platform_stats.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. """
  2. 开放平台统计和日志数据传输对象定义
  3. 定义调用统计和费用明细相关API请求和响应的数据结构
  4. 需求: 11.1, 11.2, 12.1, 12.2
  5. """
  6. from datetime import date, datetime
  7. from decimal import Decimal
  8. from typing import List, Optional
  9. from pydantic import BaseModel, ConfigDict, Field
  10. class TrendItem(BaseModel):
  11. """趋势数据项
  12. 需求 11.3: 显示调用趋势图,支持按日、周、月切换
  13. """
  14. date: str = Field(..., description="日期")
  15. count: int = Field(..., description="调用次数")
  16. cost: Decimal = Field(..., description="消费金额")
  17. class ModelDistItem(BaseModel):
  18. """模型分布项
  19. 需求 11.4: 显示各模型调用占比饼图
  20. """
  21. model_name: str = Field(..., description="模型名称")
  22. count: int = Field(..., description="调用次数")
  23. percentage: float = Field(..., description="占比百分比")
  24. class StatsResponse(BaseModel):
  25. """统计响应
  26. 需求 11.1: 显示今日调用次数、本月调用次数、总调用次数
  27. 需求 11.2: 显示今日消费金额、本月消费金额
  28. """
  29. today_calls: int = Field(..., description="今日调用次数")
  30. month_calls: int = Field(..., description="本月调用次数")
  31. total_calls: int = Field(..., description="总调用次数")
  32. today_cost: Decimal = Field(..., description="今日消费金额")
  33. month_cost: Decimal = Field(..., description="本月消费金额")
  34. trend_data: List[TrendItem] = Field(default_factory=list, description="趋势数据")
  35. model_distribution: List[ModelDistItem] = Field(default_factory=list, description="模型分布")
  36. class CallLogQuery(BaseModel):
  37. """调用日志查询参数
  38. 需求 12.1: 支持按时间范围、模型、API Key进行筛选
  39. 需求 12.4: 支持分页查询
  40. """
  41. start_date: Optional[date] = Field(None, description="开始日期")
  42. end_date: Optional[date] = Field(None, description="结束日期")
  43. model_id: Optional[int] = Field(None, description="模型ID")
  44. api_key_id: Optional[int] = Field(None, description="API Key ID")
  45. page: int = Field(default=1, ge=1, description="页码")
  46. page_size: int = Field(default=20, ge=1, le=100, description="每页数量")
  47. class CallLogResponse(BaseModel):
  48. """调用日志响应
  49. 需求 12.2: 显示调用时间、模型名称、Token用量(输入/输出)、费用金额、使用的API Key
  50. """
  51. id: int
  52. model_name: str = Field(..., description="模型名称")
  53. is_local: bool = Field(..., description="是否为本地模型")
  54. input_tokens: int = Field(..., description="输入Token数")
  55. output_tokens: int = Field(..., description="输出Token数")
  56. bill: Decimal = Field(..., description="费用金额")
  57. status: str = Field(..., description="调用状态")
  58. api_key_prefix: str = Field(..., description="API Key前缀")
  59. created_at: datetime = Field(..., description="调用时间")
  60. # 价格信息(用于显示计费明细)
  61. input_price: Optional[Decimal] = Field(None, description="输入单价(每token)")
  62. output_price: Optional[Decimal] = Field(None, description="输出单价(每token)")
  63. model_config = ConfigDict(from_attributes=True)