"""模型路由配置 API。""" from __future__ import annotations from typing import Literal from fastapi import APIRouter, Depends from fastapi.responses import JSONResponse from pydantic import BaseModel, Field from sqlalchemy.ext.asyncio import AsyncSession from ..core.response import error_response, success_response from ..core.database import get_db from ..dependencies import get_current_user from ..models import User from ..services.auth import has_any_role from ..services.model.model_routing import ModelRoutingService from ..services.operation_log_service import log_operation router = APIRouter(prefix="/model-routing", tags=["model_routing"]) class ModelRoutingUpdateRequest(BaseModel): tier_alias: Literal["low", "high"] = Field(default="high") @router.get("/functions") async def list_model_routing( db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): tenant_id = int(current_user.tenant_id) items = await ModelRoutingService.list_effective_routing(db, tenant_id=tenant_id) return success_response({"items": items}) @router.get("/functions/{function_name}") async def get_model_routing( function_name: str, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): tenant_id = int(current_user.tenant_id) data = await ModelRoutingService.get_effective_routing( db, tenant_id=tenant_id, function_name=function_name, ) return success_response(data) @router.put("/functions/{function_name}") async def update_model_routing( function_name: str, body: ModelRoutingUpdateRequest, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): if not has_any_role(str(current_user.role or ""), ["OWNER", "REVIEWER"]): return JSONResponse(status_code=403, content=error_response(403, "仅管理员可修改模型路由配置")) tenant_id = int(current_user.tenant_id) before = await ModelRoutingService.get_effective_routing( db, tenant_id=tenant_id, function_name=function_name, ) try: after = await ModelRoutingService.upsert_override( db, tenant_id=tenant_id, function_name=function_name, tier_alias=body.tier_alias, updated_by=int(current_user.id), ) except ValueError as exc: await db.rollback() return JSONResponse(status_code=400, content=error_response(400, str(exc))) await log_operation( db, tenant_id=tenant_id, user_id=int(current_user.id), project_id=None, entity_type="model_routing", entity_id=str(function_name), action="update", before_data=before, after_data=after, remark="更新函数级模型路由", ) await db.commit() return success_response(after)