实现支持 OpenAI 和 Anthropic 双协议的统一大模型 API 网关 MVP 版本,包含: - OpenAI 和 Anthropic 协议代理 - 供应商和模型管理 - 用量统计 - 前端配置界面
175 lines
5.5 KiB
Markdown
175 lines
5.5 KiB
Markdown
# 模型管理
|
||
|
||
## Purpose
|
||
|
||
TBD - 提供模型配置的管理功能,模型关联到供应商
|
||
|
||
## Requirements
|
||
|
||
### Requirement: 创建模型配置
|
||
|
||
网关 SHALL 允许为供应商创建新的模型配置。
|
||
|
||
#### Scenario: 使用有效数据创建模型
|
||
|
||
- **WHEN** 向 `/api/models` 发送 POST 请求,携带有效的模型数据(id, provider_id, model_name)
|
||
- **THEN** 网关 SHALL 在数据库中创建新的模型记录
|
||
- **THEN** 网关 SHALL 返回创建的模型,状态码为 201
|
||
- **THEN** 模型 SHALL 默认启用
|
||
|
||
#### Scenario: 使用不存在的供应商创建模型
|
||
|
||
- **WHEN** 向 `/api/models` 发送 POST 请求,携带不存在的 provider_id
|
||
- **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 指示缺少哪些字段
|
||
|
||
### Requirement: 列出所有模型
|
||
|
||
网关 SHALL 允许获取所有模型配置。
|
||
|
||
#### Scenario: 成功列出模型
|
||
|
||
- **WHEN** 向 `/api/models` 发送 GET 请求
|
||
- **THEN** 网关 SHALL 返回所有模型的列表
|
||
- **THEN** 每个模型 SHALL 包含 id, provider_id, model_name, enabled, created_at
|
||
|
||
#### Scenario: 列出模型时为空
|
||
|
||
- **WHEN** 向 `/api/models` 发送 GET 请求,且不存在模型
|
||
- **THEN** 网关 SHALL 返回空列表
|
||
|
||
### Requirement: 按供应商列出模型
|
||
|
||
网关 SHALL 允许获取特定供应商的模型。
|
||
|
||
#### Scenario: 列出存在供应商的模型
|
||
|
||
- **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)
|
||
|
||
### Requirement: 更新模型配置
|
||
|
||
网关 SHALL 允许更新现有模型配置。
|
||
|
||
#### Scenario: 使用有效数据更新模型
|
||
|
||
- **WHEN** 向 `/api/models/:id` 发送 PUT 请求,携带有效的模型数据
|
||
- **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 保留未更改的字段
|
||
|
||
### Requirement: 删除模型配置
|
||
|
||
网关 SHALL 允许删除模型配置。
|
||
|
||
#### Scenario: 删除存在的模型
|
||
|
||
- **WHEN** 向 `/api/models/:id` 发送 DELETE 请求,携带有效的模型 ID
|
||
- **THEN** 网关 SHALL 删除模型记录
|
||
- **THEN** 网关 SHALL 返回状态码 204 (No Content)
|
||
|
||
#### Scenario: 删除不存在的模型
|
||
|
||
- **WHEN** 向 `/api/models/:id` 发送 DELETE 请求,携带不存在的 ID
|
||
- **THEN** 网关 SHALL 返回错误,状态码为 404 (Not Found)
|
||
|
||
### Requirement: 启用和禁用模型
|
||
|
||
网关 SHALL 支持启用和禁用模型。
|
||
|
||
#### Scenario: 禁用模型
|
||
|
||
- **WHEN** 模型的 `enabled` 字段设置为 false
|
||
- **THEN** 网关 SHALL 不向该模型路由请求
|
||
- **THEN** 模型 SHALL 保留在数据库中
|
||
|
||
#### Scenario: 启用模型
|
||
|
||
- **WHEN** 已禁用模型的 `enabled` 字段设置为 true
|
||
- **THEN** 网关 SHALL 恢复向该模型路由请求
|
||
|
||
### Requirement: 验证模型配置
|
||
|
||
网关 SHALL 验证模型配置数据。
|
||
|
||
#### Scenario: 验证供应商存在
|
||
|
||
- **WHEN** 创建或更新模型时携带 provider_id
|
||
- **THEN** 网关 SHALL 验证供应商存在于数据库中
|
||
|
||
#### Scenario: 验证必需字段
|
||
|
||
- **WHEN** 创建或更新模型
|
||
- **THEN** 网关 SHALL 验证 id, provider_id 和 model_name 存在且非空
|
||
|
||
### Requirement: 支持透明的模型名称
|
||
|
||
网关 SHALL 使用模型名称透明传输,不做转换。
|
||
|
||
#### Scenario: 模型名称保留
|
||
|
||
- **WHEN** 模型配置了 model_name
|
||
- **THEN** 网关 SHALL 在路由请求时使用该确切名称
|
||
- **THEN** 网关 SHALL 不修改或转换模型名称
|
||
|
||
#### Scenario: 不同供应商的同名模型
|
||
|
||
- **WHEN** 多个供应商拥有相同 model_name 的模型
|
||
- **THEN** 每个模型 SHALL 通过其唯一 ID 和 provider_id 区分
|
||
- **THEN** 网关 SHALL 基于模型名称和供应商关联的组合进行路由
|
||
|
||
### Requirement: 随供应商级联删除
|
||
|
||
网关 SHALL 在删除关联供应商时删除模型。
|
||
|
||
#### Scenario: 供应商删除级联到模型
|
||
|
||
- **WHEN** 供应商被删除
|
||
- **THEN** 该供应商关联的所有模型 SHALL 自动删除
|