PMFlow/backend/app/api/ai_call_traces_api.py

73 lines
2.6 KiB
Python

"""AI call trace audit API."""
from __future__ import annotations
from typing import Optional
from fastapi import APIRouter, Depends, Query
from fastapi.responses import JSONResponse
from sqlalchemy.ext.asyncio import AsyncSession
from ..core.database import get_db
from ..core.response import error_response, success_response
from ..dependencies.permissions import require_platform_ai_ops
from ..models import User
from ..services.ai_call_trace_service import AICallTraceService
router = APIRouter(prefix="/ai-call-traces", tags=["ai_call_traces"])
@router.get("")
async def list_ai_call_traces(
page: int = Query(default=1, ge=1),
page_size: int = Query(default=30, ge=1, le=100),
status: Optional[str] = Query(default=None, max_length=80),
provider: Optional[str] = Query(default=None, max_length=80),
model: Optional[str] = Query(default=None, max_length=160),
function_name: Optional[str] = Query(default=None, max_length=255),
scene_key: Optional[str] = Query(default=None, max_length=120),
slot_key: Optional[str] = Query(default=None, max_length=80),
prompt_key: Optional[str] = Query(default=None, max_length=128),
prompt_source: Optional[str] = Query(default=None, max_length=32),
prompt_release_id: Optional[int] = Query(default=None),
trace_id: Optional[str] = Query(default=None, max_length=120),
tenant_id: Optional[int] = Query(default=None),
keyword: Optional[str] = Query(default=None, max_length=300),
since_hours: Optional[int] = Query(default=168, ge=1, le=8760),
current_user: User = Depends(require_platform_ai_ops),
db: AsyncSession = Depends(get_db),
):
_ = current_user
data = await AICallTraceService(db).list_traces(
page=page,
page_size=page_size,
status=status,
provider=provider,
model=model,
function_name=function_name,
scene_key=scene_key,
slot_key=slot_key,
prompt_key=prompt_key,
prompt_source=prompt_source,
prompt_release_id=prompt_release_id,
trace_id=trace_id,
tenant_id=tenant_id,
keyword=keyword,
since_hours=since_hours,
)
return success_response(data)
@router.get("/{trace_id_or_log_id}")
async def get_ai_call_trace(
trace_id_or_log_id: str,
current_user: User = Depends(require_platform_ai_ops),
db: AsyncSession = Depends(get_db),
):
_ = current_user
try:
data = await AICallTraceService(db).get_trace(trace_id_or_log_id)
except ValueError as exc:
return JSONResponse(status_code=404, content=error_response(404, str(exc)))
return success_response(data)