第一批(快速修复): - H6: main.py --debug 默认值 True→False,防止 Werkzeug RCE - M2+M3: /search 增加 validate_query + top_k 范围限制(1-50) - M4: context_count 范围限制(0-10) + 异常捕获 - L3: assert → raise RuntimeError(生产环境 API Key 检查) - H1: SSE 错误事件移除 traceback 字段 第二批(安全加固): - H2+H3: 文档接口路径遍历 realpath 校验 + 文件类型/大小限制 - H4+H5: 批量上传文件大小检查 - M6: LIKE 查询通配符转义 - M1: 37 处 str(e) 异常信息统一脱敏(6 文件) - M5: CORS 生产环境限制来源 - M7: SESSION_MANAGER None 保护(503) - M11: subprocess 参数注入防护(白名单 + -- 分隔符) 第三批(架构改进): - M8+M9: 提取 JSON 解析共享工具(extract_json_object/list) - M10: Prompt 注入检测防御(prompt_guard.py) - M12: 解析器文件大小限制(Excel 50MB/TXT 20MB/PDF 100MB) - M13: 全局单例竞态条件双重检查锁定(engine/bm25/intent_analyzer)
55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
"""
|
||
RAG API 服务 - 统一启动入口
|
||
|
||
使用方式:
|
||
python main.py # 启动服务(默认端口 5001)
|
||
python main.py --port 8080 # 指定端口
|
||
python main.py --host 127.0.0.1 # 仅本机访问
|
||
|
||
等效于旧入口: python rag_api_server.py
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
import argparse
|
||
import warnings
|
||
|
||
# 抑制第三方库的已知警告
|
||
warnings.filterwarnings("ignore", message="pkg_resources is deprecated")
|
||
warnings.filterwarnings("ignore", category=FutureWarning, module="core.agentic")
|
||
|
||
# 确保项目根目录在 Python 路径中
|
||
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
|
||
if PROJECT_ROOT not in sys.path:
|
||
sys.path.insert(0, PROJECT_ROOT)
|
||
|
||
|
||
def main():
|
||
parser = argparse.ArgumentParser(description='RAG API 服务')
|
||
parser.add_argument('--host', default='0.0.0.0', help='监听地址(默认 0.0.0.0)')
|
||
parser.add_argument('--port', type=int, default=5001, help='监听端口(默认 5001)')
|
||
parser.add_argument('--debug', action='store_true', default=False, help='调试模式')
|
||
parser.add_argument('--no-debug', action='store_true', help='关闭调试模式')
|
||
args = parser.parse_args()
|
||
|
||
debug = args.debug and not args.no_debug
|
||
|
||
# 通过工厂函数创建应用
|
||
from api import create_app
|
||
app = create_app()
|
||
|
||
print(f"\n🚀 RAG API 服务启动: http://{args.host}:{args.port}")
|
||
print(f" 调试模式: {'开启' if debug else '关闭'}")
|
||
|
||
app.run(
|
||
host=args.host,
|
||
port=args.port,
|
||
debug=debug,
|
||
threaded=True,
|
||
use_reloader=False
|
||
)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|