Files
Alfred/openspec/changes/add-model-management/tasks.md
lanyuanxiaoyao 933c2133f0 feat: 新增模型管理功能(供应商 + 模型 CRUD)
- 新增 providers/models 数据库表、迁移和数据访问层
- 新增 15 个后端 API 路由(供应商/模型 CRUD + 连通性测试)
- 新增 AI 服务层(registry.ts: buildProviderRegistry + testProviderConnection)
- 新增前端模型管理页面(Tabs: 供应商/模型,含表格、表单、工具栏)
- 新增前端 hooks(use-providers, use-models)
- 新增共享类型和 MODEL_CAPABILITIES 常量
- 新增 10 个测试文件(66 个测试用例,4 个因 bun test ESM 兼容问题待修复)
- 更新开发文档(architecture, backend, frontend)
- 附带 apply-review 修复:统一错误响应、提取共享常量、清理重复测试

注意:registry.test.ts 中 4 个测试因 bun test 无法解析
createProviderRegistry ESM 导出而失败,详情见 context.md
2026-05-29 12:40:10 +08:00

90 lines
6.6 KiB
Markdown
Raw 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.
## 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`,补充模型管理页面组件说明