feat: add generation trace and partial-ready workflow status
This commit is contained in:
@@ -71,13 +71,28 @@ story_json="$(post_json "$APP_URL/api/generations" '{
|
||||
"generate_images": false
|
||||
}')"
|
||||
story_id="$(jq -r '.id' <<<"$story_json")"
|
||||
assert_jq "$story_json" '.mode == "generated" and .generation_status == "narrative_ready"' "story should be readable before assets"
|
||||
story_job_id="$(jq -r '.generation_job_id' <<<"$story_json")"
|
||||
assert_jq "$story_json" '.mode == "generated" and .generation_status == "partial_ready" and .text_status == "ready"' "story should be readable before assets"
|
||||
assert_jq "$story_json" '.generation_job_id != null and .generation_job_id != ""' "story generation should expose a job id"
|
||||
assert_jq "$story_json" '(.retryable_assets | index("image")) != null and (.retryable_assets | index("audio")) != null' "story should expose image/audio as retryable assets"
|
||||
echo "$story_json" | jq '{id,title,mode,generation_status,image_status,audio_status,retryable_assets}'
|
||||
|
||||
say "Checking story generation job events"
|
||||
story_job_json="$(get_json "$APP_URL/api/generations/jobs/$story_job_id")"
|
||||
assert_jq "$story_job_json" '.id == "'"$story_job_id"'" and .story_id == '"$story_id"'' "story generation job should be queryable"
|
||||
assert_jq "$story_job_json" '.progress_percent == 100 and .is_terminal == true' "story generation job should expose progress summary"
|
||||
assert_jq "$story_job_json" '([.events[].event_type] | index("context_prepared")) != null and ([.events[].event_type] | index("narrative_generated")) != null and ([.events[].event_type] | index("story_saved")) != null' "story generation job should include workflow events"
|
||||
assert_jq "$story_job_json" '([.events[].event_type] | index("provider_call_succeeded")) != null' "story generation job should include provider call events"
|
||||
echo "$story_job_json" | jq '{id,status,current_step,events:([.events[].event_type] | unique)}'
|
||||
|
||||
say "Checking story provider stats"
|
||||
story_provider_stats_json="$(get_json "$APP_URL/api/generations/$story_id/provider-stats")"
|
||||
assert_jq "$story_provider_stats_json" '.total_calls >= 1 and .successful_calls >= 1 and (.by_provider | length) >= 1' "story provider stats should summarize provider calls"
|
||||
echo "$story_provider_stats_json" | jq '{story_id,total_calls,successful_calls,failed_calls,avg_latency_ms,estimated_cost_usd}'
|
||||
|
||||
say "Retrying story cover image"
|
||||
story_image_json="$(post_json "$APP_URL/api/generations/$story_id/retry-assets" '{"assets":["image"]}')"
|
||||
assert_jq "$story_image_json" '.image_status == "ready" and (.image_url != null)' "story cover should be ready after retry"
|
||||
assert_jq "$story_image_json" '.generation_status == "partial_ready" and .image_status == "ready" and (.image_url != null)' "story cover should be ready after retry"
|
||||
assert_jq "$story_image_json" '(.retryable_assets | index("image")) == null and (.retryable_assets | index("audio")) != null' "story image retry should leave only audio retryable"
|
||||
echo "$story_image_json" | jq '{id,title,generation_status,image_status,audio_status,retryable_assets}'
|
||||
|
||||
@@ -106,16 +121,38 @@ storybook_json="$(post_json "$APP_URL/api/generations" '{
|
||||
"page_count": 6
|
||||
}')"
|
||||
storybook_id="$(jq -r '.id' <<<"$storybook_json")"
|
||||
assert_jq "$storybook_json" '.mode == "storybook" and .image_status == "not_requested" and (.pages | length) >= 4' "storybook should be readable before images"
|
||||
storybook_job_id="$(jq -r '.generation_job_id' <<<"$storybook_json")"
|
||||
assert_jq "$storybook_json" '.mode == "storybook" and .generation_status == "partial_ready" and .text_status == "ready" and .image_status == "not_requested" and (.pages | length) >= 4' "storybook should be readable before images"
|
||||
assert_jq "$storybook_json" '.generation_job_id != null and .generation_job_id != ""' "storybook generation should expose a job id"
|
||||
assert_jq "$storybook_json" '(.retryable_assets | index("image")) != null and (.retryable_assets | index("audio")) == null' "storybook should expose images as retryable assets"
|
||||
echo "$storybook_json" | jq '{id,title,mode,generation_status,image_status,audio_status,retryable_assets,pages:(.pages | length)}'
|
||||
|
||||
say "Checking storybook generation job events"
|
||||
storybook_job_json="$(get_json "$APP_URL/api/generations/jobs/$storybook_job_id")"
|
||||
assert_jq "$storybook_job_json" '.id == "'"$storybook_job_id"'" and .story_id == '"$storybook_id"'' "storybook generation job should be queryable"
|
||||
assert_jq "$storybook_job_json" '.progress_percent == 100 and .is_terminal == true' "storybook generation job should expose progress summary"
|
||||
assert_jq "$storybook_job_json" '([.events[].event_type] | index("context_prepared")) != null and ([.events[].event_type] | index("narrative_generated")) != null and ([.events[].event_type] | index("story_saved")) != null' "storybook generation job should include workflow events"
|
||||
echo "$storybook_job_json" | jq '{id,status,current_step,events:([.events[].event_type] | unique)}'
|
||||
|
||||
say "Checking storybook provider stats"
|
||||
storybook_provider_stats_json="$(get_json "$APP_URL/api/generations/$storybook_id/provider-stats")"
|
||||
assert_jq "$storybook_provider_stats_json" '.total_calls >= 1 and .successful_calls >= 1 and (.by_provider | length) >= 1' "storybook provider stats should summarize provider calls"
|
||||
echo "$storybook_provider_stats_json" | jq '{story_id,total_calls,successful_calls,failed_calls,avg_latency_ms,estimated_cost_usd}'
|
||||
|
||||
say "Retrying storybook images"
|
||||
storybook_image_json="$(post_json "$APP_URL/api/generations/$storybook_id/retry-assets" '{"assets":["image"]}')"
|
||||
assert_jq "$storybook_image_json" '.image_status == "ready" and (.pages | length) >= 4 and ([.pages[] | select(.image_url != null)] | length) == (.pages | length)' "storybook images should be ready after retry"
|
||||
assert_jq "$storybook_image_json" '(.retryable_assets | length) == 0' "storybook should have no retryable assets after images are ready"
|
||||
echo "$storybook_image_json" | jq '{id,title,generation_status,image_status,audio_status,retryable_assets,pages:(.pages | length), ready_pages:([.pages[] | select(.image_url != null)] | length)}'
|
||||
|
||||
say "Checking story job history"
|
||||
story_jobs_json="$(get_json "$APP_URL/api/generations/$story_id/jobs")"
|
||||
storybook_jobs_json="$(get_json "$APP_URL/api/generations/$storybook_id/jobs")"
|
||||
assert_jq "$story_jobs_json" 'length >= 2 and (map(.id) | index("'"$story_job_id"'")) != null' "story job history should include generation and retry jobs"
|
||||
assert_jq "$storybook_jobs_json" 'length >= 2 and (map(.id) | index("'"$storybook_job_id"'")) != null' "storybook job history should include generation and retry jobs"
|
||||
echo "$story_jobs_json" | jq '[.[] | {id,output_mode,status,current_step}]'
|
||||
echo "$storybook_jobs_json" | jq '[.[] | {id,output_mode,status,current_step}]'
|
||||
|
||||
say "Checking story list"
|
||||
list_json="$(get_json "$APP_URL/api/stories?limit=5")"
|
||||
assert_jq "$list_json" "map(.id) | index($story_id) != null" "story list should include generated story"
|
||||
|
||||
Reference in New Issue
Block a user