feat: improve generation analytics and maintenance

This commit is contained in:
2026-04-19 09:03:40 +08:00
parent d5a173aa0d
commit 5318de670f
21 changed files with 1155 additions and 57 deletions

View File

@@ -4,7 +4,7 @@ import json
import uuid
from typing import AsyncGenerator
from fastapi import APIRouter, Depends, Response
from fastapi import APIRouter, Depends, Query, Response
from sqlalchemy.ext.asyncio import AsyncSession
from sse_starlette.sse import EventSourceResponse
@@ -19,6 +19,7 @@ from app.schemas.story_schemas import (
GenerateRequest,
GenerationJobDetailResponse,
GenerationJobSummaryResponse,
GenerationOpsSummaryResponse,
GenerationProviderAnalyticsResponse,
GenerationProviderStatsResponse,
GenerationRequest,
@@ -36,6 +37,7 @@ from app.services import story_service
from app.services.generation_jobs import (
get_generation_job_detail,
get_story_provider_stats,
get_user_generation_ops_summary,
get_user_provider_analytics,
list_story_generation_jobs,
)
@@ -86,16 +88,36 @@ async def get_generation_job(
return await get_generation_job_detail(db, job_id=job_id, user_id=user.id)
@router.get(
"/generations/ops-summary",
response_model=GenerationOpsSummaryResponse,
)
async def get_generation_ops_summary(
hours: int = Query(default=24, ge=1, le=168),
user: User = Depends(require_user),
db: AsyncSession = Depends(get_db),
):
"""Get a compact recent operations summary for generation workflows."""
return await get_user_generation_ops_summary(db, user_id=user.id, hours=hours)
@router.get(
"/generations/provider-analytics",
response_model=GenerationProviderAnalyticsResponse,
)
async def get_generation_provider_analytics(
days: int | None = Query(default=None, ge=1, le=365),
capability: str | None = Query(default=None),
user: User = Depends(require_user),
db: AsyncSession = Depends(get_db),
):
"""Get provider call stats aggregated across the user's generation history."""
return await get_user_provider_analytics(db, user_id=user.id)
return await get_user_provider_analytics(
db,
user_id=user.id,
days=days,
capability=capability,
)
@router.get(
@@ -117,11 +139,19 @@ async def list_generation_jobs(
)
async def get_generation_provider_stats(
story_id: int,
days: int | None = Query(default=None, ge=1, le=365),
capability: str | None = Query(default=None),
user: User = Depends(require_user),
db: AsyncSession = Depends(get_db),
):
"""Get provider call stats aggregated from generation job events."""
return await get_story_provider_stats(db, story_id=story_id, user_id=user.id)
return await get_story_provider_stats(
db,
story_id=story_id,
user_id=user.id,
days=days,
capability=capability,
)
@router.get("/generations/{story_id}", response_model=StoryDetailResponse)