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

6.6 KiB
Raw Blame History

1. 上下文审查

  • 1.1 阅读 design.md识别范围、需求、决策、执行约束和待解决问题
  • 1.2 审查影响范围中列出的相关文件:src/server/db/schema.tssrc/server/db/projects.tssrc/server/server.tssrc/shared/api.tssrc/web/consoles/admin/menu.tsxsrc/web/routes.tsxsrc/web/pages/projects/
  • 1.3 审查现有测试模式:tests/server/routes/projects.test.tstests/server/db/projects.test.tstests/web/hooks/use-projects.test.tstests/web/routes/projects.test.tsx

2. 基础层:依赖安装与类型定义

  • 2.1 使用 bun add ai @ai-sdk/openai @ai-sdk/anthropic @ai-sdk/openai-compatible 安装 Vercel AI SDK 依赖
  • 2.2 在 src/shared/api.ts 新增供应商和模型相关类型定义ProviderType、ModelCapability、Provider 相关请求/响应类型、Model 相关请求/响应类型)
  • 2.3 新建 src/server/ai/types.ts,定义 AI 层专用类型ProviderType、ModelCapability、AIRegistryConfig 等)

3. 数据库层Schema 与 Migration

  • 3.1 在 src/server/db/schema.ts 新增 providers 表定义id、name、type、baseUrl、apiKey、enabled、createdAt、updatedAt
  • 3.2 在 src/server/db/schema.ts 新增 models 表定义id、name、providerId、modelId、capabilities、contextLength、maxOutputTokens、enabled、createdAt、updatedAt
  • 3.3 使用 bunx drizzle-kit generate 生成 migration SQL 文件
  • 3.4 验证 migration SQL 文件正确性(表结构、索引、外键约束)

4. 数据访问层

  • 4.1 新建 src/server/db/providers.ts,实现供应商 CRUD 数据访问函数create、list、get、update、delete、enable、disable遵循 projects.ts 模式
  • 4.2 新建 src/server/db/models.ts,实现模型 CRUD 数据访问函数create、list、get、update、delete、enable、disable包含按 providerId 查询和关联检查

5. 后端路由层

  • 5.1 新建 src/server/routes/providers/create.tsPOST /api/providers
  • 5.2 新建 src/server/routes/providers/list.tsGET /api/providers
  • 5.3 新建 src/server/routes/providers/get.tsGET /api/providers/:id
  • 5.4 新建 src/server/routes/providers/update.tsPATCH /api/providers/:id
  • 5.5 新建 src/server/routes/providers/delete.tsDELETE /api/providers/:id有关联模型时阻止删除
  • 5.6 新建 src/server/routes/providers/enable.tsPOST /api/providers/:id/enable
  • 5.7 新建 src/server/routes/providers/disable.tsPOST /api/providers/:id/disable
  • 5.8 新建 src/server/routes/providers/test.tsPOST /api/providers/:id/test使用 AI SDK generateText 测试连通性)
  • 5.9 新建 src/server/routes/models/create.tsPOST /api/models
  • 5.10 新建 src/server/routes/models/list.tsGET /api/models支持按 providerId 筛选)
  • 5.11 新建 src/server/routes/models/get.tsGET /api/models/:id
  • 5.12 新建 src/server/routes/models/update.tsPATCH /api/models/:id
  • 5.13 新建 src/server/routes/models/delete.tsDELETE /api/models/:id
  • 5.14 新建 src/server/routes/models/enable.tsPOST /api/models/:id/enable
  • 5.15 新建 src/server/routes/models/disable.tsPOST /api/models/:id/disable
  • 5.16 在 src/server/server.ts 中注册所有新路由(懒加载导入)

6. AI 服务层

  • 6.1 新建 src/server/ai/registry.ts,实现 buildProviderRegistry(db)(从 DB 查询启用的供应商构建 AI SDK Provider Registry模型通过 registry.languageModel('providerId:modelId') 获取)和 testProviderConnection(config)(使用 generateText 测试连通性)

7. 前端Hooks 与路由

  • 7.1 新建 src/web/hooks/use-providers.ts,实现供应商 CRUD 的 TanStack React Query hooks
  • 7.2 新建 src/web/hooks/use-models.ts,实现模型 CRUD 的 TanStack React Query hooks
  • 7.3 在 src/web/consoles/admin/menu.tsx 新增"模型管理"菜单项,图标使用 antd 的 RobotOutlined 或类似图标
  • 7.4 在 src/web/routes.tsx 新增 /models 路由,指向 AdminConsoleLayout 下的模型管理页面

8. 前端:页面与组件

  • 8.1 新建 src/web/pages/models/index.tsx,使用 antd Tabs 实现供应商/模型双标签页布局
  • 8.2 新建 src/web/pages/models/components/ProviderTable.tsx实现供应商列表表格名称、类型、baseURL、状态、操作
  • 8.3 新建 src/web/pages/models/components/ProviderFormModal.tsx,实现供应商创建/编辑表单弹窗name、type Select 默认 openai-compatible、apiKey Password 输入、baseURL 不设默认值)
  • 8.4 新建 src/web/pages/models/components/ModelTable.tsx实现模型列表表格名称、供应商、modelId、能力标签、状态、操作
  • 8.5 新建 src/web/pages/models/components/ModelFormModal.tsx,实现模型创建/编辑表单弹窗name、provider Select、modelId、capabilities Checkbox.Group、contextLength、maxOutputTokens 可选输入、连通性测试按钮)

9. 测试:后端

  • 9.1 编写 tests/server/db/providers.test.ts,覆盖供应商 CRUD 和启用/禁用数据访问函数
  • 9.2 编写 tests/server/db/models.test.ts,覆盖模型 CRUD、启用/禁用和关联检查数据访问函数
  • 9.3 编写 tests/server/routes/providers.test.ts覆盖供应商路由的请求验证、CRUD 操作和连通性测试
  • 9.4 编写 tests/server/routes/models.test.ts,覆盖模型路由的请求验证和 CRUD 操作
  • 9.5 编写 tests/server/ai/registry.test.ts,覆盖 AI 注册表构建逻辑

10. 测试:前端

  • 10.1 编写 tests/web/hooks/use-providers.test.ts,覆盖供应商 hooks 的 query 和 mutation
  • 10.2 编写 tests/web/hooks/use-models.test.ts,覆盖模型 hooks 的 query 和 mutation
  • 10.3 编写 tests/web/routes/models.test.tsx,覆盖模型管理页面路由和渲染
  • 10.4 编写 tests/web/components/ProviderTable.test.tsx,覆盖供应商表格渲染和交互
  • 10.5 编写 tests/web/components/ModelTable.test.tsx,覆盖模型表格渲染和交互

11. 质量保障

  • 11.1 运行全部测试(bun test),确保无失败
  • 11.2 运行 lint 检查(bun run lint),确保无错误
  • 11.3 运行格式检查(bun run format:check),确保代码格式正确

12. 文档

  • 12.1 执行文档影响分析:评估本次变更对 docs/ 下各文档的影响
  • 12.2 更新 docs/development/backend.md,补充 AI 服务层架构说明(src/server/ai/ 目录结构和职责)
  • 12.3 更新 docs/development/frontend.md,补充模型管理页面组件说明