PMFlow/backend/app/api/model_routing.py

90 lines
2.7 KiB
Python

"""模型路由配置 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)