- 新增 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(已迁移至分层架构)
133 lines
3.8 KiB
Markdown
133 lines
3.8 KiB
Markdown
# Request Validation
|
||
|
||
## ADDED Requirements
|
||
|
||
### Requirement: 使用 validator 库
|
||
|
||
系统 SHALL 使用 go-playground/validator 进行请求验证。
|
||
|
||
#### Scenario: 验证器初始化
|
||
|
||
- **WHEN** 应用启动
|
||
- **THEN** SHALL 初始化 validator 实例
|
||
- **THEN** SHALL 注册自定义验证规则
|
||
|
||
#### Scenario: 验证规则定义
|
||
|
||
- **WHEN** 定义请求结构体
|
||
- **THEN** SHALL 使用 struct tag 定义验证规则
|
||
- **THEN** SHALL 支持必需字段、范围、格式等验证
|
||
|
||
### Requirement: 验证 OpenAI 请求
|
||
|
||
系统 SHALL 验证 OpenAI ChatCompletionRequest。
|
||
|
||
#### Scenario: 必需字段验证
|
||
|
||
- **WHEN** 收到 OpenAI 请求
|
||
- **THEN** SHALL 验证 model 字段不为空
|
||
- **THEN** SHALL 验证 messages 字段不为空且至少有一条消息
|
||
|
||
#### Scenario: 参数范围验证
|
||
|
||
- **WHEN** 收到 OpenAI 请求
|
||
- **THEN** SHALL 验证 temperature 范围在 [0, 2]
|
||
- **THEN** SHALL 验证 max_tokens 大于 0
|
||
- **THEN** SHALL 验证 top_p 范围在 (0, 1]
|
||
- **THEN** SHALL 验证 frequency_penalty 范围在 [-2, 2]
|
||
- **THEN** SHALL 验证 presence_penalty 范围在 [-2, 2]
|
||
|
||
#### Scenario: 消息内容验证
|
||
|
||
- **WHEN** 验证 messages 字段
|
||
- **THEN** SHALL 验证每条消息的 role 有效(system、user、assistant、tool)
|
||
- **THEN** SHALL 验证 content 不为空
|
||
|
||
### Requirement: 验证 Anthropic 请求
|
||
|
||
系统 SHALL 验证 Anthropic MessagesRequest。
|
||
|
||
#### Scenario: 必需字段验证
|
||
|
||
- **WHEN** 收到 Anthropic 请求
|
||
- **THEN** SHALL 验证 model 字段不为空
|
||
- **THEN** SHALL 验证 messages 字段不为空且至少有一条消息
|
||
- **THEN** SHALL 验证 max_tokens 大于 0(或使用默认值)
|
||
|
||
#### Scenario: 参数范围验证
|
||
|
||
- **WHEN** 收到 Anthropic 请求
|
||
- **THEN** SHALL 验证 temperature 范围在 [0, 1]
|
||
- **THEN** SHALL 验证 top_p 范围在 (0, 1]
|
||
|
||
#### Scenario: 消息内容验证
|
||
|
||
- **WHEN** 验证 messages 字段
|
||
- **THEN** SHALL 验证每条消息的 role 有效(user、assistant)
|
||
- **THEN** SHALL 验证 content 数组不为空
|
||
|
||
### Requirement: 验证管理 API 请求
|
||
|
||
系统 SHALL 验证管理 API 请求。
|
||
|
||
#### Scenario: Provider 创建验证
|
||
|
||
- **WHEN** 创建 Provider
|
||
- **THEN** SHALL 验证 id、name、api_key、base_url 字段不为空
|
||
- **THEN** SHALL 验证 base_url 格式有效(URL 格式)
|
||
- **THEN** SHALL 验证 id 格式(字母、数字、下划线、连字符)
|
||
|
||
#### Scenario: Model 创建验证
|
||
|
||
- **WHEN** 创建 Model
|
||
- **THEN** SHALL 验证 id、provider_id、model_name 字段不为空
|
||
- **THEN** SHALL 验证 provider_id 存在
|
||
|
||
#### Scenario: 更新请求验证
|
||
|
||
- **WHEN** 更新资源
|
||
- **THEN** SHALL 验证至少提供一个可更新字段
|
||
- **THEN** SHALL 验证字段值有效性
|
||
|
||
### Requirement: 返回友好的验证错误
|
||
|
||
系统 SHALL 返回友好的验证错误响应。
|
||
|
||
#### Scenario: 错误消息格式
|
||
|
||
- **WHEN** 验证失败
|
||
- **THEN** SHALL 返回 400 状态码
|
||
- **THEN** SHALL 返回详细的错误消息
|
||
- **THEN** SHALL 指示哪些字段验证失败
|
||
|
||
#### Scenario: 多字段错误
|
||
|
||
- **WHEN** 多个字段验证失败
|
||
- **THEN** SHALL 返回所有验证错误
|
||
- **THEN** SHALL 使用结构化格式(字段名 → 错误消息)
|
||
|
||
#### Scenario: 国际化支持
|
||
|
||
- **WHEN** 返回验证错误(未来)
|
||
- **THEN** SHALL 支持错误消息国际化
|
||
- **THEN** SHALL 使用错误码作为国际化 key
|
||
|
||
注:当前版本使用中文错误消息。
|
||
|
||
### Requirement: 在 handler 中应用验证
|
||
|
||
系统 SHALL 在 handler 中应用验证。
|
||
|
||
#### Scenario: 验证中间件
|
||
|
||
- **WHEN** 使用验证中间件
|
||
- **THEN** SHALL 在请求解析后立即验证
|
||
- **THEN** SHALL 在验证失败时提前返回错误
|
||
- **THEN** SHALL 避免执行后续处理逻辑
|
||
|
||
#### Scenario: 验证时机
|
||
|
||
- **WHEN** 处理请求
|
||
- **THEN** SHALL 在 handler 函数开始时验证
|
||
- **THEN** SHALL 在验证通过后才执行业务逻辑
|