131 lines
3.6 KiB
Python
131 lines
3.6 KiB
Python
"""
|
|
Token 使用统计路由
|
|
|
|
提供 token 使用情况的查询接口
|
|
"""
|
|
from fastapi import APIRouter, HTTPException
|
|
from typing import Dict, Any, List, Optional
|
|
|
|
try:
|
|
from backend.services.token_usage_service import token_usage_service
|
|
except ImportError:
|
|
from services.token_usage_service import token_usage_service
|
|
|
|
router = APIRouter(prefix="/token-usage", tags=["token-usage"])
|
|
|
|
|
|
@router.get("/months")
|
|
async def list_months():
|
|
"""列出所有有数据的月份"""
|
|
return await token_usage_service.list_months()
|
|
|
|
|
|
@router.get("/stats/{year}/{month}")
|
|
async def get_monthly_stats(
|
|
year: int,
|
|
month: int,
|
|
role_name: Optional[str] = None,
|
|
chat_name: Optional[str] = None
|
|
):
|
|
"""
|
|
获取指定月份的统计数据
|
|
|
|
Args:
|
|
year: 年份
|
|
month: 月份
|
|
role_name: 角色名称(可选)
|
|
chat_name: 聊天名称(可选)
|
|
"""
|
|
if month < 1 or month > 12:
|
|
raise HTTPException(status_code=400, detail="月份必须在 1-12 之间")
|
|
|
|
try:
|
|
stats = await token_usage_service.get_stats_by_month(
|
|
year=year,
|
|
month=month,
|
|
role_name=role_name,
|
|
chat_name=chat_name
|
|
)
|
|
return stats
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=f"获取统计数据失败: {str(e)}")
|
|
|
|
|
|
@router.get("/api-urls")
|
|
async def get_api_url_stats():
|
|
"""
|
|
✅ 获取按 API URL 分组的统计数据(快速查询)
|
|
|
|
Returns:
|
|
{
|
|
"api_url_1": {
|
|
"totalPromptTokens": 1000,
|
|
"totalCompletionTokens": 2000,
|
|
"totalTokens": 3000,
|
|
"count": 10,
|
|
"firstUsed": 1234567890,
|
|
"lastUsed": 1234567899
|
|
},
|
|
...
|
|
}
|
|
"""
|
|
try:
|
|
stats = await token_usage_service.get_api_url_stats()
|
|
return stats
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=f"获取 API URL 统计失败: {str(e)}")
|
|
|
|
|
|
@router.get("/daily/{year}/{month}")
|
|
async def get_daily_stats(year: int, month: int):
|
|
"""
|
|
✅ 获取指定月份的每日统计数据(快速查询)
|
|
|
|
Args:
|
|
year: 年份
|
|
month: 月份
|
|
|
|
Returns:
|
|
{
|
|
"2024-01-01": {
|
|
"promptTokens": 1000,
|
|
"completionTokens": 2000,
|
|
"totalTokens": 3000,
|
|
"count": 10
|
|
},
|
|
...
|
|
}
|
|
"""
|
|
if month < 1 or month > 12:
|
|
raise HTTPException(status_code=400, detail="月份必须在 1-12 之间")
|
|
|
|
try:
|
|
stats = await token_usage_service.get_daily_stats(year, month)
|
|
return stats
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=f"获取每日统计失败: {str(e)}")
|
|
|
|
|
|
@router.get("/roles/{year}/{month}")
|
|
async def get_available_roles(year: int, month: int):
|
|
"""获取指定月份有数据的角色列表"""
|
|
if month < 1 or month > 12:
|
|
raise HTTPException(status_code=400, detail="月份必须在 1-12 之间")
|
|
|
|
roles = await token_usage_service.get_available_roles(year, month)
|
|
return {"roles": roles}
|
|
|
|
|
|
@router.get("/chats/{year}/{month}")
|
|
async def get_available_chats(
|
|
year: int,
|
|
month: int,
|
|
role_name: Optional[str] = None
|
|
):
|
|
"""获取指定月份有数据的聊天列表"""
|
|
if month < 1 or month > 12:
|
|
raise HTTPException(status_code=400, detail="月份必须在 1-12 之间")
|
|
|
|
chats = await token_usage_service.get_available_chats(year, month, role_name)
|
|
return {"chats": chats}
|