feat: 实现分层架构,包含 domain、service、repository 和 pkg 层
- 新增 domain 层:model、provider、route、stats 实体 - 新增 service 层:models、providers、routing、stats 业务逻辑 - 新增 repository 层:models、providers、stats 数据访问 - 新增 pkg 工具包:errors、logger、validator - 新增中间件:CORS、logging、recovery、request ID - 新增数据库迁移:初始 schema 和索引 - 新增单元测试和集成测试 - 新增规范文档:config-management、database-migration、error-handling、layered-architecture、middleware-system、request-validation、structured-logging、test-coverage - 移除 config 子包和 model_router(已迁移至分层架构)
This commit is contained in:
@@ -1,10 +1,6 @@
|
||||
# 模型管理
|
||||
# Model Management
|
||||
|
||||
## Purpose
|
||||
|
||||
TBD - 提供模型配置的管理功能,模型关联到供应商
|
||||
|
||||
## Requirements
|
||||
## MODIFIED Requirements
|
||||
|
||||
### Requirement: 创建模型配置
|
||||
|
||||
@@ -23,16 +19,7 @@ TBD - 提供模型配置的管理功能,模型关联到供应商
|
||||
- **THEN** 网关 SHALL 返回错误,状态码为 400 (Bad Request)
|
||||
- **THEN** 错误 SHALL 指示供应商不存在
|
||||
|
||||
#### Scenario: 使用重复 ID 创建模型
|
||||
|
||||
- **WHEN** 向 `/api/models` 发送 POST 请求,携带已存在的 ID
|
||||
- **THEN** 网关 SHALL 返回错误,状态码为 409 (Conflict)
|
||||
|
||||
#### Scenario: 创建模型时缺少必需字段
|
||||
|
||||
- **WHEN** 向 `/api/models` 发送 POST 请求,缺少必需字段(id, provider_id 或 model_name)
|
||||
- **THEN** 网关 SHALL 返回错误,状态码为 400 (Bad Request)
|
||||
- **THEN** 错误 SHALL 指示缺少哪些字段
|
||||
**变更说明:** handler 通过 ModelService 调用,数据访问通过 ModelRepository 和 ProviderRepository。API 接口保持不变。
|
||||
|
||||
### Requirement: 列出所有模型
|
||||
|
||||
@@ -44,10 +31,7 @@ TBD - 提供模型配置的管理功能,模型关联到供应商
|
||||
- **THEN** 网关 SHALL 返回所有模型的列表
|
||||
- **THEN** 每个模型 SHALL 包含 id, provider_id, model_name, enabled, created_at
|
||||
|
||||
#### Scenario: 列出模型时为空
|
||||
|
||||
- **WHEN** 向 `/api/models` 发送 GET 请求,且不存在模型
|
||||
- **THEN** 网关 SHALL 返回空列表
|
||||
**变更说明:** 数据访问从 config 包迁移到 ModelRepository。API 接口保持不变。
|
||||
|
||||
### Requirement: 按供应商列出模型
|
||||
|
||||
@@ -58,24 +42,7 @@ TBD - 提供模型配置的管理功能,模型关联到供应商
|
||||
- **WHEN** 向 `/api/models?provider_id=<provider_id>` 发送 GET 请求
|
||||
- **THEN** 网关 SHALL 返回指定供应商的模型列表
|
||||
|
||||
#### Scenario: 列出不存在供应商的模型
|
||||
|
||||
- **WHEN** 向 `/api/models?provider_id=<non_existent_id>` 发送 GET 请求
|
||||
- **THEN** 网关 SHALL 返回空列表
|
||||
|
||||
### Requirement: 获取特定模型
|
||||
|
||||
网关 SHALL 允许通过 ID 获取特定模型。
|
||||
|
||||
#### Scenario: 获取存在的模型
|
||||
|
||||
- **WHEN** 向 `/api/models/:id` 发送 GET 请求,携带有效的模型 ID
|
||||
- **THEN** 网关 SHALL 返回模型详情
|
||||
|
||||
#### Scenario: 获取不存在的模型
|
||||
|
||||
- **WHEN** 向 `/api/models/:id` 发送 GET 请求,携带不存在的 ID
|
||||
- **THEN** 网关 SHALL 返回错误,状态码为 404 (Not Found)
|
||||
**变更说明:** 通过 ModelService 和 ModelRepository 实现。API 接口保持不变。
|
||||
|
||||
### Requirement: 更新模型配置
|
||||
|
||||
@@ -87,22 +54,13 @@ TBD - 提供模型配置的管理功能,模型关联到供应商
|
||||
- **THEN** 网关 SHALL 更新数据库中的模型记录
|
||||
- **THEN** 网关 SHALL 返回更新后的模型
|
||||
|
||||
#### Scenario: 更新不存在的模型
|
||||
|
||||
- **WHEN** 向 `/api/models/:id` 发送 PUT 请求,携带不存在的 ID
|
||||
- **THEN** 网关 SHALL 返回错误,状态码为 404 (Not Found)
|
||||
|
||||
#### Scenario: 更新模型供应商
|
||||
|
||||
- **WHEN** 向 `/api/models/:id` 发送 PUT 请求,携带新的 provider_id
|
||||
- **THEN** 网关 SHALL 验证新供应商是否存在
|
||||
- **THEN** 网关 SHALL 更新模型的供应商关联
|
||||
|
||||
#### Scenario: 部分更新
|
||||
|
||||
- **WHEN** 向 `/api/models/:id` 发送 PUT 请求,仅包含部分字段
|
||||
- **THEN** 网关 SHALL 仅更新提供的字段
|
||||
- **THEN** 网关 SHALL 保留未更改的字段
|
||||
**变更说明:** 通过 ModelService、ModelRepository 和 ProviderRepository 实现。API 接口保持不变。
|
||||
|
||||
### Requirement: 删除模型配置
|
||||
|
||||
@@ -114,61 +72,38 @@ TBD - 提供模型配置的管理功能,模型关联到供应商
|
||||
- **THEN** 网关 SHALL 删除模型记录
|
||||
- **THEN** 网关 SHALL 返回状态码 204 (No Content)
|
||||
|
||||
#### Scenario: 删除不存在的模型
|
||||
**变更说明:** 通过 ModelService 和 ModelRepository 实现。API 接口保持不变。
|
||||
|
||||
- **WHEN** 向 `/api/models/:id` 发送 DELETE 请求,携带不存在的 ID
|
||||
- **THEN** 网关 SHALL 返回错误,状态码为 404 (Not Found)
|
||||
## ADDED Requirements
|
||||
|
||||
### Requirement: 启用和禁用模型
|
||||
### Requirement: 使用 service 层处理业务逻辑
|
||||
|
||||
网关 SHALL 支持启用和禁用模型。
|
||||
Handler SHALL 通过 ModelService 处理业务逻辑。
|
||||
|
||||
#### Scenario: 禁用模型
|
||||
#### Scenario: 调用 service 方法
|
||||
|
||||
- **WHEN** 模型的 `enabled` 字段设置为 false
|
||||
- **THEN** 网关 SHALL 不向该模型路由请求
|
||||
- **THEN** 模型 SHALL 保留在数据库中
|
||||
- **WHEN** handler 收到请求
|
||||
- **THEN** SHALL 调用对应的 ModelService 方法(Create、Get、List、Update、Delete)
|
||||
- **THEN** SHALL 使用 domain.Model 类型
|
||||
|
||||
#### Scenario: 启用模型
|
||||
|
||||
- **WHEN** 已禁用模型的 `enabled` 字段设置为 true
|
||||
- **THEN** 网关 SHALL 恢复向该模型路由请求
|
||||
|
||||
### Requirement: 验证模型配置
|
||||
|
||||
网关 SHALL 验证模型配置数据。
|
||||
|
||||
#### Scenario: 验证供应商存在
|
||||
|
||||
- **WHEN** 创建或更新模型时携带 provider_id
|
||||
- **THEN** 网关 SHALL 验证供应商存在于数据库中
|
||||
|
||||
#### Scenario: 验证必需字段
|
||||
#### Scenario: 供应商验证
|
||||
|
||||
- **WHEN** 创建或更新模型
|
||||
- **THEN** 网关 SHALL 验证 id, provider_id 和 model_name 存在且非空
|
||||
- **THEN** SHALL 在 service 层验证供应商存在
|
||||
- **THEN** SHALL 通过 ProviderRepository 查询供应商
|
||||
|
||||
### Requirement: 支持透明的模型名称
|
||||
### Requirement: 使用 repository 层访问数据
|
||||
|
||||
网关 SHALL 使用模型名称透明传输,不做转换。
|
||||
Service SHALL 通过 ModelRepository 访问数据。
|
||||
|
||||
#### Scenario: 模型名称保留
|
||||
#### Scenario: 调用 repository 方法
|
||||
|
||||
- **WHEN** 模型配置了 model_name
|
||||
- **THEN** 网关 SHALL 在路由请求时使用该确切名称
|
||||
- **THEN** 网关 SHALL 不修改或转换模型名称
|
||||
- **WHEN** service 处理业务逻辑
|
||||
- **THEN** SHALL 调用对应的 ModelRepository 方法
|
||||
- **THEN** SHALL 使用 domain.Model 类型
|
||||
|
||||
#### Scenario: 不同供应商的同名模型
|
||||
#### Scenario: 数据验证
|
||||
|
||||
- **WHEN** 多个供应商拥有相同 model_name 的模型
|
||||
- **THEN** 每个模型 SHALL 通过其唯一 ID 和 provider_id 区分
|
||||
- **THEN** 网关 SHALL 基于模型名称和供应商关联的组合进行路由
|
||||
|
||||
### Requirement: 随供应商级联删除
|
||||
|
||||
网关 SHALL 在删除关联供应商时删除模型。
|
||||
|
||||
#### Scenario: 供应商删除级联到模型
|
||||
|
||||
- **WHEN** 供应商被删除
|
||||
- **THEN** 该供应商关联的所有模型 SHALL 自动删除
|
||||
- **WHEN** 创建或更新模型
|
||||
- **THEN** SHALL 在 service 层验证业务规则
|
||||
- **THEN** SHALL 在 repository 层执行数据库操作
|
||||
|
||||
Reference in New Issue
Block a user