73 lines
2.6 KiB
Python
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)
|