# Qurio Python 后端(FastAPI + Agno) 本后端以 Agno SDK 为核心,实现与前端 **无感切换** 的对话与工具能力。 ## 关键逻辑(当前 Agno 架构) 1. **模型选择** - `provider == gemini`:使用 Agno 的 `Gemini` 模型类。 - **除 Gemini 外全部走 OpenAI‑compatible**:统一使用 `OpenAILike`(参见 Agno OpenAI‑like 文档)。 - 模型与 base_url 以请求参数为主,未传则用环境变量默认值。 2. **消息与流式** - 不做角色映射(`developer` 会原样透传)。 - 流式输出通过 `Agent.run(stream=True, stream_events=True)` 转成 SSE JSON 事件: - `text / thought / tool_call / tool_result / done / error` 3. **工具体系(前端可选)** - **本地自定义工具(local)**:`QurioLocalTools`(calculator / local*time / summarize_text / extract_text / json_repair / webpage_reader / interactive_form / Tavily*\* 等)。 - **Agno 内置工具(agno)**:按勾选加载 Toolkit: - TavilyTools / DuckDuckGoTools / ArxivTools / WikipediaTools / YFinanceTools - **用户工具(custom)**:HTTP/MCP 工具通过 `build_user_tools_toolkit` 统一封装。 4. **存储** - 当前 **不启用 Agno DB**(前端自行写入 Supabase)。 5. **CORS** - 由 `AgentOS(cors_allowed_origins=...)` 与兜底中间件同时保证浏览器可访问。 --- ## 主要文件用途(backend-python/src) - `main.py` - FastAPI 应用入口,启动 AgentOS。 - `config.py` - 读取环境变量(HOST/PORT/CORS/DEBUG 等)。 - `services/agent_os_app.py` - 组装 FastAPI + AgentOS,注册路由,设置 CORS 与兜底响应。 - `services/agent_registry.py` - **核心模型/工具装配**: - 选择 `Gemini` 或 `OpenAILike` - 注入本地工具、Agno 工具、用户工具 - 处理工具选择策略(`tool_choice`) - `services/stream_chat.py` - **流式对话主服务**,将 Agno 事件转为 SSE JSON。 - 支持本地时间自动注入与工具提示。 - `services/tool_registry.py` - 工具清单与分类:`LOCAL_TOOLS / AGNO_TOOLS / ALL_TOOLS`。 - `services/custom_tools.py` - 本地工具实现(安全计算、时间、摘要、网页读取、Tavily 搜索等)。 - `services/user_tools.py` - 用户工具封装(HTTP/MCP),支持参数模板、域名白名单、超时与大小限制。 - `services/tools.py` - 兼容旧逻辑的本地工具执行入口(仅认 local tools)。 - `services/generation.py` - 标题、相关问题、自动 agent 选择、research plan 等非流式生成。 - `routes/*.py` - 具体 API 端点(stream-chat / title / related-questions / research-plan / deep-research 等)。 --- ## 相关配置(backend-python/.env) - `HOST` / `PORT` - `FRONTEND_URLS`(逗号分隔) - `OPENAI_BASE_URL` / `OPENAI_MODEL` - 其他 provider 的 base_url / model(如 siliconflow、glm、minimax 等) - `TAVILY_API_KEY` --- ## 与前端约定 - SSE 数据格式不变(前端无感)。 - 工具列表通过 `/api/tools` 返回,按 `category` 分组: - `custom` = 自定义工具 - `agno` = Agno 内置工具 - 其他 = 本地工具分类(math/time/text/web/search...)