feat: add generation trace and partial-ready workflow status

This commit is contained in:
2026-04-18 21:53:55 +08:00
parent 96dfc677e2
commit e99a7fbe14
36 changed files with 2597 additions and 144 deletions

View File

@@ -1,7 +1,7 @@
"""Story-related Pydantic schemas."""
from datetime import datetime
from typing import Literal
from typing import Any, Literal
from pydantic import BaseModel, Field
@@ -14,6 +14,7 @@ class StoryStatusMixin(BaseModel):
"""Shared generation status fields returned by story APIs."""
generation_status: str
text_status: str
image_status: str
audio_status: str
last_error: str | None = None
@@ -117,6 +118,7 @@ class GenerationResponse(StoryStatusMixin):
"""Unified generation response for the target workflow API."""
id: int
generation_job_id: str | None = None
title: str
mode: str
story_text: str | None = None
@@ -158,6 +160,68 @@ class StoryAssetRetryRequest(BaseModel):
assets: list[Literal["image", "audio"]] = Field(..., min_length=1)
class GenerationJobEventResponse(BaseModel):
"""One persisted event emitted by a generation job."""
id: int
job_id: str
story_id: int | None = None
event_type: str
status: str
message: str | None = None
event_metadata: dict[str, Any] = Field(default_factory=dict)
created_at: datetime
class GenerationJobSummaryResponse(BaseModel):
"""Generation job summary for progress lists."""
id: str
story_id: int | None = None
output_mode: str
input_type: str
status: str
current_step: str
progress_percent: int
progress_label: str
is_terminal: bool
result_snapshot: dict[str, Any] = Field(default_factory=dict)
error_message: str | None = None
created_at: datetime
updated_at: datetime
class GenerationJobDetailResponse(GenerationJobSummaryResponse):
"""Generation job detail with append-only workflow events."""
request_payload: dict[str, Any] = Field(default_factory=dict)
events: list[GenerationJobEventResponse] = Field(default_factory=list)
class GenerationProviderStatResponse(BaseModel):
"""Aggregated provider call stats for one adapter/capability pair."""
capability: str
adapter: str
call_count: int
success_count: int
failure_count: int
avg_latency_ms: float | None = None
estimated_cost_usd: float = 0.0
class GenerationProviderStatsResponse(BaseModel):
"""Provider call stats aggregated from generation job events."""
story_id: int
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)
class AchievementItem(BaseModel):
"""Achievement item returned for a story."""