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
This commit is contained in:
129
context.md
Normal file
129
context.md
Normal file
@@ -0,0 +1,129 @@
|
||||
# add-model-management 当前进度
|
||||
|
||||
## 变更信息
|
||||
|
||||
- **Change**: `openspec/changes/add-model-management/`
|
||||
- **Workflow**: fast-drive (design.md + tasks.md)
|
||||
- **状态**: apply-review 修复进行中,有一个阻塞问题
|
||||
|
||||
## 已完成工作
|
||||
|
||||
### 核心功能(54/54 tasks 全部标记 [x])
|
||||
|
||||
所有代码已实现并通过验证:
|
||||
|
||||
- DB Schema: providers + models 表(含 FK、唯一索引)
|
||||
- 数据访问层: `src/server/db/providers.ts`, `src/server/db/models.ts`
|
||||
- 后端路由: 15 个路由(providers 8 + models 7)注册在 `src/server/server.ts`
|
||||
- AI 服务层: `src/server/ai/registry.ts`(含 `testProviderConnection` + `buildProviderRegistry`), `src/server/ai/types.ts`
|
||||
- 共享类型: `src/shared/api.ts`(含 `MODEL_CAPABILITIES` 常量)
|
||||
- 前端 Hooks: `src/web/hooks/use-providers.ts`, `src/web/hooks/use-models.ts`
|
||||
- 前端页面: `src/web/pages/models/`(6 个组件 + index)
|
||||
- 前端路由+菜单: `src/web/routes.tsx`, `src/web/consoles/admin/menu.tsx`
|
||||
- 测试: 10 个测试文件(66 个测试用例)
|
||||
- 文档: backend.md, frontend.md, architecture.md, README.md 已更新
|
||||
|
||||
### apply-review 修复(进行中)
|
||||
|
||||
已完成的修复:
|
||||
|
||||
- ✅ **registry.ts 补充 `buildProviderRegistry`**: 新增从 DB 查询启用供应商构建 AI SDK Provider Registry 的函数
|
||||
- ✅ **Q1 统一错误响应**: `providers/get.ts` 和 `models/get.ts` 改用 `createApiError()`
|
||||
- ✅ **Q2 提取共享常量**: `MODEL_CAPABILITIES` 从 `shared/api.ts` 导出,`models/create.ts` 和 `models/update.ts` 不再重复定义
|
||||
- ✅ **Q3 清理重复测试**: `tests/web/hooks/use-models.test.ts` 移除了残留的 provider 相关测试
|
||||
- ✅ **文档修正**: `docs/development/backend.md` 中 `buildProviderRegistry` 签名已更新为 `(db)` 而非 `(config)`
|
||||
- ✅ **design.md + tasks.md 更新**: tasks 6.1 和 design 执行计划第 12 项已反映 registry 完整范围
|
||||
|
||||
## 阻塞问题
|
||||
|
||||
### `bun test` 无法解析 `createProviderRegistry`
|
||||
|
||||
**现象**: 运行 `bun test tests/server/ai/registry.test.ts` 时报错:
|
||||
|
||||
```
|
||||
SyntaxError: Export named 'createProviderRegistry' not found in module '...\node_modules\ai\dist\index.mjs'
|
||||
```
|
||||
|
||||
**已确认**:
|
||||
|
||||
- `createProviderRegistry` 在 `node_modules/ai/dist/index.mjs` 中存在
|
||||
- `bun -e "import { createProviderRegistry } from 'ai'; ..."` 正常工作
|
||||
- `bun run typecheck` 通过(类型存在)
|
||||
- 问题仅出现在 `bun test` 环境
|
||||
- 此前 registry.ts 只导入 `generateText` 时测试正常;添加 `createProviderRegistry` 后全部 registry 测试失败
|
||||
|
||||
**可能原因**: Bun 1.3.14 的 `bun test` ESM 模块解析缓存问题,或 `mock.module("ai", ...)` 与静态导入 `createProviderRegistry` 的交互问题
|
||||
|
||||
**建议尝试方向**:
|
||||
|
||||
1. 清除 Bun 缓存: `rm -rf node_modules/.cache`
|
||||
2. 升级 Bun 版本
|
||||
3. 改用动态导入 `const { createProviderRegistry } = await import("ai")` 在 `buildProviderRegistry` 函数内部
|
||||
4. 将 `buildProviderRegistry` 的测试改为不 mock `ai` 模块(因为 `createProviderRegistry` 不需要 mock,只有 `generateText` 需要)
|
||||
5. 将 registry 拆为两个文件:`connection-test.ts`(mock generateText)和 `registry.ts`(不 mock)
|
||||
|
||||
## 质量状态
|
||||
|
||||
- `bun run typecheck`: ✅ 0 errors
|
||||
- `bun run lint`: ✅ 0 errors(修复后)
|
||||
- 模型管理相关测试: ❌ 62/66 pass(4 个 registry 测试因上述问题失败,其他 62 个全部通过)
|
||||
- 已有 projects.test.tsx 有一个预存超时问题(与本次变更无关)
|
||||
|
||||
## 文件清单
|
||||
|
||||
### 新增文件(untracked)
|
||||
|
||||
```
|
||||
drizzle/0001_wooden_rocket_raccoon.sql
|
||||
drizzle/meta/0001_snapshot.json
|
||||
src/server/ai/registry.ts
|
||||
src/server/ai/types.ts
|
||||
src/server/db/models.ts
|
||||
src/server/db/providers.ts
|
||||
src/server/routes/models/{create,delete,disable,enable,get,list,update}.ts
|
||||
src/server/routes/providers/{create,delete,disable,enable,get,list,test,update}.ts
|
||||
src/web/hooks/use-models.ts
|
||||
src/web/hooks/use-providers.ts
|
||||
src/web/pages/models/index.tsx
|
||||
src/web/pages/models/components/{ModelFormModal,ModelTable,ModelToolbar,ProviderFormModal,ProviderTable,ProviderToolbar}.tsx
|
||||
tests/server/ai/registry.test.ts
|
||||
tests/server/db/models.test.ts
|
||||
tests/server/db/providers.test.ts
|
||||
tests/server/routes/models.test.ts
|
||||
tests/server/routes/providers.test.ts
|
||||
tests/web/components/ModelTable.test.tsx
|
||||
tests/web/components/ProviderTable.test.tsx
|
||||
tests/web/hooks/use-models.test.ts
|
||||
tests/web/hooks/use-providers.test.ts
|
||||
tests/web/routes/models.test.tsx
|
||||
```
|
||||
|
||||
### 修改文件(modified)
|
||||
|
||||
```
|
||||
bun.lock
|
||||
docs/development/README.md
|
||||
docs/development/architecture.md
|
||||
docs/development/backend.md
|
||||
docs/development/frontend.md
|
||||
drizzle/meta/_journal.json
|
||||
package.json
|
||||
src/server/db/schema.ts
|
||||
src/server/server.ts
|
||||
src/shared/api.ts
|
||||
src/web/consoles/admin/menu.tsx
|
||||
src/web/routes.tsx
|
||||
```
|
||||
|
||||
### OpenSpec 变更文档
|
||||
|
||||
```
|
||||
openspec/changes/add-model-management/design.md
|
||||
openspec/changes/add-model-management/tasks.md
|
||||
```
|
||||
|
||||
## 后续步骤
|
||||
|
||||
1. 解决 `bun test` 与 `createProviderRegistry` 的兼容问题
|
||||
2. 确保所有 66+ 测试通过
|
||||
3. 归档变更(`/opsx-archive`)
|
||||
Reference in New Issue
Block a user