"""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)