"""模型路由配置 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 require_platform_ai_ops from ..models import User from ..services.model.model_routing import ModelRoutingService, PLATFORM_RUNTIME_TENANT_ID 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(require_platform_ai_ops), ): tenant_id = PLATFORM_RUNTIME_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(require_platform_ai_ops), ): tenant_id = PLATFORM_RUNTIME_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(require_platform_ai_ops), ): tenant_id = PLATFORM_RUNTIME_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)