1
0
Files
nex/openspec/specs/model-management/spec.md
lanyuanxiaoyao 915b004924 feat: 初始化 AI Gateway 项目
实现支持 OpenAI 和 Anthropic 双协议的统一大模型 API 网关 MVP 版本,包含:
- OpenAI 和 Anthropic 协议代理
- 供应商和模型管理
- 用量统计
- 前端配置界面
2026-04-15 16:53:28 +08:00

175 lines
5.5 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.
# 模型管理
## 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 自动删除