feat(usage): 修复缓存命中率计算并新增用户端 API 格式统计

- 新增 input_context_expr() 按 api_format 区分 input_tokens 语义
  (OpenAI/Gemini input_tokens 已含 cache_read,Claude 需额外加上)
- 缓存命中率统一改为基于归一化后的 total_input_context 计算
- 用户 /me/usage 接口新增 summary_by_api_format 后端聚合字段
- 前端 API 格式统计改用后端聚合数据,移除前端逐条记录手动统计
- 提取 formatHitRate 到 utils/format.ts 消除三处重复定义
- 移除 PoolManager 中未使用的 select_key 方法

Co-Authored-By: AAEE86 <ppk0227@hotmail.com>
This commit is contained in:
fawney19
2026-03-14 00:28:28 +08:00
parent e9678ea899
commit bdfe4adc98
14 changed files with 281 additions and 247 deletions

View File

@@ -79,6 +79,8 @@ export interface ModelSummary {
input_tokens: number
output_tokens: number
total_tokens: number
cache_read_tokens?: number
cache_hit_rate?: number
total_cost_usd: number
actual_total_cost_usd?: number // 倍率消耗(仅管理员可见)
}
@@ -88,11 +90,24 @@ export interface ProviderSummary {
provider: string
requests: number
total_tokens: number
cache_read_tokens?: number
cache_hit_rate?: number
total_cost_usd: number
success_rate: number | null
avg_response_time_ms: number | null
}
// API 格式统计接口
export interface ApiFormatSummary {
api_format: string
request_count: number
total_tokens: number
cache_read_tokens: number
cache_hit_rate: number
total_cost_usd: number
avg_response_time_ms: number
}
// 使用统计响应接口
export interface UsageResponse {
total_requests: number
@@ -105,6 +120,7 @@ export interface UsageResponse {
billing: BillingSummary
summary_by_model: ModelSummary[]
summary_by_provider?: ProviderSummary[]
summary_by_api_format?: ApiFormatSummary[]
pagination?: {
total: number
limit: number

View File

@@ -40,6 +40,8 @@ export interface UsageByModel {
total_tokens: number
total_cost: number
avg_response_time?: number
cache_read_tokens?: number
cache_hit_rate?: number
}
export interface UsageByUser {
@@ -61,6 +63,8 @@ export interface UsageByProvider {
avg_response_time_ms: number
success_rate: number
error_count: number
cache_read_tokens?: number
cache_hit_rate?: number
}
export interface UsageByApiFormat {
@@ -70,6 +74,8 @@ export interface UsageByApiFormat {
total_cost: number
actual_cost: number
avg_response_time_ms: number
cache_read_tokens?: number
cache_hit_rate?: number
}
export interface UsageFilters {