## 1. 上下文审查 - [x] 1.1 阅读 design.md,识别范围、需求、决策、执行约束和待解决问题 - [x] 1.2 审查影响范围中列出的相关文件:`src/server/db/schema.ts`、`src/server/db/projects.ts`、`src/server/server.ts`、`src/shared/api.ts`、`src/web/consoles/admin/menu.tsx`、`src/web/routes.tsx`、`src/web/pages/projects/` - [x] 1.3 审查现有测试模式:`tests/server/routes/projects.test.ts`、`tests/server/db/projects.test.ts`、`tests/web/hooks/use-projects.test.ts`、`tests/web/routes/projects.test.tsx` ## 2. 基础层:依赖安装与类型定义 - [x] 2.1 使用 `bun add ai @ai-sdk/openai @ai-sdk/anthropic @ai-sdk/openai-compatible` 安装 Vercel AI SDK 依赖 - [x] 2.2 在 `src/shared/api.ts` 新增供应商和模型相关类型定义(ProviderType、ModelCapability、Provider 相关请求/响应类型、Model 相关请求/响应类型) - [x] 2.3 新建 `src/server/ai/types.ts`,定义 AI 层专用类型(ProviderType、ModelCapability、AIRegistryConfig 等) ## 3. 数据库层:Schema 与 Migration - [x] 3.1 在 `src/server/db/schema.ts` 新增 providers 表定义(id、name、type、baseUrl、apiKey、enabled、createdAt、updatedAt) - [x] 3.2 在 `src/server/db/schema.ts` 新增 models 表定义(id、name、providerId、modelId、capabilities、contextLength、maxOutputTokens、enabled、createdAt、updatedAt) - [x] 3.3 使用 `bunx drizzle-kit generate` 生成 migration SQL 文件 - [x] 3.4 验证 migration SQL 文件正确性(表结构、索引、外键约束) ## 4. 数据访问层 - [x] 4.1 新建 `src/server/db/providers.ts`,实现供应商 CRUD 数据访问函数(create、list、get、update、delete、enable、disable),遵循 `projects.ts` 模式 - [x] 4.2 新建 `src/server/db/models.ts`,实现模型 CRUD 数据访问函数(create、list、get、update、delete、enable、disable),包含按 providerId 查询和关联检查 ## 5. 后端路由层 - [x] 5.1 新建 `src/server/routes/providers/create.ts`(POST /api/providers) - [x] 5.2 新建 `src/server/routes/providers/list.ts`(GET /api/providers) - [x] 5.3 新建 `src/server/routes/providers/get.ts`(GET /api/providers/:id) - [x] 5.4 新建 `src/server/routes/providers/update.ts`(PATCH /api/providers/:id) - [x] 5.5 新建 `src/server/routes/providers/delete.ts`(DELETE /api/providers/:id,有关联模型时阻止删除) - [x] 5.6 新建 `src/server/routes/providers/enable.ts`(POST /api/providers/:id/enable) - [x] 5.7 新建 `src/server/routes/providers/disable.ts`(POST /api/providers/:id/disable) - [x] 5.8 新建 `src/server/routes/providers/test.ts`(POST /api/providers/:id/test,使用 AI SDK generateText 测试连通性) - [x] 5.9 新建 `src/server/routes/models/create.ts`(POST /api/models) - [x] 5.10 新建 `src/server/routes/models/list.ts`(GET /api/models,支持按 providerId 筛选) - [x] 5.11 新建 `src/server/routes/models/get.ts`(GET /api/models/:id) - [x] 5.12 新建 `src/server/routes/models/update.ts`(PATCH /api/models/:id) - [x] 5.13 新建 `src/server/routes/models/delete.ts`(DELETE /api/models/:id) - [x] 5.14 新建 `src/server/routes/models/enable.ts`(POST /api/models/:id/enable) - [x] 5.15 新建 `src/server/routes/models/disable.ts`(POST /api/models/:id/disable) - [x] 5.16 在 `src/server/server.ts` 中注册所有新路由(懒加载导入) ## 6. AI 服务层 - [x] 6.1 新建 `src/server/ai/registry.ts`,实现 `buildProviderRegistry(db)`(从 DB 查询启用的供应商构建 AI SDK Provider Registry,模型通过 `registry.languageModel('providerId:modelId')` 获取)和 `testProviderConnection(config)`(使用 generateText 测试连通性) ## 7. 前端:Hooks 与路由 - [x] 7.1 新建 `src/web/hooks/use-providers.ts`,实现供应商 CRUD 的 TanStack React Query hooks - [x] 7.2 新建 `src/web/hooks/use-models.ts`,实现模型 CRUD 的 TanStack React Query hooks - [x] 7.3 在 `src/web/consoles/admin/menu.tsx` 新增"模型管理"菜单项,图标使用 antd 的 RobotOutlined 或类似图标 - [x] 7.4 在 `src/web/routes.tsx` 新增 `/models` 路由,指向 AdminConsoleLayout 下的模型管理页面 ## 8. 前端:页面与组件 - [x] 8.1 新建 `src/web/pages/models/index.tsx`,使用 antd Tabs 实现供应商/模型双标签页布局 - [x] 8.2 新建 `src/web/pages/models/components/ProviderTable.tsx`,实现供应商列表表格(名称、类型、baseURL、状态、操作) - [x] 8.3 新建 `src/web/pages/models/components/ProviderFormModal.tsx`,实现供应商创建/编辑表单弹窗(name、type Select 默认 openai-compatible、apiKey Password 输入、baseURL 不设默认值) - [x] 8.4 新建 `src/web/pages/models/components/ModelTable.tsx`,实现模型列表表格(名称、供应商、modelId、能力标签、状态、操作) - [x] 8.5 新建 `src/web/pages/models/components/ModelFormModal.tsx`,实现模型创建/编辑表单弹窗(name、provider Select、modelId、capabilities Checkbox.Group、contextLength、maxOutputTokens 可选输入、连通性测试按钮) ## 9. 测试:后端 - [x] 9.1 编写 `tests/server/db/providers.test.ts`,覆盖供应商 CRUD 和启用/禁用数据访问函数 - [x] 9.2 编写 `tests/server/db/models.test.ts`,覆盖模型 CRUD、启用/禁用和关联检查数据访问函数 - [x] 9.3 编写 `tests/server/routes/providers.test.ts`,覆盖供应商路由的请求验证、CRUD 操作和连通性测试 - [x] 9.4 编写 `tests/server/routes/models.test.ts`,覆盖模型路由的请求验证和 CRUD 操作 - [x] 9.5 编写 `tests/server/ai/registry.test.ts`,覆盖 AI 注册表构建逻辑 ## 10. 测试:前端 - [x] 10.1 编写 `tests/web/hooks/use-providers.test.ts`,覆盖供应商 hooks 的 query 和 mutation - [x] 10.2 编写 `tests/web/hooks/use-models.test.ts`,覆盖模型 hooks 的 query 和 mutation - [x] 10.3 编写 `tests/web/routes/models.test.tsx`,覆盖模型管理页面路由和渲染 - [x] 10.4 编写 `tests/web/components/ProviderTable.test.tsx`,覆盖供应商表格渲染和交互 - [x] 10.5 编写 `tests/web/components/ModelTable.test.tsx`,覆盖模型表格渲染和交互 ## 11. 质量保障 - [x] 11.1 运行全部测试(`bun test`),确保无失败 - [x] 11.2 运行 lint 检查(`bun run lint`),确保无错误 - [x] 11.3 运行格式检查(`bun run format:check`),确保代码格式正确 ## 12. 文档 - [x] 12.1 执行文档影响分析:评估本次变更对 docs/ 下各文档的影响 - [x] 12.2 更新 `docs/development/backend.md`,补充 AI 服务层架构说明(`src/server/ai/` 目录结构和职责) - [x] 12.3 更新 `docs/development/frontend.md`,补充模型管理页面组件说明