Files

1 line
52 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "aimfllys/studysolo", "files": {"docs/summaries/2026-03-26-ai-usage-billing-dashboard-implementation-summary.md": {"70344a86e1046454758aa5f6bee3a5a874e7ff0b": {"t": 1785596113.235884, "n": 8456, "h": "47239862a0a5906a", "c": "<!-- 编码:UTF-8 -->\n\n# 2026-03-26 AI 使用量、模型目录与计费体系升级总结\n\n## 1. 这次升级解决了什么\n\n这次不是单纯“多加几个图表”,而是把 StudySolo 当前 AI 调用、模型目录、价格体系、usage 账本、用户侧左面板、后台 AI 仪表盘和项目规范文档统一成了一套完整机制。\n\n本次升级后,系统具备了以下能力:\n\n- 使用真实 usage 账本记录 AI 请求与真实 provider 调用\n- 明确区分 `assistant` 和 `workflow` 两本账\n- 从 USD 试运行口径切换到正式 `CNY` 计费口径\n- 引入 `ai_model_families + ai_model_skus` 双层模型目录\n- 前端和后台统一从 catalog API 读取模型目录\n- 后台模型页可以直接管理平台级 SKU 元数据\n- 规范文档、命名、API 契约和新增模型 SOP 同步升级\n\n## 2. 本次确认的核心业务策略\n\n### 2.1 便宜模型\n\n统一策略:\n\n- 原生 API 优先\n- `routing_policy = native_first`\n\n适用方向:\n\n- DeepSeek 全系\n- 通义千问非 Max 系\n- 大多数 Doubao\n- GLM 4.5 到 4.7 的低价通道\n- Kimi 低价模型\n\n### 2.2 贵模型\n\n统一策略:\n\n- 聚合优先,再逐级回原生\n- `routing_policy = proxy_first`\n\n默认顺序:\n\n- `qiniu -> siliconflow -> native`\n\n### 2.3 工具模型\n\n统一策略:\n\n- 能力固定平台\n- `routing_policy = capability_fixed`\n\n当前明确规则:\n\n- OCR:智谱原生\n- Search:七牛云主通道,预留智谱扩量\n\n## 3. 数据模型升级\n\n### 3.1 新增模型目录表\n\n新增:\n\n- `public.ai_model_families`\n- `public.ai_model_skus`\n\n作用:\n\n- `ai_model_families` 表示逻辑模型族\n- `ai_model_skus` 表示平台级可调用且可计费的真实 SKU\n\n关键意义:\n\n- 同名模型跨平台不再混成一条价格记录\n- `provider` 与 `vendor` 分离\n- 真正支持多原生厂商 + 多聚合平台差异计费\n\n### 3.2 旧表状态\n\n旧表:\n\n- `public.ai_models`\n\n处理方式:\n\n- 继续保留一轮兼容期\n- 已被标记为 deprecated compatibility source\n- 新代码不再把它作为主目录表\n\n### 3.3 usage 表结构扩展\n\n扩展:\n\n- `public.ss_ai_usage_events`\n- `public.ss_ai_usage_minute`\n\n新增字段:\n\n- `sku_id`\n- `family_id`\n- `vendor`\n- `billing_channel`\n- `input_price_cny_per_million`\n- `output_price_cny_per_million`\n- `cost_amount_cny`\n- `total_cost_cny`\n\n### 3.4 分钟聚合主键升级\n\n`ss_ai_usage_minute` 新主键收口为:\n\n- `(minute_bucket, user_id, source_type, source_subtype, sku_id)`\n\n同时补了旧数据去重逻辑,避免历史 request 桶在切新主键时冲突。\n\n## 4. 迁移与 Supabase 云端状态\n\n### 4.1 本地迁移文件\n\n新增迁移:\n\n- [20260326162000_upgrade_ai_catalog_and_cny_billing.sql](/D:/project/Study_1037Solo/StudySolo/supabase/migrations/20260326162000_upgrade_ai_catalog_and_cny_billing.sql)\n\n该迁移完成:\n\n- 新建 `ai_model_families`\n- 新建 `ai_model_skus`\n- 扩展 usage 账本字段\n- 将分钟聚合切到新主键\n- 新建 / 重建 `fn_ss_ai_usage_minute_increment`\n- 预置首批 family 与 SKU 种子\n\n### 4.2 云端 Supabase 同步\n\n本次已通过 MCP 将该迁移成功应用到云端 Supabase 项目:\n\n- project id: `hofcaclztjazoytmckup`\n- migration name: `upgrade_ai_catalog_and_cny_billing`\n\n第一次云端执行失败的原因:\n\n- 旧 `ss_ai_usage_minute` 在切新主键时存在重复桶\n\n处理方式:\n\n- 在迁移中补充去重聚合逻辑\n- 重新执行后成功\n\n### 4.3 云端结果\n\n云端现在已经同步具备:\n\n- `ai_model_families`\n- `ai_model_skus`\n- 扩展后的 `ss_ai_usage_events`\n- 扩展后的 `ss_ai_usage_minute`\n\n说明:\n\n- 这不是只存在本地文件的计划状态\n- 云端数据库结构已经同步到位\n\n## 5. 后端改造\n\n### 5.1 配置分层\n\n重构:\n\n- [config.yaml](/D:/project/Study_1037Solo/StudySolo/backend/config.yaml)\n- [config_loader.py](/D:/project/Study_1037Solo/StudySolo/backend/app/core/config_loader.py)\n\n现在分层清晰为:\n\n- YAML 负责运行时路由策略\n- Supabase 负责模型目录与价格元数据\n- usage ledger 负责真实消耗记录\n\n### 5.2 YAML 新职责\n\n当前 YAML 重点保留:\n\n- `providers`\n- `task_routes`\n- `compatibility`\n- `engine`\n\n已经明确表达:\n\n- `native_first`\n- `proxy_first`\n- `capability_fixed`\n\n并支持旧环境变量兼容别名,例如:\n\n- `QINIU_AI_API_KEY | QINIU_API_KEY`\n- `COMPSHARE_API_KEY | YOUYUN_API_KEY`\n\n### 5.3 Catalog 服务\n\n新增:\n\n- [ai_catalog_service.py](/D:/project/Study_1037Solo/StudySolo/backend/app/services/ai_catalog_service.py)\n\n核心能力:\n\n- 从 Supabase 读取 family 与 SKU\n- 进程内缓存目录\n- 通过 `selected_model_key` 或旧字段解析真实 SKU\n- 提供 task route 对应 SKU 列表\n\n### 5.4 AI 路由器\n\n重构:\n\n- [ai_router.py](/D:/project/Study_1037Solo/StudySolo/backend/app/services/ai_router.py)\n\n现在逻辑是:\n\n- YAML 决定路由策略和候选链\n- catalog service 决定这一步到底用哪个平台级 SKU\n- usage ledger 写入真实平台、真实模型、真实价格快照\n\n### 5.5 usage 账本\n\n升级:\n\n- [usage_ledger.py](/D:/project/Study_1037Solo/StudySolo/backend/app/services/usage_ledger.py)\n- [usage_analytics.py](/D:/project/Study_1037Solo/StudySolo/backend/app/services/usage_analytics.py)\n- [usage.py](/D:/project/Study_1037Solo/StudySolo/backend/app/models/usage.py)\n\n当前已正式改为:\n\n- `CNY`\n- 每百万 Token 计价\n- 真实平台级 SKU 计费\n\n### 5.6 请求入口兼容\n\n升级:\n\n- [ai_chat.py](/D:/project/Study_1037Solo/StudySolo/backend/app/api/ai_chat.py)\n- [ai_chat_stream.py](/D:/project/Study_1037Solo/StudySolo/backend/app/api/ai_chat_stream.py)\n- [ai_chat.py](/D:/project/Study_1037Solo/StudySolo/backend/app/models/ai_chat.py)\n\n当前规则:\n\n- 新入口:`selected_model_key`\n- 兼容入口:`selected_platform + selected_model`\n\n同时:\n\n- premium 校验已从静态模型名列表改为按 catalog `required_tier` 判断\n\n### 5.7 新接口\n\n新增用户侧目录接口:\n\n- `GET /api/ai/models/catalog`\n\n文件:\n\n- [ai_catalog.py](/D:/project/Study_1037Solo/StudySolo/backend/app/api/ai_catalog.py)\n\n新增后台目录接口:\n\n- `GET /api/admin/models/catalog`\n- `PUT /api/admin/models/{sku_id}`\n\n文件:\n\n- [admin_models.py](/D:/project/Study_1037Solo/StudySolo/backend/app/api/admin_models.py)\n\n说明:\n\n- 后台只允许编辑目录元数据\n- 不允许直接改运行时 YAML 路由\n\n## 6. 前端改造\n\n### 6.1 模型目录来源统一\n\n新增:\n\n- [ai-catalog.service.ts](/D:/project/Study_1037Solo/StudySolo/frontend/src/services/ai-catalog.service.ts)\n- [ai-catalog.ts](/D:/project/Study_1037Solo/StudySolo/frontend/src/types/ai-catalog.ts)\n\n重构:\n\n- [ai-models.ts](/D:/project/Study_1037Solo/StudySolo/frontend/src/features/workflow/constants/ai-models.ts)\n\n现在前端模型来源原则:\n\n- 正式来源:catalog API\n- 本地常量:仅开发兜底\n\n### 6.2 用户侧 AI 选模\n\n重构:\n\n- [SidebarAIPanel.tsx](/D:/project/Study_1037Solo/StudySolo/frontend/src/components/layout/sidebar/SidebarAIPanel.tsx)\n- [ModelSelector.tsx](/D:/project/Study_1037Solo/StudySolo/frontend/src/components/layout/sidebar/ModelSelector.tsx)\n- [use-ai-chat-store.ts](/D:/project/Study_1037Solo/StudySolo/frontend/src/stores/use-ai-chat-store.ts)\n- [use-stream-chat.ts](/D:/project/Study_1037Solo/StudySolo/frontend/src/features/workflow/hooks/use-stream-chat.ts)\n\n改动点:\n\n- 模型选择器改为接收 catalog 返回的 SKU 列表\n- 发送请求时优先传 `selected_model_key`\n- 旧 `selected_platform + selected_model` 继续兼容提交\n\n### 6.3 用户侧左侧仪表盘\n\n重构:\n\n- [DashboardPanel.tsx](/D:/project/Study_1037Solo/StudySolo/frontend/src/components/layout/sidebar/DashboardPanel.tsx)\n- [usage.service.ts](/D:/project/Study_1037Solo/StudySolo/frontend/src/services/usage.service.ts)\n- [usage.ts](/D:/project/Study_1037Solo/StudySolo/frontend/src/types/usage.ts)\n\n当前状态:\n\n- 成本字段已切到 `CNY`\n- 显示个人 AI 使用镜像\n- 与后台使用同一套 usage 数据口径\n\n### 6.4 后台 AI 仪表盘\n\n重构:\n\n- [AdminDashboardPageView.tsx](/D:/project/Study_1037Solo/StudySolo/frontend/src/features/admin/dashboard/AdminDashboardPageView.tsx)\n- [DashboardKpiSection.tsx](/D:/project/Study_1037Solo/StudySolo/frontend/src/features/admin/dashboard/DashboardKpiSection.tsx)\n- [DashboardChartsSection.tsx](/D:/project/Study_1037Solo/StudySolo/frontend/src/features/admin/dashboard/DashboardChartsSection.tsx)\n- [DashboardActivityTable.tsx](/D:/project/Study_1037Solo/StudySolo/frontend/src/features/admin/dashboard/DashboardActivityTable.tsx)\n\n当前状态:\n\n- 成本字段改为 `CNY`\n- 展示 provider、vendor、billing_channel\n- 模型排行已按平台级 SKU 思路展示\n\n### 6.5 后台模型目录页\n\n重构:\n\n- [models/page.tsx](/D:/project/Study_1037Solo/StudySolo/frontend/src/app/(admin)/admin-analysis/models/page.tsx)\n\n当前页面能力:\n\n- 查看平台级模型 SKU 目录\n- 编辑展示名、tier、价格、可见性、用户可选开关、fallback-only 等元数据\n- 直接调用后台 catalog API 保存\n\n## 7. 规范文档同步\n\n本次同步更新:\n\n- [naming.md](/D:/project/Study_1037Solo/StudySolo/docs/项目规范与框架流程/项目规范/naming.md)\n- [api.md](/D:/project/Study_1037Solo/StudySolo/docs/项目规范与框架流程/项目规范/api.md)\n\n新增:\n\n- [项目AI调用及计费分析统一规范.md](/D:/project/Study_1037Solo/StudySolo/docs/项目规范与框架流程/项目规范/项目AI调用及计费分析统一规范.md)\n- [新增AI模型-SOP.md](/D:/project/Study_1037Solo/StudySolo/docs/项目规范与框架流程/功能流程/新增AI模型/新增AI模型-SOP.md)\n\n这些文档现在已经覆盖:\n\n- provider / vendor / family / sku 定义\n- CNY 计费字段\n- 新 catalog API\n- `selected_model_key` 主入口\n- 新增模型流程\n\n## 8. 测试与验证\n\n### 8.1 后端\n\n通过:\n\n- `backend\\\\.venv\\\\Scripts\\\\python.exe -m pytest backend\\\\tests\\\\test_usage_analytics_property.py`\n- `backend\\\\.venv\\\\Scripts\\\\python.exe -m compileall backend\\\\app`\n\n结果:\n\n- 3 个 usage analytics 测试全部通过\n- 后端模块编译通过\n\n### 8.2 前端\n\n通过:\n\n- `npx vitest --run src/__tests__/usage-service.property.test.ts src/__tests__/admin-service.property.test.ts`\n\n结果:\n\n- 7 个测试全部通过\n\n### 8.3 TypeScript 检查\n\n执行:\n\n- `npx tsc --noEmit`\n\n结果:\n\n- 本次改动新增的问题已清掉\n- 当前剩余 2 个错误为仓库内既有无关问题:\n - `src/__tests__/edge-connection-system.smoke.test.ts`\n - `src/features/admin/users/UserDetailPanels.tsx`\n\n说明:\n\n- 本次升级没有新增新的全量 TypeScript 错误\n\n## 9. 这次做完后,系统现在是什么状态\n\n截至 2026-03-26,这套体系已经从“usage 看板试运行版”升级为“平台级模型目录 + CNY 计费版”。\n\n现在已经具备:\n\n- YAML 路由策略中心\n- Supabase 模型目录中心\n- 真实 provider 使用账本\n- 平台级 SKU 成本分析\n- 用户侧 / 后台侧同步显示\n- 文档与 SOP 同步\n\n## 10. 仍未彻底完成的部分\n\n### 10.1 价格完整度\n\n当前仍有部分模型价格待核验,因此这些 SKU 可能表现为:\n\n- 有调用\n- 有 token\n- 成本暂时为 `0 CNY`\n\n典型待补:\n\n- 部分 Moonshot\n- 部分 GLM\n- 部分 Doubao 映射\n- 部分 SiliconFlow / 搜索扩量价格\n\n### 10.2 人工 UI 级联调\n\n建议后续补一次真实操作链路验收:\n\n1. 用户侧实际选一个 catalog 模型发起聊天\n2. 触发一次 generate-workflow\n3. 执行一次 workflow\n4. 观察左侧仪表盘与后台仪表盘是否按轮询周期同步刷新\n\n## 11. 一句话结论\n\n这次升级已经把 StudySolo 的 AI 配置、模型目录、平台级计费、usage 分析、后台模型管理和项目规范收口成一套统一体系;剩余工作主要是补价格元数据和做最后一层真实页面联调,而不是再重做底层架构。\n"}}, "docs/Plans/daily_plan/API/README.md": {"70344a86e1046454758aa5f6bee3a5a874e7ff0b": {"t": 1785596113.7349424, "n": 12815, "h": "a7b17299618389f8", "c": "# StudySolo API 统一路由规划 · 权威索引\n\n> 📅 创建日期:2026-02-26 \n> 🔄 最新更新:2026-02-26 \n> 📌 所属模块:API 调用与路由 \n> 🎯 定位:**项目内所有 AI API 调用相关设计的唯一权威汇总入口** \n> ⚠️ 本文档具有最终决定权。其余散落文档中如有与本文冲突的旧版 API 描述,均以本文为准。\n\n---\n\n## 📑 目录\n\n- [一、架构演进:从旧到新](#一架构演进从旧到新)\n- [二、当前权威架构:八平台双层分治](#二当前权威架构八平台双层分治)\n- [三、十路任务分流总矩阵](#三十路任务分流总矩阵)\n- [四、节点到模型到平台的完整映射](#四节点到模型到平台的完整映射)\n- [五、YAML 配置中心化方案](#五yaml-配置中心化方案)\n- [六、容灾降级全景图](#六容灾降级全景图)\n- [七、散落文档冲突消解矩阵](#七散落文档冲突消解矩阵)\n- [八、后续 ACTION ITEMS](#八后续-action-items)\n\n---\n\n## 一、架构演进:从旧到新\n\n本项目 API 层经历了三次大版本迭代:\n\n| 版本 | 核心策略 | 平台数 | 决策文档 | 状态 |\n| :--- | :--- | :---: | :--- | :---: |\n| **v0** | 双模型路由(豆包 + 千问) | 2 | `项目深度功能规划.md` §5.1 | ❌ 已废弃 |\n| **v1** | 四平台线性优先级(七牛>优云>火山>百炼) | 4 | `多平台AI-API统一路由与容灾规划.md` 旧版 | ❌ 已废弃 |\n| **v2 ✅** | **八平台双层分治 + 十路任务分流** | 8 | `多平台AI-API统一路由与容灾规划.md` v2 | ✅ **当前生效** |\n\n### 每次迭代解决了什么问题\n\n| 迭代 | 解决的核心问题 |\n| :--- | :--- |\n| v0 → v1 | 增加容灾维度,从单平台扩展到四平台线性降级链 |\n| v1 → v2 | 引入「原生优先」原则,区分格式严格/推理/长文/搜索/向量化等任务类型,按任务分流而非线性排队 |\n\n---\n\n## 二、当前权威架构:八平台双层分治\n\n### 2.1 三层架构图\n\n```\n ┌─────────────────────────────────────────┐\n │ StudySolo AI 路由引擎 v2 │\n │ (ai_router.py · 任务分类驱动) │\n └──────────────┬──────────────────────────┘\n │\n ┌──────────────────────────┼──────────────────────────┐\n │ │ │\n═══════════▼══════════════ ═══════════▼══════════════ ═══════════▼══════════════\n║ 🏠 第一层:原生直连层 ║ ║ 🌐 第二层:代理聚合层 ║ ║ 🔧 第三层:增值服务层 ║\n║ (纯净·满血·低价) ║ ║ (海外·聚合·灾备) ║ ║ (独占功能·无替代) ║\n═══════════════════════════ ═══════════════════════════ ═══════════════════════════\n```\n\n### 2.2 八大平台身份证\n\n#### 原生直连(5 家) — 工作流默认使用\n\n| # | 平台 | Base URL | 环境变量 | 核心角色 |\n| :--- | :--- | :--- | :--- | :--- |\n| 1 | **阿里云百炼** | `https://dashscope.aliyuncs.com/compatible-mode/v1` | `DASHSCOPE_API_KEY` | Qwen 原生宿主 + 向量化/OCR/Rerank 全栈 |\n| 2 | **DeepSeek 官方** | `https://api.deepseek.com/v1` | `DEEPSEEK_API_KEY` | 推理之王 + 缓存命中极低价 |\n| 3 | **月之暗面 (Moonshot)** | `https://api.moonshot.cn/v1` | `MOONSHOT_API_KEY` | 原生Kimi |\n| 4 | **火山引擎** | `https://ark.cn-beijing.volces.com/api/v3` | `VOLCENGINE_API_KEY` | 原生满血豆包模型 |\n| 5 | **智谱AI** | `https://open.bigmodel.cn/api/paas/v4` | `ZHIPU_API_KEY` | 原生智谱模型、深度联网搜索 + GLM-OCR |\n\n#### 代理聚合(3 家) — 灾备 / 海外模型 / 独占增值\n\n| # | 平台 | Base URL | 环境变量 | 核心角色 |\n| :--- | :--- | :--- | :--- | :--- |\n| 6 | **七牛云 AIGC** | `https://api.qnaigc.com/v1` | `QINIU_AI_API_KEY` | 百度搜索 API + 图片/视频/TTS 独占 |\n| 7 | **优云智算** | `https://api.compshare.cn/v1` | `COMPSHARE_API_KEY` | 海外旗舰模型独占 (GPT-5.x/Claude-4.x) |\n| 8 | **硅基流动** | `https://api.siliconflow.cn/v1` | `SILICONFLOW_API_KEY` | 开源模型加速池 / DS/Qwen 分流灾备 |\n\n### 2.3 两条铁律\n\n> **铁律 1:** 工作流中所有节点默认使用各家 AI 的原生服务。聚合平台仅用于海外模型调用和灾备降级。\n>\n> **铁律 2:** 要求格式严格(JSON / 结构化输出)的任务,**绝不使用聚合平台**。\n\n---\n\n## 三、十路任务分流总矩阵\n\n| 路由链 | 任务类型 | 首选平台 | 首选模型 | 降级路径 |\n| :--- | :--- | :--- | :--- | :--- |\n| **A** | 格式严格 (JSON输出) | 百炼 (原生) | `qwen3-turbo` | DeepSeek → 火山 |\n| **B** | 深度推理 (CoT) | DeepSeek (原生) | `deepseek-r1` | 百炼 Max → 火山 → 七牛 |\n| **C** | 超长文本 (10K-200K) | Moonshot (原生) | `kimi-k2.5` | 百炼 Long → 七牛 |\n| **D** | 简单快速 (≤500T) | 百炼 (原生) | `qwen-turbo` | 火山 mini → 七牛 |\n| **E** | 海外旗舰 (Pro用户) | 优云智算 (代理) | `gpt-5.1` | 七牛 GPT-4o |\n| **F** | 联网搜索 (三级分流) | 见下方详表 | — | 逐级降级 |\n| **G** | 多模态向量 (RAG) | 百炼 (原生) | `qwen3-vl-embedding` | `tongyi-vision-flash` |\n| **H** | 文本向量 + Rerank | 百炼 (原生) | `text-embedding-v4` / `qwen3-vl-rerank` | 无替代 |\n| **I** | 专业 OCR | 智谱 (原生) | `glm-ocr` | 百炼 `qwen-vl-ocr` → 七牛 |\n| **J** | 其他增值服务 | 七牛云 (独占) | 图片/视频/TTS | 无替代 |\n\n### 联网搜索三级分流详表 (路由链 F)\n\n| 等级 | 场景 | 平台 | 服务/模型 |\n| :--- | :--- | :--- | :--- |\n| **深度搜索** | 工作流调研节点 `search_depth: deep` | 智谱AI (原生) | Web Search API + Search Agent |\n| **一般搜索** | 工作流普通节点 `search_depth: general` | 七牛云 (代理) | Baidu Search API |\n| **普通搜索** | 单独 AI 对话 (非工作流) 默认 | 百炼 (原生) | `qwen3.5-flash` + `enable_search: true` |\n\n### RAG 管线完整链路 (路由链 G + H)\n\n```\n用户查询\n │\n ├─ 包含图片/视频 ──→ 多模态向量化 (qwen3-vl-embedding) ──→ pgvector 检索\n │\n └─ 纯文本 ──→ 文本向量化 (text-embedding-v4) ──→ pgvector 检索\n │\n 取 Top-K 结果\n │\n 重排序 (qwen3-vl-rerank)\n │\n 取 Top-N 精排结果\n │\n 注入 System Prompt\n │\n LLM 生成最终回答\n```\n\n---\n\n## 四、节点到模型到平台的完整映射\n\n> 此表为 `ai_router.py` 的实现蓝图。每个工作流节点在执行时,路由器根据 `node.type` 查此表确定调用链。\n\n### 4.1 工作流核心节点\n\n| 节点 ID | 中文名 | 路由链 | 首选平台 | 首选模型 | Token 消耗 |\n| :--- | :--- | :--- | :--- | :--- | :--- |\n| `ai_analyzer` | 需求分析器 | A 格式严格 | 百炼 | `qwen3-turbo` | ~500-1K |\n| `ai_planner` | 工作流编排器 | A 格式严格 | 百炼 | `qwen3-turbo` | ~1K-2K |\n| `flashcard` | 闪卡生成 | A 格式严格 | 百炼 | `qwen-turbo` | ~300-800 |\n| `outline_gen` | 大纲生成 | B 深度推理 | DeepSeek | `deepseek-r1` | ~1K-3K |\n| `content_extract` | 知识提炼 | B 深度推理 | DeepSeek | `deepseek-r1` | ~2K-5K |\n| `summary` | 总结归纳 | B 深度推理 | DeepSeek | `deepseek-r1` | ~1K-3K |\n| `merge_polish` | 润色合并 | C 超长文本 | Moonshot | `kimi-k2.5` | ~3K-8K |\n| `intent_classify` | 意图分类 | D 简单快速 | 百炼 | `qwen-turbo` | ~100-300 |\n\n### 4.2 搜索 / RAG / OCR / 增值节点\n\n| 节点 ID | 路由链 | 首选平台 | 首选模型/服务 |\n| :--- | :--- | :--- | :--- |\n| `deep_search` | F 深度搜索 | 智谱AI | Web Search API |\n| `general_search` | F 一般搜索 | 七牛云 | Baidu Search API |\n| `chat_search` | F 普通搜索 | 百炼 | `qwen3.5-flash` + enable_search |\n| `mm_embed` | G 多模态向量 | 百炼 | `qwen3-vl-embedding` |\n| `text_embed` | H 文本向量 | 百炼 | `text-embedding-v4` |\n| `rerank` | H 重排序 | 百炼 | `qwen3-vl-rerank` |\n| `document_ocr` | I 专业OCR | 智谱 | `glm-ocr` |\n| `img_gen` | J 增值 | 七牛云 | Kling |\n| `video_gen` | J 增值 | 七牛云 | Kling |\n| `tts` | J 增值 | 七牛云 | TTS |\n\n### 4.3 与旧版节点分析的关键差异\n\n> 来源:`daily_plan/core/节点分析.md` §6「节点与模型路由映射」\n\n| 节点 | 旧版绑定模型 | 新版绑定模型 | 变更原因 |\n| :--- | :--- | :--- | :--- |\n| `ai_analyzer` | 豆包 2.0-pro (火山免费池) | **百炼 `qwen3-turbo`** | 格式严格任务必须走原生,避免聚合平台污染 JSON |\n| `ai_planner` | qwen3-turbo (百炼) | **百炼 `qwen3-turbo`** | 不变,但明确走路由链 A |\n| `outline_gen` | qwen3-turbo (百炼) | **DeepSeek `deepseek-r1`** | 大纲生成属深度推理,需要 CoT 慢思考 |\n| `content_extract` | qwen3-turbo (百炼) | **DeepSeek `deepseek-r1`** | 同上 |\n| `flashcard` | 豆包 2.0-pro (火山免费池) | **百炼 `qwen-turbo`** | 闪卡输出为严格 JSON 数组,需原生平台保障 |\n| `merge_polish` | qwen3-turbo (百炼) | **Moonshot `kimi-k2.5`** | 超长文本场景,需 256K 上下文窗口 |\n\n---\n\n## 五、YAML 配置中心化方案\n\n> 来源:`daily_plan/core/02-yaml-config-and-markdown-rendering.md`\n\n### 5.1 核心原则\n\n所有模型配置、节点→模型映射、容灾策略均集中在 `config.yaml` 中管理。代码侧通过 `config_loader.py` 加载配置,`ai_router.py` 零硬编码调用。\n\n### 5.2 配置文件结构(关键片段)\n\n```yaml\n# config.yaml 顶层结构\nplatform_tiers:\n native:\n - id: dashscope\n native_models: [qwen-turbo, qwen3-turbo, ..., text-embedding-v4, qwen3-vl-embedding, qwen-vl-ocr]\n - id: deepseek\n native_models: [deepseek-chat, deepseek-reasoner]\n - id: moonshot\n native_models: [kimi-k2.5, moonshot-v1-128k]\n - id: volcengine\n native_models: [doubao-2.0-pro, doubao-seed-2.0-mini]\n - id: zhipu\n native_models: [glm-4, glm-5, web-search-pro, glm-ocr]\n proxy:\n - id: qiniu\n - id: compshare\n - id: siliconflow\n\ntask_routing:\n strict_format: { chain: [dashscope → deepseek → volcengine] }\n reasoning: { chain: [deepseek → dashscope → volcengine → qiniu] }\n long_context: { chain: [moonshot → dashscope → qiniu] }\n simple_fast: { chain: [dashscope → volcengine → qiniu] }\n deep_search: { chain: [zhipu → qiniu → dashscope(enable_search)] }\n multimodal_embed: { chain: [dashscope(qwen3-vl-embedding) → dashscope(tongyi-flash)] }\n text_embedding: { chain: [dashscope(text-embedding-v4)] }\n text_rerank: { chain: [dashscope(qwen3-vl-rerank)] }\n document_ocr: { chain: [zhipu(glm-ocr) → dashscope(qwen-vl-ocr) → qiniu] }\n # ...\n```\n\n### 5.3 代码加载链路\n\n```\nconfig.yaml ──read──→ config_loader.py ──inject──→ ai_router.py\n │\n resolve $ENV_VARS\n │\n lru_cache() 应用生命周期缓存\n```\n\n> 完整 YAML 结构和 Python 代码示例见 → [`daily_plan/core/02-yaml-config-and-markdown-rendering.md`](../core/02-yaml-config-and-markdown-rendering.md)\n\n---\n\n## 六、容灾降级全景图\n\n### 6.1 十路降级总表\n\n| 路由链 | 正常通道 | Level 1 | Level 2 | Level 3 极端 |\n| :--- | :--- | :--- | :--- | :--- |\n| **A. 格式严格** | 百炼 `qwen3-turbo` | DeepSeek `deepseek-v3` | 火山 `doubao-2.0-pro` | 友好错误页 |\n| **B. 深度推理** | DeepSeek `deepseek-r1` | 百炼 `qwen3-max` | 火山 `deepseek-r1` → 七牛 | 友好错误页 |\n| **C. 超长文本** | Moonshot `kimi-k2.5` | 百炼 `qwen-long` | 七牛 `kimi` | 友好错误页 |\n| **D. 简单快速** | 百炼 `qwen-turbo` | 火山 `doubao-mini` | 七牛 `qwen-turbo` | 友好错误页 |\n| **E. 海外旗舰** | 优云 `gpt-5.1` | 七牛 `gpt-4o` | — | \"高端模型暂不可用\" |\n| **F. 联网搜索** | 智谱 Web Search | 七牛 百度搜索 | 百炼 enable_search | 禁用联网搜索 |\n| **G. 多模态向量** | 百炼 `qwen3-vl-embedding` | 百炼 `tongyi-vision-flash` | — | \"向量化暂不可用\" |\n| **H. 文本向量** | 百炼 `text-embedding-v4` | — | — | \"检索暂不可用\" |\n| **I. 专业 OCR** | 智谱 `glm-ocr` | 百炼 `qwen-vl-ocr` | 七牛 OCR | \"文档解析失败\" |\n| **J. 增值服务** | 七牛云独占 | — | — | \"功能暂时不可用\" |\n\n### 6.2 跨链路紧急降级\n\n```\n格式严格链全挂 → 借用 深度推理链的 DeepSeek-R1\n深度推理链全挂 → 借用 格式严格链的 Qwen3-Turbo\n超长文本链全挂 → 借用 深度推理链的 DeepSeek-R1 (128K)\n简单快速链全挂 → 借用 格式严格链的 Qwen3-Turbo\n```\n\n---\n\n## 七、散落文档冲突消解矩阵\n\n以下表格列出了项目中所有涉及 API 调用描述的文档,以及它们与 v2 架构的冲突点和处置方式。\n\n| 散落位置 | 具体内容 | 与 v2 冲突点 | 处置 |\n| :--- | :--- | :--- | :--- |\n| `global/项目深度功能规划.md` §5.1 | \"双模型路由:豆包 + 千问\" | ❌ 已过时,实际为八平台 | 以本文为准 |\n| `global/项目深度功能规划.md` §5.5 | \"四平台优先级路由\" | ❌ 已过时,旧版线性排序 | 以本文为准 |\n| `global/PROJECT_PLAN.md` §2.1 | 架构图中仅列\"火山 + 百炼\" | ❌ 缺少 5 个原生平台 | 以本文为准 |\n| `技术指导/AI_API参考资料/README.md` | \"供应商按路由优先级排列:七牛>优云>火山>百炼\" | ❌ 已过时,v2 按任务类型分流 | 以本文为准 |\n| `技术指导/AI_API参考资料/01-项目规划映射与选型.md` | \"四路模型供应商均走 OpenAI 兼容格式\" | ⚠️ 部分过时,实际为八路 | 以本文为准,但 OpenAI SDK 统一调用仍有效 |\n| `daily_plan/core/节点分析.md` §6 | \"ai_analyzer→豆包,outline→qwen\" | ⚠️ 模型绑定已更新 | 参见本文 §4.3 差异表 |\n| `daily_plan/core/工作流AI交互规划.md` §2.2 | \"ai_analyzer 由豆包 2.0-pro 完成\" | ⚠️ 已改为百炼 qwen3-turbo | 以本文为准 |\n| `daily_plan/core/02-yaml-config.md` | config.yaml 仅含豆包+千问两模型 | ⚠️ YAML 结构需升级为完整 v2 版 | 执行时以本文 §5.2 为准 |\n| `技术指导/核心工作流AI交互/04-RAG.md` | \"rerank: 百炼/方舟可选\" | ⚠️ 已确定为百炼 `qwen3-vl-rerank` | 以本文为准 |\n| `技术指导/混合RAG/02-三层漏斗.md` | 未指定具体 embedding 模型 | ⚠️ 已确定为 `text-embedding-v4` | 以本文为准 |\n\n> **处置原则**:上述旧文档暂不修改(保留历史参考价值),但所有开发实现以本文为唯一依据。\n\n---\n\n## 八、后续 ACTION ITEMS\n\n### 8.1 代码实现清单\n\n| 优先级 | 任务 | 涉及文件 | 备注 |\n| :--- | :--- | :--- | :--- |\n| **P0** | `ai_router.py` 重构为按任务类型查路由链 | `backend/app/services/ai_router.py` | 从线性遍历 → 任务分流 |\n| **P0** | `config.yaml` 升级为 v2 完整版 | `config.yaml` | 含八平台定义 + 十路路由 |\n| **P0** | `config_loader.py` 增强(支持 `params` 字段) | `backend/app/core/config_loader.py` | 搜索链需透传 `enable_search` |\n| **P1** | 智谱 Web Search API 适配 | `backend/app/services/search/` | Base URL 为 `/v4` 非 `/v1` |\n| **P1** | 百炼 Embedding/Rerank 适配 | `backend/app/services/rag/` | 非 Chat Completions 接口 |\n| **P1** | 智谱 GLM-OCR + 百炼 Qwen-VL-OCR 适配 | `backend/app/services/ocr/` | 双引擎 OCR |\n| **P2** | DeepSeek 超时降级(8s 硬切百炼) | `ai_router.py` | 高峰期排队问题 |\n| **P2** | 硅基流动作为 DS/Qwen 分流池接入 | `config.yaml` | 仅灾备,不作首选 |\n\n### 8.2 环境变量 Checklist\n\n```env\n# === 原生直连平台(5 家) ===\nDASHSCOPE_API_KEY= # 阿里云百炼 — https://bailian.console.aliyun.com\nDEEPSEEK_API_KEY= # DeepSeek官方 — https://platform.deepseek.com\nMOONSHOT_API_KEY= # 月之暗面Kimi — https://platform.moonshot.cn\nVOLCENGINE_API_KEY= # 火山引擎 — https://console.volcengine.com/ark\nZHIPU_API_KEY= # 智谱AI — https://open.bigmodel.cn\n\n# === 代理聚合平台(3 家) ===\nQINIU_AI_API_KEY= # 七牛云AIGC — https://portal.qiniu.com\nCOMPSHARE_API_KEY= # 优云智算 — https://www.compshare.cn\nSILICONFLOW_API_KEY= # 硅基流动 — https://cloud.siliconflow.cn\n```\n\n---\n\n## 📎 关联文档索引\n\n| 类别 | 文档路径 | 说明 |\n| :--- | :--- | :--- |\n| **全局规划 (权威)** | [`global/多平台AI-API统一路由与容灾规划.md`](../../global/多平台AI-API统一路由与容灾规划.md) | 完整版八平台配置 + YAML + 节点映射 |\n| **核心节点设计** | [`core/节点分析.md`](../core/节点分析.md) | 节点 JSON Schema + 状态机(模型绑定以本文为准) |\n| **工作流交互** | [`core/工作流AI交互规划.md`](../core/工作流AI交互规划.md) | 付费体系 + RAG + 明暗线(模型选用以本文为准) |\n| **YAML 配置** | [`core/02-yaml-config-and-markdown-rendering.md`](../core/02-yaml-config-and-markdown-rendering.md) | 配置加载器代码 + Markdown 渲染(YAML 结构以本文为准) |\n| **技术参考** | [`技术指导/AI_API参考资料/`](../../../技术指导/AI_API参考资料/) | 各平台接入指南(优先级排序已过时) |\n| **深度技术指导** | [`技术指导/核心工作流AI交互深度技术指导/`](../../../技术指导/核心工作流AI交互深度技术指导/) | 结构化输出/流式协议/RAG 检索策略 |\n| **混合 RAG** | [`技术指导/混合RAG知识库技术指导/`](../../../技术指导/混合RAG知识库技术指导/) | 三层漏斗 + pgvector + 缓存优化 |\n\n---\n\n> **一句话总结**:**原生主战、代理辅助、十路分流、按任务分治、每条链路都有降级兜底。本文档是所有 API 调用设计的唯一权威入口。**\n"}}, "backend/config.yaml": {"70344a86e1046454758aa5f6bee3a5a874e7ff0b": {"t": 1785596114.5930274, "n": 6045, "h": "012a2c80b39af04d", "c": "# StudySolo AI 运行时配置中心\n# 说明:\n# 1. YAML 只负责运行时路由策略,不再承担模型目录与价格中心职责。\n# 2. 模型目录、价格、可见性、tier gating 统一由 Supabase ai_model_families / ai_model_skus 维护。\n# 3. $ENV_A|ENV_B 表示兼容旧环境变量别名,config_loader.py 会按顺序解析。\n\nproviders:\n dashscope:\n display_name: \"阿里云百炼\"\n role: \"native\"\n base_url: \"$DASHSCOPE_BASE_URL\"\n api_key: \"$DASHSCOPE_API_KEY\"\n\n deepseek:\n display_name: \"DeepSeek 官方\"\n role: \"native\"\n base_url: \"$DEEPSEEK_BASE_URL\"\n api_key: \"$DEEPSEEK_API_KEY\"\n\n moonshot:\n display_name: \"月之暗面\"\n role: \"native\"\n base_url: \"$MOONSHOT_BASE_URL\"\n api_key: \"$MOONSHOT_API_KEY\"\n\n volcengine:\n display_name: \"火山引擎\"\n role: \"native\"\n base_url: \"$VOLCENGINE_BASE_URL\"\n api_key: \"$VOLCENGINE_API_KEY\"\n\n zhipu:\n display_name: \"智谱 AI\"\n role: \"native\"\n base_url: \"$ZHIPU_BASE_URL\"\n api_key: \"$ZHIPU_API_KEY\"\n\n qiniu:\n display_name: \"七牛云\"\n role: \"proxy\"\n base_url: \"$QINIU_BASE_URL\"\n api_key: \"$QINIU_AI_API_KEY|QINIU_API_KEY\"\n\n siliconflow:\n display_name: \"硅基流动\"\n role: \"proxy\"\n base_url: \"$SILICONFLOW_BASE_URL\"\n api_key: \"$SILICONFLOW_API_KEY\"\n\n compshare:\n display_name: \"优云智算\"\n role: \"proxy\"\n base_url: \"$COMPSHARE_BASE_URL|YOUYUN_BASE_URL\"\n api_key: \"$COMPSHARE_API_KEY|YOUYUN_API_KEY\"\n\ntask_routes:\n trigger_input:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_dashscope_qwen_turbo_native\"\n - \"sku_deepseek_chat_native\"\n - \"sku_volcengine_doubao_pro_32k_native\"\n\n ai_analyzer:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_dashscope_qwen_turbo_native\"\n - \"sku_deepseek_chat_native\"\n - \"sku_volcengine_doubao_pro_32k_native\"\n\n ai_planner:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_dashscope_qwen_turbo_native\"\n - \"sku_deepseek_chat_native\"\n - \"sku_volcengine_doubao_pro_32k_native\"\n\n flashcard:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_dashscope_qwen_turbo_native\"\n - \"sku_deepseek_chat_native\"\n - \"sku_volcengine_doubao_pro_32k_native\"\n\n quiz_gen:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_dashscope_qwen_turbo_native\"\n - \"sku_deepseek_chat_native\"\n - \"sku_volcengine_doubao_pro_32k_native\"\n\n logic_switch:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_dashscope_qwen_turbo_native\"\n - \"sku_deepseek_chat_native\"\n\n outline_gen:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_deepseek_reasoner_native\"\n - \"sku_dashscope_qwen_plus_native\"\n - \"sku_volcengine_doubao_pro_256k_native\"\n\n content_extract:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_deepseek_reasoner_native\"\n - \"sku_dashscope_qwen_plus_native\"\n - \"sku_volcengine_doubao_pro_256k_native\"\n\n summary:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_deepseek_reasoner_native\"\n - \"sku_dashscope_qwen_plus_native\"\n - \"sku_volcengine_doubao_pro_256k_native\"\n\n merge_polish:\n routing_policy: \"proxy_first\"\n sku_ids:\n - \"sku_qiniu_kimi_k2_5_proxy\"\n - \"sku_moonshot_v1_128k_native\"\n\n compare:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_deepseek_reasoner_native\"\n - \"sku_dashscope_qwen_plus_native\"\n\n chat_response:\n routing_policy: \"native_first\"\n sku_ids:\n - \"sku_deepseek_reasoner_native\"\n - \"sku_dashscope_qwen_plus_native\"\n - \"sku_volcengine_doubao_pro_256k_native\"\n\n premium_chat:\n routing_policy: \"proxy_first\"\n sku_ids:\n - \"sku_qiniu_qwen3_max_proxy\"\n - \"sku_siliconflow_qwen_72b_proxy\"\n - \"sku_dashscope_qwen_max_native\"\n\n search:\n routing_policy: \"capability_fixed\"\n sku_ids:\n - \"sku_qiniu_search_primary\"\n - \"sku_zhipu_search_expansion\"\n\n ocr:\n routing_policy: \"capability_fixed\"\n sku_ids:\n - \"sku_zhipu_glm_ocr_native\"\n\ncompatibility:\n provider_aliases:\n youyun: \"compshare\"\n\nengine:\n timeout_ms: 30000\n max_retries: 3\n max_nodes_per_workflow: 12\n json_validation_retries: 3\n\n# ============================================================\n# AI 对话面板精选模型路由(轨道 A)\n# 设计原则:\n# - sku_ids 数组即降级链:index 0 = 首选,index 1 = 降级\n# - 只有 1 个 sku_id = 无降级,挂了直接报错\n# - is_recommended = true 则前端渲染 ⭐ 推荐图标\n# - required_tier 决定前端置灰 + 后端拦截\n# ============================================================\nchat_models:\n - key: \"deepseek_r1\"\n display_name: \"DeepSeek R1\"\n vendor: \"deepseek\"\n required_tier: \"free\"\n sort_order: 1\n is_recommended: false\n sku_ids:\n - \"sku_deepseek_reasoner_native\"\n\n - key: \"qwen35_flash\"\n display_name: \"Qwen3.5-Flash\"\n vendor: \"qwen\"\n required_tier: \"free\"\n sort_order: 2\n is_recommended: false\n sku_ids:\n - \"sku_dashscope_qwen35_flash_native\"\n\n - key: \"qwen3_max\"\n display_name: \"Qwen3-Max\"\n vendor: \"qwen\"\n required_tier: \"pro\"\n sort_order: 3\n is_recommended: false\n sku_ids:\n - \"sku_qiniu_qwen3_max_proxy\" # 首选:七牛云代理\n - \"sku_dashscope_qwen_max_native\" # 降级:百炼官网\n\n - key: \"glm45\"\n display_name: \"GLM-4.5\"\n vendor: \"zhipu\"\n required_tier: \"free\"\n sort_order: 4\n is_recommended: false\n sku_ids:\n - \"sku_zhipu_glm_45_native\"\n\n - key: \"glm47\"\n display_name: \"GLM-4.7\"\n vendor: \"zhipu\"\n required_tier: \"pro\"\n sort_order: 5\n is_recommended: true # ⭐ 推荐图标\n sku_ids:\n - \"sku_zhipu_glm_47_native\"\n\n - key: \"doubao_seed\"\n display_name: \"DouBao-Seed2.0\"\n vendor: \"doubao\"\n required_tier: \"pro\"\n sort_order: 6\n is_recommended: false\n sku_ids:\n - \"sku_qiniu_doubao_seed_lite_proxy\" # 首选:七牛云代理\n - \"sku_volcengine_doubao_seed_native\" # 降级:火山引擎官网\n\n - key: \"kimi_k2\"\n display_name: \"Kimi-K2\"\n vendor: \"moonshot\"\n required_tier: \"pro\"\n sort_order: 7\n is_recommended: false\n sku_ids:\n - \"sku_moonshot_kimi_k2_native\"\n\n - key: \"gpt_oss_120b\"\n display_name: \"GPT-OSS-120B\"\n vendor: \"openai_oss\"\n required_tier: \"pro\"\n sort_order: 8\n is_recommended: false\n sku_ids:\n - \"sku_qiniu_gpt_oss_120b_proxy\"\n\n"}}, "backend/.env.example": {"70344a86e1046454758aa5f6bee3a5a874e7ff0b": {"t": 1785746738.8077087, "n": 2114, "h": "73f806644e5ee03a", "c": "# ============================================\n# StudySolo Backend - Environment Variables Template\n# ============================================\n# Copy this file to .env and fill in real values\n# cp .env.example .env\n# ============================================\n\n# Server\nPORT=2038\nENVIRONMENT=development\n\n# Supabase Access Token (for MCP/CLI tools)\n# https://supabase.com/dashboard/account/tokens\nSUPABASE_ACCESS_TOKEN=sbp_xxx\n\n# Supabase Project Config\nSUPABASE_URL=https://your-project.supabase.co\nSUPABASE_SERVICE_ROLE_KEY=eyJxxx\n\n# GitHub Personal Access Token\nGITHUB_PERSONAL_ACCESS_TOKEN=github_pat_xxx\n\n# ============================================\n# AI Platform API Keys & Base URLs\n# ============================================\n\n# 火山引擎 (Volcengine)\nVOLCENGINE_API_KEY=xxx\nVOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3\n\n# 阿里云百炼 (DashScope)\nDASHSCOPE_API_KEY=xxx\nDASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n\n# DeepSeek\nDEEPSEEK_API_KEY=xxx\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# 月之暗面 (Moonshot)\nMOONSHOT_API_KEY=xxx\nMOONSHOT_BASE_URL=https://api.moonshot.cn/v1\n\n# 智谱AI (Zhipu)\nZHIPU_API_KEY=xxx\nZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4\n\n# 七牛云 (Qiniu)\nQINIU_API_KEY=xxx\nQINIU_BASE_URL=xxx\n\n# 优云智算 (YouYun)\nYOUYUN_API_KEY=xxx\nYOUYUN_BASE_URL=xxx\n\n# 硅基流动 (SiliconFlow)\nSILICONFLOW_API_KEY=xxx\nSILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1\n\n# ============================================\n# Security\n# ============================================\nJWT_SECRET=change-this-to-a-secure-random-string\nCAPTCHA_SECRET=这里放一串强随机字符串\nCORS_ORIGIN=http://localhost:2037\n\n# ============================================\n# Email Service (Aliyun DirectMail)\n# 发件地址:accounts@email.1037solo.com(与 Platform 共用)\n# ============================================\nSMTP_HOST=smtpdm.aliyun.com\nSMTP_PORT=80\nSMTP_USER=xxx\nSMTP_PASS=xxx\n\n# ============================================\n# Agent Gateway - Agent API Keys\n# Gateway 调用子后端 Agent 时的认证凭证\n# 值需与对应 Agent 的 AGENT_API_KEY 一致\n# ============================================\nAGENT_CODE_REVIEW_KEY=code-review-secret\n"}, "8476ba0d6412426da783337995b659b232d91372": {"t": 1785767407.8710644, "n": 2114, "h": "73f806644e5ee03a", "c": "# ============================================\n# StudySolo Backend - Environment Variables Template\n# ============================================\n# Copy this file to .env and fill in real values\n# cp .env.example .env\n# ============================================\n\n# Server\nPORT=2038\nENVIRONMENT=development\n\n# Supabase Access Token (for MCP/CLI tools)\n# https://supabase.com/dashboard/account/tokens\nSUPABASE_ACCESS_TOKEN=sbp_xxx\n\n# Supabase Project Config\nSUPABASE_URL=https://your-project.supabase.co\nSUPABASE_SERVICE_ROLE_KEY=eyJxxx\n\n# GitHub Personal Access Token\nGITHUB_PERSONAL_ACCESS_TOKEN=github_pat_xxx\n\n# ============================================\n# AI Platform API Keys & Base URLs\n# ============================================\n\n# 火山引擎 (Volcengine)\nVOLCENGINE_API_KEY=xxx\nVOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3\n\n# 阿里云百炼 (DashScope)\nDASHSCOPE_API_KEY=xxx\nDASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n\n# DeepSeek\nDEEPSEEK_API_KEY=xxx\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# 月之暗面 (Moonshot)\nMOONSHOT_API_KEY=xxx\nMOONSHOT_BASE_URL=https://api.moonshot.cn/v1\n\n# 智谱AI (Zhipu)\nZHIPU_API_KEY=xxx\nZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4\n\n# 七牛云 (Qiniu)\nQINIU_API_KEY=xxx\nQINIU_BASE_URL=xxx\n\n# 优云智算 (YouYun)\nYOUYUN_API_KEY=xxx\nYOUYUN_BASE_URL=xxx\n\n# 硅基流动 (SiliconFlow)\nSILICONFLOW_API_KEY=xxx\nSILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1\n\n# ============================================\n# Security\n# ============================================\nJWT_SECRET=change-this-to-a-secure-random-string\nCAPTCHA_SECRET=这里放一串强随机字符串\nCORS_ORIGIN=http://localhost:2037\n\n# ============================================\n# Email Service (Aliyun DirectMail)\n# 发件地址:accounts@email.1037solo.com(与 Platform 共用)\n# ============================================\nSMTP_HOST=smtpdm.aliyun.com\nSMTP_PORT=80\nSMTP_USER=xxx\nSMTP_PASS=xxx\n\n# ============================================\n# Agent Gateway - Agent API Keys\n# Gateway 调用子后端 Agent 时的认证凭证\n# 值需与对应 Agent 的 AGENT_API_KEY 一致\n# ============================================\nAGENT_CODE_REVIEW_KEY=code-review-secret\n"}, "8f5dba2f85871eaa656e2c47c3a300348cdf3a39": {"t": 1785767409.2183952, "n": 1883, "h": "53fafcf391e0551b", "c": "# ============================================\n# StudySolo Backend - Environment Variables Template\n# ============================================\n# Copy this file to .env and fill in real values\n# cp .env.example .env\n# ============================================\n\n# Server\nPORT=2038\nENVIRONMENT=development\n\n# Supabase Access Token (for MCP/CLI tools)\n# https://supabase.com/dashboard/account/tokens\nSUPABASE_ACCESS_TOKEN=sbp_xxx\n\n# Supabase Project Config\nSUPABASE_URL=https://your-project.supabase.co\nSUPABASE_SERVICE_ROLE_KEY=eyJxxx\n\n# GitHub Personal Access Token\nGITHUB_PERSONAL_ACCESS_TOKEN=github_pat_xxx\n\n# ============================================\n# AI Platform API Keys & Base URLs\n# ============================================\n\n# 火山引擎 (Volcengine)\nVOLCENGINE_API_KEY=xxx\nVOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3\n\n# 阿里云百炼 (DashScope)\nDASHSCOPE_API_KEY=xxx\nDASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n\n# DeepSeek\nDEEPSEEK_API_KEY=xxx\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# 月之暗面 (Moonshot)\nMOONSHOT_API_KEY=xxx\nMOONSHOT_BASE_URL=https://api.moonshot.cn/v1\n\n# 智谱AI (Zhipu)\nZHIPU_API_KEY=xxx\nZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4\n\n# 七牛云 (Qiniu)\nQINIU_API_KEY=xxx\nQINIU_BASE_URL=xxx\n\n# 优云智算 (YouYun)\nYOUYUN_API_KEY=xxx\nYOUYUN_BASE_URL=xxx\n\n# 硅基流动 (SiliconFlow)\nSILICONFLOW_API_KEY=xxx\nSILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1\n\n# ============================================\n# Security\n# ============================================\nJWT_SECRET=change-this-to-a-secure-random-string\nCAPTCHA_SECRET=这里放一串强随机字符串\nCORS_ORIGIN=http://localhost:2037\n\n# ============================================\n# Email Service (Aliyun DirectMail)\n# 发件地址:accounts@email.1037solo.com(与 Platform 共用)\n# ============================================\nSMTP_HOST=smtpdm.aliyun.com\nSMTP_PORT=80\nSMTP_USER=xxx\nSMTP_PASS=xxx\n"}, "3429bd7f39709d60212ad39c34b79558b4fe617f": {"t": 1785767410.7194629, "n": 1856, "h": "b56496ab025ee85d", "c": "# ============================================\n# StudySolo Backend - Environment Variables Template\n# ============================================\n# Copy this file to .env and fill in real values\n# cp .env.example .env\n# ============================================\n\n# Server\nPORT=2038\nENVIRONMENT=development\n\n# Supabase Access Token (for MCP/CLI tools)\n# https://supabase.com/dashboard/account/tokens\nSUPABASE_ACCESS_TOKEN=sbp_xxx\n\n# Supabase Project Config\nSUPABASE_URL=https://your-project.supabase.co\nSUPABASE_SERVICE_ROLE_KEY=eyJxxx\n\n# GitHub Personal Access Token\nGITHUB_PERSONAL_ACCESS_TOKEN=github_pat_xxx\n\n# ============================================\n# AI Platform API Keys & Base URLs\n# ============================================\n\n# 火山引擎 (Volcengine)\nVOLCENGINE_API_KEY=xxx\nVOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3\n\n# 阿里云百炼 (DashScope)\nDASHSCOPE_API_KEY=xxx\nDASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n\n# DeepSeek\nDEEPSEEK_API_KEY=xxx\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# 月之暗面 (Moonshot)\nMOONSHOT_API_KEY=xxx\nMOONSHOT_BASE_URL=https://api.moonshot.cn/v1\n\n# 智谱AI (Zhipu)\nZHIPU_API_KEY=xxx\nZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4\n\n# 七牛云 (Qiniu)\nQINIU_API_KEY=xxx\nQINIU_BASE_URL=xxx\n\n# 优云智算 (YouYun)\nYOUYUN_API_KEY=xxx\nYOUYUN_BASE_URL=xxx\n\n# 硅基流动 (SiliconFlow)\nSILICONFLOW_API_KEY=xxx\nSILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1\n\n# ============================================\n# Security\n# ============================================\nJWT_SECRET=change-this-to-a-secure-random-string\nCORS_ORIGIN=http://localhost:2037\n\n# ============================================\n# Email Service (Aliyun DirectMail)\n# 发件地址:accounts@email.1037solo.com(与 Platform 共用)\n# ============================================\nSMTP_HOST=smtpdm.aliyun.com\nSMTP_PORT=80\nSMTP_USER=xxx\nSMTP_PASS=xxx\n"}, "68787dc8badc7aa500ef11d00a3f5ea33fb7cc2b": {"t": 1785767412.0229964, "n": 1857, "h": "8fea5b2b42618b9f", "c": "# ============================================\n# StudySolo Backend - Environment Variables Template\n# ============================================\n# Copy this file to .env and fill in real values\n# cp .env.example .env\n# ============================================\n\n# Server\nPORT=2038\nENVIRONMENT=development\n\n# Supabase Access Token (for MCP/CLI tools)\n# https://supabase.com/dashboard/account/tokens\nSUPABASE_ACCESS_TOKEN=sbp_xxx\n\n# Supabase Project Config\nSUPABASE_URL=https://your-project.supabase.co\nSUPABASE_SERVICE_ROLE_KEY=eyJxxx\n\n# GitHub Personal Access Token\nGITHUB_PERSONAL_ACCESS_TOKEN=github_pat_xxx\n\n# ============================================\n# AI Platform API Keys & Base URLs\n# ============================================\n\n# 火山引擎 (Volcengine)\nVOLCENGINE_API_KEY=xxx\nVOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3\n\n# 阿里云百炼 (DashScope)\nDASHSCOPE_API_KEY=xxx\nDASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n\n# DeepSeek\nDEEPSEEK_API_KEY=xxx\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# 月之暗面 (Moonshot)\nMOONSHOT_API_KEY=xxx\nMOONSHOT_BASE_URL=https://api.moonshot.cn/v1\n\n# 智谱AI (Zhipu)\nZHIPU_API_KEY=xxx\nZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4\n\n# 七牛云 (Qiniu)\nQINIU_API_KEY=xxx\nQINIU_BASE_URL=xxx\n\n# 优云智算 (YouYun)\nYOUYUN_API_KEY=xxx\nYOUYUN_BASE_URL=xxx\n\n# 硅基流动 (SiliconFlow)\nSILICONFLOW_API_KEY=xxx\nSILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1\n\n# ============================================\n# Security\n# ============================================\nJWT_SECRET=change-this-to-a-secure-random-string\nCORS_ORIGIN=http://localhost:2037\n\n# ============================================\n# Email Service (Aliyun DirectMail)\n# 发件地址:accounts@email.1037solo.com(与 Platform 共用)\n# ============================================\nSMTP_HOST=smtpdm.aliyun.com\nSMTP_PORT=465\nSMTP_USER=xxx\nSMTP_PASS=xxx\n"}, "a3d31f0277be51d1cc7347c32eed42eb7aea2469": {"t": 1785767413.646496, "n": 1807, "h": "fea365cee7e3a908", "c": "# ============================================\n# StudySolo Backend - Environment Variables Template\n# ============================================\n# Copy this file to .env and fill in real values\n# cp .env.example .env\n# ============================================\n\n# Server\nPORT=2038\nENVIRONMENT=development\n\n# Supabase Access Token (for MCP/CLI tools)\n# https://supabase.com/dashboard/account/tokens\nSUPABASE_ACCESS_TOKEN=sbp_xxx\n\n# Supabase Project Config\nSUPABASE_URL=https://your-project.supabase.co\nSUPABASE_SERVICE_ROLE_KEY=eyJxxx\n\n# GitHub Personal Access Token\nGITHUB_PERSONAL_ACCESS_TOKEN=github_pat_xxx\n\n# ============================================\n# AI Platform API Keys & Base URLs\n# ============================================\n\n# 火山引擎 (Volcengine)\nVOLCENGINE_API_KEY=xxx\nVOLCENGINE_BASE_URL=https://ark.cn-beijing.volces.com/api/v3\n\n# 阿里云百炼 (DashScope)\nDASHSCOPE_API_KEY=xxx\nDASHSCOPE_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1\n\n# DeepSeek\nDEEPSEEK_API_KEY=xxx\nDEEPSEEK_BASE_URL=https://api.deepseek.com/v1\n\n# 月之暗面 (Moonshot)\nMOONSHOT_API_KEY=xxx\nMOONSHOT_BASE_URL=https://api.moonshot.cn/v1\n\n# 智谱AI (Zhipu)\nZHIPU_API_KEY=xxx\nZHIPU_BASE_URL=https://open.bigmodel.cn/api/paas/v4\n\n# 七牛云 (Qiniu)\nQINIU_API_KEY=xxx\nQINIU_BASE_URL=xxx\n\n# 优云智算 (YouYun)\nYOUYUN_API_KEY=xxx\nYOUYUN_BASE_URL=xxx\n\n# 硅基流动 (SiliconFlow)\nSILICONFLOW_API_KEY=xxx\nSILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1\n\n# ============================================\n# Security\n# ============================================\nJWT_SECRET=change-this-to-a-secure-random-string\nCORS_ORIGIN=http://localhost:2037\n\n# ============================================\n# Email Service (Aliyun DirectMail)\n# ============================================\nSMTP_HOST=smtpdm.aliyun.com\nSMTP_PORT=465\nSMTP_USER=xxx\nSMTP_PASS=xxx\n"}}}}