feat: add generation trace and partial-ready workflow status
This commit is contained in:
@@ -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."""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user