""" 开放平台统计和日志数据传输对象定义 定义调用统计和费用明细相关API请求和响应的数据结构 需求: 11.1, 11.2, 12.1, 12.2 """ from datetime import date, datetime from decimal import Decimal from typing import List, Optional from pydantic import BaseModel, ConfigDict, Field class TrendItem(BaseModel): """趋势数据项 需求 11.3: 显示调用趋势图,支持按日、周、月切换 """ date: str = Field(..., description="日期") count: int = Field(..., description="调用次数") cost: Decimal = Field(..., description="消费金额") class ModelDistItem(BaseModel): """模型分布项 需求 11.4: 显示各模型调用占比饼图 """ model_name: str = Field(..., description="模型名称") count: int = Field(..., description="调用次数") percentage: float = Field(..., description="占比百分比") class StatsResponse(BaseModel): """统计响应 需求 11.1: 显示今日调用次数、本月调用次数、总调用次数 需求 11.2: 显示今日消费金额、本月消费金额 """ today_calls: int = Field(..., description="今日调用次数") month_calls: int = Field(..., description="本月调用次数") total_calls: int = Field(..., description="总调用次数") today_cost: Decimal = Field(..., description="今日消费金额") month_cost: Decimal = Field(..., description="本月消费金额") trend_data: List[TrendItem] = Field(default_factory=list, description="趋势数据") model_distribution: List[ModelDistItem] = Field(default_factory=list, description="模型分布") class CallLogQuery(BaseModel): """调用日志查询参数 需求 12.1: 支持按时间范围、模型、API Key进行筛选 需求 12.4: 支持分页查询 """ start_date: Optional[date] = Field(None, description="开始日期") end_date: Optional[date] = Field(None, description="结束日期") model_id: Optional[int] = Field(None, description="模型ID") api_key_id: Optional[int] = Field(None, description="API Key ID") page: int = Field(default=1, ge=1, description="页码") page_size: int = Field(default=20, ge=1, le=100, description="每页数量") class CallLogResponse(BaseModel): """调用日志响应 需求 12.2: 显示调用时间、模型名称、Token用量(输入/输出)、费用金额、使用的API Key """ id: int model_name: str = Field(..., description="模型名称") is_local: bool = Field(..., description="是否为本地模型") input_tokens: int = Field(..., description="输入Token数") output_tokens: int = Field(..., description="输出Token数") bill: Decimal = Field(..., description="费用金额") status: str = Field(..., description="调用状态") api_key_prefix: str = Field(..., description="API Key前缀") created_at: datetime = Field(..., description="调用时间") # 价格信息(用于显示计费明细) input_price: Optional[Decimal] = Field(None, description="输入单价(每token)") output_price: Optional[Decimal] = Field(None, description="输出单价(每token)") model_config = ConfigDict(from_attributes=True)