1
0
Files
nex/openspec/specs/request-validation/spec.md
lanyuanxiaoyao f18904af1e 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(已迁移至分层架构)
2026-04-16 00:47:20 +08:00

133 lines
3.8 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.
# 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 在验证通过后才执行业务逻辑