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

@@ -220,21 +220,33 @@ class GenerationProviderStatResponse(BaseModel):
estimated_cost_usd: float = 0.0
class GenerationProviderFailureReasonResponse(BaseModel):
"""Aggregated failed provider call reason."""
reason: str
count: int
class GenerationProviderStatsResponse(BaseModel):
"""Provider call stats aggregated from generation job events."""
story_id: int
window_days: int | None = None
capability: str | None = None
total_calls: int
successful_calls: int
failed_calls: int
avg_latency_ms: float | None = None
estimated_cost_usd: float = 0.0
by_provider: list[GenerationProviderStatResponse] = Field(default_factory=list)
failure_reasons: list[GenerationProviderFailureReasonResponse] = Field(default_factory=list)
class GenerationProviderAnalyticsResponse(BaseModel):
"""Provider call stats aggregated across one user's generation history."""
window_days: int | None = None
capability: str | None = None
total_calls: int
successful_calls: int
failed_calls: int
@@ -243,6 +255,33 @@ class GenerationProviderAnalyticsResponse(BaseModel):
job_count: int
story_count: int
by_provider: list[GenerationProviderStatResponse] = Field(default_factory=list)
failure_reasons: list[GenerationProviderFailureReasonResponse] = Field(default_factory=list)
class GenerationRecentFailureResponse(BaseModel):
"""One recent failed generation task for operations summary."""
job_id: str
story_id: int | None = None
story_title: str | None = None
output_mode: str
current_step: str
error_message: str | None = None
failure_label: str
updated_at: datetime
class GenerationOpsSummaryResponse(BaseModel):
"""Recent generation health summary for one user."""
window_hours: int
stale_threshold_minutes: int
active_jobs: int
stale_running_jobs: int
failed_jobs: int
degraded_jobs: int
asset_retry_jobs: int
recent_failures: list[GenerationRecentFailureResponse] = Field(default_factory=list)
class AchievementItem(BaseModel):