1
0
Files
nex/openspec/specs/usage-statistics/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

3.7 KiB
Raw Blame History

Usage Statistics

MODIFIED Requirements

Requirement: 记录请求统计

网关 SHALL 为每次 API 调用记录请求统计。

Scenario: 记录成功请求

  • WHEN 请求成功转发到供应商
  • THEN 网关 SHALL 增加该供应商和模型的请求计数
  • THEN 网关 SHALL 记录当前日期的统计

Scenario: 记录流式请求

  • WHEN 流式请求成功完成
  • THEN 网关 SHALL 增加该供应商和模型的请求计数
  • THEN 网关 SHALL 在流结束后记录统计

变更说明: 统计记录通过 StatsService 调用,数据访问通过 StatsRepository。API 接口保持不变。

Requirement: 按供应商查询统计

网关 SHALL 允许按供应商过滤查询统计。

Scenario: 查询特定供应商的统计

  • WHEN/api/stats?provider_id=<provider_id> 发送 GET 请求
  • THEN 网关 SHALL 仅返回指定供应商的统计

变更说明: 通过 StatsService 和 StatsRepository 实现。API 接口保持不变。

Requirement: 按模型查询统计

网关 SHALL 允许按模型过滤查询统计。

Scenario: 查询特定模型的统计

  • WHEN/api/stats?model_name=<model_name> 发送 GET 请求
  • THEN 网关 SHALL 仅返回指定模型的统计

变更说明: 通过 StatsService 和 StatsRepository 实现。API 接口保持不变。

Requirement: 按日期范围查询统计

网关 SHALL 允许在日期范围内查询统计。

Scenario: 使用日期范围查询统计

  • WHEN/api/stats?start=<start_date>&end=<end_date> 发送 GET 请求
  • THEN 网关 SHALL 仅返回指定范围内的日期统计
  • THEN 日期格式 SHALL 为 YYYY-MM-DD

变更说明: 通过 StatsService 和 StatsRepository 实现。API 接口保持不变。

Requirement: 聚合统计

网关 SHALL 按日期聚合统计。

Scenario: 同一天多次请求

  • WHEN 同一天对同一供应商和模型发起多次请求
  • THEN 网关 SHALL 为该天维护单条统计记录
  • THEN 请求计数 SHALL 为所有请求的总和

变更说明: 聚合逻辑在 StatsRepository 中实现。API 接口保持不变。

Requirement: 支持并发统计记录

网关 SHALL 支持并发请求统计记录而无冲突。

Scenario: 并发请求

  • WHEN 同时处理多个并发请求
  • THEN 网关 SHALL 正确为每个请求增加请求计数
  • THEN 不 SHALL 因并发写入而丢失统计

变更说明: 并发控制在 StatsRepository 中通过数据库事务实现。API 接口保持不变。

ADDED Requirements

Requirement: 使用 service 层处理业务逻辑

Handler SHALL 通过 StatsService 处理业务逻辑。

Scenario: 调用 service 方法

  • WHEN handler 收到统计查询请求
  • THEN SHALL 调用对应的 StatsService 方法Get、Aggregate
  • THEN SHALL 使用 domain.UsageStats 类型

Scenario: 异步记录统计

  • WHEN 请求完成需要记录统计
  • THEN SHALL 异步调用 StatsService.Record()
  • THEN SHALL 不阻塞响应返回

Requirement: 使用 repository 层访问数据

Service SHALL 通过 StatsRepository 访问数据。

Scenario: 调用 repository 方法

  • WHEN service 处理业务逻辑
  • THEN SHALL 调用对应的 StatsRepository 方法
  • THEN SHALL 使用 domain.UsageStats 类型

Scenario: 事务处理

  • WHEN 记录统计
  • THEN SHALL 在 repository 层使用数据库事务
  • THEN SHALL 确保并发安全

Requirement: 统计查询优化

统计查询 SHALL 使用索引优化性能。

Scenario: 使用索引

  • WHEN 查询统计
  • THEN SHALL 使用 (provider_id, model_name, date) 复合索引
  • THEN SHALL 优化查询性能