94 lines
2.8 KiB
Python
94 lines
2.8 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 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 ""), ["BOSS", "ADMIN"]):
|
|
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)
|