--- server/admin_api.py +++ local/admin_api.py @@ -35,5 +35,5 @@ from typing import Any, Callable -from fastapi import Depends, FastAPI, HTTPException, Request, status +from fastapi import Depends, FastAPI, HTTPException, Query, Request, status from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse, RedirectResponse @@ -883,4 +883,30 @@ ) + @app.get("/api/v2/stats/model-usage") + async def model_usage_stats( + days: int = Query(default=7, ge=1, le=90), + purpose: str = Query(default="", pattern="^(chat|guard|knowledge)?$"), + provider_id: str = Query(default="", max_length=256), + model: str = Query(default="", max_length=512), + account_id: int | None = None, + principal: Principal = Depends(require("stats:read")), + ) -> dict: + return database.model_usage_stats( + days, resolve_admin_tenant(principal, account_id), purpose, provider_id, model) + + @app.get("/api/v2/stats/model-usage/log") + async def model_usage_log( + days: int = Query(default=7, ge=1, le=90), + limit: int = Query(default=50, ge=1, le=200), + offset: int = Query(default=0, ge=0), + purpose: str = Query(default="", pattern="^(chat|guard|knowledge)?$"), + provider_id: str = Query(default="", max_length=256), + model: str = Query(default="", max_length=512), + account_id: int | None = None, + principal: Principal = Depends(require("stats:read")), + ) -> dict: + return database.list_model_usage( + days, limit, offset, resolve_admin_tenant(principal, account_id), purpose, provider_id, model) + # ── 桌面端配置 ─────────────────────────────────────────────────────── # 这一组是从老网页后台整体搬过来的("能力开关 / 模型与身份 / MCP 服务器"