관리자 감정 관측 기록과 조회 API 추가

This commit is contained in:
Yun Chan 2026-09-23 04:45:50 +09:00
parent d22cd9883d
commit acb0d26338
16 changed files with 1445 additions and 18 deletions

View file

@ -25,6 +25,10 @@ from ..auth_sessions import (
upsert_managed_user,
)
from ..config import settings
from ..contracts.admin_affect import (
AdminAffectSessionDetailResponse,
AdminAffectSessionListResponse,
)
from ..contracts.engine_gateway import (
ENGINE_PROVIDER_DEFAULTS,
ENGINE_PROVIDERS,
@ -38,6 +42,7 @@ from ..deps import Principal, require_admin_access
from ..engine_client import engine_client
from ..runtime_policy import require_runtime_fallback_allowed
from ..services import evaluator, notifications, rag
from ..services import admin_affect as admin_affect_service
from ..services import provider_credentials as provider_credentials_service
from ..services import provider_oauth as provider_oauth_service
from ..services.llm_pricing import (
@ -1934,6 +1939,58 @@ async def admin_voice_runtime(
return voice_runtime_metrics.snapshot()
@router.get("/affect/sessions", response_model=AdminAffectSessionListResponse)
async def list_admin_affect_sessions(
principal: AdminPrincipal,
limit: Annotated[int, Query(ge=1, le=100)] = 30,
offset: Annotated[int, Query(ge=0)] = 0,
) -> AdminAffectSessionListResponse:
"""관리자 전용 감정 관측 회기 목록을 반환한다."""
try:
return await admin_affect_service.list_sessions(
user_id=principal.user_id,
limit=limit,
offset=offset,
)
except admin_affect_service.AdminAffectPersistenceError as exc:
raise HTTPException(
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
detail="admin affect sessions are unavailable",
) from exc
@router.get(
"/affect/sessions/{session_id}",
response_model=AdminAffectSessionDetailResponse,
)
async def get_admin_affect_session_detail(
session_id: UUID,
principal: AdminPrincipal,
limit: Annotated[int, Query(ge=1, le=200)] = 100,
before_seq: Annotated[int | None, Query(gt=0)] = None,
) -> AdminAffectSessionDetailResponse:
"""저장된 Jev trace와 현재 감정 snapshot을 반환한다."""
try:
return await admin_affect_service.get_session_detail(
user_id=principal.user_id,
session_id=session_id,
limit=limit,
before_seq=before_seq,
)
except admin_affect_service.AdminAffectSessionNotFoundError as exc:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="admin affect session not found",
) from exc
except admin_affect_service.AdminAffectPersistenceError as exc:
raise HTTPException(
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
detail="admin affect session is unavailable",
) from exc
@router.get("/usage", response_model=AdminUsageResponse)
async def admin_usage(
principal: AdminPrincipal,