feat: 添加访问令牌管理功能并升级至 0.2.4

- 新增 Management Token(访问令牌)功能,支持创建、更新、删除和管理
- 前端添加访问令牌管理页面,支持普通用户和管理员
- 后端实现完整的令牌生命周期管理 API
- 添加数据库迁移脚本创建 management_tokens 表
- Nginx 配置添加 gzip 压缩,优化响应传输
- Dialog 组件添加 persistent 属性,防止意外关闭
- 为管理后台 API 添加详细的中文文档注释
- 简化多处类型注解,统一代码风格
This commit is contained in:
fawney19
2026-01-07 14:55:07 +08:00
parent f6a6410626
commit 0061fc04b7
59 changed files with 6265 additions and 648 deletions

View File

@@ -39,12 +39,21 @@ async def get_usage_aggregation(
db: Session = Depends(get_db),
):
"""
Get usage aggregation by specified dimension.
获取使用情况聚合统计
- group_by=model: Aggregate by model
- group_by=user: Aggregate by user
- group_by=provider: Aggregate by provider
- group_by=api_format: Aggregate by API format
按指定维度聚合使用情况统计数据。
**查询参数**:
- `group_by`: 必需聚合维度可选值model按模型、user按用户、provider按提供商、api_format按 API 格式)
- `start_date`: 可选开始日期ISO 格式)
- `end_date`: 可选结束日期ISO 格式)
- `limit`: 返回数量限制,默认 20最大 100
**返回字段**:
- 按模型聚合时model, request_count, total_tokens, total_cost, actual_cost
- 按用户聚合时user_id, email, username, request_count, total_tokens, total_cost
- 按提供商聚合时provider_id, provider, request_count, total_tokens, total_cost, actual_cost, avg_response_time_ms, success_rate, error_count
- 按 API 格式聚合时api_format, request_count, total_tokens, total_cost, actual_cost, avg_response_time_ms
"""
if group_by == "model":
adapter = AdminUsageByModelAdapter(start_date=start_date, end_date=end_date, limit=limit)
@@ -69,6 +78,25 @@ async def get_usage_stats(
end_date: Optional[datetime] = None,
db: Session = Depends(get_db),
):
"""
获取使用情况总体统计
获取指定时间范围内的使用情况总体统计数据。
**查询参数**:
- `start_date`: 可选开始日期ISO 格式)
- `end_date`: 可选结束日期ISO 格式)
**返回字段**:
- `total_requests`: 总请求数
- `total_tokens`: 总 token 数
- `total_cost`: 总成本(美元)
- `total_actual_cost`: 实际总成本(美元)
- `avg_response_time`: 平均响应时间(秒)
- `error_count`: 错误请求数
- `error_rate`: 错误率(百分比)
- `cache_stats`: 缓存统计信息cache_creation_tokens, cache_read_tokens, cache_creation_cost, cache_read_cost
"""
adapter = AdminUsageStatsAdapter(start_date=start_date, end_date=end_date)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -79,9 +107,12 @@ async def get_activity_heatmap(
db: Session = Depends(get_db),
):
"""
Get activity heatmap data for the past 365 days.
获取活动热力图数据
This endpoint is cached for 5 minutes to reduce database load.
获取过去 365 天的活动热力图数据。此接口缓存 5 分钟以减少数据库负载。
**返回字段**:
- 按日期聚合的请求数、token 数、成本等统计数据
"""
adapter = AdminActivityHeatmapAdapter()
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -102,6 +133,33 @@ async def get_usage_records(
offset: int = Query(0, ge=0),
db: Session = Depends(get_db),
):
"""
获取使用记录列表
获取详细的使用记录列表,支持多种筛选条件。
**查询参数**:
- `start_date`: 可选开始日期ISO 格式)
- `end_date`: 可选结束日期ISO 格式)
- `search`: 可选,通用搜索关键词(支持用户名、密钥名、模型名、提供商名模糊搜索,多个关键词用空格分隔)
- `user_id`: 可选,用户 ID 筛选
- `username`: 可选,用户名模糊搜索
- `model`: 可选,模型名模糊搜索
- `provider`: 可选,提供商名称搜索
- `status`: 可选状态筛选stream: 流式请求standard: 标准请求error: 错误请求pending: 等待中streaming: 流式中completed: 已完成failed: 失败active: 活跃请求)
- `limit`: 返回数量限制,默认 100最大 500
- `offset`: 分页偏移量,默认 0
**返回字段**:
- `records`: 使用记录列表,包含 id, user_id, user_email, username, api_key, provider, model, target_model,
input_tokens, output_tokens, cache_creation_input_tokens, cache_read_input_tokens, total_tokens,
cost, actual_cost, rate_multiplier, response_time_ms, first_byte_time_ms, created_at, is_stream,
input_price_per_1m, output_price_per_1m, cache_creation_price_per_1m, cache_read_price_per_1m,
status_code, error_message, status, has_fallback, api_format, api_key_name, request_metadata
- `total`: 符合条件的总记录数
- `limit`: 当前分页限制
- `offset`: 当前分页偏移量
"""
adapter = AdminUsageRecordsAdapter(
start_date=start_date,
end_date=end_date,
@@ -124,10 +182,19 @@ async def get_active_requests(
db: Session = Depends(get_db),
):
"""
获取活跃请求的状态(轻量级接口,用于前端轮询)
获取活跃请求的状态
获取当前活跃pending/streaming 状态)请求的状态信息。这是一个轻量级接口,适合前端轮询。
**查询参数**:
- `ids`: 可选,逗号分隔的请求 ID 列表,用于查询特定请求的状态
**行为说明**:
- 如果提供 ids 参数,只返回这些 ID 对应请求的最新状态
- 如果不提供 ids返回所有 pending/streaming 状态的请求
**返回字段**:
- `requests`: 活跃请求列表,包含请求状态信息
"""
adapter = AdminActiveRequestsAdapter(ids=ids)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)
@@ -142,9 +209,48 @@ async def get_usage_detail(
db: Session = Depends(get_db),
):
"""
Get detailed information of a specific usage record.
获取使用记录详情
Includes request/response headers and body.
获取指定使用记录的详细信息,包括请求/响应的头部和正文。
**路径参数**:
- `usage_id`: 使用记录 ID
**返回字段**:
- `id`: 记录 ID
- `request_id`: 请求 ID
- `user`: 用户信息id, username, email
- `api_key`: API Key 信息id, name, display
- `provider`: 提供商名称
- `api_format`: API 格式
- `model`: 请求的模型名称
- `target_model`: 映射后的目标模型名称
- `tokens`: Token 统计input, output, total
- `cost`: 成本统计input, output, total
- `cache_creation_input_tokens`: 缓存创建输入 token 数
- `cache_read_input_tokens`: 缓存读取输入 token 数
- `cache_creation_cost`: 缓存创建成本
- `cache_read_cost`: 缓存读取成本
- `request_cost`: 请求成本
- `input_price_per_1m`: 输入价格(每百万 token
- `output_price_per_1m`: 输出价格(每百万 token
- `cache_creation_price_per_1m`: 缓存创建价格(每百万 token
- `cache_read_price_per_1m`: 缓存读取价格(每百万 token
- `price_per_request`: 每请求价格
- `request_type`: 请求类型
- `is_stream`: 是否为流式请求
- `status_code`: HTTP 状态码
- `error_message`: 错误信息
- `response_time_ms`: 响应时间(毫秒)
- `first_byte_time_ms`: 首字节时间TTFB毫秒
- `created_at`: 创建时间
- `request_headers`: 请求头
- `request_body`: 请求体
- `provider_request_headers`: 提供商请求头
- `response_headers`: 响应头
- `response_body`: 响应体
- `metadata`: 提供商响应元数据
- `tiered_pricing`: 阶梯计费信息(如适用)
"""
adapter = AdminUsageDetailAdapter(usage_id=usage_id)
return await pipeline.run(adapter=adapter, http_request=request, db=db, mode=adapter.mode)