@starreel/mcp 0.1.173 → 0.1.174

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,28 +1,28 @@
1
- StarReel = a prepaid AI short-drama production line (script → AI rewrite → assets → storyboards → shot frames → video → audio → final cut .mp4), 120+ tools, all served by this server.
1
+ StarReel = prepaid AI short-drama production pipeline (script → AI rewrite → assets → storyboards → shot frames → video → audio → final cut .mp4), 120+ tools, all via this server.
2
2
 
3
- ★ Step one is ALWAYS to judge "what material does the customer have" — it decides the entry point, and rework from a wrong entry costs real credits (full table and key points: get_capabilities_guide):
4
- · A novel / story outline / synopsis (not yet in script form) → create_drama → set_script → rewrite_script → review_script
5
- · A finished script (scene headings + dialogue lines) → set_script → rewrite_script → get_script → review_script
6
- · They want to rewrite on another AI platform themselves / complain "your AI changes too much" → get_script_format_spec → let the external platform rewrite → check_script_format (errors down to zero) → exit A: adopt_external_script (with annotations · adopted as-is · free) or exit B: set_script + rewrite_script (story layer only · platform adds annotations)
7
- · A finished storyboard table (seconds / shot size / camera move per shot; typical for pilots or sheets handed to TV stations and brands) → get_storyboard_table_spec → tidy it with an external tool against the template → check_storyboard_table (errors down to zero) → import_storyboard_table (auto_complete by default) → get_autofill_status until done → review_storyboards
8
- · Structured data (customer's own tools / spreadsheet export / third-party AI emitting JSON, to build the episode's storyboards in one go; characters / scenes / props are still extracted by extract_assets) → get_bulk_import_spec → check_bulk_import (errors down to zero) → bulk_import_storyboards (auto_complete by default) → get_autofill_status until done → review_storyboards
9
- · Their own character sheets / scene plates / prop sheets / shot frames (the customer's real material) → upload_image · set_character_portrait · upload_scene_image · upload_prop_sheet · upload_shot_frame (customer-owned material only; to change the picture use generate_shot_frame) · upload_shot_footage (a whole live-action / screen-recorded clip as a shot's final footage)
10
- · Their own voice sample / a specific voice → clone_voice → speak_with_voice (preview) → set_character_voice (native-voice dramas: before generate_videos) / assign_voices
11
- · No external voice source; they want a voice a character already spoke in the film as the reference → generate_videos (one shot per speaking character first) → set_voice_anchor_from_shot → generate_videos (the remaining shots) → get_pipeline_status and check stale_shots
12
- · A song + lyrics (MV) → create_drama → set_mv_lyrics → generate_mv_story → generate_mv_script → get_mv
13
- · Lyrics only, no song (they want an MV) → set_mv_lyrics → suggest_mv_song_styles → quote_mv_song (customer agrees) → generate_mv_song → get_mv_song (preview) → select_mv_song → generate_mv_story → generate_mv_script
14
- · A product / brand (ads, brand films) → create_drama → add_product → generate_product_sheet → list_products → render_multi_aspect
15
- · Generated shots / a final cut need changes (dialogue, trimming, splitting, regenerating a shot, switching engines) → scan_dialogue_coverage / scan_intra_shot_cuts to diagnose first → update_shot / replace_shot_dialogue / repair_episode_dialogue / split_shot / trim_shot / regenerate_shot_video / edit_video_shot → rerender_episode
16
- · An existing video (own footage or a generated shot) where they want to keep the motion but replace the character / wardrobe entirely (video repaint) → get_repaint_capabilities → upload_shot_footage (own video) → quote_repaint_shot_video / quote_reskin_shot_video → repaint_shot_video / reskin_shot_video → get_repaint_status
17
- · They want to edit themselves and need a per-shot handoff pack (clean footage / dialogue track / SFX / music / subtitles) → export_handoff_pack → get_handoff_toolchain → save_handoff_toolchain
18
- · Multilingual release → translate_subtitles → update_project_settings
3
+ ★The first step is always to determine “what materials the client already has” — this decides the entry point; choosing the wrong entry causes real paid rework (full table and key points: get_capabilities_guide):
4
+ · Novel / story outline / synopsis (not yet in script form) → create_drama → set_script → rewrite_script → review_script
5
+ · Already-written script (with scene headings + dialogue-line structure) → set_script → rewrite_script → get_script → review_script
6
+ · Wants to use another AI platform to rewrite / says “your AI changed too much” → get_script_format_spec → rewrite on external platform → check_script_format(errors cleared) → Exit A adopt_external_script(with annotations · direct adoption · free) or Exit B set_script + rewrite_script(story layer only · platform adds annotations)
7
+ · Completed final storyboard table (per-shot duration / shot size / camera movement; common for samples, TV stations, or brands) → get_storyboard_table_spec → organize with external tool using template → check_storyboard_table(errors cleared) → import_storyboard_table(default auto_complete) → get_autofill_status until done → review_storyboards
8
+ · Structured data (client’s own tool / spreadsheet export / third-party AI outputs JSON directly; wants to build this episode’s storyboards in one pass; characters/scenes/props still extracted by extract_assets) → get_bulk_import_spec → check_bulk_import(errors cleared) → bulk_import_storyboards(default auto_complete) → get_autofill_status until done → review_storyboards
9
+ · Own character sheets / scene images / prop images / shot frames (client real assets) → upload_image · set_character_portrait · upload_scene_image · upload_prop_sheet · upload_shot_frame(client-owned assets only; to alter the image use generate_shot_frame) · upload_shot_footage(full live-action/screen-recording clip as one shot’s final video)
10
+ · Own voice sample / specified voice → clone_voice → speak_with_voice(test listen) → set_character_voice(original-voice drama: before generate_videos) / assign_voices
11
+ · No external audio source, wants to use a voice already spoken by a character in the video as baseline → generate_videos(first generate one shot for each speaking character) → set_voice_anchor_from_shot → generate_videos(remaining shots) → get_pipeline_status check stale_shots
12
+ · Song + lyrics (MV) → create_drama → set_mv_lyrics → generate_mv_story → generate_mv_script → get_mv
13
+ · Lyrics only, no song (wants MV) → set_mv_lyrics → suggest_mv_song_styles → quote_mv_song(user agrees) → generate_mv_song → get_mv_song(test listen) → select_mv_song → generate_mv_story → generate_mv_script
14
+ · Product / brand (ad, brand microfilm) → create_drama → add_product → generate_product_sheet → list_products → render_multi_aspect
15
+ · Generated shots / final cut need changes (change lines, trim, split shot, regenerate a shot, switch engine) → scan_dialogue_coverage / scan_intra_shot_cuts diagnose first → update_shot / replace_shot_dialogue / repair_episode_dialogue / split_shot / trim_shot / regenerate_shot_video / edit_video_shot → rerender_episode
16
+ · Existing video segment (own asset or generated shot), wants to keep action but replace character / outfit overall (video repaint) → get_repaint_capabilities → upload_shot_footage(own video) → quote_repaint_shot_video / quote_reskin_shot_video → repaint_shot_video / reskin_shot_video → get_repaint_status
17
+ · Wants to edit themselves: needs per-shot asset pack (raw video / dialogue tracks / SFX / music / subtitles) → export_handoff_pack → get_handoff_toolchain → save_handoff_toolchain
18
+ · Multilingual distribution → translate_subtitles → update_project_settings
19
19
 
20
- Pipeline order (no skipping): create_drama (set setting_brief / aspect ratio / video_engine / image_model / consistency anchors at creation — all free) → set_script → rewrite_script → ★review_script → extract_assets → quote/generate_storyboards → ★review_storyboards → character sheets + design sheets / scene plates / prop sheets / color script → ★review_assets → run_precheck → quote/generate_frames (first frames only by default) → tail_frame_plan (free · which shots need a separate last frame) → quote/generate_frames (frame_type=last_frame) → chain_frames (seams · dry_run:true first to see the plan, run it after the customer confirms) → get_jobs (wait until its reframe image jobs finish; failed ones show error_msg) → ★review_frames → quote/generate_videos → audio → ★review_videos → compose_episode → get_final_cut → review_final_cut. Track progress with get_pipeline_status.
21
- Five free hard gates (skipping → 400): review_script (before extract_assets / storyboards) · review_storyboards (before frames, incl. per-shot generate_shot_frame) · review_assets (before frames; pass its token as asset_review_token) · review_frames (before videos, incl. per-shot regenerate_shot_video) · review_videos (before compose_episode); pass the review_token to downstream paid tools (batch and per-shot alike) and relay every finding to the customer verbatim.
22
- ★After every review you must also do your own QC: open each item in the returned agent_qc materials yourself, answer its checklist, and submit_qc_report; on gated dramas the token is unusable until the report is in.
23
- Billing discipline: prepaid, no overdraft; for large steps call quote_* → tell the customer estimated_points as-is → only after they agree call generate_* (quote_id), never confirm on their behalf; image quotes give estimated_points (upper bound — prepare balance for it) and typical_points (usual spend) — say both; text steps are billed post-hoc by tokens; on 402 stop and let the customer top up, do not retry.
24
- Long tasks are async: generate_* returns immediately; poll with get_pipeline_status / get_storyboards / get_run_status; an image in pending is still generating — do not call again (double billing).
25
- After a successful rewrite only spot-edit with edit_rewritten_script, do not rerun rewrite_script; the single source of truth for character appearance is the character profile (update_character) — never put it into visual_lock / art_bible.
26
- Choosing an image model / video engine, or the customer asks "which model is better / how to save" → get_capabilities_guide (section=model_guide): measured strengths and weaknesses, prices, decision steps and recommended combos; bring it up proactively when creating the drama.
27
- Action / fight / skill-showcase films → get_capabilities_guide (section=action_film): the storyboard-table fast path, first frame frozen on the wind-up, grouping and rhythm cutting.
28
- Unsure which tool to use, or the customer asks "what can you do" → call get_capabilities_guide first (free, local, no network).
20
+ Pipeline order (do not skip steps): create_drama(create drama and set setting_brief/aspect ratio/video_engine/image_model/consistency anchors, all free) → set_script → rewrite_script → ★review_script → extract_assets → quote/generate_storyboards → ★review_storyboards → character sheets + turnarounds (generate_character_sheets) / scene images / prop images / color script → ★review_assets → run_precheck → quote/generate_frames(default only first frame) → tail_frame_plan(which shots need independent last frames) → quote/generate_frames(last_frame) → chain_frames (dry_run first, run it after confirmation) → get_jobs (wait for its reframe image jobs to finish) → ★review_frames → quote/generate_videos → audio → ★review_videos → compose_episode → get_final_cut → review_final_cut. Use get_pipeline_status to check progress.
21
+ Five free hard gates (skip → 400): review_script(before extract_assets/storyboards) · review_storyboards(before frame generation via generate_frames, including single-shot generate_shot_frame) · review_assets(after character/scene/prop images are generated, before frame generation via generate_frames / generate_shot_frame; pass its token as asset_review_token) · review_frames(before video generation, including single-shot regenerate_shot_video) · review_videos(before compose_episode); pass review_token to downstream paid tools (both batch and single-shot tools require it); report findings to the client verbatim item by item.
22
+ ★After each review layer you must also personally QC: inspect assets item by item according to returned agent_qc, then submit_qc_report; gray-release dramas cannot proceed without the report.
23
+ Billing discipline: prepaid, no overdraft; for large steps quote_* → tell client estimated_points exactly as returned → after client agrees, generate_*(quote_id); never confirm on your own; image-generation quotes provide estimated_points(upper bound, prepare balance by this) and typical_points(usual spend), state both; text steps are postpaid by token; on 402 stop and ask client to recharge, do not retry.
24
+ Long tasks are async: generate_* returns immediately; poll with get_pipeline_status / get_storyboards / get_run_status; image pending = still generating, do not call again (duplicates charge credits).
25
+ After rewrite succeeds, only use edit_rewritten_script for targeted edits; do not rerun rewrite_script; the single source of truth for character appearance is the character profile (update_character), do not write it into visual_lock/art_bible.
26
+ Choosing image model/video engine, or client asks “which model is better / how to save more” → get_capabilities_guide(section=model_guide): measured pros/cons, prices, decision steps, and recommended combos for each model; proactively explain and decide with client when creating the drama.
27
+ For action / fight / skill demo videos → get_capabilities_guide(section=action_film): storyboard-table fast path, first frame frozen at wind-up pose, grouping and rhythm trimming.
28
+ If unsure which tool to use, or client asks “what can you do” → call get_capabilities_guide first (free, local, no internet).
@@ -1 +1,241 @@
1
- {}
1
+ {
2
+ "get_capabilities_guide": "★Capability map (free · local · offline · no credits). **Call this first when you are new to this server, when a client asks “what can you do / where should we start”, or when you are unsure which tool fits the client’s materials**. Returns: entry_points(client has novel / mature script / wants external AI rewrite / finished storyboard table / own assets / voice sample / song / product / existing final cut to revise / wants to edit locally / multilingual → which tools to use and which path to avoid), pipeline(10-step production line, tools per step, free vs paid, review gates), review_gates(three free hard-gate rules), qa_tools(pick diagnostics and fixes by symptom), optional_boosts(optional enhancements and timing), billing(quote confirmation and free families), common_requests(client wording → action), local_postproduction(★full workflow when client wants to download shots to **their own computer** for color grading / third-party AI post / editing / scoring / subtitle burn-in / transition optimization / narration patch: phase order, execution location, per-shot/per-line audio checks, acceptance criteria), model_guide(★tested pros/cons, prices, selection steps and recommended combinations for image models and video engines—read before project model selection or when client asks “which model is better / why are hands bad / how to save money”), action_film(★workflow for action / fight / skill-demo films: asset images follow the rewrite backbone while storyboards use your own table, first frame freezes at wind-up, group adjacent action shots, trim draggy tails, engine tests and cost reference—read before action films or “can this reference video be made”). Pass section to fetch one part only. ★Tool descriptions answer “what does this tool do”; this tool answers “when should I use which tool”. If a client gives a finished storyboard table but you run set_script→rewrite_script and turn it into prose, you skipped this map.",
3
+ "list_project_options": "List all project creation options: project type(short drama/ad/MV/brand film), aspect ratio, video resolution, video engine(Seedance 2.5/MiniMax H3, with price and capability differences), with Chinese/English labels + descriptions + defaults. Call before create_drama, let the user choose, then pass keys to create_drama. Free.",
4
+ "create_drama": "Create a new short-drama project shell. ★Strongly recommended: set base project settings at creation—project_type/setting_brief(worldview · ERA LOCK)/ethnicity/aspect ratio/resolution, plus consistency anchors(cinematography_prompt/art_bible/visual_lock). All are free and form the foundation for full-pipeline consistency; creating an empty shell with title only will derail later generations and cause paid rework. Automatically creates N empty episodes from total_episodes, returns drama_id and episode_id per episode. Free.",
5
+ "set_script": "Set the **original script** (content) for an episode. This is the input for AI rewriting, not the final shootable draft. Free. Put synopsis/outline/self-written finished draft here; after setting it you **must call rewrite_script for AI rewriting**—do not skip rewriting and paste the draft directly into edit_rewritten_script (it will be rejected). ★★【Execution-mode master guide·read before starting】For dramas with a confirmed opening plan, first call get_production_plan and read autopilot: professional mode (pro, or autopilot.enabled=false, or plan not confirmed) → every later “tell the customer; proceed only after customer agrees” is literal; one-click (auto)/hybrid (custom) **managed stages** → do not ask the customer: proceed in order by get_pipeline_status next_action, self-confirm quotes within the hard budget cap, and after each layer still run review_* + agent QC; the review/QC returned autopilot.next_step tells you how to proceed for that layer (whitelisted error with auto_acknowledge:true / self-fix round number / pause and ask customer), follow it; for choices follow autopilot.default_decisions; autopilot.never_auto_actions (mode=replace, delete assets, overwrite customer-uploaded images, allow_era_ref_conflict, voice cloning, delivery acceptance) always require customer approval in every mode. ★In managed stages, re-generating frames for the same shot (generate_shot_frame) is capped at 3 rounds, re-generating videos (regenerate_shot_video / edit_video_shot) capped at 3 times; at the cap the platform returns 409 AUTOPILOT_SHOT_REGEN_LIMIT (no charge)—do not bypass with another tool; stop and ask the customer: if they agree to more, quote normally and pass customer_approved_more_regens:true when generating (grants another cap); if they accept the current result, continue, and pass acknowledge_review:true on the next paid call to record confirmation. 402 BUDGET_WOULD_EXCEED / 409 MODEL_UNAVAILABLE / 409 AUTOPILOT_SHOT_REGEN_LIMIT / 400 AUTOPILOT_MUST_ASK with must_ask_customer=true / non-empty pending_questions → pause and ask the customer **once with a consolidated summary** of get_autopilot_log pending_questions; customer-controlled stages follow professional-mode asking. After final cut, deliver to customer using get_autopilot_log report. ★Three-tier execution strategy (do not mix the tiers when asking the customer): ①【Basic project settings·free·mandatory foundation·set when creating the drama; do not create an empty shell】project_type/setting_brief (worldview·ERA LOCK)/ethnicity/aspect ratio and resolution, plus consistency anchors cinematography_prompt (cinematography DNA)·art_bible (art bible)·visual_lock (visual lock)—all free, the foundation driving full-chain consistency; if not set, all later generation drifts and rework costs money. Set directly with create_drama/update_project_settings. ★visual_lock/art_bible should only contain frame-level/world-level locks (camera language·environment·art tone·forbidden elements), **never pin clothing/hairstyle/appearance details for specific characters**—the only source of truth for character appearance is the character profiles from extract_assets (change via update_character); writing both inevitably conflicts: character sheets vs profiles, concept images vs visual lock, consistency gates reject by character sheet → concept images/shot frames get **structurally rejected repeatedly**, no number of rerolls will pass, pure wasted spend. ★★【Era contract·free·mandatory before image generation for non-modern subjects】The worldview in setting_brief is **free text**, only provides background and cannot constrain images; the real override stronger than visual lock is the **structured era contract**: use set_era_contract to set the episode tier (modern/republican/historical/fantasy), get_era_contract to read current value. **Unset means empty**—the platform can only stack words in prompts; modern objects appearing in ancient images, scene images rendered in the wrong era, are mostly caused by this being empty. ★Xianxia/fantasy/wonderland types **must use fantasy, not historical**: historical demands evidence-based realism and will mark glowing aura, floating terrain, non-human forms as “not era-compliant”, pulling images toward realistic antiquity. For a single scene exception (e.g. modern flashback in a fantasy world), use update_scene era_contract to override; scene-level overrides episode-level. ★★【Per-stage review protocol·all free·main line preventing waste, not optional】After each stage output, review first, tell the customer the conclusion verbatim, then proceed. **Five hard gates (failing causes 400 rejection; ④⑤ and agent QC below)**: ① after rewritten draft → review_script (before extract_assets / generate_storyboards); ② after storyboards → review_storyboards (before generate_frames); ③ after shot images → review_frames (before generate_videos). Each review returns review_token; pass it to downstream paid tools. Explain findings one by one to customer (code=issue type·shots=hit shot numbers·action=which tool to fix with); after fixing per action, **review again** before proceeding. If content changes after review → token invalidates automatically; re-review once (free). error blocks by default; only if the customer is explicitly informed and insists may you pass acknowledge_review:true (acknowledge_review only means the customer personally agreed; every execution mode requires explicit customer agreement, including managed). Managed stages may use auto_acknowledge:true only for whitelisted heuristic errors (see 【Execution-mode master guide】). **Soft guidance (non-blocking but strongly recommended, also free)**: before image/video generation run run_precheck (finds shots vendors will reject, prevents wasted spend)—★**for whole-drama scan, first run run_drama_precheck** (drama-level summary·free·read-only): get issue counts per episode and attention (which episodes to fix first), prioritize accordingly, then run run_precheck on those episodes for details; do not blindly scan episode by episode. Note not_covered—the drama-level scan skips the only lint requiring images; “0 drama issues” ≠ “everything checked”. ★After issues are found, do not blindly edit yourself: plan_precheck_fix lets the platform compute proposals → apply_precheck_fix commits selected ones (for managed=accept all according to execution mode: professional mode / unconfirmed plan / customer-controlled current stage → tell customer and proceed only after agreement; do not decide for them; managed current stage → do not ask, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log); after storyboards run get_health_report; after character sheets are done use get_characters to verify every on-screen character has image/sheet; after frames use get_storyboards to inspect frame_status and fail_reason/fail_hint (fix failed shots before continuing; do not make videos from bad frames); after videos inspect video_status similarly; before final cut use get_pipeline_status to confirm no missing shots. ★**Never generate all the way through blindly**: pushing generate calls without review amplifies issues at every layer and can waste the whole episode; every image/video rework is charged. Reviews are all free; catching issues costs nothing. ★Changing clothing edits structured bindings: update_shot active_wardrobe_id (whole shot) / appearance_wardrobes (per character in multi-character shots), can override or clear—text description changes do not change clothes, and the customer need not edit on the website. ②【Production mainline·in order, no skipping·★storyboard before assets】set_script→rewrite_script→★review_script→extract_assets→storyboards (storyboard first·pure-text shot breakdown)→★review_storyboards→★Script discipline (endpoint-enforced, cannot be bypassed): all raw material (synopsis/outline/finished draft) goes in set_script, **must pass rewrite_script to produce the AI rewritten draft**—pasting a self-written script directly into edit_rewritten_script to bypass rewriting will be rejected with 400 (without a rewritten draft there is nothing to edit); extract_assets also requires the rewritten draft. All post-rewrite edits must use AI-output structured formats: script edits via edit_rewritten_script (polish/correct), character profiles via update_character, storyboards via update_shot/replace_shot_dialogue—do not replace the whole script again or write a second truth source in settings; conflicting truth sources are the #1 consistency accident. ★★**After one successful rewrite, do not rerun rewrite_script**: it restarts from the whole original, discards all current fixes, and the new version is not guaranteed to preserve fixed parts (three-version tests oscillate). To fix, use edit_rewritten_script targeted edits (get_script full text → change only those scenes, copy all else verbatim → submit whole text), free, instant, deterministic; if rerun by mistake, use get_script(include_previous=1) to recover the previous version. generate_portraits_and_sheets (character sheets + turnaround sheets·build after storyboards: first use delete_character to delete on-screen characters that **do not appear in any episode of the whole drama and are not planned for later episodes** before image generation—characters are drama-level; after deletion, every episode’s frame assembly will no longer include them; you cannot judge by this episode’s storyboards alone, keep if unsure (one character sheet costs far less than losing an identity anchor in a later episode); this step generates images for **all undeleted on-screen characters**, regardless of storyboard binding, and charges for all kept characters; off-screen voice characters (char_type=voiceover narrator/phone voice) do not get images and have no storyboard binding, **do not delete them**, dubbing still needs them)→★generate_color_script (color script·unified grading)→assign_voices (assign voice colors; if narrator/character library has no suitable voice → design_voice by description, then set_character_voice after sample confirmation)→★quote_scene_images+generate_scene_images (empty scene plates·mandatory before frames)→frames (default only first frames)→★tail_frame_plan (free·which shots need independent last frames)→frames(frame_type=last_frame)→★chain_frames (seams·dry_run:true first)→★review_frames→videos→generate_tts→compose; ★★【Do not skip seams·after last frames complete, before review_frames】After first/last frames are ready, call chain_frames(dry_run:true, free) to see the platform seam plan and estimated_points (copy free, reframe costs one image per seam), tell customer and after confirmation execute without dry_run; already chained seams are excluded from the plan, repeated calls do not double-charge. ★After execution, reframe is **async image generation**: use get_jobs to watch the first_frame generation rows for shots in the plan, wait until all pending/processing finish (for failed, inspect error_msg; use chain_shot_from for a single seam), then run review_frames—while the old first frame remains, get_storyboards frame_status is still ready and cannot show whether the new image is generating or failed. After get_jobs is clear, use get_storyboards to verify seam_state: replacement images rejected during promotion are not kept in get_jobs, that seam remains unchained (review_frames also reports seam_unchained); reconnect per its action. If you review before it lands, you review the old first frame; the token invalidates when the new first frame lands. Episodes with per-shot/batch frame generation usually were not auto-chained (get_storyboards seam_state=unchained means this); skipping it does not error—the cost is discontinuity between shots and jump cuts in final cut. ★★【Do not skip last frames·frame generation is two-pass】generate_frames defaults to first frames only. About 30% of shots have **end state ≠ start state** (large camera move/object released/state change); these need an independent last frame, and the criterion is platform-side, not guessable from storyboard text—therefore after first frames finish you must call the free tail_frame_plan once for the per-shot list, then fill with frame_type=last_frame (shots_needing_last_frame in generate_frames response is this number; if not 0, do not go directly to review_frames). Skipping does not error or block—the cost is those videos having only the first frame as anchor, leaving end state to the model: action incomplete, large camera moves end by returning to start composition. Production tests: in 32 episodes, 30 generated only first frames; 23 of those proceeded all the way through video. ★★【When last frames are blocked by TERMINAL_DESC_GATE: edit text, do not retry】For shots reporting “this shot is marked as state change but nowhere says what it looks like at the end”, use update_shot to write **what the image looks like at the end** into that shot’s last_frame_prompt, then regenerate the last frame. ★Better: **avoid hitting it**—before last frames, call get_storyboards and list all terminal_desc_missing=true shots for the episode at once (free), fill their last_frame_prompt first, then generate; zero rejections needed. Per-shot also possible via get_shot_prompts same field, but do not do that for dozens of shots. Retrying without the description is ineffective—the vendor prompt has no terminal-state segment, so it still draws the first-frame pose and will fail terminal review again, with normal charges each time (production test: last-frame success 9.4% without terminal text, 40.2% with it). Only for shots that truly “almost do not change” use generate_shot_frame allow_missing_terminal. ★★【Do not skip empty scene plates·third parties often miss this】Scene images are **background anchors**: every shot frame in the same scene anchors to them. Frames can still be generated without plates, with no error and no block—the cost is **the first shot of every scene has no background anchor at all** (platform fallback is “if missing image is discovered, generate one in background”; that generated plate is used by later shots in the same scene, but the triggering first shot cannot wait for it), and the first shot is often the tone-setting shot; backgrounds also drift among later shots. They pair with character sheets: character sheets anchor people, scene images anchor environments; whichever is missing drifts. Progress self-check: generate_scene_images step in get_pipeline_status (completed/total); review_storyboards also reports scene_plate_missing before frames. ★★【Do not skip turnaround sheets·character sheet ≠ turnaround sheet】A character sheet is a single-person single-image identity anchor; a turnaround sheet is a multi-view turnaround generated by the platform from the character sheet, the root consistency anchor for shot frames/videos (angle changes·lighting changes·clothing mostly depend on it). Frames can still be generated with only character sheets, no error—the cost is characters drift when angle changes and clothing differs every shot. Use generate_portraits_and_sheets for one-click two-step (each call advances one step; after character sheets are complete, call again to generate turnaround sheets), or call generate_character_sheets after character sheets. Progress self-check: get_pipeline_status generate_character_sheets step (completed/total, portrait_only=characters with only character sheets). ★Customer-provided images: character sheets must be single person, single image, single angle, no text; scene images must be empty scenes with no people and no overlay text—set_character_portrait/upload_scene_image auto-check and reject noncompliance with 422. ★Do not build character images/prop sheets/motion templates before storyboards—storyboards are pure text and need no images; the cast is finalized after storyboards, so delete non-appearing characters first to save (motion templates also must be after storyboards). Paid steps follow current quote confirmation flow. Ads additionally need add_product+generate_product_sheet; MV uses set_mv_lyrics→generate_mv_story→generate_mv_script (if no existing song: after set_mv_lyrics first suggest_mv_song_styles→quote_mv_song→generate_mv_song→get_mv_song→select_mv_song). ★★【④⑤ two new hard gates + agent personal QC】④ asset layer: after character sheets/turnaround sheets/scene images/prop images → review_assets (before generate_frames / generate_shot_frame; its token is asset_review_token and is passed together with the storyboard-layer review_token); ⑤ video and audio layer: after videos/dubbing/music → review_videos (before compose_episode); after final cut run review_final_cut. ★After every layer review you must also **personally QC**: follow returned agent_qc, inspect assets one by one (download images, sample video frames, read text), answer the checklist, submit via submit_qc_report; for grayscale dramas, without the report the review_token cannot enter the next step; report issues block by default like errors. The platform judges existence; you judge likeness and correctness. ★★【Single-shot path is also gated】generate_shot_frame must also pass storyboard-layer review_token; regenerate_shot_video must also pass shot-image-layer review_token—do not expect per-shot tools to bypass reviews (a tested workflow generated all 25 shots by single-shot frames without any gate; all final-cut rework cost real credits). Generating frames does **not** invalidate storyboard-layer token (fingerprint only looks at storyboard content); only changing storyboard content—update_shot / import / add-delete shots / change character bindings—requires one free quick re-review. Generating one shot’s frame invalidates the **shot-image-layer** token; before regenerate_shot_video for the next shot, run review_frames once. ★★【For native-audio dramas, lock voices before batch videos】When use_clip_audio=true (default), each shot’s voice is sampled separately by the video vendor; without locking, it will drift and later unification requires per-shot video regeneration. If customer-authorized source audio exists → clone_voice+set_character_voice before generate_videos; otherwise → for each speaking character first use single-shot quote_regenerate_shot_video→regenerate_shot_video to generate one shot with longer dialogue (generate_videos has no per-shot parameters and only batch-fills missing videos; single-shot regeneration also works for shots with no video yet), use set_voice_anchor_from_shot to choose that voice line, then generate remaining shots. get_pipeline_status native_voice_anchor lists unanchored_speakers still unlocked and stale_shots generated before locking that need regeneration. ★Worldview concept image = mandatory by default (improves whole-drama consistency; many third-party platforms miss this): after storyboards, call generate_world_concept by default, still following quote confirmation (tell customer estimated credits, confirm before charging)—do not silently charge, and do not skip. ★★【Color script】generate_color_script unifies grading across the whole film, done after storyboards and before frames; text step has no quote_* and is postpaid by usage. Progress self-check: get_pipeline_status generate_color_script; review_storyboards reports color-script gaps. ★Motion templates are optional experimental: call generate_motion_templates (motion template extraction) only when the customer explicitly requests it, after storyboards; text step postpaid by usage. First/last frames do not inject motion templates by default; missing templates do not need backfill and do not block images/videos/final cut. Video templates may be cropped; no delivery or gain is guaranteed. ★Scene Bible (detailed scene settings) order is **after scene images are generated**—complete it based on finished scene images (no MCP tool yet; do on official site); do not do Scene Bible before scene images. ★Audio defaults to video native audio (use_clip_audio on by default; skip TTS and use AI video’s built-in audio): when creating/updating a drama, the AI should proactively tell the customer “Default uses video native audio; if TTS dubbing is needed set use_clip_audio to false” and let them choose. ★Default image model is ChatGPT Image 2.5 Flare (gpt-image-2.5-flare·unified whole-drama style): set image_model in create_drama/update_project_settings; omitted means this default; options: gpt-image-2.5-sunburst (same price·more accurate Chinese glyphs/details)/gemini-3.1-flash-image (Nano Banana 2·71 credits)/gemini-3-pro-image (Nano Banana Pro·more detailed·175 credits)/gemini-3.1-flash-lite-image (Nano Banana 2 Lite·cheap·31 credits)/doubao-seedream-5-0-260128 (Seedream5.0); generate_frames can temporarily override for one run. ★2.5 charges by input volume (base 11 credits + 18 credits per reference image), Nano Banana/Seedream are flat-price—budget must include this for shots with many references. ★Four video engine choices (drama-level·when AI creates a drama it must proactively guide selection by genre and show price differences for customer decision):【Selection decision tree】① realistic live-action drama→hailuo-3 (about 1/3 cost, 70 credits/second·strong faithful editing·can output 2K·but each shot ~6 minutes; if video_engine not passed, platform auto-selects it by style); seedance-2.5 is not yet open for live-action subjects, but usable for anime/stylized (anime/stylized dramas still default seedance-2.5, strongest instruction following/details·720p 212 credits/second); ② stylized/animation/3D cartoon drama·empty shots·product shots→wan3.0 (about 40% cost, 84 credits/second·max 30 seconds·min 2-second billing·each shot ~2 minutes), use wan3.0-prime for rush delivery (126 credits/second·~1 minute); ③★Never choose wan3.0/prime for realistic live-action drama—WAN output-side real-human face review consistently rejects at 720p+ and retries cannot fix; ④★★Use wan3.0/prime cautiously for narrative dramas (dialogue, coherent story, stable shot rhythm): WAN will **self-cut hard camera changes inside a single storyboard shot** (test: 11/12 shots had intra-shot jump cuts, vs seedance-2.5 only 1/6 and hailuo-3 0/5), final cut feels like “the image jumps around within one shot and cuts too fast”; this is weak vendor instruction following and cannot be stopped by prompt constraints (our negative constraints are already included and tested ineffective), fix afterward only by regenerating with another engine. WAN suits inherently short-fast stylized/empty/product shots; for stable single-shot narrative choose seedance-2.5 or hailuo-3. After generation, use scan_intra_shot_cuts to inspect; ④b★★Use hailuo-3 cautiously for dialogue-heavy drama (different from the previous “intra-shot self-cut”; this is about **whether all dialogue is spoken**): native-audio engine stops reading when the shot ends and may ad-lib; tests show “dialogue not fully spoken” rate hailuo-3 **50%** (26 shots, all generated after 8-30 native-audio fixes, so engine-intrinsic), seedance-2.5 **23%** (294 shots); wan3.0 has **insufficient sample, not tested** on this dimension (26 samples all before same fix, only 2 shots after fix)—do not conclude WAN is bad from this. When customer says “line not finished”, first run scan_dialogue_coverage and categorize; do not default to lengthening shots (even with sufficient shot length, 32% still missed full lines). ⑤★Shot duration control (all engines, especially visible on WAN): keep each shot 3~5 seconds. Longer shots give the model more room to improvise—test: one 16-second shot (neighboring shots 3~5 seconds) changed scenes 4 times inside the shot, the character disappeared for 4 seconds and then grew back from the edge; customer sees “a person appeared out of nowhere”. For long performance, split into multiple short shots and connect with frame chaining; do not write single shots over 15 seconds. 【Resolution decision】Draft/iteration: WAN dramas 480p (42 credits/second cheapest), others 720p; final delivery: seedance dramas 720p (HD tier discontinued), hailuo-3 dramas 1080p (=2K·112 credits/second), WAN dramas 1080p (168 credits/second); hailuo-3 has no independent 480p tier (selecting it bills as 768P); set video_engine/video_resolution in create_drama/update_project_settings, ★both must be decided before video generation—switching does not back-propagate to generated shots, and mixing within one drama causes style/identity drift. ★Slow image generation ≠ failure: each image takes tens of seconds to minutes; a full episode may take over ten minutes. Poll get_storyboards frame_status—pending=still generating (wait patiently; do not call generate_frames repeatedly and waste credits), ready=done, failed=real failure. ★To change a specific shot image / make a new character sheet take effect, use **single-shot regeneration generate_shot_frame** (platform automatically includes identity anchors, scene/prop references, style anchors for that shot, preserving whole-film consistency); generate_frames only batch-fills shots with **missing frames** and skips shots that already have first frames (normal, not “refusal”). ★After first frames, call free tail_frame_plan to see which shots need independent last frames, then batch-fill with frame_type=last_frame. After changing a character sheet (set_character_portrait), response stale_frames are shots polluted by the old image and requiring per-shot regeneration. ★Never use external tools to make first/last frames and upload_shot_frame to “change the image”—external images lack identity/style anchors, so characters/clothing/style will drift; that is the real root of waste. upload_shot_frame is only for customer-owned real footage/assets. ③【Optional enhancements·AI proactively tells customer·quote confirmation required】Art bible generation / visual lock extraction / scene groups / lip sync / poster / sound effects / music / subtitle translation—these improve consistency/quality and are mostly paid. ★AI should proactively tell the customer these are available and quote them (whether to run depends on execution mode: professional mode / unconfirmed plan / customer-controlled current stage → tell customer and proceed only after agreement; do not decide for them; managed current stage → do not ask, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log); neither silently skip nor charge without permission. ★Two lock disciplines: ①**Aspect ratio** is set in create_drama, locked at drama level, used by all later images/videos/final cuts, **do not change midstream** (generated content would have inconsistent aspect ratios and drift); default 9:16 if unset. ②**5-7 seconds per storyboard shot is a normal AI-video-optimized duration**, do not mistakenly re-split because “shots seem long”—generate_storyboards **replaces all storyboards in the episode**, wasting generated images; backend blocks if storyboards already exist and requires confirm_replace. ★Rewrite fidelity (default auto intelligent routing): when the set_script original **is already script-shaped** (scene headers/dialogue-line structure), rewrite_script automatically runs two-pass fidelity—customer dialogue is machine-gate locked line by line (dropping one line triggers internal rejection and redo), AI never adds plot; dramaturgical gaps (hooks/emotional anchors) are not auto-filled but listed in get_script dramaturgy_suggestions (whether to adopt depends on execution mode: professional mode / unconfirmed plan / customer-controlled current stage → tell customer and proceed only after agreement; do not decide for them; managed current stage → do not ask, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log). If original is novel/outline, it auto-runs creative rewriting (AI builds hooks/emotional beats). Both customer types get the right path; no manual switch needed. To override defaults, use update_project_settings rewrite_pipeline (auto/two_pass/single_forced) and fidelity_enforce (1=hard fidelity gate). Handling “AI changed my script too much”: ①confirm full original is in set_script; ②set rewrite_pipeline to two_pass and rerun rewrite_script; ③after customer confirms character appearance, use update_character profile_locked=1 to lock profiles and prevent later extraction from overwriting appearance and changing the character sheet face. ★If customer wants to rewrite the script on **another AI platform** (common: third-party model judges our rewrite “changed too much”, customer wants control over change degree): first call get_script_format_spec to get the platform-accepted format contract (markdown template + external_prompt directly forwardable to the external model + blank skeleton), send external_prompt+template+customer original to that platform; after receiving the organized draft, **first call check_script_format** for self-check (free·rules only·no model). After errors clear, two exits: 【A】adopt_external_script directly commits it as shootable draft (our AI not involved·instant·free, provided the external draft contains production-layer annotations); 【B】set_script back into the original slot + rewrite_script through two-pass fidelity (choose this when the external draft only handles story layer; platform adds annotations; customer-written annotations are stripped and rewritten on this path). ★Do not put externally organized drafts into edit_rewritten_script (400 if no rewrite has run), and do not skip check_script_format before ingesting—noncompliant scripts are still gate-blocked and waste a run. ★★If the customer provides an **already finished storyboard table** (per-shot seconds/shot size/camera movement), neither path above applies—use import_storyboard_table directly to create storyboards, skipping rewrite and shot breakdown. The rewrite path will strip seconds/shot size/camera movement/STYLE/text cards as non-story content (production test: 8 shots 36 seconds → 20 shots 109 seconds). ★Both import channels are deterministic—errors are imported as-is, so **get the contract first, self-check, then import**: storyboard table path uses get_storyboard_table_spec → check_storyboard_table → import_storyboard_table; if customer tools/tables export structured data, or external AI can produce JSON directly, use get_bulk_import_spec → check_bulk_import → bulk_import_storyboards (storyboards only; characters/scenes/props are extracted from script by extract_assets, import binds existing items by name—extract first, then import). Both imports default with auto_complete (background AI fills professional fields + image/video prompts, text step postpaid; inform customer before calling): if receipt started=true, poll get_autofill_status until done before review_storyboards—autofill changes shots, so a token reviewed earlier invalidates. Use get_pipeline_status for progress (returns project-type-specific steps). ★★【Opening plan·first thing after creating drama·free】First ask basic video parameters (project type/aspect ratio/episode count × minutes per episode/genre: realistic_human·stylized·product/native audio or dubbing), then call get_production_menu to fetch the **currently available** three-tier packages (effect description + real-time estimate including text steps + recommended budget + excluded items) and present them to customer—do not recommend models from memory; some models may be temporarily unavailable for some genres, and the menu is already filtered. Then ask customer to choose execution mode (pro control every step / auto one-click final cut / custom select managed stages), budget budget_points, and automatic overrun cap (0/10/20/30/50%): **default recommendation** budget=selected tier recommended_budget (non-text upper bound ×1.2 plus text estimate), overrun=menu recommended_overrun_pct (30%)—QC regenerations are not in the upper bound and are covered by overrun; recommendation is only recommendation, final numbers are customer-decided; if customer changes them, follow customer. Clearly summarize and only after explicit customer agreement call confirm_production_plan(customer_confirmed:true)—never confirm on behalf of customer. For dramas with confirmed plans: before paid dispatch, platform rechecks model availability and quote upper bound ≤ budget×(1+overrun%); if blocked (402 BUDGET_WOULD_EXCEED / 409 MODEL_UNAVAILABLE), stop and ask customer, do not switch models or adjust budget yourself. confirm returns 403 PRODUCTION_PLAN_NOT_OPEN = drama not open (grayscale); follow original step-by-step confirmation flow.",
6
+ "rewrite_script": "AI rewrite: convert the source script into a shootable script (read content → write script_content). Automatically selects the rewrite agent by project type. ★Fidelity auto-routing: if the source is already in script form, automatically uses two-pass fidelity (dialogue locked line by line by machine, AI does not add plot; dramaturgical gaps go into dramaturgy_suggestions; whether to adopt follows execution mode: pro mode / unconfirmed plan / customer-controlled step → explain to customer and do only with customer approval, do not decide for them; autopilot step → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log); if the source is a novel/outline, uses creative rewrite. (Ads use ad rewrite; MV is blocked from standard rewrite.) Backend async (minutes), text step is token postpaid, no arrears, no quote needed. After completion use get_script to review, edit_rewritten_script to revise. ★Typical time 2~4 minutes (production observed ≈169 seconds). **No result within 60 seconds is normal, not failure**—use get_run_status to check whether it is still running; do not rush to resubmit. ★★**This tool is \"redo from the entire source\", not \"make another revision\"**: rerunning when a shootable script already exists overwrites the current script and all prior fixes, and the new version **does not guarantee preserving parts already fixed in the old version** (production test across three versions: long narration split in the previous version was merged back in the next; correct period costume in the previous version drifted in the next). overwrites_existing_script=true in the response means exactly this. Therefore **after the first successful rewrite, all later changes must use edit_rewritten_script for targeted edits**—free, seconds-level, only touches the specified scenes, everything else remains byte-identical, deterministic with no lottery; rerun this tool only when a \"completely different version\" is required. If rerun by mistake, use get_script(include_previous=1) to retrieve the previous version. ★★【Execution-mode master rules · read before starting】For dramas with a confirmed opening plan, first get_production_plan and read autopilot: pro mode (pro, or autopilot.enabled=false, unconfirmed plan) → every later \"explain to customer and do only with customer approval\" is literal; auto / custom **autopilot steps** → do not ask customer: advance in order per get_pipeline_status next_action, self-confirm quotes within the hard budget cap, after each layer still run review_* + agent QC, and follow autopilot.next_step returned by review/QC (whitelisted error with auto_acknowledge:true / which self-fix round / pause to ask customer); for choices follow autopilot.default_decisions; autopilot.never_auto_actions(mode=replace, asset deletion, overwrite customer-uploaded images, allow_era_ref_conflict, voice cloning, delivery acceptance) always require customer approval in every mode. ★For the same shot in autopilot steps, generate_shot_frame regeneration max 3 rounds and regenerate_shot_video / edit_video_shot max 3 times; at the limit platform returns 409 AUTOPILOT_SHOT_REGEN_LIMIT (no charge)—do not bypass with another tool; stop and ask customer: if customer approves more regenerations, quote normally and generate with customer_approved_more_regens:true (grants another limit); if customer accepts current state, continue, and include acknowledge_review:true on the next paid call to record confirmation. 402 BUDGET_WOULD_EXCEED / 409 MODEL_UNAVAILABLE / 409 AUTOPILOT_SHOT_REGEN_LIMIT / 400 AUTOPILOT_MUST_ASK with must_ask_customer=true / nonempty pending_questions → pause, summarize get_autopilot_log pending_questions **once** and ask customer; customer-controlled steps follow pro mode. After final cut, deliver to customer using get_autopilot_log report. ★Three execution tiers (do not mix the three when asking customer): ①【Basic project settings · free · mandatory foundation · set when creating drama, do not create an empty shell】project_type/setting_brief (worldview · ERA LOCK)/ethnicity/aspect ratio resolution, plus consistency anchors cinematography_prompt (cinematography DNA) · art_bible · visual_lock— all free, the foundation driving full-pipeline consistency; if not set, all later generation drifts and rework costs again. Set directly with create_drama/update_project_settings. ★visual_lock/art_bible should contain only image-level/world-level locks (shot language · environment · art direction · forbidden elements), **never pin costume/hairstyle/appearance details for specific characters**—the single source of truth for character appearance is the character profiles output by extract_assets (change via update_character); writing both inevitably conflicts, character sheet vs profile and turnaround vs visual lock, consistency gates reject by character sheet → turnarounds/shot frames get **structural consecutive rejection**, no number of rerolls can pass, pure wasted money. ★★【Era contract · free · must set before image generation for non-modern subjects】The worldview in setting_brief is **free text**: it only provides background and cannot constrain images; what can truly override visual lock is the **structured era contract**: use set_era_contract to set this episode tier (modern/republican/historical/fantasy), get_era_contract to read current value. **Unset means empty**—the platform can only stack prompt text to fight the model; modern objects entering ancient images and scene images drawn as another era are mostly caused by this being empty. ★Xianxia/fantasy/fairyland **must use fantasy, not historical**: historical requires researched realism and will judge glowing aura, floating terrain, nonhuman forms as \"era-inconsistent\", pulling images toward realistic ancient style. For an exception in one scene (e.g. a modern memory in a fantasy world), use update_scene era_contract override; scene-level overrides episode-level. ★★【Per-step review protocol · all free · main line preventing bad films, not optional】After each step output, review first, tell customer the conclusion verbatim, then proceed. **Five hard gates (otherwise 400 rejected; ④⑤ and agent QC below)**: ①After rewritten script → review_script (before extract_assets / generate_storyboards); ②After storyboards → review_storyboards (before generate_frames); ③After shot images → review_frames (before generate_videos). Each review returns review_token; pass it to downstream paid tools. Explain findings to customer item by item (code=issue type · shots=hit shot numbers · action=which tool to fix with); after fixing per action, **review again** before proceeding. If content changed after review → token auto-invalidates; one re-review is enough (free). error blocks by default; only if customer is explicitly informed and insists may you pass acknowledge_review:true (acknowledge_review only means the customer personally agreed; any execution mode requires explicit customer approval, autopilot included). In autopilot steps only whitelisted heuristic errors may carry auto_acknowledge:true (see 【Execution-mode master rules】). **Soft guidance (non-blocking but strongly recommended, also free)**: before images/videos run run_precheck (catches shots vendors will certainly reject, avoiding wasted credits)—★**to scan the whole drama, run run_drama_precheck first** (drama-level summary · free · read-only): get issue counts and attention per episode in one call (which episodes to fix first), prioritize by it, then run run_precheck on those episodes for itemized details; do not blind-scan episode by episode. Note its not_covered—drama-level skips the only lint that needs images, so \"0 issues for whole drama\" ≠ \"everything checked\". ★After findings, do not blindly edit yourself: plan_precheck_fix lets platform compute proposals → apply_precheck_fix persists them (which to accept; autopilot=accept all per execution mode: pro mode / unconfirmed plan / customer-controlled step → explain to customer and do only with customer approval, do not decide for them; autopilot step → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log); after storyboards run get_health_report; after character sheets are done, use get_characters to verify every appearing character has image/sheet; after frames, use get_storyboards to inspect frame_status and fail_reason/fail_hint (fix failed shots before proceeding; do not generate videos from bad frames); after videos likewise inspect video_status; before final cut use get_pipeline_status to confirm no missing shots. ★**Never just generate all the way through**: pushing without reviews amplifies issues at every layer and finally forces redoing the whole episode—every image/video retry is charged. Reviews are all free; catching early costs nothing. ★Changing costume is a structured binding edit: update_shot active_wardrobe_id (whole shot) / appearance_wardrobes (per-character in multi-character shots), can override or clear—editing text description does not change clothes, and customers need not change it on the web. ②【Production trunk · ordered, no skipping · ★storyboard before asset creation】set_script→rewrite_script→★review_script→extract_assets→storyboards (storyboard first · pure text shot breakdown)→★review_storyboards→★Script discipline (endpoint-enforced, cannot bypass): all raw material (synopsis/outline/finished script all count) goes into set_script and **must pass rewrite_script to produce an AI rewritten script**—pasting your own script directly into edit_rewritten_script to bypass rewrite will be 400 rejected (no rewritten script means no editable object); extract_assets likewise requires the rewritten script. All post-rewrite edits use the structured AI-output format: edit_rewritten_script (polish/correct), update_character, update_shot/replace_shot_dialogue—do not go back and replace the whole script or write another truth source in settings; dual sources of truth are the top cause of consistency accidents. ★★**After one successful rewrite, do not rerun rewrite_script**: it redoes the whole source, losing all current fixes, and the new version does not guarantee preserving old fixed parts (three-version tests drift back and forth). To fix, use edit_rewritten_script targeted edit (get_script full text → change only those scenes, copy the rest byte-identically → submit full script), free and seconds-level, deterministic; if rerun by mistake, recover previous with get_script(include_previous=1). generate_portraits_and_sheets (character sheets + turnarounds · create after storyboards: first use delete_character to remove appearing characters that **do not appear in any episode of the whole drama and are not intended for later episodes** before image generation—characters are drama-level; once deleted, frame assembly for every episode will no longer include them; this cannot be judged from this episode's storyboards alone, keep if unsure (one character sheet costs far less than losing the identity anchor in a later episode); the character sheet step generates images for **all undeleted appearing characters**, regardless of storyboard bindings, and all kept characters are charged; voiceover characters (char_type=voiceover narrator/phone voice) are not imaged and have no storyboard binding, **do not delete**, audio still needs them)→★generate_color_script (color script · unified grading)→assign_voices (assign voice types; no suitable narrator/character-library voice → design_voice from description, then set_character_voice after sample approval)→★quote_scene_images+generate_scene_images (empty scene plates · required before frames)→frames (default first frames only)→★tail_frame_plan (free · which shots need independent tail frames)→frames(frame_type=last_frame)→★chain_frames (seams · first dry_run:true)→★review_frames→videos→generate_tts→compose; ★★【Do not skip seams · complete tail frames before review_frames】After first/tail frames are ready, call chain_frames(dry_run:true, free) to see the platform's seam plan and estimated_points (copy free, reframe costs one image per seam); explain to customer and, after confirmation, execute without dry_run. Already chained seams are excluded, repeat calls do not double charge. ★After execution, reframe is **async image generation**: use get_jobs to watch the planned shots' first_frame jobs, wait until all pending/processing are done (for failed, inspect error_msg; use chain_shot_from for a single seam), then review_frames—the old first frame still exists so get_storyboards frame_status remains ready and cannot show whether the new image is running or failed. After get_jobs clears, use get_storyboards to check seam_state: replacement images rejected on promotion do not remain in get_jobs; that seam remains unchained (review_frames will also report seam_unchained), reconnect per its action. If you review before landing, you review old first frames; the token expires when the new first frame lands. Episodes generated shot-by-shot/batch often have not been auto-chained (get_storyboards seam_state=unchained); skipping causes no error—the cost is visual mismatch between shots and jump cuts throughout the final cut. ★★【Do not skip tail frames · frames are two passes】generate_frames defaults to first frames only. About 30% of shots have **end state ≠ start state** (large camera moves/object release/state change) and need an independent tail frame; the criterion is platform-side and cannot be guessed from storyboard text. Therefore after first frames, you must call the free tail_frame_plan once for a per-shot list, then fill frame_type=last_frame (shots_needing_last_frame in generate_frames response is this count; if not 0, do not go directly to review_frames). Skipping causes no error and does not block you—the cost is those shots only have a first-frame anchor when generating video, so the model improvises the end state: actions miss, large camera moves end back at the starting composition. Production observed 30 of 32 episodes generated only first frames; 23 still generated videos all the way. ★★【When tail frame is blocked by TERMINAL_DESC_GATE: edit text, do not retry】For shots reporting \"this shot is marked as state-changing but nowhere describes what the end looks like\", use update_shot to write **what the image looks like at the end** into that shot's last_frame_prompt, then regenerate the tail frame. ★Better: **avoid hitting it**—before tail frames, call get_storyboards once; terminal_desc_missing=true lists all such shots in the episode (free). Fill their last_frame_prompt first, then generate, with zero rejections. You can also query per shot via get_shot_prompts same field, but do not do that for dozens of shots. Retrying without adding description is ineffective—the vendor prompt has no terminal-state segment, so it still draws the starting pose and will be rejected again by terminal review, while each try is still charged (production observed tail-frame success 9.4% without terminal description, 40.2% with it). Only for shots that truly should be \"almost unchanged\" use generate_shot_frame allow_missing_terminal to bypass. ★★【Do not skip empty scene plates · this step is often missed by third parties】Scene images are **background anchors**: every shot frame in the same scene anchors to them. Frames can still be generated without plates, with no error and no blocking—the cost is **the first shot of each scene has no background anchor at all** (platform fallback image generation is \"when missing image detected, generate one in background\"; later shots in the same scene use it, but the triggering shot itself cannot wait for it), and the first shot is often the tone-setting shot; backgrounds also drift across later shots. It pairs with character sheets: character sheets anchor people, scene images anchor setting; whichever is missing drifts. Progress self-check: `get_pipeline_status` generate_scene_images step (completed/total); `review_storyboards` also reports scene_plate_missing before frames. ★★【Do not skip turnarounds · character sheet ≠ turnaround】A character sheet is a single-person single-image identity anchor; a turnaround is a multi-view turnaround generated by the platform from the character sheet, the root consistency anchor for shot frames/videos (angle changes · lighting changes · costumes mostly rely on it). Frames can still be generated with only character sheets and no error—the cost is character drift when angle changes and costumes differ every shot. Use generate_portraits_and_sheets for both steps (each call advances one step; after character sheets are complete, call again to generate turnarounds), or call generate_character_sheets after character sheets. Progress self-check: get_pipeline_status generate_character_sheets step (completed/total, portrait_only=characters with only character sheets). ★Customer-provided images: character sheet must be single person, single image, single angle, no text; scene image must be empty environment, no people, no overlaid text—set_character_portrait/upload_scene_image auto-check and reject noncompliance with 422. ★Do not create character images/prop sheets/motion templates before storyboards—storyboard is pure text and depends on no images; only after storyboards is the cast fixed, so delete non-appearing characters before images to save (motion templates must be after storyboards anyway). Paid steps follow the existing quote confirmation flow. Ads additionally need add_product+generate_product_sheet; MV flow is set_mv_lyrics→generate_mv_story→generate_mv_script (if no existing song: after set_mv_lyrics run suggest_mv_song_styles→quote_mv_song→generate_mv_song→get_mv_song→select_mv_song). ★★【④⑤ two new hard gates + agent hands-on QC】④Asset layer: after character sheets/turnarounds/scene images/prop images → review_assets (before generate_frames / generate_shot_frame; its token is asset_review_token and is passed together with the storyboard-layer review_token); ⑤Video and audio layer: after videos/voiceover/music → review_videos (before compose_episode); after final cut, run review_final_cut. ★After every review layer you must also **personally QC**: follow returned agent_qc, inspect each asset yourself (download images, sample video frames, read text), answer checklist items, submit via submit_qc_report; for gray-release dramas, a review_token without the report cannot enter the next step; report problems block by default just like error. Platform judges whether it exists; you judge whether it looks right and is correct. ★★【Single-shot path is also review-gated】: generate_shot_frame also requires storyboard-layer review_token; regenerate_shot_video also requires shot-image-layer review_token—do not expect single-shot tools to bypass reviews (production observed a workflow generating all 25 shots via single-shot frames without hitting any gate, and all final-cut rework was truly charged). Generating frames **does not** invalidate the storyboard-layer token (fingerprint only checks storyboard content); only changing storyboard content—update_shot / import / add-delete shots / change character bindings—requires one re-review (free, seconds). Generating one shot's frame invalidates the **shot-image-layer** token; before regenerate_shot_video for the next shot, just run review_frames once. ★★【For native-audio dramas, lock voices before batch video】When use_clip_audio=true (default), each shot's voice is sampled by that video vendor, and will drift if not locked; unifying later requires regenerating shot by shot. With customer-authorized source audio → clone_voice+set_character_voice before generate_videos; without it → for each speaking character, first use single-shot quote_regenerate_shot_video→regenerate_shot_video on a shot with relatively long dialogue (generate_videos has no per-shot parameters and only batch-fills missing videos; single-shot regeneration also works on shots with no video yet), use set_voice_anchor_from_shot to select the voice from that shot, then generate remaining shots. get_pipeline_status native_voice_anchor lists unanchored_speakers and stale_shots generated before locking that need regeneration. ★World concept image = required by default (improves whole-drama consistency; many third-party platforms skip it): after storyboards, call generate_world_concept by default; still follows quote confirmation (tell customer estimated credits and confirm before charging)—do not silently charge, and do not skip. ★★【Color script】generate_color_script unifies color grading for the whole film; do after storyboards and before frames. Text step has no quote_* and is usage-postpaid. Progress self-check: get_pipeline_status generate_color_script; review_storyboards reports color-script gaps. ★Motion templates are optional experimental: call generate_motion_templates (motion template extraction) only when customer explicitly requests, after storyboards; text step usage-postpaid. First/tail frames do not inject motion templates by default; missing templates need not be created and do not block images, videos, or final cut. Video templates may be cropped; delivery or benefit is not guaranteed. ★Scene Bible (detailed per-scene settings) order is **after scene images are generated**—refine based on generated scene images (no MCP tool yet; do on official site); do not do Scene Bible before scene images. ★Audio defaults to native video audio (use_clip_audio default on; skip TTS and use AI video's built-in audio): when creating drama/changing settings, AI should proactively tell customer \"default uses native video audio; set use_clip_audio false if TTS dubbing is needed\" and let customer choose. ★Default image model is ChatGPT Image 2.5 Flare (gpt-image-2.5-flare · unified style across drama): set image_model in create_drama/update_project_settings; default if omitted. Options: gpt-image-2.5-sunburst (same price · better Chinese glyphs and details)/gemini-3.1-flash-image (Banana 2 · 71 credits)/gemini-3-pro-image (Banana Pro · more detailed · 175 credits)/gemini-3.1-flash-lite-image (Banana 2 Lite · cheaper · 31 credits)/doubao-seedream-5-0-260128 (Seedream5.0); generate_frames can temporarily override for one run. ★2.5 charges by input volume (base 11 credits + 18 credits per reference image); Banana/Seedream are fixed-price—budget must account for many-reference shots. ★Four video engine options (drama-level · when AI creates drama, must proactively guide selection by drama and show price differences for customer decision): 【Selection tree】①Realistic live-action drama→hailuo-3 (about 1/3 cost, 70 credits/sec · strong fidelity editing · can output 2K · but about 6 minutes per shot; if video_engine omitted, platform auto-selects it by style); seedance-2.5 is not yet open for live-action subjects, usable for anime/stylized (anime/stylized dramas still default seedance-2.5, strongest instruction following/details · 720p 212 credits/sec); ②Stylized/animation/3D cartoon dramas · empty shots · product shots→wan3.0 (about 40% price, 84 credits/sec · max 30 sec · min 2 sec billing · about 2 minutes per shot), for urgent delivery use wan3.0-prime (126 credits/sec · about 1 minute); ③★Never choose wan3.0/prime for realistic live-action dramas—WAN output-side human-face review rejects consistently at 720p+, retries cannot fix; ④★★Use caution with wan3.0/prime for narrative dramas (dialogue, coherent story, stable shot rhythm needed): WAN will **hard-cut to new camera angles inside a single storyboard shot** (observed 11/12 shots with intra-shot cuts, vs seedance-2.5 only 1/6, hailuo-3 0/5); final-cut feel is \"image jumps around within one shot, cuts too fast\". This is weak vendor instruction following; prompt-level blocking cannot solve it (our negative constraints already included and tested ineffective). Only remedy after generation is regenerate with another engine. WAN suits fast short stylized/empty/product shots; for stable single-shot narrative choose seedance-2.5 or hailuo-3. After generation use scan_intra_shot_cuts to check; ④b★★Use caution with hailuo-3 for dialogue-heavy dramas (different from the previous \"intra-shot self-editing\"; this is about **whether all dialogue is spoken**): native-audio engine stops when the shot ends and may ad-lib; observed \"dialogue not fully spoken\" rate hailuo-3 **50%** (26 shots, all generated after 8-30 native-audio fix, so engine-inherent), seedance-2.5 **23%** (294 shots); wan3.0 has **insufficient sample size, untested** on this dimension (26 samples all before the same fix; only 2 after fix)—do not infer WAN is bad from this. When customer reports \"line was not finished\", first run scan_dialogue_coverage to segment causes; do not default to lengthening shots (observed that among shots with enough duration, 32% still did not speak all lines); ⑤★Shot duration control (all engines, especially obvious on WAN): keep each shot 3~5 sec. The longer the shot, the more freedom the model has—observed one 16-sec single shot (neighbors were 3~5 sec) changed scene 4 times inside the shot, a character disappeared for 4 sec then grew back from frame edge; customer perceives \"someone appeared out of nowhere\". For long performances, split into multiple short shots and connect with frame chaining; do not write single shots longer than 15 sec. 【Resolution decisions】Draft/iteration: WAN dramas 480p (42 credits/sec cheapest), others 720p; final delivery: seedance dramas 720p (HD tier discontinued), hailuo-3 dramas 1080p (=2K · 112 credits/sec), WAN dramas 1080p (168 credits/sec); hailuo-3 has no separate 480p tier (choosing it still bills as 768P). Set video_engine/video_resolution in create_drama/update_project_settings; ★both must be decided before video generation—switching does not retroactively change generated shots; mixing in one drama causes style/identity drift. ★Slow image generation ≠ failure: each image takes tens of seconds to minutes, a whole episode may take over ten minutes; poll get_storyboards for frame_status—pending=still generating (wait patiently, do not repeat generate_frames and waste credits), ready=done, failed=real failure. ★To change one shot's image / make a new character sheet take effect, use **single-shot regeneration generate_shot_frame** (platform automatically includes that shot's identity anchors · scene/prop references · style anchor, preserving whole-film consistency); generate_frames only batch-fills shots with **missing frames** and skips existing first frames (normal, not \"rejection\"). ★After first frames, call free tail_frame_plan to see which shots need independent tail frames, then batch-fill with frame_type=last_frame. After set_character_portrait, stale_frames in the response are shots polluted by the old image and must be regenerated shot by shot. ★Never use external tools to make first/tail frames and upload_shot_frame to \"change image\"—external images lack identity/style anchors, so characters/costumes/style will drift, which is the real source of bad films; upload_shot_frame is only for customer-owned real footage. ③【Optional enhancements · AI proactively informs customer · quote confirmation required】Art Bible generation / visual lock extraction / scene groups / lip sync / posters / sound effects / music / subtitle translation—these improve consistency/quality and are mostly charged. ★AI should proactively tell customer these are available and provide quotes (whether to run follows execution mode: pro mode / unconfirmed plan / customer-controlled step → explain to customer and do only with customer approval, do not decide for them; autopilot step → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log); neither silently skip nor charge without permission. ★Two locking rules: ①**Aspect ratio** is set at create_drama, locked at drama level; all later images/videos/final cut use it, **do not change midstream** (changing makes generated content aspect-inconsistent and drift); default 9:16 if unset. ②**5-7 sec per shot in shot breakdown is normal duration optimized for AI video generation**; do not misjudge as \"shots too long\" and rebreak—generate_storyboards **replaces all storyboards in the episode** and wastes generated images; backend blocks if storyboards already exist and requires confirm_replace. ★Rewrite fidelity (default auto smart routing): when set_script source is **already in script form** (scene headings/dialogue-line structure), rewrite_script automatically uses two-pass fidelity—customer dialogue is locked line by line by a machine gate (missing any line triggers internal rejection and redo), AI never adds plot; dramaturgical gaps (hooks/emotional anchors) are not auto-filled, but written into dramaturgy_suggestions returned by get_script (whether to adopt follows execution mode: pro mode / unconfirmed plan / customer-controlled step → explain to customer and do only with customer approval, do not decide for them; autopilot step → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log). If source is novel/outline, automatically uses creative rewrite (AI lays hooks and emotional points). Both customer types get appropriate handling with no manual switch. To override default, use update_project_settings rewrite_pipeline(auto/two_pass/single_forced) and fidelity_enforce(1=fidelity hard gate). If customer says \"AI changed my script off-track\": ①confirm full source was put into set_script; ②set rewrite_pipeline to two_pass to force fidelity, then rerun rewrite_script; ③after customer confirms character appearance, use update_character profile_locked=1 to lock profile and prevent later extraction from overwriting appearance and changing the face in character sheets. ★If customer wants to rewrite on **another AI platform** (common: third-party model judges our rewrite \"changed too much\", customer wants to control change degree): first call get_script_format_spec to get the platform-accepted format contract (markdown template + external_prompt directly forwardable to external model + blank skeleton), send external_prompt+template+customer source to that platform; after receiving organized script, **first call check_script_format to self-check** (free · rule-only · no model). Once errors are zero, two exits: 【A】adopt_external_script to directly adopt as shootable script (our AI not involved · seconds-level · no charge, requires external script includes production-layer annotations); 【B】set_script back into source slot + rewrite_script with two-pass fidelity (choose this when external only handles plot layer; platform fills annotations; customer-written annotations on this path are stripped and rewritten). ★Do not put external organized script into edit_rewritten_script (400 rejected if rewrite has never run), and do not skip check_script_format and ingest directly—noncompliant scripts are still blocked by gates and waste a run. ★★If the customer provides a **finished storyboard table** (per-shot duration/shot size/camera movement), neither path above applies—use import_storyboard_table directly to create storyboards, skipping rewrite and shot breakdown. The rewrite path strips duration/shot size/camera movement/STYLE/text cards as non-plot content (production observed 8 shots 36 sec → 20 shots 109 sec). ★Both import channels are deterministic—even wrong content is created as-is, so **get contract first, then self-check, then import**: storyboard table path is get_storyboard_table_spec → check_storyboard_table → import_storyboard_table; if customer's own tools/spreadsheets can export structured data, or external AI can directly produce JSON, use get_bulk_import_spec → check_bulk_import → bulk_import_storyboards (creates storyboards only; characters/scenes/props are extracted by extract_assets from the script; import binds existing ones by name—extract first, then import). Both imports default with auto_complete (backend AI fills professional fields + image/video prompts, text step postpaid; inform customer before call): if receipt started=true, poll get_autofill_status until done, then review_storyboards—autofill changes shots, so any earlier review token expires. Use get_pipeline_status for progress (returns project-type-specific steps). ★★【Opening plan · first thing after creating drama · free】First ask basic video parameters (project type/aspect ratio/episode count × minutes per episode/subject: realistic_human · stylized anime · product empty-shot/native audio or dubbing), then call get_production_menu to get the **currently available** three package tiers (effect notes + real-time estimate including text steps + recommended budget + exclusions) and explain to customer—do not recommend models from memory; some models may be temporarily unavailable for certain subjects, menu is already filtered. Then let customer choose execution mode (pro controls every step / auto one-click final cut / custom choose autopilot steps), budget budget_points, and automatic overrun cap (0/10/20/30/50%): **default recommendation** budget=selected tier's recommended_budget (upper bound excluding text ×1.2 plus text estimate), overrun=menu recommended_overrun_pct (30%)—QC regenerations are not in the upper bound and are covered by overrun. Recommendations are only recommendations; final numbers are set by customer, and if customer changes them, use customer's values. Explain the summary clearly; only after explicit customer agreement call confirm_production_plan(customer_confirmed:true)—never confirm for the customer. For dramas with confirmed plans: before paid dispatch, platform rechecks model availability and that quote upper bound ≤ budget×(1+overrun%); if blocked (402 BUDGET_WOULD_EXCEED / 409 MODEL_UNAVAILABLE), stop and ask customer; do not change model or budget yourself. confirm returning 403 PRODUCTION_PLAN_NOT_OPEN = this drama is not enabled (gray release); follow the original step-by-step confirmation flow.",
7
+ "get_script": "Read the raw episode content + AI-rewritten shootable script + rewrite status + dramaturgy_suggestions (dramatic gaps AI identified but did not auto-fill in two-step fidelity mode—hooks/emotional anchors; whether to adopt them depends on execution mode: professional mode / unconfirmed plan / client-controlled step → explain to client and do only after client agrees; do not decide for client; hosted step → do not ask client, follow get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log; ignoring them does not affect the production pipeline). Free. ★Revision workflow: first use this tool to retrieve the full rewritten_script → edit only the scenes the client wants changed → submit with edit_rewritten_script (do not rerun rewrite). previous_script_available=true means a previous-version snapshot exists; pass include_previous=1 to retrieve the full previous version (recovery path for accidental rerun/bad edits; omitted by default to avoid doubling the response).",
8
+ "edit_rewritten_script": "★Preferred channel for revisions: edit the AI-rewritten shootable script(write script_content). Free, instant, deterministic—**after one successful rewrite, all modifications go here; do not rerun rewrite_script**(that restarts from raw source, loses fixes, may revert improvements). ★Point-edit method(3 steps, do not skip): ① get_script to fetch **full** rewritten_script; ② **only edit target scenes**—within them change wording/split scenes/delete wrong motif/add [SFX]/move hand-held objects to [道具], and copy all other scenes byte-for-byte including punctuation; ③ submit the **entire** modified script here(this is full overwrite; do not send snippets or let model “also polish” untouched parts). Typical fixes: scene too long/split needed, dialogue line breaks across shots, wrong time/era, motif attached to scene without element, [角色档案] clothing mixed with held object, missing [SFX]/[BGM]. Only edits AI-rewritten output; if rewrite_script has not run, 400—this is not a bypass. Recover with get_script(include_previous=1). Free.",
9
+ "get_script_format_spec": "Fetch the platform-accepted **script format contract**: full markdown template + external_prompt(can forward verbatim to any external AI) + skeleton(with 〈…〉 placeholders) + filled_example. Free · static · no credits. ★Since template v2, **production-layer annotations** are included([角色档案] six-part format/[外貌] line prefix/[道具]/[SFX][BGM][VFX]/motif/fourth lighting segment in scene header/end metadata). v1 only covered story layer, causing external AI drafts to fail checks. When forwarding, **include filled_example**—LLM format accuracy depends on complete examples, not rules. ★Use when client wants to control rewrite degree, use another AI platform, or says “your AI changed my script too much”. ★Two exits(ask client first; determines whether external AI should write annotations): 【A Direct adoption】external AI produces complete script **with production annotations** → check_script_format all green → adopt_external_script as shootable script, no StarReel AI, instant, free, client [角色档案] preserved. For clients requiring zero changes. 【B Send to AI rewrite】external AI produces story layer only(**no annotations**) → set_script as raw → rewrite_script two-pass fidelity to add annotations. ★In B, client-written annotations **are stripped and rebuilt by G1**, so tell external AI not to write them. ★Workflow: ① get external_prompt + filled_example + markdown and send with raw script to other platform; ② run check_script_format on returned draft until errors=0; ③ use adopt_external_script for A, or set_script + rewrite_script for B. ★Contract includes scene header three-part format/location naming/environment first sentence three elements/first-appearance appearance line/sound line prefixes/single-line dialogue length/ban on camera moves and end-credit edit markers, plus four fidelity requirements(keep dialogue line by line, do not drop characters, do not drop action beats, do not add scenes) already in external_prompt.",
10
+ "check_script_format": "**Format self-check before backfill**: run script text against platform rules and return issues. Free · rules-only · no model · no database write · repeatable. ★errors = unconditional rejection(empty/too short/no scene headers/contains camera-move terms/contains end-credit edit markers); must clear before import. warnings = warning by default(strictOnly=true becomes rejection if strict mode enabled): scene too long/short, no sound line, dialogue line over limit, incomplete scene header segments, skipped scene numbers, wrong [角色档案] segment count, profile exists but missing [外貌] line, speaker slot mixed with age/identity. ★placeholder_left(residual 〈…〉 template placeholders) is **error**: system gate may not catch it, but placeholders would enter script as visual content—worse than rejection. ★Scene length counts **story-layer** characters only([角色档案]/[外貌]/[道具]/[SFX] etc. excluded), so full annotations do not push scenes over 120 chars; do not delete annotations just to pass. ★Typical use: external AI draft → self-check → send returned message list back to that platform with “fix only these, copy rest exactly” → check again → all green then set_script. ★Only checks **format**; fidelity like dialogue preservation and missing characters is checked during rewrite_script against original source.",
11
+ "import_storyboard_table": "【Use for existing storyboard tables】Directly create storyboards from the client’s **finished storyboard table**, skipping rewrite and shot breakdown—no agent in between. Free. ★Three steps, do not import directly: ① get_storyboard_table_spec for template(shot type/camera-move whitelist, body placement, text-card syntax, external AI prompt); ② check_storyboard_table until errors=0 and inspect warnings(missing duration/unrecognized shot type/no visual description are imported as-is); ③ call this tool. ★Use when client provides finished storyboard table(per-shot duration/shot type/camera move, common for TV/brand samples). The set_script→rewrite_script→generate_storyboards path strips production params(test: 8 shots 36s became 20 shots 109s; STYLE blocks/data cards lost). ★Declaration format(one line per shot, fields separated by | or fullwidth |): `[镜 001 | 4s | 微距 | 固定]`; also recognizes bold form `**镜 001 | 4″ | 微距 | 摄影机固定不动**`(no need to retype). Order = shot number|duration|shot type|camera move|markers; marker `不切` means must not split further, `★` key shot. Camera move “横移” maps tracking, “摇” maps pan(do not mix; reflections behave differently). `[字卡 9s] line one | line two` creates a text-card shot(final cut renders black card directly, no image/video). ★Props: `[道具] NameA、NameB` binds prop_ids by exact names in drama prop library; prop names fully appearing in body also bind automatically. Receipt prop_names_unresolved lists unbound names(create props first or rename). ★If content omitted, reads episode raw content. If no per-shot declarations, 400(that is a script, use normal breakdown). ★If storyboards already exist, returns 409 with shot count; pass confirm_replace:true only after confirmation(old shots marked deleted, recoverable). Shots missing duration/shot type still import but issues list them—system will not guess; wrong duration means wrong final cut length. ★After import, **auto_complete defaults on**(follows project “auto-fill auxiliary assets” switch): one background batch fills empty professional fields(shot intent/beat/subtext/J-L cut/voice line etc., fill-empty only) and expands platform base description into full image/video prompts. Text step postpaid by token, **tell client before call**. To import only, pass auto_complete:false(**cost: no composition contract generated**—visible count, subject person/partial/prop, shot type inferred only from text; hand insert and offscreen voice shots may render as full characters and fail review. Receipt contract_coverage lists missing shots and current viable fix; follow its note—if contract auto-fill is on, use autofill_storyboards). If auto_complete.started=true, poll get_autofill_status until done(each shot tens of seconds) **before** review_storyboards; autofill changes shots and invalidates prior token.",
12
+ "get_storyboard_table_spec": "Fetch the platform-accepted **storyboard table format contract**: full markdown template + external_prompt(can forward verbatim to external AI) + skeleton(〈…〉 placeholders) + filled_example + checklist + shot_types(shot-type whitelist) + movements(camera-move whitelist and recognized Chinese forms). Free · static · no credits. ★Use when client has a finished storyboard table(per-shot duration/shot type/camera move) or wants external AI/own tool to format shot design for us—call **before import_storyboard_table**. ★Contract essentials: one shot per line `[镜 001 | 4s | 特写 | 固定]`(bold/fullwidth bars/traditional forms accepted); shot type and camera move only accept whitelist terms(other terms left blank); text after declaration = visual description(at least one line or no image) + `Character: dialogue` + [SFX:]/[BGM:]/[VFX:] tags; full-screen text uses `[字卡 9s] line one | line two`; STYLE/NEG global style blocks **do not go in table**(put in project settings); `## non-scene heading` ends current shot. When forwarding to external AI, **include filled_example**—format correctness comes from examples.",
13
+ "check_storyboard_table": "**Storyboard-table self-check before import**: run the exact same parser as the import endpoint, returning errors / warnings / stats / shots(per-shot parse preview: duration, shot type, camera move, markers, body length). Free · rules-only · no model · no DB write · repeatable. ★errors = import will 400(empty / no per-shot declaration = not a storyboard table) + residual 〈…〉 placeholders; must clear. ★warnings = import proceeds but result lacks data: missing duration(default 4s), unrecognized shot type(blank), unrecognized camera move(blank), no visual description after declaration(dead shot, cannot image), no scene header(no scene binding), data card not using text-card syntax(not in final cut), single shot >15s, STYLE block, duplicate shot numbers—send message list back to external AI and ask it to fix only these. ★If this is green, import_storyboard_table will have no issues(same code).",
14
+ "get_bulk_import_spec": "Get the **bulk-import JSON format contract**: full markdown template + template(placeholder template; every <...> must be replaced) + filled_example(finished reference; copy the structure directly) + external_prompt(task prompt to forward to an external AI/your own tool) + checklist + enums(valid values for mode/role/char_type/shot_type/action_motion_class; same source as validator) + limits(array and field caps). Free · static · no credits. ★When to use: before **bulk_import_storyboards**, when the client can export structured data from their own tool/spreadsheet, or wants an external AI to output JSON that creates this episode’s storyboards in one pass. ★Difference from import_storyboard_table(one text line per shot): use JSON if the data is already structured; use that tool if the client has a text storyboard table. ★Contract basics: top level { mode, episode_meta?, characters?[], scenes?[], storyboards[] }; characters[]/scenes[] are **reference declarations only, not persisted**(characters/scenes/props are extracted from the script by extract_assets; import binds by name to existing assets, so extract first, then import; props are not characters—do not put them in characters[]); storyboards dedupe by storyboard_number; bound_characters references characters[].name(or existing character name in this drama), bound_props references prop names in this drama’s prop library(if omitted, prop names appearing in body text are auto-bound), scene_ref references scenes[] location+time—unresolved references are **silently skipped**; each shot needs at least one of action/description; dialogue is `speaker: line`, no stage directions(they will be spoken); image_prompt/video_prompt may be empty(platform builds a base description from shot size + scene + lighting + action); if supplied, they are used **verbatim** and never overwritten. frame_visual_contract is an internal frame contract and ignored on import.",
15
+ "check_bulk_import": "**Pre-import JSON self-check**: validates with the **same zod schema** as the import endpoint, then converts the import route’s \"silent behavior\" into warnings. Returns errors / warnings / stats(shot count · total seconds · characters · scenes · mode · promptsToBuild). Free · not persisted · repeatable. ★errors = import would 400 or overwrite incorrectly: invalid JSON / schema failure(with per-item path, e.g. storyboards[2].shot_type) / duplicate shot numbers + leftover <...> placeholders; must be zero. ★warnings = import continues but something will be missing or have side effects: unresolved bound_characters/scene_ref(silently skipped) / no action+description(dead shot) / dialogue contains camera language(will be spoken) / single shot >15 seconds / action_overload(too many independent actions for the duration—about 2 beats in 3 seconds, 3 beats in 5 seconds; one main action per shot; split new events into next shot; can ignore if multiple people each do one thing) / shot-number gaps / mode=replace(replaces all storyboards in this episode) / no character binding at all(characters will drift). ★If this is green, bulk_import_storyboards should pass in one call.",
16
+ "bulk_import_storyboards": "Create/update this episode’s storyboards from one structured JSON payload in a single pass(dedupe/update by storyboard_number). **Does not create characters/scenes/props**—they are extracted from the script by extract_assets; import only binds by name to existing ones(receipt characters_unmatched / char_refs_unresolved lists unbound refs; extract first, then import). Free · deterministic · no AI call. ★Three steps: ① get_bulk_import_spec for contract and finished example; ② check_bulk_import until errors=0; ③ call this tool. ★mode=merge(default) keeps shots not mentioned; mode=replace replaces **all** storyboards in this episode(old shots and generated images/videos are archived and recoverable, not auto-relinked)—replace requires explicit client consent in any execution mode, including autopilot. ★If you want to write image_prompt / video_prompt yourself, put them on each shot; they are used **verbatim and not overwritten**. Empty shots get platform-built base descriptions(receipt base_prompts_built says how many); after import use get_shot_prompts to read and update_shot to edit. (frame_visual_contract is an internal frame contract and ignored on import.) ★After import: speech timing may raise durations for shots whose dialogue does not fit(receipt speech_duration_raised / speech_duration_overflow). ★After import, **auto-completion is on by default**(auto_complete, follows the drama’s \"auto-complete auxiliary assets\" switch, default on): one background batch fills empty professional fields across all shots(AI, fill-empty only) and expands full image/video prompts only for shots with no image_prompt that used a platform base description(client-written prompts are never overwritten; receipt auto_complete.prompt_shots). Text step is postpaid by token; **tell the client before calling**. If you only want import, pass auto_complete:false(**cost: no composition contract is generated**—visible headcount, subject type character/part/prop, and shot size can only be inferred from text; hand insert shots and off-screen narration shots are easily rendered/audited as full characters; receipt contract_coverage lists missing shots **and gives current viable fixes; trust its note**—when contract auto-complete is enabled it calls autofill_storyboards). If receipt started=true, poll get_autofill_status until done **before** review_storyboards.",
17
+ "get_autofill_status": "Check this episode’s background completion batch(import auto_complete / autofill_storyboards AI one-click fill-empty): { status: running|done|failed|idle, total, done, ok, fail }. Free. ★After import with auto-complete, wait for status=done before review_storyboards / generate_frames—the batch rewrites shot fields one by one, so any earlier review_token becomes invalid when content changes. Each shot takes tens of seconds; a full episode can take 10+ minutes. Poll interval ≥10 seconds; do not tight-loop. If status=failed or fail>0, inspect fail count; a few failed shots can be rerun with autofill_storyboards(fill-empty only; already-filled fields are not charged again).",
18
+ "adopt_external_script": "[Exit A] Adopt a draft produced by an external AI from the template **directly as the shootable script**; StarReel AI does not intervene. Seconds, no charge. ★Hard pre-gate: server first runs a format self-check; non-empty errors return 400 with the list unchanged—use check_script_format until fully green before this tool. warnings do not block(same strictness as default lenient save_script). ★When to use: client demands \"do not change a single word\" and the external AI already produced a complete draft with production-layer annotations. ★When **not** to use: client only organized the story layer(no [角色档案]/[外貌])—direct adoption would leave downstream without character profiles and appearance anchors; use Exit B(set_script + rewrite_script) so the platform adds annotations. ★Difference from edit_rewritten_script: that is a point-edit channel for an **existing rewritten script**(400 if rewrite was never run). This tool is the **first script ingestion** channel, only for \"the script was prepared externally\". It is not a backdoor around rewriting—the server gate decides; if it fails, it fails. Old script is saved into previous_script; if adopted by mistake, recover with get_script(include_previous=1).",
19
+ "extract_assets": "Extract characters/scenes/props from the shootable script (writes three tables in one pass; the foundation for downstream consistency). Backend async; text step postpaid, no arrears. Prerequisite: rewrite_script has produced the rewritten script (mandatory for new projects; character profiles must be extracted from the rewritten script to stay self-consistent with script and storyboards). ★Minute-level backend task; use get_run_status to decide whether it is still running; do not treat 60 seconds as failure.\n★【Rewritten-script review hard gate · free】Before this step, you must call review_script first: report every returned finding to the customer verbatim (each with code=issue type, shots=hit shot numbers, action=which tool to use to fix), then pass review_token into this tool. Skipping review will be rejected with 400. If content changed after review → token auto-invalidates; review again once (still free). If there is error, block by default; only if the customer is informed and insists on continuing as-is may you pass acknowledge_review:true—pushing forward with known issues will likely produce unusable footage and is still charged normally (acknowledge_review only means the customer personally agreed; every execution mode still requires explicit customer consent, including managed mode); in managed steps, only allowlisted heuristic error can pass with auto_acknowledge:true (platform decides; if not allowlisted returns 400 AUTOPILOT_MUST_ASK:must_ask_customer=true then pause and ask customer, false = self-fix per action then review again). ★Gray-release dramas also require you (agent) to QC personally: inspect assets item by item per agent_qc returned by review_script, answer the checklist, and submit via submit_qc_report before this token can be used (not submitted → 400 agent_qc_required; bad report → blocked by default like error).★★【Execution-mode master rules · read before starting】For dramas with a confirmed opening plan, first get_production_plan and read autopilot: pro mode (pro, or autopilot.enabled=false, or no confirmed plan) → every later 'tell customer, proceed only after customer agrees' is literal; one-click (auto) / hybrid (custom) managed steps → do not ask customer: follow get_pipeline_status next_action in order, self-confirm quotes within the hard budget cap, after each layer still run review_* + agent QC, and let review/QC autopilot.next_step tell you how to proceed at this layer (allowlisted error with auto_acknowledge:true / which self-fix round / pause to ask customer); for choices follow autopilot.default_decisions; autopilot.never_auto_actions(mode=replace, deleting assets, overwriting customer-uploaded images, allow_era_ref_conflict, cloning voices, delivery acceptance) always require customer consent in every mode. ★In managed steps, regenerating frames for the same shot (generate_shot_frame) max 3 rounds, regenerating video (regenerate_shot_video / edit_video_shot) max 3 times; at the limit the platform returns 409 AUTOPILOT_SHOT_REGEN_LIMIT (not charged)—do not bypass with another tool; stop and ask customer: if customer approves more, quote normally and pass customer_approved_more_regens:true when generating (grants another limit); if customer accepts current state, continue, and pass acknowledge_review:true on the next paid call to record confirmation. 402 BUDGET_WOULD_EXCEED / 409 MODEL_UNAVAILABLE / 409 AUTOPILOT_SHOT_REGEN_LIMIT / 400 AUTOPILOT_MUST_ASK with must_ask_customer=true / non-empty pending_questions → pause and ask the customer the pending_questions from get_autopilot_log **summarized all at once**; customer-controlled steps follow pro mode. After final output, deliver to customer using the get_autopilot_log report. ★Three-tier execution strategy (do not mix the three when asking customer):①【Basic project settings · free · mandatory foundation · set when creating drama, do not create an empty shell】project_type/setting_brief(worldview · ERA LOCK)/ethnicity/aspect ratio resolution, plus consistency anchors cinematography_prompt(photography DNA)·art_bible(art bible)·visual_lock(visual lock)—all free, foundation for full-pipeline consistency; if not set properly, all later generation drifts and rework costs again. Set directly via create_drama/update_project_settings. ★visual_lock/art_bible only write image-level/world-level locks (shot language · environment · art tone · forbidden elements), **never pin clothing/hairstyle/appearance details for specific characters**—the single source of truth for character appearance is the character profiles produced by extract_assets (change via update_character); writing both places inevitably conflicts, character sheet vs profile, concept image vs visual lock, consistency gate rejects by character sheet → concept images/shot frames get **structurally rejected in chains**, no amount of rerolls passes, pure waste.★★【Era contract · free · required before image generation for non-modern subjects】The worldview in setting_brief is **free text**; it can provide background but cannot constrain images. The real override over visual_lock is the **structured era contract**: use set_era_contract to set this episode’s tier (modern/republican/historical/fantasy), get_era_contract to read current value. **Unset means empty**—the platform can only rely on prompt text to fight drift; modern objects entering ancient images or scene images drawn in the wrong era is usually caused by this being empty. ★Xianxia/fantasy/immortal-realm content **must use fantasy, not historical**: historical requires textual realistic accuracy and will classify glowing aura, floating landforms, and non-human transformations as 'era-inconsistent', pulling images toward realistic ancient style. To make an exception for one scene (e.g. a modern flashback inside a fantasy world), use update_scene era_contract to override at scene level; scene-level beats episode-level.★★【Per-stage review protocol · all free · main line to prevent unusable film, not optional】After every stage output, review first, report conclusions verbatim to customer, then proceed. **Five hard gates (not passing causes 400; ④⑤ and agent QC below)**:① after rewritten script → review_script (before extract_assets / generate_storyboards);② after storyboards → review_storyboards (before generate_frames);③ after shot images → review_frames (before generate_videos). Each review returns review_token; pass it with downstream paid tools; explain findings one by one to customer (code=issue type · shots=hit shot numbers · action=which tool to fix), fix per action, then **review again** before proceeding. If content changed after review → token auto-invalidates; review once again (free). If error exists, block by default; only if customer explicitly understands and insists may pass acknowledge_review:true (acknowledge_review only means customer personally agreed; every execution mode still needs explicit customer consent, including managed mode); in managed steps, only allowlisted heuristic error can pass auto_acknowledge:true (see 【Execution-mode master rules】). **Soft guidance (non-blocking but strongly recommended, also free)**: before image/video generation run run_precheck (catches shots vendors will definitely reject, preventing wasted credits)—★**to run whole-drama first use run_drama_precheck** (drama-level summary · free · read-only): get issue counts per episode and attention (which episodes to fix first), prioritize by it, then run run_precheck on those episodes for details; do not blindly scan episode by episode. Note not_covered—drama-level skips the only lint that requires images, so '0 whole-drama issues' ≠ 'everything checked'. ★After findings, do not blindly edit yourself: plan_precheck_fix lets platform compute proposals → apply_precheck_fix writes them (choose which to adopt; managed=adopt all per execution mode: pro mode / no confirmed plan / this step customer-controlled → tell customer and proceed only after consent; do not decide for customer; managed step → do not ask, follow get_production_plan autopilot.default_decisions, platform logs in get_autopilot_log); after storyboards run get_health_report; after character sheets use get_characters to verify every appearing character has image/sheet; after frames use get_storyboards to inspect frame_status and fail_reason/fail_hint (fix failed shots before continuing; do not make video from bad frames); after videos inspect video_status similarly; before final cut use get_pipeline_status to confirm no missing shots. ★**Never generate straight through**: pushing layer after layer without review amplifies issues at every layer, and the whole episode may need redoing—every repeated image/video generation is real charged. Reviews are all free; catching issues costs nothing. ★Clothing changes are structured bindings: update_shot active_wardrobe_id (whole shot) / appearance_wardrobes (multi-character per role), can override or clear—editing text descriptions does not change clothes, and do not send customer to web UI.②【Production mainline · sequential, no skipping · ★storyboards before assets】set_script→rewrite_script→★review_script→extract_assets→storyboards(first storyboards · pure-text shot breakdown)→★review_storyboards→★Script discipline (endpoint-enforced, cannot bypass): all raw material (synopsis/outline/finished script all count) goes into set_script, **must go through rewrite_script to produce AI rewritten script**—pasting your own finished script directly into edit_rewritten_script to bypass rewrite will be rejected 400 (no rewritten script means nothing to edit); extract_assets likewise requires the rewritten script. All post-rewrite changes must use the structured format of AI output: edit script via edit_rewritten_script (polish/correct), character profiles via update_character, storyboards via update_shot/replace_shot_dialogue—do not go back and replace the whole script or write another truth source in settings; dueling truth sources are the top cause of consistency failures.★★**After rewrite_script succeeds once, do not rerun rewrite_script**: it restarts from the original full manuscript, discarding all current edits, and the new version is not guaranteed to preserve prior fixes (three-version tests oscillate). To fix, use edit_rewritten_script point edits (get_script full text → change only those scenes, copy the rest verbatim → submit whole text), free, seconds-level, deterministic; if rerun by mistake use get_script(include_previous=1) to recover previous version. generate_portraits_and_sheets(character sheet + concept images · build after storyboards: first use delete_character to delete appearing characters who **do not appear in any episode of the whole drama and are not planned for later episodes** before image generation—characters are drama-level; once deleted, no episode’s frame assembly includes them; this cannot be judged from current episode storyboards alone, keep if unsure (one character sheet costs far less than losing identity anchors in a later episode); the character sheet step generates images for **all undeleted appearing characters**, ignoring storyboard bindings, so kept characters are charged normally; voiceover characters (char_type=voiceover narrators/phone voices) are not image-generated and have no storyboard binding; **do not delete** them, dubbing relies on them)→★generate_color_script(color script · unified grading)→assign_voices(assign voice types; if narrator/character library has no fit → design_voice by description, then set_character_voice after sample approval)→★quote_scene_images+generate_scene_images(empty scene plates · required before frames)→frames(default first frames only)→★tail_frame_plan(free · which shots need independent last frames)→frames(frame_type=last_frame)→★chain_frames(seams · dry_run:true first)→★review_frames→videos→generate_tts→compose;★★【Do not skip seams · after last-frame completion, before review_frames】After first/last frames are ready, call chain_frames(dry_run:true, free) to view platform seam plan and estimated_points (copy free, reframe one image per seam), tell customer and execute without dry_run after confirmation; already chained seams are not planned, repeated calls do not charge again. ★After execution, reframe is **async image generation**: use get_jobs to watch first_frame generation rows for planned shots; wait until all pending/processing finish (failed: check error_msg; use chain_shot_from to rechains a single seam), then review_frames—while old first frame remains, get_storyboards frame_status is still ready, so it cannot show whether the new image is generating or failed. After get_jobs is clear, use get_storyboards to verify seam_state: replacement images rejected from promotion will not remain in get_jobs; that seam remains unchained (review_frames also reports seam_unchained); rechains per its action. If you review before landing, you reviewed old first frames; the token becomes invalid after new first frames land. Episodes generated shot-by-shot/batch likely were not auto-chained (get_storyboards seam_state=unchained means so); skipping does not error—the cost is mismatch between adjacent shots and jump cuts throughout final cut.★★【Do not skip last frames · frames are two passes】generate_frames defaults to first frames only. About 30% of shots have **end state ≠ start state** (large camera moves/object released/state changes) and need an independent last frame; the criterion is platform-side and cannot be guessed from storyboard text—therefore after first frames finish, you must call the free tail_frame_plan once to get per-shot list, then fill frame_type=last_frame (shots_needing_last_frame in generate_frames response is this count; if not 0 do not go straight to review_frames). Skipping does not error or block—the cost is that videos for those shots have only one anchor, so the model invents the end state: actions fail, large camera moves end back at the starting composition. Production tests: in 32 episodes, 30 generated only first frames for the whole episode, and 23 went all the way through video.★★【When last frame is blocked by TERMINAL_DESC_GATE: edit text, do not retry】For shots reporting 'this shot is marked as state-changing, but nowhere describes what it looks like at the end', use update_shot to write **what the image looks like at the end** into that shot’s last_frame_prompt, then regenerate last frame. ★Better: **avoid hitting it**—before last-frame generation, first inspect get_storyboards; shots with terminal_desc_missing=true are listed for the whole episode at once (free), fill their last_frame_prompt before generating and avoid any rejection. Per-shot query also exists (get_shot_prompts same field), but do not do that for dozens of shots. Retrying without filling the description is useless—the vendor prompt has no terminal-state section, so it still draws the first-frame pose and will be rejected again by terminal review, and each attempt is charged normally (production tests: last-frame success 9.4% without terminal description, 40.2% with it). Only use generate_shot_frame allow_missing_terminal for shots that truly should be 'almost unchanged'.★★【Do not skip empty scene plates · this step is often missed by third parties】Scene images are **background anchors**: every shot frame in the same scene anchors on it. Frames can still generate without plates, with no error and no block—the cost is **the first shot of every scene has no background anchor at all** (platform fallback is 'if missing image is discovered, generate one in background'; that plate is used by subsequent shots in the same scene, but the triggering first shot cannot wait for it), and the first shot is often the tone-setter; later backgrounds drift too. It is paired with character sheets: character sheets anchor people, scene images anchor locations; whichever is missing drifts. Progress self-check: get_pipeline_status generate_scene_images step (completed/total); review_storyboards also reports scene_plate_missing before frame generation.★★【Do not skip concept images · character sheet ≠ concept image】A character sheet is a single-person identity anchor; concept image is the platform-generated multi-angle turnaround from the character sheet, the root consistency anchor for shot frames/videos (angles, lighting, clothing rely on it). Frames can still generate with only character sheets, with no error—the cost is characters drift when angle changes and clothing differs every shot. Use generate_portraits_and_sheets for one-click two-step (each call advances one step; after character sheets are complete, call again to create concept images), or generate_character_sheets after character sheets. Progress self-check: get_pipeline_status generate_character_sheets step (completed/total, portrait_only=characters with character sheet only). ★Customer images: character sheet must be single person, single image, single angle, no text; scene image must be empty location with no people and no overlaid text—set_character_portrait/upload_scene_image auto-checks and rejects invalid with 422. ★Do not create character visuals/prop concept images/action templates before storyboards—storyboards are pure text and do not depend on any images; after storyboards the cast is known, delete non-appearing characters before image generation to save cost (action templates must be after storyboards anyway). Paid steps follow existing quote confirmation flow. Ads additionally need add_product+generate_product_sheet; MV uses set_mv_lyrics→generate_mv_story→generate_mv_script (if no finished song: after set_mv_lyrics first suggest_mv_song_styles→quote_mv_song→generate_mv_song→get_mv_song→select_mv_song).★★【④⑤ two new hard gates + agent personal QC】④Asset layer: after character sheets/concept images/scene images/prop images finish → review_assets (before generate_frames / generate_shot_frame; its token is asset_review_token and passed together with storyboard-layer review_token);⑤Video and dubbing layer: after video/dubbing/music finish → review_videos (before compose_episode); after final cut, run review_final_cut. ★After every review layer you must also **personally QC**: inspect assets item by item per returned agent_qc (download images, sample video frames, read text), answer checklist item by item, submit via submit_qc_report; for gray-release dramas, a review_token cannot enter the next step without the report; bad report is blocked by default like error. Platform judges existence; you judge likeness and correctness.★★【Single-shot path is also gated by reviews】: generate_shot_frame also requires storyboard-layer review_token; regenerate_shot_video also requires shot-image-layer review_token—do not expect single-shot tools to bypass review (production observed a workflow generating all 25 shots with single-shot frame tools and no gates; all final rework was fully charged). Generated frames **do not** invalidate the storyboard-layer token (fingerprint only covers storyboard content); only storyboard content edits—update_shot / import / add-delete shots / change character bindings—require one more review (free, seconds). Generating one shot’s frames invalidates the **shot-image-layer** token; before regenerating the next shot video, review_frames once.★★【For native-audio dramas, lock voices before batch video】When use_clip_audio=true(default), each shot’s voice is sampled independently by the video vendor; if not locked it will drift, and unifying after the fact requires per-shot regeneration. If customer-authorized voice source exists → clone_voice+set_character_voice before generate_videos; if not → for each speaking character first use single-shot quote_regenerate_shot_video→regenerate_shot_video on a shot with longer dialogue (generate_videos has no per-shot parameters and only batch-fills missing-video shots; single-shot regeneration also works for shots without video), then use set_voice_anchor_from_shot to select the voice from that shot, then generate remaining shots. get_pipeline_status native_voice_anchor lists unanchored_speakers not yet locked and stale_shots generated before locking that need regeneration. ★Worldview concept image = required by default (improves whole-drama consistency; many third-party platforms miss it): after storyboards, call generate_world_concept by default; still follows quote confirmation (tell customer estimated credits, confirm before charging)—do not charge silently and do not skip.★★【Color script】generate_color_script unifies grading across the whole film; run after storyboards and before frames; text step has no quote_*, postpaid by usage. Progress self-check: get_pipeline_status generate_color_script; review_storyboards reports color-script gaps. ★Action templates are optional experimental: call generate_motion_templates(action template extraction) after storyboards only if customer explicitly requests; text step postpaid by usage. First/last frames do not inject action templates by default; missing templates need not be made up and do not block image/video/final cut. Video templates may be cropped; delivery or quality gain is not guaranteed. ★Scene Bible(detailed per-scene setting) comes **after scene image generation**—refine based on generated scene images (no MCP tool yet; do on official site); do not make Scene Bible before scene images. ★Audio defaults to video native audio (use_clip_audio default on; skip TTS and use AI video’s built-in audio): when creating/updating drama settings, AI should proactively tell customer 'default uses video native audio; set use_clip_audio false if TTS dubbing is needed' and let customer choose. ★Default image model is ChatGPT Image 2.5 Flare(gpt-image-2.5-flare · unified whole-drama style): set image_model in create_drama/update_project_settings; omitted means default. Options: gpt-image-2.5-sunburst(same price · better Chinese glyphs/details)/gemini-3.1-flash-image(Banana 2 · 71 credits)/gemini-3-pro-image(Banana Pro · finer · 175 credits)/gemini-3.1-flash-lite-image(Banana 2 Lite · cheap · 31 credits)/doubao-seedream-5-0-260128(Seedream5.0); generate_frames can temporarily override one run. ★2.5 charges by input volume (base 11 credits + 18 credits per reference image); Banana/Seedream are flat price—shots with many reference images must include this in budget. ★Four video engine choices (drama-level · when AI creates a drama it must proactively guide engine choice by drama type and quote price differences for customer decision):【Decision tree】①Realistic live-action drama→hailuo-3(about 1/3 cost, 70 credits/sec · strong fidelity editing · can output 2K · but about 6 minutes per shot; if video_engine not passed, platform auto-selects it by style); seedance-2.5 is not yet open for live-action subjects, usable for anime/stylized (anime/stylized dramas still default seedance-2.5, strongest instruction following/details · 720p 212 credits/sec);②Stylized/animation/3D cartoon dramas · empty shots · product shots→wan3.0(about 40% price, 84 credits/sec · max 30 sec · minimum 2 sec billing · about 2 minutes per shot), use wan3.0-prime for rush delivery (126 credits/sec · about 1 minute);③★Never choose wan3.0/prime for realistic live-action dramas—WAN output-side human-face review consistently rejects at 720p+, retry cannot fix;④★★For narrative dramas (dialogue, continuous story, stable shot rhythm), choose wan3.0/prime cautiously: WAN may **hard-cut camera positions inside a single storyboard shot** (tests: 11/12 shots had intra-shot jump cuts, versus seedance-2.5 1/6 and hailuo-3 0/5); final cut feels like 'the image jumps around within one shot, cuts too fast'. This is weak vendor instruction following and cannot be blocked at prompt level (our negative constraints are already included and tested ineffective); afterwards the only fix is regenerating with another engine. WAN fits stylized/empty/product shots that are inherently short and fast; for stable single-shot narrative choose seedance-2.5 or hailuo-3. After generation use scan_intra_shot_cuts to check;④b★★Dialogue-heavy dramas should choose hailuo-3 cautiously (different from above 'intra-shot self-cut'; this is about **whether all lines are spoken**): native-audio engine stops speaking at shot end and may ad-lib; tests show 'dialogue not fully spoken' rates hailuo-3 **50%** (26 shots, all generated after 8-30 native-audio repair, so engine itself), seedance-2.5 **23%** (294 shots); wan3.0 sample **insufficient, untested** for this dimension (26 samples all before same repair, only 2 after)—do not infer WAN is bad. When customer reports 'line not finished', first run scan_dialogue_coverage by family; do not default to lengthening shots (even among sufficiently long shots, 32% still missed full lines);⑤★Shot length control (all engines, especially WAN): keep each shot 3~5 seconds. The longer the shot, the more room the model has to improvise—test: one 16-second shot (neighbors all 3~5 sec) changed scenes 4 times within the shot; character disappeared for 4 sec then grew back from frame edge; customer sees 'a person appeared from nowhere'. For long performances, split into multiple short shots and connect with frame chains; do not write single shots over 15 sec;【Resolution decision】Draft/iteration: WAN dramas 480p (42 credits/sec cheapest), others 720p; final delivery: seedance dramas 720p (HD tier discontinued), hailuo-3 dramas 1080p(=2K · 112 credits/sec), WAN dramas 1080p(168 credits/sec); hailuo-3 has no separate 480p tier (if selected, billed as 768P); set video_engine/video_resolution in create_drama/update_project_settings, ★must be decided before video generation—switching does not retroactively affect generated shots, and mixing within one drama causes style/identity drift. ★Slow image generation ≠ failure: each image takes tens of seconds to minutes; whole episode may take 10+ minutes. Poll get_storyboards frame_status—pending=still generating (wait patiently; do not call generate_frames again and waste credits), ready=done, failed=real failure. ★To change one shot’s image / make new character sheet take effect, use **single-shot regeneration generate_shot_frame** (platform automatically includes identity anchors, scene/prop references, style anchors for that shot to preserve whole-film consistency); generate_frames only batch-fills shots with **missing frames** and skips shots that already have first frames (normal, not 'rejected'). ★After first frames finish, call free tail_frame_plan to see which shots need independent last frames, then batch-fill with frame_type=last_frame. After changing a character sheet (set_character_portrait), stale_frames in the response are shots polluted by the old image and must be regenerated shot by shot. ★Never use external tools to make first/last frames and upload_shot_frame to 'change the image'—external images lack identity/style anchors, so characters/clothing/style will drift; that is the real source of unusable film. upload_shot_frame is only for customer-owned real footage.③【Optional enhancements · AI proactively informs customer · do only after quote confirmation】Art bible generation / visual lock extraction / scene groups / lip sync / posters / sound effects / music / subtitle translation—these improve consistency/quality and are mostly paid. ★AI should proactively tell customer these are available and provide quote (whether to run depends on execution mode: pro mode / no confirmed plan / this step customer-controlled → tell customer and proceed only after consent; do not decide for customer; managed step → do not ask, follow get_production_plan autopilot.default_decisions, platform logs in get_autopilot_log); neither silently skip nor charge without authorization. ★Two locking rules:①**Aspect ratio** is set at create_drama, locked at drama level; all later image/video/final cut use it, **do not change midstream** (generated content will have inconsistent aspect ratio and drift); default 9:16 if unset.②**5-7 sec per shot in shot breakdown is normal length optimized for AI video**, do not wrongly re-split because 'shots are long'—generate_storyboards **replaces all storyboards in the episode**, wasting generated images; backend blocks when storyboards already exist unless confirm_replace is supplied. ★Rewrite fidelity (default auto smart routing): when the set_script original is **already script-shaped** (scene headers/dialogue-line structure), rewrite_script automatically uses two-pass fidelity—customer dialogue is machine-gate locked line by line (missing one line causes internal rejection and redo), AI never adds plot; dramaturgical gaps (hooks/emotional anchors) are not auto-filled, but written into dramaturgy_suggestions returned by get_script (whether to adopt follows execution mode: pro mode / no confirmed plan / this step customer-controlled → tell customer and proceed only after consent; do not decide for customer; managed step → do not ask, follow get_production_plan autopilot.default_decisions, platform logs in get_autopilot_log). If original is novel/outline, it auto uses creative rewrite (AI lays hooks/emotional beats); both customer types get intended behavior, no manual switch needed. To override default use update_project_settings rewrite_pipeline(auto/two_pass/single_forced) and fidelity_enforce(1=hard fidelity gate). When customer says 'AI changed my script too much':①confirm full original entered set_script;②set rewrite_pipeline two_pass to force fidelity, then rerun rewrite_script;③after customer confirms character appearance, use update_character profile_locked=1 to lock profiles and prevent later extraction from overwriting appearance and changing faces in character sheets. ★If customer wants to rewrite script on **another AI platform** (common: third-party model says our rewrite 'changed too much', customer wants control): first call get_script_format_spec to obtain platform-accepted format contract (markdown template + external_prompt directly forwardable to external model + blank skeleton), give external_prompt+template+customer original to that platform; after receiving organized draft, **first call check_script_format** self-check (free · rule-only · no model); after errors are zero, two exits:【A】adopt_external_script directly adopts as shootable script (our AI not involved · seconds · no charge, requires external draft contains production-layer annotations);【B】set_script puts it back into original slot + rewrite_script two-pass fidelity (choose when external only handles story layer; platform fills annotations; customer-written annotations are stripped and rewritten on this path). ★Do not put external organized draft into edit_rewritten_script (400 if rewrite not run), and do not skip check_script_format before ingestion—noncompliant scripts are still blocked by gates, wasting a run.★★If the customer’s material is **already a finished storyboard table** (per-shot durations/framing/camera moves), neither path applies—use import_storyboard_table directly to create storyboards and skip rewrite and shot breakdown. The rewrite path will strip durations/framing/camera moves/STYLE/text cards as non-story content (production test: 8 shots 36 sec → 20 shots 109 sec). ★Both import channels are deterministic—wrong input is created as-is, so **get contract, self-check, then import**: storyboard table path uses get_storyboard_table_spec → check_storyboard_table → import_storyboard_table; if customer tools/spreadsheets can export structured data, or external AI can directly produce JSON, use get_bulk_import_spec → check_bulk_import → bulk_import_storyboards (only creates storyboards; characters/scenes/props are extracted from script by extract_assets; import binds by name to existing ones—extract first, then import). Both imports default with auto_complete(background AI fills professional fields + image/video prompts, text step postpaid; tell customer before call): if receipt started=true, poll get_autofill_status until done, then review_storyboards—autofill changes shots, so any earlier review token invalidates. Use get_pipeline_status for progress (returns project-type-specific steps).★★【Opening plan · first thing after creating drama · free】First ask basic video parameters (project type/aspect ratio/episodes × minutes per episode/subject: realistic_human realistic live-action · stylized anime/stylized · product/empty shots · native audio or dubbing), then call get_production_menu to get **currently available** three packages (effect description + real-time estimate including text steps + recommended budget + excluded items) and explain to customer—do not recommend models from memory; some models may be temporarily unavailable for some subjects, menu already filters them. Then let customer choose execution mode (pro self-control every step / auto one-click final cut / custom managed selected steps), budget budget_points, and automatic overrun cap (0/10/20/30/50%): **default recommendation** budget=selected package recommended_budget (upper bound excluding text ×1.2 plus text estimate), overrun=menu recommended_overrun_pct(30%)—QC regenerations are not in upper bound and are covered by overrun; recommendation is only recommendation, final numbers are customer’s, and if customer changes them use customer values. Explain summary clearly; only after explicit customer consent call confirm_production_plan(customer_confirmed:true)—never confirm for customer. For dramas with confirmed plan: before paid dispatch the platform rechecks model availability and quote upper bound ≤ budget×(1+overrun%); if blocked (402 BUDGET_WOULD_EXCEED / 409 MODEL_UNAVAILABLE), stop and ask customer; do not change model or budget yourself. confirm returns 403 PRODUCTION_PLAN_NOT_OPEN = this drama not open (gray release), follow original step-by-step confirmation flow.\n★【Post-completion QC】After extraction, use get_characters / get_scenes / get_props to verify profiles (names, appearance, era) match the customer script; after character sheets/concept images/scene images/prop images finish, review_assets handles coverage and quality review uniformly.",
20
+ "get_pipeline_status": "Check the complete workflow progress for one episode(script_rewrite/extraction/storyboards/voice/image/video/compose/music/final merge… each step done/partial/pending/not_required). Follow it in order; do not skip. Free. ★For auto / custom mode(hosted rollout), also returns next_action(action=run do hosted step directly / wait_running background still running, wait for persistence and do not dispatch duplicate / wait_customer client-controlled step or no budget precheck, ask first / ask_customer pending questions, summarize and ask first / done all steps complete—first run tool=review_final_cut, fix issues and re-compose/re-review, then deliver report; tool=which tool to call) and pending_questions; advance exactly by next_action. asset_versions_summary separates generated, input_consistent, review_valid, adopted, and current_effective; do not treat generate_videos.completed as current valid count. ★generate_images / generate_videos status=done only means \"generated\", not deliverable: inspect validity for that step(current_effective / input_changed with changed_by listing drama-level settings, shot itself, or which character changed / input_unknown / unreviewed / review_failed). If validity.note is non-empty, tell the client first. Changed input may not affect visuals; do not regenerate whole episode paid just for that—use get_asset_versions per shot to inspect causes. ★not_required means this mode does not need the step(e.g. TTS steps for native-audio drama, generate_bgm when music disabled), not unfinished; do not fill it. Image/video denominators exclude blocked shots(shots_not_applicable). merge_episode.bgm_stale=true means music is newer than final cut; just compose_episode again.",
21
+ "quote_character_portraits": "Quote: how many credits to batch-generate character sheets for characters missing them. Returns portraits_to_generate, estimated_points, quote_id. No charge. Character sheets are identity consistency anchors(missing them makes characters drift); strongly recommended before video. ★This quote only covers character sheets; after character sheets are ready, you **must** also generate_character_sheets for turnarounds(no quote required · image step postpaid; response sheets_to_generate_after is pending count). Only character sheets without turnarounds will drift when characters change angle/lighting/clothing—tell client about this step during quote. ★Returns two numbers: estimated_points is the **upper bound**(estimated at max reference images, enough balance avoids mid-run 402), typical_points is **typical cost**. Tell the client both; only quoting upper bound makes it seem much more expensive. For fixed-price models(e.g. Nano Banana series), they are equal.",
22
+ "generate_character_portraits": "After confirmation, batch-generate character sheets(★character sheets only): background async. A character sheet is a single identity anchor—shot consistency(especially wardrobe) also needs **turnarounds**. After this, strongly recommend generate_character_sheets, or use generate_portraits_and_sheets for both. Check progress via get_pipeline_status/get_storyboards. ⚠️ Batch quote-confirm flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id(quote confirmation by execution mode: pro / no confirmed plan / client-controlled step → tell client and get consent; hosted step → do not ask, follow get_production_plan.autopilot.default_decisions; platform logs in get_autopilot_log). Hosted quotes must fit within budget hard cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask client. ★**Image-generation quotes(character sheets/scene images/frames) return two numbers**: estimated_points is the **upper bound**(estimated at that model’s max reference images, prevents starting with too-low budget and hitting 402 mid-run); typical_points in same response is **typical cost**. Tell both—only upper bound sounds far too expensive(max-ref upper bound can exceed typical by 2x+), only typical may leave insufficient balance. For fixed-price models they are equal; then one number is enough.\n★[Post-completion QC · free] After images persist(poll corresponding get_*; if pending do not repeat call), run review_assets for asset-layer review(missing / generating / failed / rejected by consistency gate / prop era conflict / color script). Relay findings verbatim, fix per action and re-review; then personally inspect each image per agent_qc(does it match profile, same person, era correct; turnaround has all angles and correct proportions/structure; props and scene images make sense in story—compare used_in_shots). Submit QC with submit_qc_report. When generating shot images, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
23
+ "generate_character_sheets": "★Batch-generate turnarounds(multi-view) for all drama characters. Turnaround is the **root consistency anchor** referenced by shot frames/video—only character sheets without turnarounds cause drift when angle/lighting/clothing changes(2.5 directly slices turnarounds as bone-structure anchors). Generates only missing turnarounds(no duplicate charge). Prereq: character already has character sheet(missing blocks and tells you to generate character sheet first). Image step, postpaid by usage with no credit debt. Poll get_characters for sheet_status: pending=generating/auditing(turnaround ~2~4 minutes; do not click repeatedly); ready=persisted; **rejected=image generated but rejected by consistency gate**, read sheet_fail_hint for verdict—reroll once; if same reason repeats, anchor fields conflict with character profile, run_precheck before rerolling again.\n★[Post-completion QC · free] After images persist(poll corresponding get_*; if pending do not repeat call), run review_assets for asset-layer review(missing / generating / failed / rejected by consistency gate / prop era conflict / color script). Relay findings verbatim, fix per action and re-review; then personally inspect each image per agent_qc(does it match profile, same person, era correct; turnaround has all angles and correct proportions/structure; props and scene images make sense in story—compare used_in_shots). Submit QC with submit_qc_report. When generating shot images, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
24
+ "generate_portraits_and_sheets": "★One-click: character sheets + turnarounds(recommended, standard pipeline). Turnarounds depend strongly on character sheets, so this is smart two-stage—if any character lacks character sheet, it dispatches character sheets first and tells you; once all are ready, call again to batch-generate turnarounds. Avoids drift from character-sheet-only workflows. Image step, postpaid by usage with no credit debt. Poll get_characters until image/sheet_url ready; each call advances one stage.\n★[Post-completion QC · free] After images persist(poll corresponding get_*; if pending do not repeat call), run review_assets for asset-layer review(missing / generating / failed / rejected by consistency gate / prop era conflict / color script). Relay findings verbatim, fix per action and re-review; then personally inspect each image per agent_qc(does it match profile, same person, era correct; turnaround has all angles and correct proportions/structure; props and scene images make sense in story—compare used_in_shots). Submit QC with submit_qc_report. When generating shot images, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
25
+ "quote_storyboards": "Quote: credits to split one episode script into storyboards. No charge. Returns quote_id and a **range**: estimated_points=budget upper bound(prepare balance by this; no 402 mid-split), typical_points=usual cost—tell user both; only upper bound looks absurdly expensive, only typical may underfund balance. AI decides the number of shots(estimated_shots is an estimate), so exact credits are impossible. ★price_breakdown includes not only \"shot splitting\" but also automatic completion triggered after splitting(fills empty fields per shot; when wardrobe assets exist, schedules wardrobe timeline)—they happen with shot splitting and charge together, so include them in the total you tell user. After receiving consent, call generate_storyboards with quote_id.",
26
+ "generate_storyboards": "Confirm then split into storyboards: runs in background (minutes), returns immediately status:generating. Poll with get_storyboards. ★Note: storyboard splitting will **replace all existing storyboards for the entire episode** (all tuned/generated images are lost; you must spend again). 5-7 seconds per shot is the **normal** duration optimized for AI video generation; do not resplit just because a shot feels “a bit long”. If storyboards already exist, backend blocks; only pass confirm_replace=true after confirming replacement. ★Typical duration 5~10 minutes (production measured 7~8.4 minutes; **a single LLM call may take 3~7 minutes**). **No storyboards within 60 seconds or even 3 minutes is normal**—use get_run_status to see whether it is still running. running:true means keep waiting; resending equals redoing the entire episode’s storyboards.\n★【Rewrite review hard gate · free】Before this step you must call review_script first: report each returned finding to the customer verbatim (each with code=issue type, shots=hit shot numbers, action=which tool to use to fix), then pass review_token into this tool. No review will be rejected with 400. If content changes after review → token auto-invalidates; review once again (still free). error findings block by default; only if the customer is informed and insists on proceeding as-is may you pass acknowledge_review:true—pushing forward with known issues will likely produce unusable video and still charge normally (acknowledge_review only means the customer personally agrees; every execution mode requires explicit customer consent, autopilot included). In autopilot steps, only whitelisted heuristic errors can pass with auto_acknowledge:true (platform decides; if not whitelisted returns 400 AUTOPILOT_MUST_ASK: must_ask_customer=true means pause to ask customer, false = self-fix and re-review per action). ★Gray-release dramas also require you (agent) to personally QC: inspect assets one by one per agent_qc returned by review_script, answer every checklist item, and submit via submit_qc_report before this token can be used (not submitted → 400 agent_qc_required; problematic report → blocks like error by default). ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step controlled by customer → explain to customer and only do it after customer agrees; do not decide for them. This step autopilot → do not ask customer; execute per get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log). Autopilot step quotes must stay within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask the customer. ★**Image-generation quotes (character sheet/scene image/frame generation) provide two numbers**: estimated_points is the **upper bound** (estimated using that model’s maximum reference-image count, ensuring you do not start with an underbudget and hit 402 midway); typical_points in the same response is the **usual spend**. Tell the customer both—only stating the upper bound makes it look much more expensive (the full-reference upper bound can exceed the usual value by over 2x), while only stating the usual value may leave insufficient balance. For fixed-price models the two are equal, so one number is enough. Video-generation quote and charging use the same function; this range does not exist.",
27
+ "get_frame_retry_diagnosis": "Free read-only query for image-task losing-streak diagnosis, evidence task IDs, and next action. When diagnosis_required, call this tool first: audit failures should re-review existing candidates; unknown causes should be rechecked first; do not redraw with identical input or change the script without authorization. ★Returned recovery_options are the three choices after image generation failure (ordered free→free→paid, no need to disturb customer when needs_attention=false): ① adopt_rejected select an audit-misjudged candidate from rejected/unselected candidates (get_frame_candidates→adopt_frame_candidate, candidates is adoptable count); ② upload_fixed locally patch this shot’s platform candidate then upload_shot_frame; ③ regenerate modify content per diagnosis then quote_shot_frame→generate_shot_frame. When ask_customer=true, present all three to the customer and let them choose; do not approve on their behalf or pay for regeneration without authorization. failure_class=transient is incidental failure; wait and retry same input. not_self_healable is overdue account/insufficient credits/quota full/model unavailable; regeneration is useless (regenerate.available=false); handle account or change model first.",
28
+ "get_image_dispatch": "Free read-only query of a shot frame’s dispatch ledger: which reference images were actually used, each image’s purpose and character ownership, whether it reached the model, at which step and why any missing or pre-dispatch removed image was removed (e.g. conflicting object named by era precheck), and the final prompt actually sent to the image model. Use to answer “which image was used and why the result does not look like it”; check facts before deciding to regenerate, do not repeatedly pay for redraws by guessing. ledger=partial/none means the image was generated before ledger launch; missing fields are honestly null.",
29
+ "get_frame_candidates": "Free read-only: **all candidates** for a shot’s first frame/last frame (same data as the image acceptance workbench). Each candidate includes original image URL (rejected ones too; can open directly at original size), status, whether currently in use (adopted), rejection reason reject (main primary code / code specific cause / details / class routing: needs_content_fix=content must change, content_retryable=content issue but reroll succeeds about 1/3, transient=audit did not complete or incidental—not image disqualification), audit evidence audit (warnings Chinese conclusion, expected design requirements, derived_shot_type inferred shot size with rationale, boxes positions of subjects/body parts in frame; candidates before 2026-10-07 have no archived evidence and are null, not proof they were audited), and which reference images were actually used (references: purpose/character ownership/whether delivered). storyboard.tail_endstate is the “last frame≈first frame” check conclusion (current=false means the conclusion is not for the current two images). ★When a shot is repeatedly rejected, or the customer asks “what did those rejected images look like / why not adopt them”, call this first: inspect each original image and evidence, then decide whether to change storyboard, references, or reroll—do not blindly pay to regenerate. To see a specific image’s final prompt use get_image_dispatch(generation_id). If the customer has seen the original image and confirms the image is fine and the audit was wrong, use adopt_frame_candidate for manual adoption (free); manual_adoption non-empty = this candidate was manually approved. recovery_options gives the three choices after failure by frame position (pick false rejection / patch and upload / regenerate), same criteria as get_frame_retry_diagnosis.",
30
+ "adopt_frame_candidate": "Free: manually adopt a completed first-frame/last-frame candidate (rejected by audit rejected, unselected dismissed, or completed but previously in use then replaced) as the active frame for this shot—manual fallback for audit misjudgment (e.g. setting explicitly specified by author contract was judged conflicting), and can switch back to a previous one at any time. ★You must first use get_frame_candidates so the customer has seen the original image and rejection reason, and only call after explicit customer consent (adopting a rejected candidate requires explicit customer consent in every execution mode, autopilot included); do not self-approve just to move the process along. Can only adopt this shot’s same frame position, completed, has image, and not currently active. Manual approval is recorded on the candidate (who/when/original rejection reason); original rejection reason is retained for statistics. If this shot already has video, it will be marked pending regeneration (video was generated from old frames; need regenerate_shot_video). If this frame is customer-uploaded or finalized, pass replace_user_frame:true to replace it (and unfinalize). If same frame position has image generation in progress or this shot has video in progress, returns 409; wait for it to finish before adopting.",
31
+ "get_stale_portrait_frames": "Free read-only query for which active first frames/last frames in an episode were drawn using old assets for characters that have since been replaced (old character sheet, old turnaround, old body/hair image). Use after changing a character sheet to confirm impact scope, then let the customer decide which shots to regenerate (regeneration costs credits; this tool changes no data). verdict=stale must include evidence: ledger-old-asset (dispatch ledger directly recorded use of old image) / references-previous-asset (references include that character’s previous old asset) / portrait-born-after-frame (current character sheet was created after this frame). If not provable, mark unknown with reason; do not treat as stale. has_video=true means this shot’s video is also based on old frame; after regenerating frames, video must be regenerated.",
32
+ "get_asset_versions": "Read-only query for all image/video versions of a shot, historical view links, dependency IDs and version hashes, plus four independent facts: generated → consistent with current input → audit valid → adopted. If historical dependency records are missing, show unknown; do not fabricate snapshots. Free.",
33
+ "get_asset_binding_repair_plan": "Read-only generation of an auditable repair proposal for missing historical scene bindings in an episode. Returns original location/time, candidate ID, match basis, ambiguity, and proposed_scene_id; applied=false, never auto-backfills by name. Only after item-by-item verification does the customer decide whether to rebind. Free.",
34
+ "get_storyboards": "Read an episode’s storyboard list (for review/progress). Includes readiness of each shot’s first frame (first_frame_image) and video (video_url). asset_versions separately reports for first frame/last frame/video: generated, input_consistent, review_valid, adopted, current_effective. null=missing evidence; ready only means an artifact exists, not that it is currently effective. Old assets remain viewable. ★Each shot includes **dialogue and speaker**: dialogue (raw text, null if no dialogue), dialogue_lines([{speaker,text}] line by line, split by the same parser as subtitles/voiceover—the speaker here is the one voiced in the final cut; stage directions removed), plus is_key_moment (1=key shot, uses high-end image model) and emotion_intensity (1-10). Use this single call to verify “whether dialogue is missing / who speaks / which shots are key / emotion curve”; no need to fetch per shot. After update_shot changes dialogue, verify here too. Visual/video/first-last-frame prompts are still only read per shot with get_shot_prompts. ★Each shot also includes **structured status**: frame_status/video_status (ready/pending/authorizing/rejected/failed/none/not_required). ★video_status=ready only means video generated, not that visual acceptance passed. If video_quality_issues contains terminal_cut: status=suspected means suspected abrupt end cut; cut_at_s/tail_duration_s give position; status=unavailable means detection not complete, not a pass. Both pause this run’s automatic last-frame writeback and continuation; review the video first. Field absence does not mean detection was performed, and do not directly retry paid generation. ★not_required=narration/end-card shot: frames and video are rendered at final-cut layer; this shot does not need generation—count it as completed when filling progress, do not retry. fail_reason (sensitive/text_sensitive/copyright/face_mismatch/account_overdue/quota_full/authorizing/insufficient_credits/transient/repeat_rejected/diagnosis_required/pair_collateral/model_unavailable), retryable (true=can retry; false=handle per fail_hint first, do not retry unchanged), fail_hint (human-readable). ★model_unavailable=selected image/video model vendor has paused or is temporarily unavailable: fail_hint lists currently available alternative models (whether credits were charged depends on error text; do not promise refunds on behalf of platform). Ask user, then use update_project_settings to change video_engine/image_model (or per shot use regenerate_shot_video model / generate_shot_frame image_model) before generating; retrying unchanged will only fail again. ★diagnosis_required=same input and same detailed cause failed repeatedly or existing candidates await judgment: inspect existing candidates and audit evidence first. For audit failure, re-review the same candidate first; for unknown reason, recheck first; do not directly change script or regenerate. Follow retryable to decide retry vs content change; do not parse Chinese. ★pair_collateral=other frame in same shot failed, this frame ended with the batch—**this frame itself was not judged bad, do not modify it**: if reopen_pair_id exists, use it to reroll only the faulty side; otherwise regenerate this shot directly. ★If a shot has degraded_frames:[{frame_type,reason,reason_label,since,hint}], this frame was **allowed through** by the system after same-cause repeated-rejection circuit break (criteria recorded, not rejected); URL is indistinguishable from a clean frame but requires manual review. If unsatisfied, follow hint to fix input then generate_shot_frame to regenerate that frame. ★terminal_desc_missing=true: this shot is marked as “state change” but none of three places says what it looks like at the end—this can be detected **before last-frame generation**, now for the whole episode at once (previously only get_shot_prompts could query per shot; nobody queries dozens of shots one by one). First use update_shot to write the ending state into last_frame_prompt, then generate the last frame: historical success rate when forced as-is is 9.4%, with terminal state written 40.2%, and each rejection still charges normally. Only for shots truly “almost unchanged” use generate_shot_frame allow_missing_terminal to pass. ★first_frame_source/last_frame_source='upload' means this frame is an **externally uploaded image** (bypassing identity anchors/style anchors/best-of-N/frame audit quality chain)—check these shots first when diagnosing character/clothing/style drift. Drift caused by external images is not a platform generation quality issue; correct fix is delete the external image and use generate_shot_frame for platform regeneration. ★If a shot has reopen_pair_id: when first/last frames were generated together, only one side truly had an issue and the other was innocent collateral rejection; pass it unchanged to generate_shot_frame parameter reopen_pair_id to reroll only the faulty side (saves half compute/cost; will not generate an image not intended for this rerun). If absent, follow fail_reason/retryable normal retry. Free. ★Each shot also includes **bindings** (IDs only): character_ids (characters bound to this shot), character_bindings[{character_id,presence}] (presence=on_screen visible in frame / voice_only voice only, not in frame), scene_id, prop_ids, active_wardrobe_id (shot-wide wardrobe), appearance_wardrobes[{character_id,wardrobe_id}] (per-character wardrobe anchor; only lists characters with declared wardrobe). These determine whose character sheet/which scene image/which prop images are injected for image generation; use get_characters for character-name lookup, get_props for prop-name lookup. Change bindings with update_shot character_ids (★full overwrite; read current values here before editing, omitted means unbind) and character_presence; change wardrobe with update_shot active_wardrobe_id / appearance_wardrobes (can overwrite, can pass null to clear); read this tool again after edits to verify. character_bindings absent = not read this time (not unbound); empty array means no bindings. ★When bilateral version review is enabled, seam_review.status is passed/failed/not_checked/stale; stale means evidence expired, not image failure, do not pay to regenerate for that alone. continuity_intent can be made explicit with update_shot. ★Each shot includes **seam_state** (seam between this shot and previous shot, same criteria as official site frame timeline): ok=chained (first frame is previous shot’s last frame, or platform performed first-last frame continuation, landed, and neither side regenerated afterward) / unchained=should be continuous but not connected (marked continuous but never connected, or platform-initiated continuation regeneration did not land: rejected/failed/still generating—this shot frame_status will be failed/processing; or after continuation passed, this shot’s first frame was regenerated) / broken=connected but discontinuous (seam_failed_dims gives discontinuous dimensions: characters/wardrobe/props/lighting/scene; seam_audit_status=stale with no dimensions = previous shot’s last frame regenerated after continuation, while this shot’s first frame still connects to old last frame) / intended=intentional cut (hard cut/scene change/time jump/large shot-size jump/insert shot/external uploaded frame), ignore / missing=frames missing on either side / unknown=no intent marked and never connected (system did not judge, not an issue) / na=first shot or narration card. seam_audit_status=pending means continuation landed but platform continuity audit not concluded yet. Before video generation only handle unchained and broken: episode-wide use chain_frames (dry_run first), single shot use chain_shot_from_prev / chain_shot_from.",
35
+ "get_run_status": "(★free · mandatory after long-running operations) Check whether an agent is currently running for this episode. rewrite_script / extract_assets / generate_storyboards are all **minute-level** background tasks; they only return status:\"generating\". This tool is the only way to distinguish “still running” from “finished”.\n★Typical duration (production measured): rewrite 2~4 minutes, storyboard splitting 5~10 minutes—**a single LLM call may take 3~7 minutes**. So no result within 60 seconds is completely normal, definitely not failure.\nUsage: after starting, call every 30~60 seconds. running:true = still running, keep waiting, **never resend** (resending storyboard splitting replaces the entire episode’s storyboards; all tuned/generated images are lost and must be paid again); running:false = that run has ended, only then call get_storyboards / get_script to see whether artifacts were persisted.\n⚠️ Service restart clears in-flight registration; runs started during restart may also show as no in-flight.",
36
+ "run_precheck": "(★recommended · free quality gate) Run pre-generation precheck before image/video generation to catch shots that would be rejected. Free, no credits charged. Strongly recommended before generate_frames/generate_videos to avoid wasting money on rejections.\nChecks these categories: ① live-action portrait / cloned voice authorization ② high-risk image-review words ③ voiceover coverage and large gaps ④ **self-contradictory instructions (kind=prompt-conflict)**—mutually exclusive requirements within the same shot (e.g. wide shot but close-up subject marked, standing and sitting at once). No correct image can satisfy these shots; if not fixed they will be rejected repeatedly and charge repeatedly. When present, first edit the storyboard per hints, then generate images, rather than retrying.\n★**You do not need to guess how to fix**: call plan_precheck_fix for platform proposals (which shot, change what to what), then apply_precheck_fix to persist (choose which items to accept; autopilot=accept all per execution mode: professional mode / unconfirmed plan / this step controlled by customer → explain to customer and only do it after customer agrees, do not decide for them; this step autopilot → do not ask customer, execute per get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log)—more stable than blindly using update_shot yourself, which bypasses optimistic lock and pre-persist recheck. Some categories are not auto-fixed by system (blocked in proposals); only those require manual handling.\n★★**Also come back and run this when a shot repeatedly cannot be generated**—this tool is not only a preflight check. It also reports “same-shot same-cause repeated rejection circuit-broken (repeat-reject, auto-clears in 24h)” and “frame contract contradiction”; that is exactly the answer to “why this shot never works no matter how we reroll”. **Do not blindly reroll**: while circuit break is active, every reroll repeats the same full-price rejection.\n⚠️ It does **not** check whether the first frame is “before the action happens” (platform has no contract field for this yet), and does not replace get_health_report.",
37
+ "run_drama_precheck": "(★free · read-only) **Whole-drama** health summary: get in one call how many issues each episode has and which episodes to fix first. run_precheck is episode-level; for dozens of episodes you would need dozens of calls and manual aggregation—call this first when scanning the full drama.\nReturns: episodes[] with per-episode blockers/warnings/by_kind (counts by rule code), totals for whole drama, attention[] = episodes most worth fixing first (sorted by blocker count, warning count descending).\n★**How to use**: inspect attention to set priority → call run_precheck on those episodes for itemized details → use plan_precheck_fix / update_shot to fix → rerun this tool to confirm totals decreased.\n⚠️ **“whole drama 0 issues” does not mean “everything was checked”**: to finish in one request, drama-level forcibly skips the only lint that needs image inspection (25s wall-clock per episode). not_covered in response lists skipped categories; to check those, run run_precheck on the corresponding episode.\n⚠️ episodes[].failed=true means that episode **was not checked successfully** (not “no issues”); just retry. truncated=true means episode count exceeded limit and scan is incomplete.",
38
+ "plan_precheck_fix": "Let the platform **compute** how to fix \"instruction self-contradiction\" issues caught by run_precheck (step ①, compute only, do not modify). Billed by text usage (tiny), no quote confirmation.\n★Two-step flow; this step changes no data: after receiving proposals, **explain them to the customer one by one** (which shot, change what to what, why), then pass the accepted items **unchanged** to apply_precheck_fix to persist (only the accepted items. Autopilot = accept all per execution mode: professional mode / unconfirmed plan / this step customer-controlled → explain to customer and only proceed after approval; do not decide for the customer. This step autopilot → do not ask customer; follow get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log).\n★**In professional mode, do not decide for the customer**: these rules have false positives; the platform intentionally does not offer \"one-click auto-fix\"—tests found nearly half the proposals in the same batch were rule false positives, and silent edits would break originally correct storyboards.\n★Returned blocked lists categories the \"system will not fix for you\": those must be manually adjusted per run_precheck hints. Seeing blocked does not mean there is no problem; it is exactly the part that **must be handled manually**.\nOmit shot_id to compute the whole episode; pass it if you only want to fix one shot.",
39
+ "apply_precheck_fix": "Persist proposals the customer has **confirmed** (step ②). Free (pure text DB write). Input is the proposal object returned by plan_precheck_fix; just **pass it back unchanged**—only the items the customer checked for acceptance.\n★Before persisting, the platform applies three gates again: optimistic lock (if the DB value changed, skip; never overwrite others' changes), admission recheck, and self-healing gate (if the rule is not green after the edit, skip). So some items entering skipped is normal, not a failure.\n★Returned remaining = how many precheck issues **remain in this episode**, not \"how many fields were changed\". After fixing, rerun run_precheck to confirm, then proceed to image generation.",
40
+ "get_health_report": "(★Recommended · free diagnosis) Read storyboards and output a health report: overlong duration / insufficient motif coverage / problematic shots. Read-only, free. Check before image generation; identify issues, fix first, and avoid discovering them only after the film is produced.",
41
+ "review_script": "【Hard Gate ① · Free】Review the AI rewritten script: dialogue line length, completeness of emotional turns, opening hook, final-scene cliffhanger. ★Before extract_assets and generate_storyboards, this tool must run first—character profiles and storyboards are derived from the rewritten script; issues in the script will be amplified layer by layer into character sheets / image generation / video generation, and discovering them at final cut means redoing the whole episode. Tell the client each item in findings one by one, fix by action (use edit_rewritten_script for script edits), then re-review and proceed with the review_token.\n★【Agent manual QC · Free】The returned agent_qc contains this-layer checklist and the episode materials to inspect (materials, each with a ref; images/videos include links). The platform only judges “exists / present / rejected”; “looks alike / correct / good” must be checked by you: download and open images, sample at least beginning/middle/end frames for videos, read text through with tools. Answer each checklist item (ok / issue / na; for issue, specify which item and what problem), list every inspected ref in inspected, and call submit_qc_report to submit; relay the QC conclusion to the client verbatim. If agent_qc.required=true and no report is submitted, this review_token cannot enter the next step (400 agent_qc_required); a problematic report blocks by default just like a platform error.\n★【Script evaluation and suggestions】materials contains the client original script (script:original) and the rewritten script (script): first evaluate the client’s script itself (mainline, motivation, conflict, pacing, plot holes, filmability), then check the rewritten script; for each issue, provide concrete fixes in submit_qc_report suggestions (if wording can be directly changed, provide before/after). After submission, tell the client the evaluation and suggestions item by item and let the client choose: adopt some / execute all directly / continue without changes (which path to take follows the execution mode: professional mode / unconfirmed plan / this stage controlled by client → tell the client and proceed only after client approval; do not decide for the client; if this stage is autopiloted → do not ask the client, execute according to get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log); autopiloted stages by default execute only priority=must items that do not change the client’s original dialogue; all others go into the delivery report.",
42
+ "review_storyboards": "【Hard gate ② · free】Review storyboards: forbidden terms (will be rejected by vendors and waste credits), shot duration distribution, repeated adjacent composition, character blocking drift in the same scene, emotional curve peaks/valleys, key-shot markers. ★Must run this tool before generate_frames—storyboard issues become a whole episode of wasted images once generated and cannot be fixed shot by shot. Fix per findings.action using update_shot/split_shot, then review again. ★A finding with code=forbidden_term includes `terms` (specific matched terms, e.g. \"background music\", \"strong light\") and `shots` (shot numbers); use those two to update_shot and remove them, no need to guess word by word. ★Forbidden terms are judged with **negative semantics**: writing \"no background music\" or \"do not add music\" is not a violation (it is obeying the constraint), so no edit is needed. ★\"Action overload\" in warnings (action_overload, advisory only, non-blocking): one shot contains more independent actions than its duration can support; before video generation, use split_shot to split it or delete actions—slow motion/dissolves cannot rescue it after final cut. Ignore if multiple people each do one thing or it is a naturally continuous action chain.\n★【Agent hands-on QC · free】Returned agent_qc contains this layer's checklist and materials to inspect for this episode (materials, each with a ref; images/videos include links). The platform only checks \"exists / present / rejected\"; \"looks like / is correct / is good\" must be judged by you: download and open images, sample at least beginning/middle/end frames for videos, read text fully with tools. Answer checklist items one by one (ok / issue / na; for issue, state which item has what problem), list every inspected ref in inspected, and call submit_qc_report; tell the customer the QC conclusion verbatim. When agent_qc.required=true, without a submitted report this review_token cannot proceed to the next step (400 agent_qc_required); issues in the report block by default just like platform errors.",
43
+ "review_frames": "【Hard gate ③ · free】Review the shot image layer: character identity-anchor coverage (characters without character sheets will drift in shots), image-generation failure rate, orphan character variants, scene images polluted by people. ★Must run this tool before generate_videos—video generation is the most expensive step in the whole chain, and generating a whole episode of video from drifting first frames is the most typical wasted-film failure. Fix per findings.action (mostly generate_character_portraits / generate_shot_frame single-shot regeneration), then review again. ★Also reports **inter-shot seams** (warning, non-blocking): code=seam_unchained (marked continuous but never did first/last-frame chaining, or initiated chained regeneration never landed / first frame was regenerated again after chaining) / seam_broken (chained but not connected, or previous shot's last frame was regenerated after chaining); shots is the shot whose \"seam with previous shot\" has the issue. Cheapest to fix before video generation—videos are generated from first frames; if a first frame does not match the previous shot's last frame, the final cut has a jump cut. See action for fixes (whole episode chain_frames dry_run first; single seam chain_shot_from_prev / chain_shot_from).\n★【Agent hands-on QC · free】Returned agent_qc contains this layer's checklist and materials to inspect for this episode (materials, each with a ref; images/videos include links). The platform only checks \"exists / present / rejected\"; \"looks like / is correct / is good\" must be judged by you: download and open images, sample at least beginning/middle/end frames for videos, read text fully with tools. Answer checklist items one by one (ok / issue / na; for issue, state which item has what problem), list every inspected ref in inspected, and call submit_qc_report; tell the customer the QC conclusion verbatim. When agent_qc.required=true, without a submitted report this review_token cannot proceed to the next step (400 agent_qc_required); issues in the report block by default just like platform errors.",
44
+ "review_assets": "【Asset-layer hard gate · free】Review character appearance images, scene images, and prop images used **on screen** in this episode—coverage and quality: on-screen character missing character sheet / missing reference image / still generating / generation failed / reference image rejected by consistency gate (hint includes rejection reason); scene missing empty-scene base plate; prop referenced by storyboard missing prop image / rejected; prop image conflicts with this shot's era/form; missing color script (warning). ★Call once after producing character sheets, reference images, scene images, and prop images; must review before generate_frames / generate_shot_frame—pass the returned review_token as **asset_review_token**, together with the storyboard-layer review_token (both are required). Only checks the assets themselves: generating shot images later will not invalidate it; changing character sheets / scene images / prop images will invalidate it, just review again (free, seconds). Explain findings to the customer one by one (code=issue type, names=which character/scene/prop, shots=affected shot numbers, action=which tool to call to fix).\n★【Agent hands-on QC · free】Returned agent_qc contains this layer's checklist and materials to inspect for this episode (materials, each with a ref; images/videos include links). The platform only checks \"exists / present / rejected\"; \"looks like / is correct / is good\" must be judged by you: download and open images, sample at least beginning/middle/end frames for videos, read text fully with tools. Answer checklist items one by one (ok / issue / na; for issue, state which item has what problem), list every inspected ref in inspected, and call submit_qc_report; tell the customer the QC conclusion verbatim. When agent_qc.required=true, without a submitted report this review_token cannot proceed to the next step (400 agent_qc_required); issues in the report block by default just like platform errors.",
45
+ "review_videos": "【Video and dubbing-layer hard gate · free】Review this episode's videos and dubbing—coverage and quality: missing video / still generating / generation failed / vendor rejected; first frame changed but video was generated from an old frame (video_stale); suspected hard cut at clip end, unexpected human voice in no-dialogue shots (warning); dubbed drama: dialogue shot missing dubbing, speaking character has no voice, missing narrator role; original-audio drama: shots not attached to current voice line at export time, characters without locked voice lines; missing music (warning). ★Call once after video, dubbing (generate_tts), and music are produced; must review before compose_episode, passing the returned review_token. Finer checks (requiring decoding picture/audio tracks) are available via scan_intra_shot_cuts / scan_dialogue_coverage / audit_silent_shot_audio; after assembling the final cut, run review_final_cut.\n★【Agent hands-on QC · free】Returned agent_qc contains this layer's checklist and materials to inspect for this episode (materials, each with a ref; images/videos include links). The platform only checks \"exists / present / rejected\"; \"looks like / is correct / is good\" must be judged by you: download and open images, sample at least beginning/middle/end frames for videos, read text fully with tools. Answer checklist items one by one (ok / issue / na; for issue, state which item has what problem), list every inspected ref in inspected, and call submit_qc_report; tell the customer the QC conclusion verbatim. When agent_qc.required=true, without a submitted report this review_token cannot proceed to the next step (400 agent_qc_required); issues in the report block by default just like platform errors.",
46
+ "submit_qc_report": "Submit the QC report made by you (agent) after personally inspecting materials. Free. First call the corresponding review_* layer (script / storyboards / assets / frames / videos), open each returned agent_qc material in materials, answer every checklist item, then call this tool. ★The platform only verifies the report is **complete**, not whether your conclusions are correct: every checklist id must be answered (ok / issue / na; issue must include note explaining which item has what problem); every ref in materials must be listed in inspected (omit one and it is rejected with the missing refs named); if there are issues, set verdict=issues and list them in issues; reporting pass when issues exist will be rejected. ★Do not go through the motions: listing something in inspected without opening it means you signed off for the customer—wasted output will still be charged. ★When verdict=issues, this token cannot proceed to the next step by default: explain the problems to the customer, fix, then review + QC again; only if the customer is clearly informed and insists on proceeding as-is should the next step include acknowledge_review:true. ★suggestions (change suggestions): required at script layer when agent_qc.suggestions_required=true and issues were reported; optional for other layers. Each item includes problem + proposal; if text can be directly changed, also provide before/after; the response assigns each suggestion an id (s1…). Explain suggestions to the customer; the customer chooses accept some / execute all directly / proceed without changes (which route; autopilot = only execute priority=must suggestions that do not change the customer's original lines per execution mode: professional mode / unconfirmed plan / this step customer-controlled → explain to customer and only proceed after approval; do not decide for the customer. This step autopilot → do not ask customer; follow get_production_plan autopilot.default_decisions, recorded by the platform in get_autopilot_log). If content changes after the review, the report will be rejected; review again and QC against the new agent_qc.",
47
+ "review_all": "(Recommended · free) Overall health check running three layers at once: script + storyboards + shot images. Use for initial assessment before work starts and recheck before delivery. ★It **does not issue review_token**—before paid steps, still run the corresponding review_script / review_storyboards / review_frames once each (the gate recognizes \"just reviewed against the current output\", not \"reviewed once sometime before\").",
48
+ "autofill_storyboards": "(Recommended) AI one-click fills missing fields across all episode storyboards; by default it **only fills blanks and does not overwrite existing values** (only overwrites when overwrite=true). Improves storyboard completeness; do before image generation. Async in background, postpaid text step. ★When platform contract auto-fill is enabled, it also tries to add contracts to shots **without composition contracts** (whether enabled is indicated by the note in the import receipt contract_coverage; visible headcount / subject range / shot size are judged by it for both image generation and review; with default overwrite:false, existing contracts are untouched; **overwrite:true also rewrites existing contracts**)—if auto_complete was off during import and the contract_coverage note points to this tool, call it once before image generation. If this episode already has autofill running, this run **will not queue** (prevents duplicate-click duplicate charges); newly imported shots must wait until get_autofill_status is done before calling again.",
49
+ "enhance_shot_prompts": "(Optional enhancement · ★not required · has side effects) AI batch-enhances the whole episode's image_prompt. ★It **rewrites existing prompts** (including manually edited ones); and **must be done before generate_frames**—changing prompts after image generation makes images stale and requires paid regeneration. Not required to get a film through the pipeline; do only if the customer explicitly requests it. Async in background, postpaid text step.",
50
+ "complete_ending_motifs": "(Optional enhancement·★not required·conditional) Complete missing visual motifs in the ending segment (graft visual echoes onto ending shots). ★Prerequisite: this drama already has motifs (none = no-op); this will **modify ending shot action/descriptions**, so do it before generating images (otherwise already-generated ending shots become stale). Backend async, billed after the text step.",
51
+ "tail_frame_plan": "★Free read-only: which shots in this episode **need independent last frames** (shots whose terminal state ≠ initial state—large camera move/object released/state change). It uses the same criteria the platform uses for video generation; you cannot guess this yourself, so call it once after first frames are done. Returns shots_needing_last_frame(total), ready(shots with first frames already available and can get last frames now), pending_first_frame(shots that need last frames but whose first frames are not ready yet—call this tool again after first frames finish). After getting the ready list: use quote_frames + generate_frames with frame_type=last_frame to batch-fill. ★After last frames are filled (or this tool reports 0), the next step is seams: chain_frames(dry_run:true) to view plan and estimate, execute after customer confirmation, then review_frames. ★Skipping last frames will not error, but those shots have only one first-frame anchor during video generation, so the model improvises the terminal state—bad action completion, large camera moves ending back at the starting composition, etc. usually come from this. Zero cost, callable anytime.",
52
+ "quote_frames": "Quote: how many credits to batch-generate frames for an episode. Returns frames_to_generate, estimated_points, quote_id. Zero cost. frame_type defaults to first_frame(only shots missing first frames); last_frame only generates shots that have first frames and lack last frames; both fills both. ★Quote is tiered by the **actual model and resolution that will be used**; response includes price_breakdown(count and unit price per tier). If you plan to temporarily switch models in generate_frames, pass the same image_model when quoting, otherwise prices differ. ★Both sides must pass the same image_model — mismatch is rejected directly (400 IMAGE_MODEL_MISMATCH), because the model determines the billing tier; different sources mean \"estimate ≠ charge\". Passing neither on both sides also counts as consistent (uses the drama setting). Deprecated models (all FLUX series) are always rejected; do not pass them. ★Returns two numbers: estimated_points is the **upper bound** (estimated by maximum reference-image count; prepare this balance to avoid mid-run 402), typical_points is the **usual cost**. Tell the customer both; quoting only the upper bound makes it look much more expensive. For fixed-price models (e.g. Nano Banana series), they are equal.",
53
+ "generate_frames": "Batch-generate frames after confirmation: backend async. Poll with get_storyboards; done when first_frame_image/last_frame_image is filled shot by shot. ★Image generation is slow—tens of seconds to minutes per image (especially HD models); a full episode may take 10+ minutes. When polling, check frame_status: **pending=still generating (keep waiting patiently; do not treat as failure; do not call generate_frames again; duplicate triggers=wasted credits)**, ready=done, failed=only this is real failure. Do not decide generation failed or retry just because “it still has not appeared after waiting a while”. Frames must be generated before video, otherwise video degrades into images with no consistency anchors. ★**Before generating frames, prepare both anchors**: character sheets (generate_portraits_and_sheets, anchors people) and empty scene baseplates (generate_scene_images, anchors scenes). Missing baseplates will not block you, but the first shot of each scene will have no background anchor (the platform fallback fill only benefits later shots in the same scene), so the background starts drifting from the first shot. Use the generate_scene_images step in get_pipeline_status to verify completed/total. frame_type must match what quote_frames used (default first_frame). ★This is **batch fill-missing-frames**: it only generates images for shots “missing that frame”; shots that already have first frames are skipped—this is normal design, not “the system refusing to regenerate”. To **regenerate/redraw an existing frame for one shot** (e.g. after changing a character sheet and wanting the new image to take effect), use generate_shot_frame (single-shot regeneration with platform identity anchor), not this tool, and definitely not a self-made image via upload_shot_frame. ★**This tool generates only first frames by default; framing is a two-pass process**: after first frames finish, you must call the free tail_frame_plan once—it tells you, using the platform’s own criteria, which shots need independent tail frames (end state ≠ start state: large camera move/object released/state change, about 30%; you cannot guess this yourself), then batch-fill with frame_type=last_frame. Production data: in 32 episodes, 30 generated only first frames for the whole episode, and 23 proceeded all the way to video: those shots had only one first-frame anchor when generating video, so the model freely invented the end state. shots_needing_last_frame in this tool’s response is this count; if it is not 0, do not go straight to review_frames. ★frames_planned in the response is **planned count, not successful count**—this endpoint returns before the backend dispatch loop starts. Real progress is only in get_storyboards first_frame_image / get_jobs per-item generation records; insufficient balance (402) aborts the whole batch, and polling forever will not produce results—check balance instead of continuing to wait. ★★**If a few shots repeatedly fail while all others are ready**: that is not “not enough waiting”; those shots are being repeatedly rejected by content gates. Check fail_reason in get_storyboards (repeat_rejected / diagnosis_required / needs_content_fix / contract_rejected). If diagnosis_required, first diagnose existing candidates per fail_hint; if audit is wrong, re-audit first; if evidence is insufficient, re-check first; do not redraw unchanged or rewrite the script on your own. Then **run run_precheck** (can be run after the fact; it will tell you what contradiction it is), follow its hints to use update_shot to change shot size/description/bound characters, then regenerate. Do not keep spinning generate_frames, and do not send the customer to external tools to make images—external images bypass identity anchors and frame audit, so faces/costumes/style will drift.\n★【Storyboard review hard gate · free】Before this step you must call review_storyboards first: relay every returned finding to the customer verbatim (each with code=issue type, shots=hit shot numbers, action=which tool to use to fix), then pass review_token into this tool. Without review it is rejected with 400. If content changes after review → token auto-invalidates; just review again (still free). error findings block by default; only if the customer is informed and insists on continuing as-is may you pass acknowledge_review:true—pushing ahead with issues is likely to produce a junk video and still charges normally (acknowledge_review only means the customer personally agreed; any execution mode requires explicit customer consent, including autopilot). In autopilot steps, only whitelisted heuristic errors can pass with auto_acknowledge:true (platform decides; if not whitelisted returns 400 AUTOPILOT_MUST_ASK: must_ask_customer=true means pause and ask customer; false = self-fix per action and re-review). ★Gray-release dramas also require you (agent) to personally QC: inspect materials item by item per agent_qc returned by review_storyboards, answer every checklist item, and submit via submit_qc_report before this token can be used (not submitted → 400 agent_qc_required; report has issues → blocked by default just like error).\n★【Asset-layer hard gate · free】You must also run review_assets first (character appearance images/scene images/prop images) and pass its review_token as asset_review_token here (coexists with storyboard-layer review_token; both are required; gray-release dramas missing it will 400 and name review_assets). Generating frames does not invalidate the asset token. ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation depends on execution mode: professional mode / unconfirmed plan / this step controlled by customer → explain to customer and proceed only after customer agrees; do not decide for them; this step in autopilot → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log). Autopilot-step quotes must be within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask the customer. ★**Image-generation quotes (character sheets/scene images/frame generation) provide two numbers**: estimated_points is the **upper bound** (estimated using the maximum reference-image count for that model, ensuring you do not start with an underbudget and hit 402 midway); typical_points in the same response is the **typical cost**. Tell the customer both—only saying the upper bound makes it seem much more expensive (the full-reference upper bound can exceed typical by 2x+), while only saying the typical value may leave insufficient balance. For fixed-price models they are equal; then one number is enough. Video-generation quote and charge use the same function; this range does not exist.",
54
+ "quote_shot_frame": "Quote: how many credits to redraw/fill **one frame of one shot** (one frame = one image). Returns estimated_points, quote_id. Zero cost. Use this when the customer says \"shot N is wrong/needs changes\", instead of using another image platform and then upload_shot_frame. ★Response includes billing_kind/unit_points(actual billing tier and unit price); if you will switch models in generate_shot_frame, pass the same image_model when quoting. ★Both sides must pass the same image_model — mismatch is rejected directly (400 IMAGE_MODEL_MISMATCH), because the model determines the billing tier; different sources mean \"estimate ≠ charge\". Passing neither on both sides also counts as consistent (uses the drama setting). Deprecated models (all FLUX series) are always rejected; do not pass them. ★Returns two numbers: estimated_points is the **upper bound** (estimated by maximum reference-image count; prepare this balance to avoid mid-run 402), typical_points is the **usual cost**. Tell the customer both; quoting only the upper bound makes it look much more expensive. For fixed-price models (e.g. Nano Banana series), they are equal.",
55
+ "generate_shot_frame": "After confirmation, generate or regenerate the frame for **one shot** (async). This is the proper path to fix a shot image: the platform will carry this shot’s character identity anchors, scene/prop reference images, style anchor, and frame audit; regenerated images stay consistent with the whole film. Using external tools to generate then upload bypasses this entire chain, so character/clothing/style will inevitably drift. Regeneration overwrites the shot’s existing frame image (including prior uploads) and marks this shot’s video as needing regeneration. A last frame requires this shot’s first frame to be ready (otherwise use first_frame or both first). Completion criterion: poll get_storyboards and watch this shot’s first_frame_image/last_frame_image change.\n★Inherited reopen (reopen_pair_id): if get_storyboards returns this field on a shot, pass it through unchanged to reroll only the actually problematic side among first/last frames—the other previously generated candidate is preserved as-is, not regenerated and not charged again. When passing it, you no longer need frame_type (it will be ignored; the platform decides which side to regenerate); quote_id still must come from quote_shot_frame (frame_type may be first_frame or last_frame; single-frame price is the same). If the shot has no reopen_pair_id field (inheritance conditions not met), do not pass this parameter; use normal frame_type retry.\n★★If generating a last frame is blocked with “this shot is marked as state changed, but nowhere says what it looks like at the end”: the correct fix is to use update_shot to write the ending state into last_frame_prompt, then generate—**do not simply add allow_missing_terminal and force it**. For this type of shot, generating a last frame as-is historically succeeds only 9.4% of the time (40.2% when an end-state description exists), so forcing it will mostly waste one charge. Only pass that parameter when you confirm this shot is intended to look “almost unchanged”.\n★One-click final cut hosted flow: the same shot may regenerate frames at most 3 rounds (one call counts as one round; both also counts as one round). At the limit, returns **409 AUTOPILOT_SHOT_REGEN_LIMIT** (not dispatched, not charged, quote not consumed)—do not bypass with another tool. Stop and ask the customer: if the customer agrees to more regeneration, quote and generate normally with customer_approved_more_regens:true (grants another limit); if the customer accepts the current state, proceed downward, and the next paid call must include acknowledge_review:true to record confirmation. Professional mode and customer-controlled stages are not subject to this limit.\n★【Storyboard review hard gate · free】Before this step you must call review_storyboards: tell the customer every returned finding verbatim (each with code=issue type, shots=hit shot numbers, action=which tool to use for fixing), then pass review_token into this tool. If not reviewed, it will be rejected with 400. If content changes after review → token auto-invalidates; just re-review once (still free). error findings block by default; only when the customer is informed and insists on continuing as-is may you pass acknowledge_review:true—pushing ahead with known issues is likely to produce unusable footage and still charges normally (acknowledge_review only means the customer personally agreed; every execution mode requires explicit customer consent, hosted included). In hosted stages, only allowlisted heuristic errors may pass with auto_acknowledge:true (platform decides; if not allowlisted, returns 400 AUTOPILOT_MUST_ASK: must_ask_customer=true means pause and ask the customer, false = self-fix according to action and re-review). ★Grayscale dramas also require you (agent) to personally QC: inspect assets item by item per agent_qc returned by review_storyboards, answer the checklist line by line, and submit via submit_qc_report before this token can be used (not submitted → 400 agent_qc_required; problematic report → blocks by default just like error).\n★【Asset-layer hard gate · free】You must also run review_assets first (character sheet images / scene images / prop images), and pass its review_token as asset_review_token (coexists with the storyboard-layer review_token; both are required; grayscale dramas missing it get 400 naming review_assets). Generating frames does not invalidate the asset token. ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation depends on execution mode: professional mode / unconfirmed plan / customer-controlled stage → explain to the customer and proceed only after customer approval; hosted stage → do not ask the customer, follow get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Hosted-stage quotes must stay within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask the customer. ★**Image-generation quotes (character sheet / scene image / frame generation) return two numbers**: estimated_points is the **upper bound** (estimated using that model’s maximum reference-image count, ensuring you do not start with an underbudgeted run that hits 402 midway); typical_points in the same response is the **typical cost**. Tell the customer both—only saying the upper bound makes it look much more expensive (the max-reference upper bound can exceed 2× the typical value), while only saying the typical value may leave insufficient balance. For fixed-price models they are equal, so one number is enough. Video-generation quote and charge use the same function; no such range exists.",
56
+ "quote_videos": "Quote: how many credits to batch-generate videos for an episode (same function as actual charge, relatively accurate). Returns estimated_points, quote_id. Zero cost. ⚠️ Video is a large expense; clearly tell the user the credits and wait for confirmation.\n★**Only counts shots actually dispatched this time**: shots that already have video are skipped during whole-episode resume, not regenerated and not priced—shots_total = shots priced this time (not total shots in episode), shots_already_done = shots with video skipped this time. Exception: if any shot in a scene group lacks video, the **entire group is regenerated**, and already-generated shots inside the group are also priced. All shots already have video ⇒ 400(no dispatchable shots; use regenerate_shot_video to regenerate a shot). If any shot's video is cleared after quoting (becomes pending video), generate_videos returns 409 requiring a new quote; it will not charge for shots outside the quote.\n★**Specify video engine per shot**: pass shot_engines={storyboard id: engine} to switch engines only for those shots and only for this whole-episode generation (does not change drama-level video_engine; other shots unchanged). Quote prices per shot accordingly; quote_id pins the engines, and generate_videos dispatches exactly them—changing engine requires a new quote. Receipt shot_engines = actual applied mapping; shot_engines_ungrouped = scene groups **split into per-shot generation** because they include specified shots (scene-group duration and multi-keyframes are planned for the drama engine; generating the whole group with a changed engine would lose shots/keyframes; after splitting, other shots in the group still generate per-shot with the drama engine, losing group-level one-pass continuity, so do not split a good group for one shot—check get_scene_group_plan first). Selected engine must support this drama's resolution (seedance-2.5 only 480p/720p; hailuo-3 only 720p/1080p; wan3.0/wan3.0-prime 480p~1080p), and shot duration must not exceed that engine's single-shot limit (seedance-2.5/wan3.0 30s, hailuo-3 15s), otherwise 400 (vendors truncate overlong shots; either switch engine or split_shot). Shots with specified engines must be generated this time: whole-episode generation will not regenerate shots already having video, so specifying an engine for one ⇒ 400; a split per-shot scene group only counts group members without video. If you only want to regenerate a few shots that already have video, using quote_regenerate_shot_video with model is cheaper.",
57
+ "generate_videos": "After confirmation, batch-generate videos: one backend chain runs the full episode; if balance is insufficient it auto-aborts the whole chain (prevents duplicate charging). Requires first frames already generated for this episode (otherwise rejected). Poll get_storyboards; completion = video_url filled shot by shot.\n★【Hard gate: shot image review · free】Before this step you must call review_frames first: report the returned findings to the customer verbatim, item by item (each with code=issue type, shots=hit shot numbers, action=which tool to use to fix), then pass review_token into this tool. No review → 400 rejection. If content changes after review → token auto-invalidates; review once again (still free). If there is error, block by default; only if the customer is informed and insists on continuing as-is, pass acknowledge_review:true—pushing ahead with issues will very likely produce unusable footage and still charges normally (acknowledge_review only means the customer personally agreed; every execution mode requires explicit customer consent, including autopilot). In autopilot steps, only whitelisted heuristic errors may be released with auto_acknowledge:true (platform decides; if not whitelisted, returns 400 AUTOPILOT_MUST_ASK: must_ask_customer=true means pause and ask customer, false = self-fix per action then re-review). ★ Gray-release dramas also require you (agent) to personally QC: per review_frames returned agent_qc, inspect assets item by item, answer every checklist item, and submit via submit_qc_report before this token can be used (not submitted → 400 agent_qc_required; report has problems → blocked by default same as error). ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step controlled by customer → explain to customer and proceed only after customer agrees; do not decide for customer; this step autopilot → do not ask customer, execute per get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log). Autopilot-step quotes must stay within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask customer. ★ **Image-generation quotes (character sheet / scene image / frame generation) give two numbers**: estimated_points is the **upper bound** (estimated using that model's max reference-image count, ensuring you do not start with too-low budget and hit 402 mid-run); typical_points in the same response is the **usual cost**. Tell the customer both—only stating the upper bound makes it look much more expensive (with max reference images, the upper bound can exceed 2x the typical value); only stating the typical value may leave balance insufficient. For fixed-price models the two are equal; then one number is enough. Video-generation quote and charge use the same function; no range exists.\n★【Post-completion QC · free】After generation, wait for it to persist (check video_status in get_storyboards / get_pipeline_status), then call review_videos to review video and dubbing layers (missing video / video made from old frames / hard cut at ending / unexpected human voice / missing dubbing / voice timbre unassigned / original voice line expired); fix and re-review; then personally inspect each shot and listen to dubbing per agent_qc (action correct, face stable, lines complete, voice right), submit via submit_qc_report; compose_episode must carry its review_token.",
58
+ "compose_episode": "Stitch all shot videos of one episode into one final cut (final stitching). **Free** (pure stitching, no quote confirmation required), async in backend. Before starting, a final-stitch precheck runs: shots missing video or video tasks still generating will hard-block with 400 and list the problem shots (blockers); fix them and retry. If you really want a partial final cut, pass force=true (shots missing video are skipped, final cut lacks shots, logged). advisories in the response (duration drift/orphan tasks/missing TTS) are warnings only, not blockers; handle them one by one before stitching. After starting, poll with get_final_cut.\n★【Video and dubbing review hard gate · Free】Before this step you must call review_videos: relay the returned findings to the customer verbatim one by one (each with code=issue type, shots=hit shot numbers, action=which tool to use to fix), then pass the review_token into this tool. If not reviewed, 400 rejection. If content changed after review → token auto-invalidates; just review again (still free). error blocks by default; only if the customer is informed and insists on proceeding as-is may you pass acknowledge_review:true — proceeding with known issues will likely produce unusable video and still charge credits as usual (acknowledge_review only means the customer personally agreed; every execution mode requires explicit customer consent, autopilot included). In autopilot, only whitelisted heuristic errors may pass with auto_acknowledge:true (platform decides; if not whitelisted, returns 400 AUTOPILOT_MUST_ASK: must_ask_customer=true means pause to ask customer, false = self-fix per action and re-review). ★ For gray rollout dramas, you (agent) must personally QC: inspect materials item by item per agent_qc from review_videos, answer every checklist item, and submit via submit_qc_report before this token can be used (not submitted → 400 agent_qc_required; report has issues → blocked by default like error).\n★【Post-completion QC · Free】After the final cut is ready, run review_final_cut (missing shots/subtitles not fitting/identity anchors/axis jumps/typos; proofread=false means no credits charged), tell the customer the conclusion; call confirm_delivery_acceptance only after customer confirmation (delivery acceptance requires explicit customer consent in every execution mode, autopilot included). force only bypasses the final-stitch precheck, not the review gate.",
59
+ "get_final_cut": "Check an episode final cut status and download link. When status=completed, returns download_url(our COS direct link, downloadable directly). Free. ★bgm_stale=true means BGM was generated/modified after the final cut and is not yet in the final cut: just compose_episode again (free), do not re-render. ★If a current delivery version has been set (external version registered by register_external_delivery, or platform version specified by set_current_delivery), also returns delivery—that is the version the customer actually received; download_url remains the platform's latest stitched final cut. To see what every final-cut version used and its hash, use list_deliveries.",
60
+ "get_export": "Check an episode export/master status (downloadable master after final assembly). Free.",
61
+ "review_final_cut": "**Final cut checkup**: Before export, run through the whole episode—shots with no generated frame, subtitles that do not fit on one screen, characters without identity anchors, shot continuity (axis jump), plus one typo proofread pass.\n★**Advisory, non-blocking**: can_export=false only means there are block-level issues worth checking first; the platform will not stop you from running compose_episode / get_export. Explain findings to the client one by one (code=issue type, shots=hit shot numbers, action=which tool to use to fix), and **let the client decide whether to fix or publish as-is**.\n★Cost: the check itself is free, but by default it runs one LLM typo proofread pass—**that step costs credits**. If proofreading is not needed, pass proofread=false (faster and no credits charged).\n★For subtitles and typo items, view the **original text** in the official website checkup panel; here only conclusions and shot numbers are returned.",
62
+ "audit_silent_shot_audio": "Check **abnormal vocal audio in no-dialogue shots**: a reaction shot that should be silent has an audio track louder than dialogue shots in the same scene—in the final cut this appears as “someone randomly speaking offscreen”. Free.\n★Use on **native-audio dramas** (use_clip_audio=true, i.e. directly using the sound embedded in the AI video). Films using TTS dubbing do not have this issue.\n★**Very slow**: each shot’s audio must be fully decoded; observed 6~10 seconds/shot (backend concurrency limit 4), so dozens of shots in an episode take several minutes. Do not repeatedly tune this mid-pipeline; run it once before the final cut.\n★shots_probe_failed is the count of shots that **could not be probed**, not proof those shots have problems.\n★★probe_speech:true also runs voice detection on shots whose **dialogue field is empty** (calibrated criteria): when the vendor’s no-dialogue shot speaks a sentence by itself, loudness may not catch it, but this can—hits are listed in unexpected_speech, text is the spoken content. Slower (download + transcription per shot), max 20 shots per run; skipped_by_limit is the remainder—call again to continue scanning. Report only, do not modify: the customer decides whether to mute with mute_only or regenerate.",
63
+ "get_asset_recovery": "List recoverable **historical video artifacts** for this episode (free · read-only): full-episode final cuts and per-shot videos generated earlier and later overwritten.\nUse when the customer says “the previous final cut was better” or “that video for this shot from the day before yesterday was better than the current one”; recover it from here.\n★★Video only, **no image frames**: first/last frames are not here and will never appear in the list. If the customer wants to revert to a specific frame → use generate_shot_frame to regenerate it (platform includes identity anchors), or upload_shot_frame to register a specified image URL (note this prevents that frame from being overwritten by future batch regeneration).\n★This step only inspects, does not modify. Present candidates to the customer one by one, then apply only after the **customer confirms each one**.",
64
+ "apply_recovered_final": "Set a **historical final assembly** as the current final cut for this episode (free, pointer switch).\n★This will **overwrite** the episode’s currently published final cut. First use get_asset_recovery to list versions, clearly explain which version it is (time/duration), and call this only after the **customer confirms each one**—do not decide yourself because it “looks better”.\n★A later compose_episode(final assembly) will overwrite it again.",
65
+ "apply_recovered_candidate": "Backfill a **historical shot video** into the specified shot (free, pointer switch). ★This replaces that shot’s **video**, not its first/last frames.\n★**target_storyboard_id must be explicitly specified**: only the customer knows which shot this video should return to; the platform will not guess for you—guessing the wrong target shot is worse than doing nothing (it will replace the video another shot is currently using).\n★Also requires **one-by-one confirmation**: backfill only one item at a time; first tell the customer “which video (duration/prompt) goes back to which shot number”.",
66
+ "rollback_asset_recovery": "Undo an already-applied recovery (free). Use it to revert a mistaken apply back to the state before application (also video only).",
67
+ "list_wardrobe": "List this drama’s **wardrobe asset library** (free). Each wardrobe item is a structured asset that shots can reference, not a text description inside the storyboard.",
68
+ "create_wardrobe": "Create a new wardrobe asset (free, writes text to the library). After creation, it must be **bound to shots** to affect image generation—use apply_wardrobe_timeline / apply_wardrobe_appearances, or choose it per shot in the website.",
69
+ "get_wardrobe": "Read the details of a wardrobe asset (free).",
70
+ "update_wardrobe": "Modify a wardrobe asset (free). After modification, already-generated images are **not** automatically regenerated: call regenerate_wardrobe_image to update the asset image, and regenerate existing shot frames one by one.",
71
+ "regenerate_wardrobe_image": "Regenerate this wardrobe’s asset image (**paid**, image steps billed post-use). Use after changing description/reference images so the image catches up.",
72
+ "delete_wardrobe": "Soft-delete a wardrobe asset (free). Shots already bound to it are not automatically changed; first confirm no shots are still using it.",
73
+ "build_wardrobe_timeline": "Compute the **wardrobe timeline**: infer what each character should wear in each shot from the script and storyboard, and produce per-shot suggested diffs. **Costs credits** (uses LLM). This is step ①, **compute only, do not modify**.\n★Two-step flow: after computation, explain the diff to the **customer item by item** (which shot, change from which outfit to which outfit, and why); after the customer selects items, use apply_wardrobe_timeline to write them to the DB. Do not apply everything for the customer.\n★**This step solves “text changes did not take effect”**: what determines clothing in image generation is the structured binding (active_wardrobe_id / appearances[].wardrobeAssetId), not the text description in update_shot. If you only change text and not the binding, generated images will still wear the original outfit.",
74
+ "apply_wardrobe_timeline": "Persist the customer-approved wardrobe-change suggestions (step ②, free). This changes each shot's **active_wardrobe_id structured binding**, not the text description—this is the correct fix for the trap where “I changed update_shot text but nothing took effect”.\n★items only needs {storyboard_id, wardrobe_id}: pass suggestions from build (only those the customer approved), or **skip build and specify manually** (when the customer names “change these shots to this outfit”, pass directly to avoid spending LLM money for one explicit assignment). Max 200 items per call.\n★To edit a single shot, or **clear** a binding, use update_shot active_wardrobe_id (pass null to clear); this tool can only set, not clear.\n★For shots with multiple characters in frame, a single-column outfit binding is insufficient; use update_shot appearance_wardrobes, or this tool's multi-character version apply_wardrobe_appearances.",
75
+ "apply_wardrobe_appearances": "Backfill per-character wardrobe bindings in appearances (multi-character version of step ②, free). For shots with **multiple characters in frame**: one active_wardrobe_id cannot represent what each person wears, so this binds per character. items can be build suggestions or manual assignments; max 200 items per call.\n★It **fills empty slots**: if that character already has a wardrobe selection in this shot, it is skipped (never overwritten); the character must already have an appearance entry in this shot, and if the same character appears twice in one shot (same-source double), it is also skipped. To **overwrite wrong bindings, clear bindings, or set wardrobe for an already-bound character that has no appearance entry yet**, use update_shot appearance_wardrobes (per shot, explicit overwrite, wardrobe_id:null clears). Check skipped/errors in the receipt.",
76
+ "get_world_state": "Read this episode's **world-state ledger**: tracked entities (props/wardrobe/scars, etc.) and their states across shots, plus mismatches (conflicts, with the two matched shot numbers). Free.\n★stale=true = storyboards changed but the ledger was not rebuilt; run rebuild_world_state first, otherwise you are reading old data.\n★The ledger is currently only a **report**: it does not block generation and is not automatically injected into image generation. When you see conflicts, decide yourself whether to edit the storyboard (update_shot) or add a manual event note (add_world_state_event).\nPer-event text details are shown in the official web panel; this returns a structured overview.",
77
+ "rebuild_world_state": "Rebuild the world-state ledger (**costs money**: uses an LLM to extract entities and state changes from storyboards).\nOnly rebuild after editing storyboards, or when get_world_state returns stale=true; if nothing changed, do not run it repeatedly.",
78
+ "add_world_state_event": "Add a **manual event** to the ledger (free). Use when the AI missed or mis-extracted a state change, and you need to add an explanatory note.\nTypical case: conflicts says “the same prop changed between two shots”, but a handoff/damage actually happened in the plot—add a manual event and the conflict is explained away; no need to edit the storyboard.",
79
+ "delete_world_state_event": "Delete a manual event (free). Only manually added events can be deleted; AI-extracted events require rebuild_world_state to recompute.",
80
+ "link_world_state_scene_variant": "Link an event in the ledger to a **scene variant** (free). Use when the same scene looks different before/after an event (lights on/off, intact/damaged); after linking, image generation will use the corresponding scene image version.",
81
+ "derive_pose_chain": "Derive a **pose chain** (Action Graph): infer each shot's start/end poses from actions in adjacent shots so transitions do not jump. **Costs money** (uses an LLM).\n★Only fills shots whose pose fields are **empty**; existing poses are untouched; black-screen shots are skipped automatically.\nRun before image generation to reduce continuity issues like “standing in previous shot, suddenly sitting in next shot”.",
82
+ "quote_extend_final": "★Final cut extension **quote** (free · no side effects): append several more rounds of AI-generated clips after the existing final cut to lengthen it. Returns rounds / duration_per_round / max_rounds / estimated_points.\n★You **must call quote_extend_final for a quote before calling extend_final** (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step controlled by customer → explain to the customer and proceed only after customer approval, do not decide for them; this step on autopilot → do not ask the customer, follow get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log) (before dispatch, the platform runs a whole-order quote/budget precheck with the same params; if it exceeds the hard cap, returns 402 BUDGET_WOULD_EXCEED with no charge—then stop and ask the customer). Each round spends real vendor money.\n★403 = this drama has not enabled this capability (episode video engine must be 2.5 series). This is not a call error; do not retry. Tell the customer to switch engine or use another lengthening method.",
83
+ "extend_final": "Start final cut extension (**paid**, each round enters the video-generation billing chain). Runs serially in the background; returns a session id immediately; poll with get_extend_final.\n★Before calling, you **must** call quote_extend_final for a quote (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step controlled by customer → explain to the customer and proceed only after customer approval, do not decide for them; this step on autopilot → do not ask the customer, follow get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log) (before dispatch, the platform runs a whole-order quote/budget precheck with the same params; if it exceeds the hard cap, returns 402 BUDGET_WOULD_EXCEED with no charge—then stop and ask the customer).\n★Extension only “appends clips after the final cut”; it does not change existing earlier content. The appended result also **does not** automatically become this episode's final cut; after approval, explicitly call apply_extend_final to make it effective.\n★403 = not enabled for this drama (engine must be 2.5 series); do not retry.",
84
+ "get_extend_final": "Check progress and outputs for all extension sessions in this episode. Free. Each session returns status(pending/processing/completed/partial/failed), rounds_completed, final_url(direct output link), applied(whether this output is **currently** the episode final cut), error_msg.\n★When status=processing, poll patiently; do not start extend_final again (that would charge again).",
85
+ "apply_extend_final": "Set an extension output as this episode's **final cut** (free, pure pointer switch).\n★This step **overwrites** the episode's current final cut link: the previous final cut is no longer the public version. First use get_extend_final to inspect final_url and confirm the customer is satisfied before calling.\n★If compose_episode (final assembly) is run again later, the final cut will be overwritten by the final assembly result, and applied automatically becomes false.",
86
+ "export_sheet_compare": "Export **character sheet comparison version** (side-by-side composite of character sheets and final cut frames, for marketing/delivery). Triggers backend compositing; poll with get_sheet_compare.\n★This capability is **off by default**: it is a drama-level switch (not every title is allowed to export this externally). When off it returns **403**. If you see 403, do not retry and do not treat it as failure—tell the customer to enable it in **Drama Settings** on the official site.\nIf character_id is omitted, export the whole episode; if provided, export only that character.",
87
+ "get_sheet_compare": "Poll export status for the character sheet comparison version. Free. Returns enabled (whether the drama switch is on)/processing/result/error.\n★enabled=false means the drama switch is not enabled—not an error. Enable it in Drama Settings on the official site, then export again.",
88
+ "update_project_settings": "Modify project settings after creating the drama. Besides aspect ratio/resolution/worldview Brief/ethnicity/genre/director style, now also covers ★whole-drama visual consistency anchors (cinematography DNA cinematography_prompt/art bible art_bible/visual lock visual_lock/video style positive and negative prompts/visual motifs motifs), audio (bgm_source own vs native/bgm_volume_preset volume/use_clip_audio use original video audio), subtitles (show_subtitles/bilingual subtitle_secondary_lang/position/margins/animation), transitions—i.e. all common settings on the project settings page. Free. ⚠️ After changing worldview Brief/ethnicity/aspect ratio/consistency anchors, already generated content will not update automatically; regenerate the corresponding content.",
89
+ "generate_world_concept": "(★Default required·many third-party platforms miss this step·still uses quote confirmation) Generate worldview concept images (fixed 4 panels: panorama/era/main location/color) to improve whole-drama visual consistency. ★Call this by default after storyboard; do not skip. But still tell the customer the estimated credits (whether to run depends on execution mode: Professional mode / unconfirmed plan / this step is customer-controlled → explain to the customer and run only after customer approval; do not decide for them. This step in autopilot → do not ask the customer; follow get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Before dispatch, the platform prechecks budget by missing slots × single-image upper bound; if it exceeds the hard cap, returns 402, with no charge. Requires setting_brief ≥30 characters. Image step, fixed-cost postpaid, no arrears.",
90
+ "generate_art_bible": "Generate the art bible (palette/materials/atmosphere, reads characters + metadata). Text step, postpaid, no arrears.",
91
+ "extract_visual_lock": "Extract \"visual lock\" rules from worldview Brief + characters (writes visual_lock, unifies image style/ethnicity). Text step, postpaid, no arrears.",
92
+ "extract_setting_brief": "Condense a raw worldview passage into a concise setting_brief (and save it back to the project). Text step, postpaid, no arrears.",
93
+ "generate_video_style": "Generate video style lock prompt (reads brief/artBible/visualLock, unifies video generation direction). Text step, postpaid, no arrears.",
94
+ "generate_color_script": "Generate the drama color script (unifies color mood across the film). ★Main pipeline step: run after storyboard and before generate_frames. During image/video generation, it injects color-grading instructions per shot; skipping does not error or block you, but silently disables injection and each shot’s color tone drifts independently. Requires existing script text for this drama/episode. Backend async; after completion, get_color_scripts can read it and get_pipeline_status generate_color_script becomes done. Text step, no quote_*, usage-based postpaid with no arrears—just inform the customer.",
95
+ "generate_motion_templates": "Optional experiment: extract motion templates from existing storyboards. Call only when the customer explicitly requests it; not a required pipeline step. First/last frames do not inject motion templates by default, so no need to add this before generate_frames; video templates may be cropped and are not guaranteed to be delivered or beneficial. Synchronously returns created_count; get_motion_templates remains available for reading and management. Text step, no quote_*, usage-based postpaid.",
96
+ "quote_scene_images": "Quote: credits needed to batch generate **empty scene plates** for scenes missing images. Returns images_to_generate, estimated_points, quote_id. No charge. ★This is a step **before** generating shot frames, not an optional enhancement: scene images are background anchors; every shot frame in the same scene anchors to it. ★Only quotes scenes that \"do not yet have images\"; existing images are not charged again. Quote the whole drama at once (by drama_id, not episode_id). ★To check how many are missing first, use get_pipeline_status generate_scene_images step (completed/total, free). ★Returns two numbers: estimated_points is the **upper bound** (estimated by the maximum reference-image count; prepare balance with this and you will not hit 402 mid-run), typical_points is the **typical cost**. Tell the customer both; only quoting the upper bound makes it look much more expensive. Under fixed-price models (e.g. Nano Banana series), they are equal.",
97
+ "generate_scene_images": "After confirmation, batch generate **empty scene plates** (one character-free background image per scene): backend async, only fills scenes that \"do not yet have images\". ★Do this **before generating shot frames**. Skipping will not error or block you, but the cost is real: the platform fallback is \"when frame generation finds the scene has no image → generate one in the background\"; that generated image only benefits **subsequent** shots in the same scene. The triggering shot cannot wait for it, so **the first shot of each scene has no background anchor**—and the first shot is often the tone-setting shot; backgrounds will also drift across subsequent shots. It pairs with character sheets: character sheets anchor people, scene images anchor settings. ★If the output is wrong, do not rerun this tool (it only fills missing scene images and skips all existing ones): `get_scene_prompt` read the text → `update_scene` edit image_prompt → `regenerate_scene_image` regenerate one scene. ★For non-modern genres, set `set_era_contract` first, otherwise plates may be drawn in the wrong era and all downstream shot frames in that scene will follow. ★Check progress via get_pipeline_status generate_scene_images step. ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation follows execution mode: Professional mode / unconfirmed plan / this step is customer-controlled → explain to the customer and run only after customer approval; do not decide for them. This step in autopilot → do not ask the customer; follow get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). For autopilot steps, the quote must be within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask the customer. ★**Image-generation quotes (character sheets/scene images/frames) provide two numbers**: estimated_points is the **upper bound** (estimated by that model’s maximum reference-image count, ensuring you do not start with too-low a budget and get interrupted by 402 halfway); typical_points in the same response is the **typical cost**. Tell the customer both—only saying the upper bound makes it seem much more expensive (the full-reference upper bound can exceed the typical value by more than 2×), while only saying the typical value may leave insufficient balance. Under fixed-price models they are equal, in which case one number is enough. Video quotes and charges use the same function; this interval does not exist there.\n★【Post-completion QC·free】After generation, wait for images to be saved (poll corresponding get_* status; do not call again while pending), then call review_assets for asset-layer review (missing images / generating / failed / rejected by consistency gate / prop era conflict / color script). Tell the customer the findings verbatim, fix according to action, then re-review; then personally inspect each image according to the returned agent_qc (whether it resembles the profile, whether it is the same person, whether the era is correct; for character sheets, whether all angles are complete and proportions/structure are correct; whether props and scene images make sense in the story—check the referenced used_in_shots shots), submit_qc_report to submit the QC report; when generating shot frames, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
98
+ "upload_image": "Upload a local image to our COS and return image_url (browser/client uploads bytes directly to COS, not through the business server). Used as a reference image for video editing, or to get a URL before registration. Free.",
99
+ "set_character_portrait": "Use the customer's own image as the character sheet (identity anchor, higher priority than AI-generated; later AI regeneration will not overwrite it by default). ★★Image requirements (platform auto-checks before registration; noncompliance returns 422 and does not register): **only this one character** (no other people/group photo/background passersby); **single image, single angle** (not a collage/nine-grid/multi-view turnaround—the platform generates turnarounds from the character sheet); front or 3/4 view, clear unobstructed face, clean background; **no text anywhere on the image** (watermarks/subtitles/name labels/logo/text on clothing are all forbidden; text will be replicated into every shot). Before uploading, first inspect the customer's image; if noncompliant, ask the customer to replace it first, do not upload directly. If rejected, tell the customer the issue in message verbatim; only if the customer has seen the issue and explicitly insists on using this image should you retransmit with allow_issues:true (auto-check may be wrong). ★Changing the image invalidates existing derived assets (turnarounds/multi-angle avatars/hair·body references) and rebuilds the face lock, but **the turnaround is not automatically regenerated**—after changing, you must run generate_character_sheet(character_id) to regenerate the turnaround from the new character sheet (next_step in the response will prompt this), otherwise the character has only the character sheet as an anchor. ★After changing the image, the response contains stale_frames=[{storyboard_id,storyboard_number,frames}]—the first frames of these shots were generated from the old character sheet and are contaminated. To make the new character sheet take effect: for each stale_frame, use quote_shot_frame+generate_shot_frame to regenerate that shot (the platform will automatically use the new character sheet/turnaround/face lock as anchors to preserve full-film consistency). No need to specify model/first/last frames shot by shot yourself. ★Never self-make first/last frames and then upload_shot_frame—external images lack character identity anchors/style anchors, so people·costumes·style will drift; that is the root cause of unusable films (not \"preventing unusable films\"). ★Changing the image only **unlinks references**; files for the old character sheet/turnaround are not deleted. old_assets in the response lists unlinked old assets item by item: unlinked=[{kind,url,in_history}] (in_history=false means the platform kept no record—typical for a customer's uploaded old character sheet; save the url yourself if you need to keep it), physically_deleted is always empty. If the customer says \"delete the old image\", tell them truthfully that it is no longer used but the file still exists; do not say it has been deleted. Pass either a local file (file_path, auto-upload to COS) or an already-hosted image URL (image_url). Registration is free; content checking is a small visual audit charged postpaid by usage.\n★【Post-completion QC · free】After generation, wait for images to be stored (poll the corresponding get_* for status; if pending, do not call again), then call review_assets to audit the asset layer (missing image / generating / failed / rejected by consistency gate / prop-era conflict / color script), tell the customer findings verbatim, fix according to action and re-audit; then personally inspect each image according to the returned agent_qc (whether it matches the profile, is the same person, era is correct; for the turnaround itself, whether all angles are complete and proportions/structure are correct; whether prop and scene images make sense in the plot—compare the shots listed in used_in_shots), submit_qc_report to submit the QC report; when generating shot images, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
100
+ "upload_shot_frame": "Use a **customer-owned image** as a shot's first_frame or last_frame. last_frame is optional—only pass it when you want to fix a shot's ending image (large camera move/reveal shot); normally only first_frame is needed. Marks any existing video for that shot as stale and awaiting regeneration. Auto-upload + registration. Free. ⚠️ Only use for customer-provided material, or **local repair of this shot's platform candidate** (recovery_options upload_fixed: crop/color-grade/fix small defects on the original image returned by get_frame_candidates, then upload after customer confirmation). To \"redraw a shot\", use generate_shot_frame to let the platform regenerate it—images generated from scratch by external tools do not carry this film's identity anchors and style anchors, so people/costumes/style will drift.",
101
+ "register_external_delivery": "Register an externally post-produced final cut; the server verifies sha256, size, and duration. Free. If you have the original export, pass the export-time handoff_pack_id and handoff_manifest_sha256; the platform uses the original frozen manifest and does not guess the source from the latest materials at registration time. Without the original export, the source is marked unknown. Registration does not mean customer acceptance; after traceability is enabled, you still need set_current_delivery to choose the current version and confirm_delivery_acceptance to record the customer's explicit confirmation. Pass either file_path or file_url.",
102
+ "list_deliveries": "List **all final cut versions** for this episode (new→old; platform final cuts and external deliveries share one version sequence). Each entry includes sha256, duration, is_current, and full manifest. Free.\n★source=platform: every platform final cut version (compose_episode / rerender_episode / multi-aspect) is **automatically registered**; the manifest records **the exact timeline used for rendering**—for each shot, whether it used original footage/composited footage/retracked output/lip-sync output (source_kind), which files were used for dialogue/music/SFX, subtitle count and text hash, file sha256, and dialogue audit family counts at registration time. Use this as the authority for delivery notes and for verifying \"which version was delivered\"; do not rely on memory. Platform versions **do not automatically become the current delivery version**; when the customer selects a version, use set_current_delivery to point to it.\n★source=external: external post-produced final cut registered by register_external_delivery.",
103
+ "confirm_delivery_acceptance": "Record acceptance or revoke acceptance only after the customer explicitly confirms; do not treat successful download, model judgment, or generation completion as customer acceptance. delivery_id=null means the customer only confirmed verbally and the file was not verified; otherwise bind to the specified delivery version. Selecting current and customer acceptance are independent facts; only after set_current_delivery selects a version will the platform show that file as delivered and complete. Free; does not generate or modify assets.",
104
+ "set_current_delivery": "Set a final cut version of this episode as the current delivery version (for example, the customer finally chose an earlier version). Free. Can set platform versions (source=platform) or external versions. Only affects get_final_cut delivery; does not modify the platform final cut.",
105
+ "upload_shot_footage": "Use a **customer-owned full video clip** (screen recording / product live-action / third-party final cut) directly as a shot's video—live-action material shot. After registration, this shot no longer generates AI images/videos (generate_videos will skip it, single-shot regeneration will be rejected), final assembly uses it as-is, shot duration is written back from the material's true length, and first/last frames are extracted for frame chaining and preview. Free. Use cases: payment-arrival screen recording in a promo, live recording of a backend big screen, product live-action, customer's existing final cut segment. ⚠️ Do not use it to paste in an externally AI-generated video to \"change the image\"—it lacks this film's identity anchors/style anchors, so people·style will drift; to change the image, use regenerate_shot_video. ⚠️★**Overwrites this shot's existing AI final video** (video_url is replaced by the material you upload; the old final video still exists but is no longer the in-use video for this shot, and final assembly will splice in the material). ⚠️★**If you want to use a video as an \"action/camera reference\" for AI to redraw from, this is not the tool**—that is edit_video_shot reference_video_urls (or the reference-video channel in generate_videos). This tool's semantics are \"this video **is** the final shot itself, no more generation\". The same file passed to the two workflows produces completely different results: using this tool causes the shot to be blocked by the video-generation guard from then on (including edit_video_shot); you must first clear_shot_footage or explicitly replace_user_footage to continue. To switch back to AI generation, first clear_shot_footage.\n★【Post-completion QC · free】After generation, wait for it to be stored (get_storyboards for video_status / get_pipeline_status), then call review_videos to audit the video and dubbing layer (missing video / video generated from stale frames / hard cut at ending / unexpected human voice / missing dubbing / voice not assigned / source-voice timbre expired), fix and re-audit; then personally inspect each shot's video and listen to dubbing according to agent_qc (action is correct, no face morphing, lines fully spoken, voice correct), submit_qc_report to submit; compose_episode must include its review_token.",
106
+ "list_unlinked_assets": "List old assets in this drama that have been \"unlinked\" (free): cleared last frames, old last frames/old character sheets/old turnarounds/hair·body references/video anchors detached when changing character sheets, one URL per item. These files still exist in storage. The list tries to exclude images that have been reused, but exclusion is not guaranteed—whether an image is still referenced elsewhere is determined by the platform's full-library check. Use this when the customer asks \"does the old image still exist?\"",
107
+ "preview_delete_asset": "Preview \"hard deletion\" of an old asset file (free, read-only). Hard deletion will **permanently delete** all versions of this image from storage and is irreversible. Returns deletable (whether it can be deleted), reasons (why it cannot be deleted, e.g. still-referenced / no-trusted-provenance / not-drama-owner), blocking (places still referencing it), history (number of history records that will be invalidated), copies (version counts in each storage bucket), and, if deletable, confirm_token (valid for 10 minutes, single-use). ★You must tell the customer the preview result verbatim, and only call delete_asset after the customer explicitly says \"confirm delete\" (any asset deletion execution mode requires explicit customer consent, including managed operation). Only the drama owner can delete; only files with provable ownership can be deleted—images generated by the platform for this drama, or images uploaded by the customer through the platform (with an issuance record at upload). Earlier uploads without issuance records cannot be deleted, only unlinked.",
108
+ "delete_asset": "★Irreversible: permanently delete all versions of an old asset file (two storage buckets). You must first call preview_delete_asset, show the result to the customer, and after the customer explicitly confirms, call this with the same url and the confirm_token returned by the preview. Before execution, the platform reruns all checks; if the impact scope differs from the preview, it rejects with 409 and requires a new preview. If some copies fail to delete, returns 502 with a receipt; the file may still exist, so preview again before retrying. Do not auto-retry, and do not batch-delete files the customer has not confirmed one by one.",
109
+ "clear_shot_frame": "Clear a shot's last frame (unlink reference, free). Use when after changing a character sheet or plot, an old last frame would carry the old character/old image into regenerated video; clear it first, then regenerate_shot_video. Only last frames can be cleared: the first frame is the starting point for video generation; to replace the first frame, use generate_shot_frame to regenerate or upload_shot_frame to replace. ★This is unlinking, not deletion: the file is not deleted; entries in unlinked[].in_history=true in the response can be recovered via get_asset_versions, and physically_deleted is always empty—tell the customer truthfully. This shot's existing video will be marked stale (video_stale). If the last frame is pinned, returns 409; after customer confirmation, pass release_pin:true (also unpins it). If the last frame is being generated, also returns 409; wait until it finishes before clearing. still_referenced_by in the response lists other shots in the same drama still using this image (typical: the next shot's first frame is a raw copy of it)—these are not cleared together; regenerate shot by shot if needed.",
110
+ "clear_shot_footage": "Clear the live-action footage for a shot (set video_url empty and clear source flags), making this shot AI-video-generatable again. Free.",
111
+ "upload_scene_image": "Use the customer's own image as the scene image for a scene (empty-scene base · background anchor: every shot in the same scene is anchored to it). Auto upload + register. ★★Image requirements (platform auto-checks before registration; noncompliant returns 422 and is not registered): **empty scene, no people anywhere in frame** (including distant passersby, people on posters/screens—the person in the image will be replicated as extra passersby or ghost characters and compete with the real storyboard characters); single complete image (not collage/multi-panel); no overlay text/watermark/logo (native signage/doorplates in the scene are OK). If the customer's live-action image has people: ask for a no-people version, or use regenerate_scene_image so the platform creates an empty scene. If rejected, tell the customer the issues in message verbatim; only if the customer has seen the issues and explicitly insists, re-upload with allow_issues:true (auto-check may false-positive). Registration is free; content check is a small visual-audit charge, postpaid by usage. ★After replacing the scene image, old lighting reference images are invalid; the platform **will not** auto-fill them (that would cost credits for another image): when receipt lighting_ref.needed=true, tell the customer estimated_points (whether to run follows execution mode: professional mode / unconfirmed plan / customer-controlled stage → explain to customer and proceed only after consent, do not decide for them; autopilot stage → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log), then call quote_scene_lighting_ref → generate_scene_lighting_ref. If no storyboards exist for this scene at upload time (needed=false and storyboards not created yet), after storyboards are created call quote_scene_lighting_ref to see whether to fill it—the platform will not auto-fill lighting reference images for uploaded images.\n★【Post-completion QC · free】After generation, wait until images are stored (poll corresponding get_* for status; do not repeat-call while pending), then call review_assets for asset-layer review (missing images / generating / failed / rejected by consistency gate / prop-era conflict / color script), tell customer findings verbatim, fix by action and re-review; then manually inspect images one by one per returned agent_qc (matches profile, same person, correct era; character sheet angles complete, proportions/structure correct; props and scene images make sense in story—check the shots in material used_in_shots), submit_qc_report; when generating shot frames, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
112
+ "upload_prop_sheet": "Use the customer's own image as a prop sheet for a prop. Auto upload + register. Free.\n★【Post-completion QC · free】After generation, wait until images are stored (poll corresponding get_* for status; do not repeat-call while pending), then call review_assets for asset-layer review (missing images / generating / failed / rejected by consistency gate / prop-era conflict / color script), tell customer findings verbatim, fix by action and re-review; then manually inspect images one by one per returned agent_qc (matches profile, same person, correct era; character sheet angles complete, proportions/structure correct; props and scene images make sense in story—check the shots in material used_in_shots), submit_qc_report; when generating shot frames, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
113
+ "get_edit_capabilities": "Check video edit capability switches (whether in-place edit / range replacement is available). Free.",
114
+ "quote_edit_video_shot": "Quote: credits needed to do in-place edit/range replacement (Seedance 2.5) on a shot. Returns quote_id. No charge. This shot must already have video.",
115
+ "edit_video_shot": "After confirmation, in-place edit a shot video: modify by instruction, optionally with reference image/video/audio, or use start_sec/end_sec for range replacement. model can select an engine specifically for this edit (may differ from the drama engine): hailuo-3=MiniMax H3 high-fidelity edit at about 1/3 cost; wan3.0/wan3.0-prime=WAN 3.0 strong semantic edit at about 40% cost (environment may follow instruction expansion); H3/WAN do not support start_sec/end_sec ranges (passing them returns 400), and input video for edit/continuation is charged by seconds on H3/WAN.\n★If receipt contains `edit_instruction_negation_advisory` = your instruction has **negative constraints** (\"must not use X\", \"do not show X\"). Video models treat nouns as positive cues; writing \"do not X\" often makes X appear instead—the negated action/object is exactly the most salient model prior. This is not blocked; task was submitted normally; but **next time you revise the instruction, you must remove negative sentences and use positive descriptions** (write what should happen specifically: starting action, hand position, duration of each beat), otherwise the same issue will recur. Verified case: customer wrote \"must not use the static dance pose in the reference image with raised hand and one foot\", and the final cut opening arm-raise was pulled by that raised-hand reference.\n★If you receive **409 \"this shot is user-uploaded live-action footage\"** = this shot was registered by upload_shot_footage as a live-action footage shot; not a model or engine problem, switching engines and retrying is useless. Two paths: to use this footage as source for AI repaint → resend with replace_user_footage=true; to restore it to a normal AI shot → first clear_shot_footage.\n★If you receive **409 + `in_flight_generation_id`** = this shot still has a generation not finished (previous edit / regeneration / batch video generation); this edit was not submitted and not charged, quote is invalidated. The edit source is the shot's current video; when the in-flight generation completes it will replace it—so wait for completion, inspect result, then re-quote and edit; **do not chain-send** multiple edits expecting them to stack, each one is based only on the source at that time. If the in-flight one is exactly the same edit you just submitted (e.g. retry after timeout), just wait for its result, do not submit again. Resending the identical edit (same instruction, reference assets, range, engine) will not 409; it attaches to the in-flight one without duplicate charge.\n★One-click final cut autopilot stage: video regeneration for the same shot max 3 times (combined with regenerate_shot_video); at limit returns **409 AUTOPILOT_SHOT_REGEN_LIMIT** (not dispatched, not charged, quote not consumed)—do not bypass with another tool; stop and ask customer: if customer agrees to more generations, quote normally and generate with customer_approved_more_regens:true (grants another limit); if customer accepts current state, continue, and next paid call includes acknowledge_review:true to record confirmation. Professional mode and customer-controlled stages are not constrained by this limit. ⚠️ Batch quote confirmation flow: first call corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation follows execution mode: professional mode / unconfirmed plan / customer-controlled stage → tell customer and proceed only after consent, do not decide for them; autopilot stage → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log). Autopilot-stage quotes must be within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask customer. ★**Image-generation quotes (character sheet/scene image/frame generation) provide two numbers**: estimated_points is the **upper bound** (estimated by that model's max reference-image count, ensuring you do not start with too-low budget and hit 402 mid-run); typical_points in the same response is the **typical cost**. Tell the customer both—only saying the upper bound makes it look much more expensive (full-reference upper bound can be over 2× typical), only saying typical may leave insufficient balance. For fixed-price models they are equal; then say one number. Video-generation quote and charge use the same function; no range.\n★【Post-completion QC · free】After generation, wait until stored (get_storyboards for video_status / get_pipeline_status), then call review_videos for video and dubbing-layer review (missing video / video made from old frame / hard cut at end / unexpected voice / missing dubbing / voice timbre unassigned / original voice expired), fix and re-review; then manually watch each shot and listen to dubbing per agent_qc (action correct, face stable, lines complete, voice right), submit_qc_report; compose_episode must include its review_token.",
116
+ "get_repaint_capabilities": "Check which video-to-video repaint modes are available for this drama: whether repaint (video repaint) / reskin (outfit-change repaint) is open, maxSourceSec per source segment, relayMaxSegments max segments for long-shot relay (0=not open; shots >5 seconds cannot repaint). Free.",
117
+ "quote_repaint_shot_video": "Quote: credits needed to do **video repaint** on a shot (redraw character and outfit by description + reference image, preserve source motion). Returns quote_id. No charge. This shot must already have video. Quote only applies to this shot's current video segment—if video is later replaced (regenerate/upload/edit completion), starting will 409; just re-quote.\n★Division vs edit_video_shot: edit modifies the image by instruction (change background/color/local edits); repaint/outfit-change repaint **uses the shot's existing video as motion skeleton and redraws the whole character and outfit**, with action, lip-sync timing, camera movement following source, and audio track pasted back to source.\n★**Customer's own video can also be repainted**: first use upload_shot_footage to register it as live-action footage for a shot (extracts first/last frames and writes back duration), then quote/start on that shot; after repaint result writes back, the shot is no longer a live-action footage shot.\n★Duration: ≤5 seconds per order (charged as 5 seconds); if this drama has long-shot relay enabled (get_repaint_capabilities relayMaxSegments>0), 5~about 14 seconds auto-splits into ≤3 relay segments, each segment one order, quote is total; longer requires split_shot first.\n★Async: start returns one generation record (segment 1 for relay); use get_repaint_status(storyboard_id, generation_id) to check completed/failed; relay in progress includes relay.segments_done/segments. On completion, this shot's video is replaced with repaint result; if unsatisfied, use restore_repaint_original to switch back to source (free).",
118
+ "repaint_shot_video": "After confirmation, do video repaint on a shot. Charge cap = quote estimated_points (total for whole chain in relay).\n★Reference image: if reference_image_url is not passed, automatically uses the shot characters' (outfit-change) character sheets—**without a reference image, the person will still be replaced**; auto_reference=false means explicitly no reference image (draw only by description).\n★keep_scene defaults true: adds this shot's scene/props/action into description and only changes person and clothing; pass false = repaint scene too.\n★control: posebodyface (default, preserves lip-sync; use for talking shots)/ posebody (no face, mouth does not move)/ depth (by depth, solid-color backgrounds may produce vertical stripes)/ scribble (line art). strength only accepts 0 or 1.\n★If this shot is bound to product text (must preserve original product wording), it will be rejected (repaint redraws text in the image).\n★Division vs edit_video_shot: edit modifies the image by instruction (change background/color/local edits); repaint/outfit-change repaint **uses the shot's existing video as motion skeleton and redraws the whole character and outfit**, with action, lip-sync timing, camera movement following source, and audio track pasted back to source.\n★**Customer's own video can also be repainted**: first use upload_shot_footage to register it as live-action footage for a shot (extracts first/last frames and writes back duration), then quote/start on that shot; after repaint result writes back, the shot is no longer a live-action footage shot.\n★Duration: ≤5 seconds per order (charged as 5 seconds); if this drama has long-shot relay enabled (get_repaint_capabilities relayMaxSegments>0), 5~about 14 seconds auto-splits into ≤3 relay segments, each segment one order, quote is total; longer requires split_shot first.\n★Async: start returns one generation record (segment 1 for relay); use get_repaint_status(storyboard_id, generation_id) to check completed/failed; relay in progress includes relay.segments_done/segments. On completion, this shot's video is replaced with repaint result; if unsatisfied, use restore_repaint_original to switch back to source (free). ⚠️ Batch quote confirmation flow: first call corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation follows execution mode: professional mode / unconfirmed plan / customer-controlled stage → tell customer and proceed only after consent, do not decide for them; autopilot stage → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log). Autopilot-stage quotes must be within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask customer. ★**Image-generation quotes (character sheet/scene image/frame generation) provide two numbers**: estimated_points is the **upper bound** (estimated by that model's max reference-image count, ensuring you do not start with too-low budget and hit 402 mid-run); typical_points in the same response is the **typical cost**. Tell the customer both—only saying the upper bound makes it look much more expensive (full-reference upper bound can be over 2× typical), only saying typical may leave insufficient balance. For fixed-price models they are equal; then say one number. Video-generation quote and charge use the same function; no range.",
119
+ "quote_reskin_shot_video": "Quote: credits needed to do **outfit-change repaint** on a shot (provide a first frame with the new outfit already applied, then continue the whole video in that outfit following source motion). Returns quote_id. No charge. This shot must already have video; this capability is enabled per drama, first check get_repaint_capabilities reskin.\n★Division vs edit_video_shot: edit modifies the image by instruction (change background/color/local edits); repaint/outfit-change repaint **uses the shot's existing video as motion skeleton and redraws the whole character and outfit**, with action, lip-sync timing, camera movement following source, and audio track pasted back to source.\n★**Customer's own video can also be repainted**: first use upload_shot_footage to register it as live-action footage for a shot (extracts first/last frames and writes back duration), then quote/start on that shot; after repaint result writes back, the shot is no longer a live-action footage shot.\n★Duration: ≤5 seconds per order (charged as 5 seconds); if this drama has long-shot relay enabled (get_repaint_capabilities relayMaxSegments>0), 5~about 14 seconds auto-splits into ≤3 relay segments, each segment one order, quote is total; longer requires split_shot first.\n★Async: start returns one generation record (segment 1 for relay); use get_repaint_status(storyboard_id, generation_id) to check completed/failed; relay in progress includes relay.segments_done/segments. On completion, this shot's video is replaced with repaint result; if unsatisfied, use restore_repaint_original to switch back to source (free).",
120
+ "reskin_shot_video": "After confirmation, do outfit-change repaint on a shot. Charge cap = quote estimated_points.\n★first_frame_url is the **first frame with outfit already changed**: it must align one by one with the source first frame in **composition, character pose, prop positions** (only clothing changes), otherwise the whole segment will drift—verified failures are all due to the first frame. After completion it becomes this shot's official first frame. Only public https images accepted (use upload_image first).\n★prompt may be empty (system inspects first frame and writes automatically); if writing it, do not use clothing category words like \"uniform/military uniform\", model will add epaulettes/stripes on its own; directly describe color and style.\n★control: posebodyface (default, preserves lip-sync)/ depth. Rejected if this shot is bound to product text.\n★Division vs edit_video_shot: edit modifies the image by instruction (change background/color/local edits); repaint/outfit-change repaint **uses the shot's existing video as motion skeleton and redraws the whole character and outfit**, with action, lip-sync timing, camera movement following source, and audio track pasted back to source.\n★**Customer's own video can also be repainted**: first use upload_shot_footage to register it as live-action footage for a shot (extracts first/last frames and writes back duration), then quote/start on that shot; after repaint result writes back, the shot is no longer a live-action footage shot.\n★Duration: ≤5 seconds per order (charged as 5 seconds); if this drama has long-shot relay enabled (get_repaint_capabilities relayMaxSegments>0), 5~about 14 seconds auto-splits into ≤3 relay segments, each segment one order, quote is total; longer requires split_shot first.\n★Async: start returns one generation record (segment 1 for relay); use get_repaint_status(storyboard_id, generation_id) to check completed/failed; relay in progress includes relay.segments_done/segments. On completion, this shot's video is replaced with repaint result; if unsatisfied, use restore_repaint_original to switch back to source (free). ⚠️ Batch quote confirmation flow: first call corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation follows execution mode: professional mode / unconfirmed plan / customer-controlled stage → tell customer and proceed only after consent, do not decide for them; autopilot stage → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records in get_autopilot_log). Autopilot-stage quotes must be within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask customer. ★**Image-generation quotes (character sheet/scene image/frame generation) provide two numbers**: estimated_points is the **upper bound** (estimated by that model's max reference-image count, ensuring you do not start with too-low budget and hit 402 mid-run); typical_points in the same response is the **typical cost**. Tell the customer both—only saying the upper bound makes it look much more expensive (full-reference upper bound can be over 2× typical), only saying typical may leave insufficient balance. For fixed-price models they are equal; then say one number. Video-generation quote and charge use the same function; no range.",
121
+ "get_repaint_status": "Check progress of a video repaint/outfit-change repaint once. generation_id uses the id returned at start (for relay, this is segment 1 id; response is the status of the whole chain). Free.\n· status=processing: in progress; relay includes relay.segments_done/segments.\n· status=completed: this shot video has been replaced with repaint result (video_url / local_path); relay completion includes relay.final_generation_id—**use this final_generation_id to switch back to source**, not segment 1 id.\n· status=completed but errorMsg contains \"未写回\": this shot video was replaced during the task; result is archived in this record and did not overwrite the shot.\n· status=failed: errorMsg is the Chinese reason (relay states which segment failed), shot unchanged, charged credits refunded by rules.",
122
+ "restore_repaint_original": "Switch a shot from its repaint result back to the pre-repaint original video (outfit repaint also restores the first frame). Free. generation_id = the repaint generation corresponding to this shot's current video (for relay, take get_repaint_status relay.final_generation_id).\n★409 = this shot has produced another video afterward, so it will not overwrite (protects later results); also do not switch back while a video task is running, because the running job will be archived due to source-video mismatch (wasted credits).",
123
+ "quote_regenerate_shot_video": "Quote: how many credits to regenerate one shot video. Returns quote_id. Zero charge.\n★**Specify video engine per shot**: pass model to switch engine only for this regeneration of this shot (does not change drama-level video_engine; other shots unchanged); the quote is priced by that engine, quote_id pins the engine, and regenerate_shot_video dispatches exactly it—must re-quote to switch engine; passing an engine again at generation time is ineffective. Receipt video_engine = actual dispatched engine, engine_overridden=true means it overrode the drama engine. ★The selected engine must support this drama's resolution (seedance-2.5 only 480p/720p; hailuo-3 only 720p/1080p; wan3.0/wan3.0-prime 480p~1080p); unsupported returns 400 and lists selectable engines—will not silently switch to another engine to render. This shot's duration also cannot exceed that engine's per-shot limit (seedance-2.5/wan3.0 30s, hailuo-3 15s); over limit returns 400 (vendor will truncate). Use when: one shot repeatedly fails on the drama engine / is rejected by vendor moderation / self-cuts within the shot, and you want to try a different engine for this shot only. ★Mixing engines in one drama risks style/identity drift; after switching, review this shot before deciding whether to apply more broadly; do not switch photoreal human shots to wan3.0/wan3.0-prime (real human faces at 720p+ are often rejected by vendors).",
124
+ "regenerate_shot_video": "After confirmation, regenerate video for a shot (optional new prompt).\n★If you get **409「本镜是用户上传的实拍素材」** = this shot was registered by upload_shot_footage as a live-action footage shot; not a model issue, changing engine is useless. To overwrite it with AI video, pass replace_user_footage=true; to keep the footage, do not regenerate.\n★If you get **409 + `in_flight_generation_id`** = this shot still has a generation unfinished, and it was not started with this exact content (you passed a new prompt / later changed the shot with update_shot / later changed this shot's first frame or last frame—regeneration, upload, and supplementary last-frame generation all count / the frames, reference assets, engine, or other params passed this time differ from that run / the in-flight task is an edit). This 409 can happen even if the prompt is unchanged. This regeneration was not submitted, no credits charged, quote invalidated. Wait for the in-flight task to finish, review the result, then re-quote and regenerate—otherwise the video you get is from old content (old prompt or old first/last frames), causing you to think the change had no effect.\n★Success but response includes **`reused_in_flight: true`** = the same content is already generating (resend/double-click/batch video generation already dispatched). No new task created, no new credits charged; the returned task is the in-flight one. Just monitor its progress; do not send again.\n★Autopilot final-cut pipeline stage: the same shot can regenerate video at most 3 times (combined with edit_video_shot). At the limit returns **409 AUTOPILOT_SHOT_REGEN_LIMIT** (not dispatched, no credits charged, quote not consumed)—do not bypass with another tool; stop and ask the customer: if the customer agrees to more regeneration, quote normally and pass customer_approved_more_regens:true when generating (grants another limit); if the customer accepts current state, proceed, and the next paid call must pass acknowledge_review:true to record confirmation. Professional mode and customer-controlled stages are not subject to this limit.\n★【Shot image review hard gate · free】Before this step, you must call review_frames: report the returned findings to the customer verbatim one by one (each with code=issue type, shots=hit shot numbers, action=which tool to use to fix), then pass review_token into this tool. Without review, it will be rejected with 400. If content changes after review → token auto-invalidates; just review again (still free). When there is error, default is to block; only if the customer is informed and insists on continuing as-is, pass acknowledge_review:true—pushing ahead with issues will likely produce unusable video and still charge normally (acknowledge_review only means the customer personally agreed; every execution mode requires explicit customer consent, including autopilot). In autopilot stages, only whitelisted heuristic error can be released with auto_acknowledge:true (platform decides; if not whitelisted returns 400 AUTOPILOT_MUST_ASK: must_ask_customer=true means pause and ask customer, false = self-fix per action then re-review). ★For grayscale dramas, you (agent) must also personally QC: inspect assets item by item per agent_qc returned by review_frames, answer each checklist item, and submit via submit_qc_report before this token can be used (not submitted → 400 agent_qc_required; report has issues → blocked by default like error). ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation follows execution mode: professional mode / unconfirmed plan / this stage customer-controlled → explain to customer and proceed only after customer agrees; do not decide for the customer. This stage autopilot → do not ask customer; follow get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log). Autopilot-stage quote must be within hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask customer. ★**Image-generation quotes (character sheet/scene image/frame generation) provide two numbers**: estimated_points is the **upper bound** (estimated by the model's max reference-image count, ensuring you do not start with too-low budget and hit 402 midway); typical_points in the same response is the **typical spend**. Tell the customer both—only stating the upper bound makes it look much more expensive (the upper bound with full reference images can be over 2x the typical value), while only stating the typical value may leave insufficient balance. For fixed-price models they are equal; then one number is enough. Video-generation quote and charge are the same function; no range.\n★【Post-completion QC · free】After generation, wait until it is stored (see video_status via get_storyboards / get_pipeline_status), then call review_videos to review video and dubbing layers (missing video / video generated from old frames / hard cut at end / unexpected human voice / missing dubbing / voice not assigned / original audio voice line expired), fix and re-review; then personally inspect each shot video and listen to dubbing per agent_qc (action correct, face stable, lines complete, voice right), submit via submit_qc_report; compose_episode must include its review_token.",
125
+ "split_shot": "Split one shot into two shots by first/last frames (structural operation). Free.",
126
+ "trim_shot": "Trim one shot duration (in_ms/out_ms). Free; after return, call rerender_episode to reassemble the final cut.",
127
+ "recommend_trim_window": "Trim-window action QC: for independently generated shots where declared duration < actual video duration, recommend in/out trim windows based on in-video activity detection—vendor output often has action in the second half, and trimming from 0 seconds by default can cut at a mid-action pose (e.g., hand raised but not yet struck). Free, zero charge. Not applicable to group-mode shots (group splitting is already content-aware; returns applicable=false). After receiving a recommendation, apply it with trim_shot.",
128
+ "scan_intra_shot_cuts": "★When the customer reports \"shots cut too fast / the image jumps around inside one shot\", run this first. Free, zero charge. A storyboard should be **one continuous shot**, but the vendor may hard-cut camera positions inside the video (telescope close-up → aerial wide shot → character medium shot). These cuts are invisible in the storyboard table and timeline—they can only be found by scanning frames. Returns shots_with_cuts (shot numbers with intra-shot jump cuts) / total_cuts / engine_suspect / message; shots_with_terminal_cuts separately lists suspected short abrupt tail cuts, and detail.terminal_cut gives position and status. ★Interpretation: perceived final-cut cut points = seams between shots + intra-shot cuts reported here. If this accounts for most cuts, it is not an editing pace problem; resplitting shots or changing transitions will not help. engine_suspect=true means this drama's engine is a known high-frequency source (WAN); measured WAN 11/12 shots had intra-shot cuts, Seedance 1/6, H3 0/5, and prompts cannot block it (negative constraints are already included)—first verify actual cut points and narrative intent, then decide whether to adjust splitting or regenerate; do not retry paid generation solely because of the scan warning. Ordinary intra-shot multi-cut statistics still exclude group mode and explicit montage; however, single segments after group splitting are not exempt from tail-cut checks, so still inspect shots_with_terminal_cuts/detail.terminal_cut.",
129
+ "scan_burned_subtitles": "★For original-voice dramas (video has built-in human speech), recommend running once before final assembly; when the customer reports \"the final cut has two subtitle layers / an extra line of text in the image\", run this first. Video vendors sometimes ignore \"no subtitles\" constraints and burn dialogue into the image—small text, usually appearing only for one or two seconds while the line is spoken. The platform final cut then overlays another subtitle layer, creating double subtitles. Reassembling cannot remove it; only regenerate_shot_video for that shot can. Samples 12 frames per shot, one vision audit, **usage-based billing** (one small vision call per shot). Returns flagged[{shot, texts, matches_dialogue, frames}] / clean / errors. matches_dialogue=true means the recognized text is this shot's dialogue, essentially confirming vendor subtitles; text naturally present in signs, book pages, screens, etc. does not count. dry_run=true reports only and does not write back; otherwise writes back, and compose_episode final-assembly precheck will list these shots as vendor_burned_text.",
130
+ "scan_wardrobe_consistency": "★Run this when the customer reports \"the same character changed clothes / clothing color or style is wrong\"; also recommended before final assembly. For each shot, compare the used first frame and one mid-video frame against each character's design image in that shot (or character sheet if none) for clothing style and color. A common cause is distant small characters being drawn by the image model in different clothes—even when reference images and prompts are correct. Overall color cast from night scenes/warm lighting does not count as inconsistency. One vision audit per shot, **usage-based billing**. Returns flagged[{shot, characters:[{name, differences}]}] / clean / errors. dry_run=true reports only and does not write back; otherwise writes back, and compose_episode final-assembly precheck will list these shots as wardrobe_mismatch. Remedy: regenerate this shot's first frame (generate_shot_frame), then regenerate_shot_video; reassembling cannot remove it.",
131
+ "scan_voice_consistency": "★For original-voice dramas (video has built-in human speech), run this when the customer reports \"the same character's voice differs across shots / voice drifted\". Free (local inference, no vendor call). For each shot with dialogue, listens to vendor-generated human speech: whether the dialogue was fully spoken, and whether the voice resembles the timbre anchor bound to that character. **Async**: returns immediately; background full-episode scan takes about 10 minutes. Only one scan per episode can run at the same time (repeat calls return started=false). By default skips shots already scanned for the current video; rescan=true rescans all. Use get_voice_consistency to check progress and per-shot results.",
132
+ "get_voice_consistency": "Check progress and per-shot results of the voice consistency scan (started by scan_voice_consistency). Free. summary.voice_mismatch = shot numbers whose voice does not resemble the character timbre anchor (focus on these); dialogue_issues = shots where dialogue was incomplete/wrong/extra speech appeared; not_scanned_or_stale = not scanned yet or video changed and needs rescan. speaker_verdict=uncertain means the human speech is too short to judge; it is not an issue. For shots with inconsistent voice: first use get_pipeline_status native_voice_anchor to confirm the character has a bound voice, then regenerate_shot_video.",
133
+ "scan_dialogue_coverage": "★When the customer reports \"cut before the line finished / only half the dialogue was spoken\", run this first. Default **free, zero charge** (read-only access to persisted transcription audit results). Compares each original-voice shot's video audio track against the dialogue at word level, and reports conclusions by family: truncated (stops halfway through the line) / off_script (most spoken content is not the dialogue: improvising, repeating previous shot, only ambience) / extra_speech (dialogue is fully spoken but extra speech is added) / minor_gap (sporadic missing words, transcription error, ignore) / ok. ★Interpretation: the three reportable families have **different remedies**; do not simply lengthen every shot—measurements show 21% of shots with sufficient length still fail to finish the line, so \"too short\" is rarely the real cause (the platform already auto-raises duration by dialogue when saving storyboards). The correct fix for truncated/off_script is regenerate_shot_video (how much the vendor says is random each time; rerolling often gets the full line); if the same drama repeatedly has off_script, switch engine. ★never_audited is the most important section of this report: those shots have never been checked; \"not checked\" does not mean \"no issue\". rescan=true will run ASR comparison for them (compute-intensive, not instant; limit controls per-run cap), default does not run. TTS-dubbed shots are out of scope (TTS necessarily reads the full line; low coverage can only be transcription error). If the same episode also has \"cuts too fast\", that is a separate issue; run scan_intra_shot_cuts.",
134
+ "update_shot": "Shot-by-shot edit: change a single storyboard shot's text content (shot size/action/dialogue/visual description/camera movement, etc.), facial expression (expression_hint), duration (duration), final cut speed (speed_factor), character binding (character_ids), voice-over marker (character_presence), and wardrobe binding (active_wardrobe_id / appearance_wardrobes). Send only fields to change; all others stay unchanged. ★Any shot edit (accepted or rejected) invalidates unconsumed quotes covering this shot; generation then returns 409 QUOTE_INVALIDATED—edit first, read back to verify, then quote. **Free** (pure text DB write). ★Changing dialogue automatically invalidates generated TTS voice-over and subtitles for this shot (tts must be regenerated); text edits do not auto-regenerate images/video. To make visuals follow text changes, edit then regen the corresponding shot. Use get_storyboards to inspect results (each shot includes character_ids / character_bindings / scene_id / prop_ids / active_wardrobe_id / appearance_wardrobes). ★★【Change clothes here, not in text】What appears in image generation is determined by **wardrobe binding**: single-character shots use active_wardrobe_id (one outfit for the whole shot); multi-character shots use appearance_wardrobes (per character). Writing \"wearing X clothes\" in description/action will not change clothes. Use list_wardrobe for wardrobe id; edits do not auto-regenerate images. To update visuals, regenerate this shot's first frame then video. ★★For native-audio shots (vendor-native audio), after changing dialogue the shot video is marked \"needs regeneration\"—because spoken lines are **baked into the video audio**. If you final-compose without regeneration, the final cut still speaks the old line (typical symptom: dialogue seems to have moved to another shot). compose_episode lists these shots under advisory `stale_video_after_edit`; correct handling is regenerate_shot_video before final compose. ★You may also directly edit this shot's four prompt bodies (image_prompt/video_prompt/first_frame_prompt/last_frame_prompt): read current values with get_shot_prompts first; do not overwrite from scratch. @char:N / @scene:M in the body are supplemental reference markers for image generation; keep them unchanged. ★Which character sheet is injected is determined by character_ids, and background by scene_id: deleting markers will not remove already-bound people from the image. To make someone not appear, edit character_ids; if they are voice-only, set character_presence to voice_only. Conversely, do not write @char markers for unbound characters—this will inject their image. ★★【If last-frame generation is blocked, edit here】If last-frame generation reports \"this shot is marked as a state change, but nowhere describes what it looks like at the end\" (TERMINAL_DESC_GATE), fix by writing **what the final image should look like** into this shot's last_frame_prompt, then regenerate the last frame. Do not retry image generation—shots of this type (action_motion_class=state_change without terminal state) historically succeed at 9.4%, versus 40.2% with terminal-state description; without adding the description, the vendor prompt has no terminal-state section, so it still draws the same as the first frame, is rejected again, and each regeneration still charges normally. terminal_desc_missing=true from get_shot_prompts is this signal.",
135
+ "rederive_shot_contract": "Using this shot's **current** prompt body and character binding, let the platform re-derive the composition contract (how many visible people, whether the subject is a person or a partial/object, shot size). The contract itself is internal: cannot be read or edited directly. This tool only returns outcome: updated (changed and effective) / unchanged (derived result same as current) / rejected (derived result self-contradictory, not adopted, original contract kept) / no_candidate (no usable result, original contract kept) / stale (shot changed during derivation, result not written; call again after edits), plus note for next step. Insufficient credits returns 402. ★When to use: image generation/precheck/review repeatedly says the number of people is wrong, or a partial shot (hand/prop close-up) is treated as a full-person shot in generation or review, and you have already edited text or bindings—the autofiller only fills blanks and does not overwrite existing contracts; without this tool, edits will not enter the contract. ★Correct order: first update_shot to make the image text correct (who is visible, who is voice-only via character_presence voice_only, unbind anyone who should not appear from character_ids), then call this tool; calling without text edits usually returns unchanged. ★One text AI call, postpaid by token (same chain as autofill_storyboards); inform the customer before calling. ★Only changes this one contract field; does not touch dialogue/prompts/other specialized fields. Generated first/last frames are not auto-regenerated; to update visuals, regenerate frames for this shot (quote first). ★updated invalidates unconsumed frame/video quotes for this shot and the same episode; quote again afterward.",
136
+ "get_shot_prompts": "Read the four prompt **bodies** for one shot (image_prompt=first-frame image / video_prompt=dynamic performance / first_frame_prompt=what it looks like at start / last_frame_prompt=what it looks like at end), for direct fine-tuning then writing back with update_shot. Free. ★terminal_desc_missing=true in the response means this shot is marked as a \"state change\" but none of the three places describes the terminal state—last-frame generation will be blocked by the pre-gate. Fix by writing the end state into last_frame_prompt (do not retry image generation; retry will inevitably be rejected again and still charged). ★Also returns expression_hint (author-specified facial expression for this shot; null=unspecified, platform infers from dialogue). Edit it with update_shot. expression_inferred is the storyboard AI's inferred expression when the script did not specify expression (read-only; null=no inference, or this shot's dialogue/action/mood/description/intensity changed and the inference is expired and no longer used); it has lower priority than expression_hint—if inference is unsatisfactory, write expression_hint with update_shot to override it. ★Per-shot on demand: read only the shot you edit (episode list get_storyboards does not include prompts). ★Returned asset_tokens are supplemental reference markers in the body (@char:N / @scene:M); keep them unchanged when rewriting. Which character sheet is injected is determined by bindings (character_ids / scene_id in get_storyboards); deleting markers will not remove bound characters. Markers with #variant are the only source for that variant image. Writing a marker for an unbound character will inject that character's image. ★This is the body layer in the storyboard sheet; during image/video generation the platform also appends identity anchors, consistency constraints, and reference-image instructions (not here, and you do not need to write them). Changing prompts does not auto-regenerate images/video; to update visuals, regen the corresponding shot.",
137
+ "rerender_episode": "Recompose the final cut from the current timeline (use after shot edits/cropping). **Free** (pure ffmpeg+COS), asynchronous in background.",
138
+ "replace_shot_dialogue": "Replace a shot's dialogue timbre/voice (transcribe + clone + redub). **Synchronous call**, returns product in about 1 minute, postpaid by usage with no debt. Requires this shot to have native-audio video + character voice character sheet audio. ★This is also the cheapest fix for \"this shot did not finish the line / spoke something else\": redub the full line with cloned voice and mute the native-audio segment, **without regenerating video**—charged at TTS tier (per thousand characters), orders of magnitude cheaper than regenerate_shot_video (720p 212 credits/sec). Tradeoff: the image lip-sync was performed to the original audio, so after replacement it may mismatch; almost lossless when lips are unclear (back view/long shot/voice-over), use caution on extreme close-ups. ★Product is automatically written back to the shot (returns persisted:true), but written back ≠ included in final cut: rely on productEffective from get_dialogue_repair_status—if true, rerender_episode to recompose; if false, first perform pendingCompose as instructed, then recompose, otherwise the final cut still uses old audio. ★If this shot already has a lip-sync product, the final cut prioritizes the lip-sync version, so replacing track will not take effect. For episode batch use repair_episode_dialogue.\n★Before writeback, the product is verified (same criteria as scan_dialogue_coverage): still truncated, repeated/extra speech (extra_speech), or not the line (off_script) → **not written back**, this cost automatically refunded, and error returns which category—these shots cannot be fixed by voice replacement; use regenerate_shot_video. On success, verify:verified=false means it could not be judged (transcription failed/line too short); it is still written back, but unverified, so listen yourself.",
139
+ "revoice_narration": "Replace the voice for a shot's **narration/voice-over** (or re-synthesize after editing narration text). **Does not regenerate video**: keeps visuals and on-screen dialogue, only mutes the narration segments, synthesizes them with the current narration voice, mixes back, then verifies. Synchronous call, charged at TTS tier (per thousand characters). ★Edit first, then call: to change voice, first set_character_voice for the \"narration\" character (or design_voice to create one); to change text, first update_shot the narration line in dialogue. ★Pure narration shots (only narration in this shot) work directly; **mixed shots** (on-screen dialogue plus narration) require sentence count to match the speech segments in the video. If not, it errors instead of guessing (a wrong guess could mute on-screen dialogue too)—then only regenerate_shot_video can fix it. ★If the dialogue field has no narration line, it errors directly; if the vendor randomly speaks in a no-dialogue shot, use replace_shot_dialogue mute_only. ★After writeback, the final cut uses it directly (no extra switch); rerender_episode is enough to recompose. If verification fails, it is not written back, and narration synthesis cost is not refunded.",
140
+ "repair_episode_dialogue": "★Batch-fix \"line not finished / spoke something else\" for the whole episode. By default only fixes shots scan_dialogue_coverage judges defective (truncated/off_script/extra_speech); the minor_gap family is transcription error and native audio is usually fine, so it is untouched. Same principle as replace_shot_dialogue: redub the full line with cloned voice + mute native-audio segment, **without regenerating video**—charged at TTS tier (per thousand characters), orders of magnitude cheaper than episode-wide regenerate_shot_video, and the preferred fix for these defects. ★Tradeoff is lip-sync: visuals were performed to original audio and may mismatch after replacement. Almost lossless when lips are unclear (back view/long shot/voice-over); if the whole episode is close-up dialogue, prefer regenerate_shot_video. Asynchronous serial background run (CosyVoice synthesis is not concurrent); check progress with dialogue-repair-status. Insufficient balance aborts without charging. Each shot is verified after replacement; if still truncated/repeated/wrong, product is not written back, cost refunded, and listed in status verify_rejected. After completion, first check get_dialogue_repair_status productEffective:true before recomposing final cut (compose_episode / rerender_episode); if false, follow pendingCompose to complete composition first, otherwise the final cut still uses old audio.",
141
+ "get_dialogue_repair_status": "Check dialogue repair progress (free). repair_episode_dialogue runs asynchronously in serial background; poll with this.\n★This tool previously **did not exist**, while repair_episode_dialogue's description said \"check progress with dialogue-repair-status\"—third parties following it would find nothing (caught by MCP override gate on 2026-09-21).\n★Response includes **aborted** = last batch was stopped early due to account-level failure (kind=account_overdue upstream platform account overdue / credits insufficient credits), remaining shots not executed. In this state, **resubmitting unchanged will definitely fail for the same reason**: for credits, recharge first; account_overdue is not your credits issue—stop and tell the user to try later, do not repeatedly resubmit; model_unavailable=the vendor for the selected video model is paused or temporarily unavailable, error lists available alternative models; ask the user, then switch model and submit.\n★Includes **verify_rejected** = these shots failed verification after replacement (truncated/repeated/wrong), product not written back and cost refunded—voice replacement cannot fix them; use regenerate_shot_video.",
142
+ "get_shot_name_card": "Read the current **character name card** values for this shot (free): name, title, display position, etc.\n★Read once before editing—set_shot_name_card is **full overwrite**; if you edit without reading, fields you did not intend to change may be cleared.",
143
+ "generate_bgm": "Generate/replace AI background music for the whole episode (by emotional arc). Asynchronous in background, postpaid by usage with no debt. Returns number of emotional-arc segments and estimated duration; poll progress with get_bgm_status. ★Generated/changed music **does not automatically enter an existing final cut**—after completion you must compose_episode again (free) to hear it; bgm_stale=true from get_final_cut indicates this. Do not use re-render (it consumes the old timeline and does not include new music).\n★prompt optional: omitted=fully automatic (same as before). If provided, it adds direction on top of the automatic result, one prompt for the whole episode; the system still segments by emotional arc. See get_bgm_prompt_guide (free) for how to write. Key point=only write music dimensions (emotional texture/main instruments/tempo dynamics/density and space/style reference), not plot (\"when protagonist discovers the truth, make it tense\" → write \"tense, strong rhythmic propulsion\"). Pure instrumental only: vocals/lyrics/foley as instruments will not take effect and will be named in prompt_warnings, but **will not block generation**.\n★prompt_mode: guide (default)=your requirements and platform professional guardrails (era/genre fit, restrained instrumentation, preserve climax scale, segment differentiation) both apply; override=pass-through, skipping guardrails and keeping only technical baselines (instrumental/duration/loopable). Use override at your own risk; **try guide first**, switch only if it cannot be steered. If prompt is omitted, the episode's last saved value is reused (visible in get_bgm_status).\n★director optional=structured locks (hard constraints): specify mood / instruments / bpm / tonality (major/minor) item by item; generation **forcibly overrides** the music director's judgment (unlike prompt, which is only direction and may be modified by guardrails or AI choice). Unlocked items remain automatic. Episode-wide locks go at director top level; per-act locks go in director.acts[{act,…}] (same field names override episode-wide). ★director is saved per episode (same as prompt): if passed this time it is stored, and omitted next time reuses the last value (visible in get_bgm_status director); pass null to clear. If storyboard edits make saved act numbers nonexistent, that entry is ignored and explained in director_warnings, without blocking generation. Acts are automatically split by emotional arc: before locking by act, call get_bgm_plan (free, read-only) to see how many acts this episode has and which shots each covers. Parameter errors (bpm out of range, tonality not major/minor/modal, act number nonexistent) return 400; vocals/ambient sounds in instruments are dropped and named in director_warnings. For clear parameters like \"slower, minor key, use guzheng\", use director; for directions like \"overall more oppressive\", use prompt; both can be used together.\n★candidates optional=full-version candidate comparison: generate 2~3 **complete** candidates per act for the customer to choose (selected one is used directly; what you hear is what enters the final cut). Each track is billed separately ⇒ cost is N times a single track, so you **must quote_bgm_candidates first**, then call this tool with quote_id (quote confirmation follows execution mode: professional mode / unconfirmed plan / this stage customer-controlled → explain to customer and proceed only after customer agrees, do not decide for them; this stage delegated → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log) (before dispatch, platform prechecks whole-order quote against budget; exceeding hard cap returns 402 with no charge). Omitted or 1=original behavior (one track per act, no quote needed). After generation, get_bgm_status candidate_groups provides preview URLs for each track; select_bgm_candidate selects (free); if none selected, default is track 1.\n★【Post-completion QC · free】After generation lands in DB (check video_status / get_pipeline_status via get_storyboards), call review_videos to review video and dubbing layers (missing video / video generated from stale frames / hard cut at ending / unexpected voice / missing dubbing / unassigned timbre / expired native-audio voice), fix then re-review; then follow agent_qc to personally inspect each shot's video and audio (action correct, no face drift, lines complete, voice correct), submit_qc_report; compose_episode must include its review_token.",
144
+ "quote_bgm_candidates": "Quote for \"full-version BGM candidate comparison\" (free): total credits for candidates complete candidates per act = number of acts with music × candidate count × single-track price. Returns quote_id (valid 15 minutes, one-time). ⚠️ Use quote_id to call generate_bgm (candidates must match here) (quote confirmation follows execution mode: professional mode / unconfirmed plan / this stage customer-controlled → explain to customer and proceed only after customer agrees, do not decide for them; this stage delegated → do not ask customer, follow get_production_plan autopilot.default_decisions, platform records it in get_autopilot_log) (before dispatch, platform prechecks whole-order quote against budget; exceeding hard cap returns 402 with no charge). There is also a small music director LLM text fee (once per act), not included in the quote.",
145
+ "select_bgm_candidate": "Select one track for an act from full-version candidate comparison (free). cue_id and track_id come from get_bgm_status candidate_groups; all BGM segments in the same act switch together. After editing, compose_episode to recomposite before it enters the final cut.",
146
+ "get_bgm_plan": "Check how this episode's score will be split into acts (free, read-only, no generation): each act's act number act, covered shot range sb_from~sb_to, duration, and average emotional intensity. Before using generate_bgm director.acts to lock parameters by act, call this first to get act numbers. ★This is an independent read-only tool: to inspect act splits, **do not** call generate_bgm—that call immediately charges credits and generates.",
147
+ "set_episode_audio": "Set **this episode's** final cut mix (free): BGM volume (overrides series setting), clip original-audio gain, and voiceover-track gain. Use update_project_settings for the series-wide BGM volume. ★Settings only: final cut changes require re-composing with compose_episode (rerender_episode uses the old timeline and will not include them). ★To adjust one BGM segment's volume, fade in/out, or start point, use list_bgm_cues + update_bgm_cue. ★Original audio = sound embedded in video clips (in original-audio dramas, this is character dialogue); voiceover track = TTS-generated dialogue and narration (premixed into one track, adjustable only as a whole, not separable). ★If this episode uses per-shot composed clips for final stitching (every shot has a composed clip), voiceover is baked into each shot and shares the same audio with original audio, so these two gains do not take effect—the response will include a warning; relay it to the client as-is.",
148
+ "list_bgm_cues": "List this episode's BGM cues (AI score split into emotion-based acts; each cue covers a shot range sb_from~sb_to): id, coverage, gain_db (null = follow volume preset), fade_in_ms / fade_out_ms, track_offset_ms / start_shift_ms (null = system decides). episode_id null means a **series-wide shared cue**; changing it affects all episodes. Free.",
149
+ "update_bgm_cue": "Adjust one BGM cue's volume, fade in/out, and start point (free). To change the track or covered shot range, regenerate with generate_bgm. ★Examples: BGM enters too abruptly → increase fade_in_ms; a segment masks dialogue → lower gain_db; want to start from the track's climax → set track_offset_ms; want it to enter after the first shot in this segment starts speaking → set start_shift_ms. Re-compose with compose_episode after changes for them to take effect.",
150
+ "get_bgm_prompt_guide": "Get the writing guide for “AI score prompts”: how to choose between the two tiers, what dimensions to include (with copy-ready examples), hard constraints that will not take effect even if written (pure instrumental/duration/no sound effects/no copying specific tracks), and common bad prompt patterns. Free, static, unrelated to any specific drama—read this before writing generate_bgm prompt; do not guess. Also suitable to relay key points directly to clients.",
151
+ "set_shot_name_card": "Add/change/clear a “layout title card” for one shot (burned into the final cut during final stitching, with preview-matched calligraphy font and cinnabar-red seal). Pass name as an empty string = clear this shot's title card. Free (data only; it displays once filled). Two modes: ① omit orient/placement/font_size = character name card (single vertical column character name at screen side, suited for ensemble entrance shots); ② provide any of them = generic layout title card; name can be a **full line of dialogue or narration** (auto-splits columns by punctuation and fits font size to the tallest column). placement=\"auto\" automatically chooses position by background brightness and texture (avoids faces/bright areas); orient=\"auto\" falls back to horizontal layout when the background is too busy. ★Do not download the video, overlay text yourself, and upload it—that bypasses renderer font and seal assets, causing preview/final cut mismatch.",
152
+ "extract_segment_to_library": "Extract a time span from one shot (or one episode final cut), save it as a reusable asset, and add it to my asset library. Free (pure trim, no vendor call). Typical use: flashbacks/memory montages—visuals all reuse existing shots, marginal cost 0. The span is in seconds relative to **the source video**; if the end exceeds video duration, it is automatically clamped and the actual range is echoed in span. Repeated calls with the same source and same span hit the content hash and reuse the existing asset (reused=true), avoiding duplicate library rows. ★Do not download the video and cut locally with ffmpeg—the vendor outputs have GOPs up to 10s, so keyframe cuts will inevitably drift; this uses the platform's already-normalized exact cut points.",
153
+ "get_bgm_status": "Check AI score generation status for an episode: running (whether generation is in progress) + list of library score tracks (track/covered shot segments/fade in/out) + cue count. Free. After score is done, re-run compose_episode to include it in the final cut.",
154
+ "translate_subtitles": "Translate an episode's subtitles into a second language and enable bilingual subtitles. Backend async, postpaid by usage, no arrears.",
155
+ "list_dramas": "List all short dramas under my account (drama_id/title/genre/episode count/progress). Free.",
156
+ "get_drama": "Read details of one drama (settings/character count/scene count/asset stats, etc.). Free.",
157
+ "get_characters": "Read the character list for one episode (names/character sheets/reference-sheet readiness). Free. Each character includes structured status: portrait_status/sheet_status (ready=stored in library/pending=generating or under audit·do not click repeatedly/rejected=image generated but rejected by consistency gate and not stored/failed/none) + on rejection: sheet_fail_reason·sheet_retryable·sheet_fail_hint (rejection verdict). ★When sheet_status=rejected, judge by retryable: consistency_rejected can be rerolled once (generate_character_sheet); **repeated rejections with nearly identical fail_hint = anchor fields conflict with character profile (structural guaranteed rejection); rerolling is pure wasted money**—first run run_precheck and check anchor-conflict warnings, remove or align character appearance pinned in visual_lock/art_bible with the profile, then reroll.",
158
+ "get_scenes": "Read the scene list for an episode (name/description/whether scene image is ready). Free.",
159
+ "get_assets": "Read all aggregated assets for a drama (characters/scenes/props/images). Free.",
160
+ "get_jobs": "Check a drama's task queue progress (pending/processing/done/failed for image/video/compositing stages). Use after async generation to track progress. Free. ★Full-episode frame generation (generate_frames) dispatches shot by shot in the background; rejected shots will not appear in the task list—check response frame_dispatch_rejections (per shot storyboard_id/frame_type/code/message). code=ERA_USER_REF_CONFLICT means the customer-uploaded character sheet was judged conflicting by Era review: relay message to the customer (allow_era_ref_conflict requires the customer's explicit consent in any execution mode, autopilot included); after confirmation, call generate_shot_frame for those shots with allow_era_ref_conflict=true. This list is cleared after restart.",
161
+ "get_drama_bill": "Net cost bill for this drama (free). Use for reconciliation and answering “how much exactly was spent, where it went, how much was refunded”; do not stitch transaction flows yourself.\n· totals / by_kind: per-kind charged, refunded, net, charges/refunds counts. **net is the spend**, same source as web “spent for this drama” and get_budget_status; charged includes idle charges later auto-refunded after failures, only for reconciliation.\n· in_flight: tasks already charged with results not yet returned (platform charges on submit and refunds on failure; no separate preauthorization).\n· rework.video: count of successful videos from the 2nd time onward for the same shot (does not prove waste or failure); verify reasons and image costs with get_cost_attribution. Old image stats are not counted (first frame/end frame/best-of-N candidates are naturally multiple images for the same shot).\n· account_level: voice charges such as voice-library cloning/design/audition that **do not belong to any drama**, listed separately, counted_in_drama=false, not included in this drama.\n· available=false: ledger temporarily unreachable; do not provide numbers (do not pass estimates off as facts), retry later.",
162
+ "get_cost_attribution": "Read line-by-line attribution of actual charges and refunds. Free; net total still follows the bill. Images and videos both show task, frozen input version, whether adopted, and explicitly registered rework reason. Do not guess unknowns or ambiguities; not adopted does not mean waste. When available=false, there is no reliable amount; when complete=false, details are truncated but totals are full. Historical rework.video is only a count of repeated successful video generations and does not prove failure or waste.",
163
+ "classify_cost_reason": "Register the reason for a ledger line based on explicit evidence, preserving operator and note. Free, does not change any charge or refund; cannot classify as supplier failure solely because it was not adopted, was retried, or errored.",
164
+ "get_cost_estimate": "Check a drama's overall cost (credits): already spent + pending-spend range for unfinished parts + category breakdown. Free. already_spent_points shares the same source as get_budget_status spent and web “spent for this drama” (platform charge ledger net, refunds deducted), the same number. spent_source=usage_mirror means ledger temporarily unreachable and fell back to local mirror (lower, excludes text/music); when quoting to customers, state this and retry later to recover; spent_note explains the basis. Sum of breakdown done_points rows = already_spent_points: ledger cannot distinguish whether text spend was for rewrite/shot splitting/storyboard completion/extraction, so total text spend appears only in kind=text_spent row (text / text_rewrite rows have done_points always 0; do not report “text cost nothing”; fallback has no text_spent row); categories without separate estimates such as music and voice cloning are in other_spent (note lists composition). total = spent + pending. ★Also excludes account-level voice (voice-library cloning/design/audition); use get_drama_bill for reconciliation.",
165
+ "get_budget_status": "Check a drama's budget status (budget/spent/remaining). Free. spent shares the same source as web “spent for this drama” (platform charge ledger net, refunds deducted), by_kind itemizes by kind (ai_image/ai_video/ai_text/ai_music/tts_local…). spent_source=usage_mirror means ledger temporarily unreachable and fell back to local mirror (lower, excludes text/music); state this when quoting to customers. ★Excludes account-level voice charges: voice cloning, voice design, voice audition do not belong to any drama and are only in the account bill—when the customer asks “total spent”, explain this part is separate and do not treat spent as total cost.",
166
+ "get_production_menu": "★Opening step 2 (free·read-only·no drama id needed): based on the customer's basic video parameters, return the **currently available** three-tier model packages (budget/standard/high quality). Each tier gives: image model + video engine + resolution, effect description (effect), real-time estimate (estimate: typical spend and upper bound per episode and full drama, breakdown), warnings (selected model recently busy/high failure), substitutions (reason primary model in this tier is unavailable and fell back to backup combo). If a tier has available=false, all models in that tier are currently unavailable (unavailable_reason explains); do not recommend it. estimate=null means pricing service cannot get real-time unit prices—tell the customer “temporarily cannot estimate”, do not invent numbers. estimate includes text steps (script rewrite, shot splitting, storyboard completion, estimated about 360 credits per shot, breakdown text item). not_included lists costs outside the estimate (dubbing/music, QC regenerations, regenerations after review rejection); tell the customer too; QC regenerations are not in the upper bound and are covered by the “auto overrun” quota. ★Recommended budget: for each tier recommended_budget = (that tier estimate.total.upper − breakdown text item) × 1.2 + text item (text not amplified); menu recommended_overrun_pct=30 is the suggested overrun tier. By default recommend to the customer “budget = recommended_budget, overrun 30%” (budget_advice is ready wording), and explain this is only a recommendation; budget and overrun ratio are decided by the customer (overrun may be 0/10/20/30/50). availability is model availability for this subject matter (for professional customers choosing models themselves; unavailable cannot be selected). ★Professional custom model selection: call again with custom (image model + video engine + resolution); response adds custom (availability + real-time estimate); explain custom.estimate to the customer, and on confirmation pass custom.estimate.total.upper back verbatim as expected_total_upper. ★Platform currently does not provide “historically how many dramas use overrun”: **do not** estimate a ratio or number yourself; if the customer asks whether overrun will be used, only explain overrun quota covers QC regenerations and regenerations after review rejection; unused quota is not charged. ★content_class determines availability: the same engine may support anime while realistic live-action is temporarily unavailable—choose by actual story visuals, do not change subject matter just to use a model.",
167
+ "confirm_production_plan": "★Final opening step: write the customer's **explicitly agreed** complete plan into this drama (free). Writes image model/video engine/resolution/budget, and records subject matter, execution mode, auto-overrun cap, and confirmation snapshot. Before calling, you must fully summarize to the customer: selected package and effect, full-drama estimate (typical and upper bound), execution mode, budget, overrun ratio, and “overrun is used only after budget is exhausted; at the hard cap it stops and asks”—only pass customer_confirmed:true after the customer agrees. ★Default recommendation for budget and overrun is budget_points=that tier recommended_budget (non-text upper bound×1.2+text), overrun_pct=30 (QC regenerations covered by overrun); if customer sets different values, pass the customer's numbers. In autopilot stages, the same shot may regenerate frames up to 3 rounds and regenerate video up to 3 times; at the limit returns 409 AUTOPILOT_SHOT_REGEN_LIMIT, stop and ask the customer. ★After confirmation, the platform rechecks before each charge dispatch: ① this drama's models remain available for its subject matter, else 409 MODEL_UNAVAILABLE; ② quote upper bound + already spent ≤ budget×(1+overrun%), else 402 BUDGET_WOULD_EXCEED (no charge in either case). If blocked, stop and ask the customer; do not switch models or adjust budget yourself. ★Execution mode changes agent and review-gate behavior (dramas in autopilot graylist AUTOPILOT_DRAMAS): one-click auto fully autopilots all stages, hybrid custom autopilots per stage_control, professional pro lets customer control every step. In autopilot stages, allowlisted heuristic error may be passed with auto_acknowledge:true; others self-fix (up to max_fix_rounds per layer, default 3) and if still failing, pause and ask the customer; server writes decision log (get_autopilot_log). After confirmation, first call get_production_plan and follow autopilot.instructions. ★Package selection must include expected_combo (the tier's combo verbatim) and expected_total_upper: the confirmed models and estimate must be the exact group shown to the customer. ★For custom combo, first call get_production_menu with the same custom to get an estimate and explain it to the customer; on confirmation pass expected_total_upper=custom.estimate.total.upper; missing, or recomputation increases by over 5% ⇒ 409 CUSTOM_ESTIMATE_UNCONFIRMED (not written), response contains latest estimate; explain to customer, get agreement, then confirm with new value. 409 PACKAGE_CHANGED = after menu returned, this tier changed combo or estimate rose significantly; response contains new combo and estimate, re-explain to customer and confirm with new value after agreement. 409 PACKAGE_UNAVAILABLE / MODEL_UNAVAILABLE = model unavailable at confirmation time; call get_production_menu again and let customer choose again. 403 PRODUCTION_PLAN_NOT_OPEN = this drama is not enabled (graylist); follow original step-by-step confirmation flow.",
168
+ "get_production_plan": "Check this drama's confirmed opening plan (free). Returns plan snapshot, current models, models_unavailable_now (nonempty when this drama's models are currently unavailable—ask customer what to do before image/video generation), budget (including hard_cap and whether overrun_in_use is already using overrun quota). confirmed=false means no plan has been confirmed. ★When budget.overrun_in_use becomes true, proactively tell the customer “budget is exhausted; now using overrun quota, cap_remaining credits left.” ★autopilot = the execution-mode instructions issued to you: instructions (overall rules to follow), stage_control (which stage belongs to customer vs autopilot), max_fix_rounds, default_decisions (in autopilot stages, make choices by this table without asking), never_auto_actions (customer consent required in any mode), auto_ack_codes / never_auto_ack_codes (whether review error can be auto-acknowledged). enabled=false means autopilot is not enabled for this drama; always execute in professional mode.",
169
+ "get_autopilot_log": "Autopilot decision log and delivery report for one-click / hybrid modes (free·read-only). Logs are written by the **server** during review, review gate, and QC submission—your self-reported “how many rounds fixed, what was passed” does not count; this is authoritative. Returns pending_questions (questions requiring customer decision: not in auto-ack allowlist, or self-fix reached limit; each includes episode number, stage, blocking code and reason), report (delivery report: budget spend and hard cap, layers self-fix rounds per episode per layer and latest review/QC conclusion, auto_acknowledged what was auto-passed, leftovers remaining flaws), entries (latest 200 raw records). ★If pending_questions is nonempty, pause and ask the customer **in one consolidated batch** (do not ask one by one); do not push downstream for that layer before customer replies. If customer agrees to continue as is → pass acknowledge_review:true in the next step. ★After final cut generation, call once and explain report to customer: how much was spent, how many self-fix rounds per layer, which heuristic issues were auto-passed, and which flaws remain. Delivery acceptance confirm_delivery_acceptance can only be confirmed by the customer personally.",
170
+ "assign_voices": "★Assign voice styles to all characters in this episode (voice director agent selects by gender/personality/age/role positioning + project language). voiceStyle is not auto-filled during extraction—if not assigned, generate_tts has no voice style. Text step (LLM), postpaid. Characters already bound via set_character_voice to the customer's own licensed voice style are locked and will not be changed to another voice style. Async backend; poll get_pipeline_status:assign_voices=done to finish, then generate_tts.",
171
+ "generate_tts": "Batch-generate TTS for all dialogue in the whole episode. Audio step before final cut—without dubbing, the final cut will lack dialogue. Prerequisite: run assign_voices first to assign voice styles to characters. Async backend, postpaid by usage if not in arrears.\n★【Post-completion QC · free】After output, wait until persisted (check video_status via get_storyboards / get_pipeline_status), then call review_videos to review video and dubbing layers (missing video / video made from old frames / hard cut at ending / unexpected human voice / missing dubbing / unassigned voice style / expired original voice line), fix and re-review; then follow agent_qc to personally inspect every shot and listen to dubbing (actions correct, no face drift, lines fully read, voice correct), submit via submit_qc_report; compose_episode must include its review_token.",
172
+ "set_mv_lyrics": "MV project: set lyrics (full-song audio is passed separately when creating the drama). Free. Then generate_mv_story → generate_mv_script.",
173
+ "generate_mv_story": "MV project: AI creates an MV storyline from the lyrics. Async/sync, postpaid by usage.",
174
+ "generate_mv_script": "MV project: write a shootable first-episode script from lyrics + story (writes scriptContent). Then follow standard extract_assets → storyboard → …. Postpaid by usage.",
175
+ "get_mv": "MV project: read current status of lyrics/story/script. Free.",
176
+ "suggest_mv_song_styles": "MV project · AI composition step 1: read the stored lyrics for this drama (set_mv_lyrics first) and provide 3 song-style plans (name/why/bpm/vocal/prompt). Does not generate a song; only costs one small text LLM fee. Present the plans to the user to choose; the user may edit prompt; after selection, call quote_mv_song for a quote. Use only when the customer has **no** existing song; if they have one, ask them to upload the full song. In gray release: unopened dramas return 403 feature_disabled.",
177
+ "quote_mv_song": "MV project · AI composition step 2: quote (free). Total credits = candidates × unit price per song; returns quote_id (valid 15 minutes, one-time). ⚠️ Use quote_id to call generate_mv_song (candidates must match) (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step controlled by customer → explain to customer and proceed only after customer agrees, do not decide for them; this step managed → do not ask customer, execute per get_production_plan autopilot.default_decisions, platform records in get_autopilot_log) (before dispatch, platform budget-prechecks the full-order quote; over hard cap returns 402, no charge).",
178
+ "generate_mv_song": "MV project · AI composition step 3 (charged): use this drama's lyrics + selected style description to generate candidates full-song candidates with vocals; backend runs about 1~2 minutes. Must include quote_id obtained from quote_mv_song. lyrics_rights_confirmed must be true, and **may only be passed true after the user explicitly states they have usage rights to these lyrics** (using lyrics from someone else's published song to generate is an unauthorized cover); do not confirm for the user. Generated songs end with about 1 second of AI-generated marker tone. After completion, use get_mv_song to view candidates and lyric-vocal QC, then select via select_mv_song.",
179
+ "get_mv_song": "MV project · AI composition: check progress and generated candidates for this drama (free). candidates[].qc is a lyric-vocal QC summary (typo rate / suspected unsung sections), for hint only—speech-to-text on singing can be inaccurate, ask user to listen to file_url before choosing; bound=true is the currently bound full song; lyrics_match=false means this song was generated from earlier lyrics and can no longer be selected (select_mv_song will reject); regenerate using current lyrics.",
180
+ "select_mv_song": "MV project · AI composition step 4 (free): set a candidate as this MV's full song and automatically align timing to this drama's lyrics (then proceed normally with generate_mv_story / generate_mv_script).",
181
+ "update_character": "Modify character settings (name/appearance/age group/ethnicity/gender/personality/role weight/profile lock). After changes, regenerate character sheet/related images. Free. ★profile_locked=1: after customer confirms appearance, lock the profile; subsequent AI extraction will no longer overwrite appearance/personality/description—appearance is anchored by the character sheet and face lock; if overwritten = face changes across the whole film. Lock once satisfied; to modify again, pass 0 to unlock first.",
182
+ "delete_character": "Delete a character (use for mistaken extraction/merging). Free.",
183
+ "update_scene": "Modify scene settings (name/description/location/time_of_day/mood), plus the **scene image prompt body** (image_prompt). Free (pure text DB write). ★If the scene image is unsatisfactory, changing image_prompt is the direct method—changing only location/time_of_day makes the platform re-compose, but may not fix it; before editing, use get_scene_prompt to read the current value, then use regenerate_scene_image to regenerate this scene image. ★Changing the scene image will not automatically regenerate already-generated shot frames: those frames still use the old scene image as the background anchor; to catch up, regenerate shot by shot.",
184
+ "set_era_contract": "Set the era contract for **this episode** (free, pure text DB write). ★This is the only era mechanism that overrides the visual lock—costume/republican/xianxia projects **must set it before image generation**; otherwise the platform can only fight via prompt text, and era confusion (modern objects in ancient images, fairy realms drawn as realistic ancient settings) is basically caused by this being empty.\nHow to choose the four levels:\n· modern —— modern/contemporary urban. Use this if unsure.\n· republican —— Republican era, early twentieth century.\n· historical —— researchable historical dynasties; this level pushes images toward **researched realism**.\n· fantasy —— ★xianxia/fantasy/fairy realms: cultivation worlds, spirits taking form, and other **non-realistic** oriental fantasy. For these projects **do not use historical**—that level requires researched realism and will judge glowing aura, floating landforms, and non-human forms as \"era-inappropriate\", dragging the image toward realistic ancient style.\n★Setting this will not automatically regenerate existing images: to make images follow it, call generate_frames / regenerate_scene_image again. ★To make an exception for one scene, use update_scene era_contract to override individually (scene-level overrides episode-level).",
185
+ "get_era_contract": "Read the current era contract for this episode + the per-scene override list + usage notes for the four optional levels. Free. Read once before editing: it shows \"which level is set at episode level and which scenes have individual overrides\", avoiding the whole episode's unified era being messed up scene by scene. ★era_contract null means **unset**—if a costume/xianxia project shows null, set_era_contract before image generation.",
186
+ "get_scene_prompt": "Read the prompt body for a scene's **scene image (empty-scene base plate)**, for direct fine-tuning then writing back via update_scene image_prompt. Free. ★Per-scene as needed: read the scene you want to edit (the full-episode list get_scenes is a pure asset view and does not include prompts). ★This is the body layer in the scene table; during image generation the platform also adds style blocks, empty-scene constraints, and era lock on top (not here, and you do not need to write them). The returned has_image indicates whether this scene already has an image.",
187
+ "quote_scene_lighting_ref": "Quote for adding a lighting reference image to a scene (free, no image generation). Lighting reference image = an image that reproduces only this scene's lighting, not used as identity reference: the new version is an identity-free lighting probe (two matte calibration spheres on a neutral gray background, no people); if the platform has not yet switched this drama to the new version, it is still a neutral face close-up; the returned note explains which type this drama will get. Used to unify lighting when close-up/extreme close-up shots cannot see the scene image. Only needed when the scene lacks one (e.g. after uploading a new scene image); not needed for scenes with wide shots but no first frame yet (the platform derives it automatically when generating wide-shot frames). Returns 400 with the reason if not eligible. ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then use quote_id to call this tool (quote confirmation follows execution mode: professional mode / unconfirmed plan / customer-controlled stage → explain to the customer and proceed only after customer consent, do not decide for the customer; autopilot stage → do not ask the customer, follow get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Autopilot-stage quotes must fit within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask the customer. ★**Image-generation quotes (character sheet/scene image/frame generation) give two numbers**: estimated_points is the **upper bound** (estimated by the max number of reference images for that model, ensuring you don't start with an under-budget and hit 402 halfway); typical_points in the same response is the **typical cost**. Tell the customer both—only stating the upper bound makes it look much more expensive (the full-reference upper bound can exceed typical by over 2x), while only stating typical may leave insufficient balance. For fixed-price models they are equal, so one number is enough. Video-generation quote and charging use the same function, so this range does not exist.",
188
+ "generate_scene_lighting_ref": "Add this scene's lighting reference image per the quote (background image generation, deducts credits by usage). After completion, this scene's lighting reference field in get_scenes will have a value.",
189
+ "quote_regenerate_scene_image": "Quote for regenerating a single scene image (free, no image generation). Returns estimated_points (upper bound)/typical_points, including one scene image, and whether the platform will automatically derive a lighting reference image after replacement (lighting_ref.will_generate, for unifying lighting in close-up shots, also deducts credits). After getting quote_id, pass it to regenerate_scene_image. ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then use quote_id to call this tool (quote confirmation follows execution mode: professional mode / unconfirmed plan / customer-controlled stage → explain to the customer and proceed only after customer consent, do not decide for the customer; autopilot stage → do not ask the customer, follow get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Autopilot-stage quotes must fit within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask the customer. ★**Image-generation quotes (character sheet/scene image/frame generation) give two numbers**: estimated_points is the **upper bound** (estimated by the max number of reference images for that model, ensuring you don't start with an under-budget and hit 402 halfway); typical_points in the same response is the **typical cost**. Tell the customer both—only stating the upper bound makes it look much more expensive (the full-reference upper bound can exceed typical by over 2x), while only stating typical may leave insufficient balance. For fixed-price models they are equal, so one number is enough. Video-generation quote and charging use the same function, so this range does not exist.",
190
+ "regenerate_scene_image": "Regenerate **this scene's** scene image using the current prompt (after editing image_prompt, make the image catch up). Image step, postpaid by usage, no arrears. ★First call quote_regenerate_scene_image to get the quote and tell the customer the credits, then call this tool with quote_id: after replacing the scene image, if the scene has no available wide-shot first frame, the platform will automatically generate another lighting reference image (deducting credits for one more image), already included in the quote. ★Overwrite: after generation, this scene's old image is replaced (if you need an archive, first use get_scene_prompt/asset list to get the old image URL). ★Already-generated shot frames will not automatically regenerate—they still use the old scene image as the background anchor; to catch up, regenerate shot by shot. ★Difference from generate_scene_images: that is full-drama batch generation and only fills scenes **missing images**; any scene with an existing image is skipped. This tool forces regeneration for a single scene. Customer-uploaded scene images will also be overwritten; first confirm whether they need to be kept. ★episode_id usually does not need to be passed (the platform derives it from scene ownership, then from storyboards that reference it). Only specify it if the return says \"this scene is shared by storyboards from multiple episodes\": that means the same location is reused across episodes, and the platform will not guess which episode's era/worldview to use—guessing wrong silently gives the wrong image era.\n★【Post-completion QC · free】After generation, wait for the image to land in the DB (poll the corresponding get_* status; if pending, do not call again), then call review_assets to review the asset layer (missing image / generating / failed / rejected by consistency gate / prop-era conflict / color script), relay findings to the customer verbatim, fix per action and review again; then personally inspect each image according to the returned agent_qc (whether it matches the profile, is the same person, era is correct; whether the design image itself has complete angles and correct proportions/structure; whether props and scene images make sense in the plot—check the shots in material used_in_shots), submit_qc_report to submit the QC report; when generating shot images, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
191
+ "delete_scene": "Delete a scene. Free.",
192
+ "generate_character_sheet": "Generate a three-view turnaround for a **single** character (root anchor for shot consistency; all shot frames will reference it; more complete than a character sheet). Use generate_character_sheets for full-episode batch. Prerequisite: this character already has a character sheet. Image step, postpaid by usage, no arrears.\n★【Post-completion QC · free】After generation, wait for the image to land in the DB (poll the corresponding get_* status; if pending, do not call again), then call review_assets to review the asset layer (missing image / generating / failed / rejected by consistency gate / prop-era conflict / color script), relay findings to the customer verbatim, fix per action and review again; then personally inspect each image according to the returned agent_qc (whether it matches the profile, is the same person, era is correct; whether the design image itself has complete angles and correct proportions/structure; whether props and scene images make sense in the plot—check the shots in material used_in_shots), submit_qc_report to submit the QC report; when generating shot images, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
193
+ "generate_prop_sheet": "AI-generate a prop sheet (design sheet for a prop). Image step, postpaid by usage, no arrears.\n★【Post-completion QC · free】After generation, wait for the image to land in the DB (poll the corresponding get_* status; if pending, do not call again), then call review_assets to review the asset layer (missing image / generating / failed / rejected by consistency gate / prop-era conflict / color script), relay findings to the customer verbatim, fix per action and review again; then personally inspect each image according to the returned agent_qc (whether it matches the profile, is the same person, era is correct; whether the design image itself has complete angles and correct proportions/structure; whether props and scene images make sense in the plot—check the shots in material used_in_shots), submit_qc_report to submit the QC report; when generating shot images, pass its review_token as asset_review_token to generate_frames / generate_shot_frame.",
194
+ "get_props": "List the drama prop library (each prop name/type/description/concept sheet). ★Prop library ≠ ad product library (add_product/list_products are commerce products); the prop library is for drama props. Free. ★Each prop includes era_audit (era/form audit conclusion for the prop image; null if the image was changed): form_consistent=false means the prop image conflicts with its era_lock; conflicting_scopes lists scenes/episodes it is bound to but era-incompatible with (scope like scene:12 / episode:3); violations names the exact conflicting features. If there is a conflict: first use update_prop to change era_lock (state dynasty/era and form clearly), then generate_prop_sheet to regenerate the prop image; or switch those shots to a suitable prop.",
195
+ "audit_prop_era": "Re-audit a prop image's era/form (one small visual audit, postpaid by usage). Based on the prop's era_lock and the era contracts of the scenes/episodes for shots it is bound to. For cross-era dramas (different scenes belong to different dynasties/periods), run once after all prop images are generated or replaced; result is the same as era_audit in get_props. Returns 400 if the prop has no image, or has neither era_lock nor any binding to a shot with an era contract (no basis for comparison). A conflict is only judged when exact conflicting features are named; a vague “doesn't look like that era” does not count.",
196
+ "create_prop": "Add a prop to the prop library. extract_assets auto-extracts props; this is for manual additions. For cross-era dramas, fill era_lock when creating the prop (creation will auto-trigger concept sheet generation; filling it later only takes effect after regenerating). Free (entry creation; if description is filled, concept sheet generation is auto-triggered and postpaid).",
197
+ "update_prop": "Modify a prop (name/type/description/prompt/size/multi-view reference images/era lock). For cross-era dramas, era_lock is required; otherwise era-neutral prop names may get random periods. Free. ★Changing era_lock does not automatically regenerate the prop image — use generate_prop_sheet to regenerate it; after regeneration, if get_props era_audit is null (new image not audited yet), run audit_prop_era once.",
198
+ "delete_prop": "Delete a prop. Free.",
199
+ "mark_signature_prop": "Mark/unmark a “signature prop” (a key prop recurring across multiple shots, with stronger consistency tracking). signature=false to unmark. Free.",
200
+ "get_color_scripts": "Read generated color scripts for this drama (full-film color palette and mood). Generated by generate_color_script; read with this tool. Free.",
201
+ "get_motion_templates": "Read existing motion templates for this drama (camera/action presets). Generated by generate_motion_templates; read with this tool. Free.",
202
+ "record_product_text_review": "Free: record the user's manual verification result for current original product text. Call only after the user explicitly opens the file, checks it word by word, and confirms the result; do not substitute model judgment as manual verification. From get_storyboards product_text, take the current contract_hash and the frame position, file, generation_id in reviews; for uploaded assets generation_id is null, and media_version from the same response must be passed. Any change invalidates old reviews. Does not regenerate, does not switch the adopted version, and does not represent client acceptance of the entire film.",
203
+ "audit_seams": "Audit edit continuity of current bilateral frames; checks only, does not regenerate or replace assets. Default dry_run=true returns the scope to audit and is free. Insert details only check object identity and state, not composition copying. Existing current valid conclusions are not re-audited. Execution is billed by actual text token usage; estimated_points=null means the amount is not quoted, not free. First show the plan and billing method; only pass dry_run=false and confirm_usage_billing=true after explicit client acceptance. After execution, use get_storyboards seam_review to inspect actual results; attempted does not mean passed.",
204
+ "chain_frames": "Whole-episode first/last-frame relay chain: make each shot's first frame inherit the previous shot's last frame so inter-shot visuals are continuous (smoother than generating each shot independently). ★When to call: after first frames are done and any last frames required by tail_frame_plan are also filled, before review_frames / generate_videos. The platform only auto-runs this once when batch frame generation on the official site finishes; episodes generated shot by shot (generate_frames / generate_shot_frame) often have never been chained — get_storyboards seam_state=unchained means this kind of seam.\n★First use dry_run:true (free, does not write DB or generate images): returns planned_copy / planned_reframe / estimated_points / needs_last_frame. copy = directly replace this shot's first frame with the previous shot's last frame (free, but this shot's shot size becomes the same as the previous shot); reframe = use the previous shot's last frame as an anchor to regenerate this shot's first frame according to this shot's visual description (one image per seam, preserves shot size). Tell the client the plan and estimated_points; after confirmation, call again **without dry_run** to execute (postpaid by usage).\n★The platform decides which seams to chain: intentional cuts (scene/time jump/costume change/insert shot), shots with existing video, and already-chained seams are skipped — “already chained” = the first frame is the previous shot's last frame, or reframe is chained to the previous shot's **current** last frame, so repeated execution will not charge again. If the previous shot's last frame is later regenerated, that seam will reappear in the plan; that seam is indeed broken. To fill individual seams, use chain_shot_from_prev / chain_shot_from. Shots whose first frame is changed by execution and already have video will be marked pending regeneration. ★Execution only dispatches reframe and does not wait for image generation: use get_jobs to view first_frame generation rows for these shots; wait until all pending/processing are finished (for failed, check error_msg; for a single seam use chain_shot_from to reconnect; while the old first frame still exists, get_storyboards frame_status remains ready and failure is not visible), then use get_storyboards to verify seam_state and review_frames — auditing too early will audit the old first frame, and the token will be invalidated later.",
205
+ "chain_shot_from_prev": "(Free) Directly set the previous shot's last frame as this shot's first frame: visuals connect 100%, zero cost, no image generation. ★Use when: the two shots are a continuation from the same camera position and same shot size (seam_state=unchained/broken and this shot should already share the previous shot's composition). ★Do not use for seams with shot-size changes (wide → close-up, etc.): it will overwrite this shot's shot-size design, and later image generation may be judged “inconsistent with design” — for such seams use chain_shot_from with mode=reframe. If this shot already has video, it will be marked pending regeneration. If this shot's first frame is already client-locked (first_frame_pinned), the call is rejected; pass force:true only to overwrite it (any execution mode requires explicit client consent, including managed mode).",
206
+ "quote_chain_shot_from": "(Free quote) chain_shot_from with mode=reframe deducts **one image** (regenerate this shot's first frame anchored on the source frame); quote before execution (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step is customer-controlled → explain to the customer and proceed only after customer approval; do not decide for them; this step is autopiloted → do not ask the customer, execute per get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Returns quote_id / estimated_points; quote_id is one-time and valid only for this shot. mode=copy needs no quote.",
207
+ "chain_shot_from": "Use the first or last frame of **any shot** in the same episode as this shot's first frame. Two modes:\n· mode=copy(default, free): directly replace this shot's first frame with the source frame, pixel-identical—good for “return to the exact same image” or continuing the same camera position.\n· mode=reframe(deducts one image, must include quote_id from quote_chain_shot_from): regenerate the first frame anchored on the source frame and based on this shot's visual description—character/clothing/prop/lighting/scene continuity, while preserving this shot's own shot size and composition. Use this when the seam must connect while shot size changes.\n★If the source is not the previous shot's last frame (bookend / return to a previous image), the platform records the seam between this shot and the previous shot as an “intentional cut”, and automatic frame chaining will no longer overwrite it. If this shot already has video it will be marked for regeneration; if its first frame is finalized it will be rejected—pass force:true only when overwriting it has explicit customer approval (required in every execution mode, including autopilot).",
208
+ "quote_align_prev_shot": "(Free quote) align_prev_shot regenerates **the previous shot's video** (deducts one video); quote before execution (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step is customer-controlled → explain to the customer and proceed only after customer approval; do not decide for them; this step is autopiloted → do not ask the customer, execute per get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Returns quote_id / estimated_points / prev_storyboard_id(which shot will be regenerated); if first-time portrait verification fee applies, kyc_first_time_points is listed separately.",
209
+ "align_prev_shot": "Seam-crack repair “align to previous shot”: this shot's first frame **does not change**; use it as the ending image and regenerate **the previous shot's video** in first/last-frame mode (previous shot's first frame unchanged), so the previous shot truly ends on this shot's opening image. Deducts one video and must include quote_id from quote_align_prev_shot. ★Use when the customer changed this shot's first frame (e.g. uploaded or regenerated a better one), but the previous shot's video is already done and you don't want to alter this shot's first frame to accommodate it. Do not use when neither shot has video yet—changing the first frame (chain_shot_from_prev / chain_shot_from) is cheaper. Async: poll get_storyboards for the previous shot's video_status.",
210
+ "get_scene_group_plan": "Get the scene group plan for an episode (how shots are grouped for continuous long shots). Free.",
211
+ "quote_regenerate_scene_group": "Quote: how many credits to regenerate **one scene group** (one video request for the whole group, preserving intra-group continuity). Returns quote_id. No charge. shot_numbers must exactly equal the shot numbers of one group in get_scene_group_plan.\n★Optional video_engine: swap engine only for this whole-group regeneration (does not change the series-level video_engine); the quote is calculated with it and the quote_id pins it, so regenerate_scene_group will dispatch with it. The whole group is still one final cut, so total group duration must fit within that engine's single-segment limit (hailuo-3 15s; seedance-2.5/wan3.0 30s) and support this series resolution, otherwise 400—if so, use update_shot to set video_engine on individual shots (shots with it set will generate separately). Quote is calculated per shot (per-shot fallback if whole-group fails; per-shot is the upper bound); normal-path actual deduction is usually lower.",
212
+ "regenerate_scene_group": "After confirmation, regenerate one scene group (one video request for the whole group, async in background; poll each shot's video_url via get_storyboards). Grouping and engine are pinned by quote_id and cannot be changed here; if any shot in the group changes after quote, or grouping changes, the quote becomes invalid (409); just re-quote (free). ⚠️ Batch quote confirmation flow: first call the corresponding quote_* tool to get estimated_points and quote_id, then call this tool with quote_id (quote confirmation follows execution mode: professional mode / unconfirmed plan / this step is customer-controlled → explain to the customer and proceed only after customer approval; do not decide for them; this step is autopiloted → do not ask the customer, execute per get_production_plan autopilot.default_decisions, and the platform records it in get_autopilot_log). Autopiloted step quotes must stay within the hard budget cap; if blocked by 402 BUDGET_WOULD_EXCEED, stop and ask the customer. ★**Image-generation quotes (character sheet / scene image / frame generation) provide two numbers**: estimated_points is the **upper bound** (estimated by the model's max reference-image count, ensuring you won't start with an underbudget and get interrupted by 402 halfway); typical_points in the same response is the **usual cost**. Tell the customer both—only saying the upper bound makes it seem much more expensive (with max reference images the upper bound can exceed 2× the usual value), while only saying the usual cost may leave insufficient balance. For fixed-price models they are equal, so one number is enough. Video-generation quote and deduction use the same function; no such range exists.",
213
+ "generate_scene_groups": "Generate scene groups (group continuous shots; the foundation for continuous long shots / batch frame generation). Async in background.",
214
+ "render_multi_aspect": "Re-render the final cut in multiple aspect ratios (vertical / horizontal / square) for multi-platform distribution. Free (pure ffmpeg), async in background.",
215
+ "lipsync_shot": "Apply lip sync to a single shot (align dialogue with the character's mouth). Postpaid by usage.\n★Receiving **503 code=lipsync.unavailable** = the platform currently has no available lip-sync service; this request was not submitted and no fee was deducted; retrying is useless. Follow the returned alternatives (regenerate this shot's video / targeted edit / replace audio only—the last option does not change mouth motion).",
216
+ "lipsync_episode": "Batch lip sync the whole episode. Async in background, postpaid by usage. Use get_lipsync_status to check progress.\n★Receiving **503 code=lipsync.unavailable** = the platform currently has no available lip-sync service; this request was not submitted and no fee was deducted; retrying is useless. Follow the returned alternatives (regenerate this shot's video / targeted edit / replace audio only—the last option does not change mouth motion).\n★【Post-completion QC · free】After generation, wait for it to persist (check video_status via get_storyboards / get_pipeline_status), then call review_videos to review video and dubbing layers (missing video / video from stale frames / hard cut at ending / unexpected human voice / missing dubbing / voice timbre unassigned / original voice timbre expired), fix and re-review; then per agent_qc personally inspect each shot's video and audio (action correct, face stable, full lines spoken, voice matches), submit via submit_qc_report; compose_episode must include its review_token.",
217
+ "get_lipsync_status": "Check whole-episode lip-sync progress. Free.",
218
+ "generate_episode_poster": "Generate a poster image for a specific episode. Image step, postpaid by usage.",
219
+ "generate_drama_poster": "Generate a poster image (KV) for the whole drama. Image step, postpaid by usage.",
220
+ "generate_cover": "Generate an opening cover image for the whole drama. Image step, postpaid by usage.",
221
+ "generate_sfx": "Automatically match + generate sound effects (SFX) for the full episode. Backend async, postpaid by usage.",
222
+ "generate_effects": "Automatically match visual effects for the full episode. Backend async, postpaid by usage.",
223
+ "generate_transitions": "Automatically add transitions to the full episode (white flash/glass shatter, etc.). Backend async.",
224
+ "get_deliverables": "Brand film: read the deliverables tree (posters/masters/stems/platform versions, etc.). Free.",
225
+ "generate_deliverables": "Brand film: one-click generate all deliverables. Backend async, postpaid by usage.",
226
+ "add_product": "★Required for ad projects: add a product to the product library (name/selling points/images), the **main subject** of the ad—when generating video, product images are matched from storyboard text as anchors; without a product library, products in shots will drift/hallucinate. After creation, use generate_product_sheet to generate a character sheet-style product setup image (more stable anchor). Free (entry creation only).",
227
+ "list_products": "Ad project: list the product library. Free.",
228
+ "generate_product_sheet": "★Ad project: generate an AI product sheet for a product in the product library (ad exposure anchor). Product without sheet → when generating video, grep product name from storyboard to fetch image as anchor will fail, causing product drift. Image step, postpaid by usage, no arrears.",
229
+ "clone_voice": "Clone voice timbre from an **authorized** audio sample, returns voice_id. **No character or drama required first**. ⚠️ Sample must be a voice **authorized with consent** by the person/rights holder (otherwise infringement, same as real-person/copyright issues). The sample is automatically transcribed into paired text (needed for zero-shot cloning); ~10 seconds of clear human speech is enough, do not use pure music/silence. Charged at platform price (flat price per voice). After cloning, directly use speak_with_voice to audition/download; only when using it to dub a final cut do you then need set_character_voice to bind it to a character.",
230
+ "speak_with_voice": "Make a voice speak arbitrary text and return a downloadable audio URL. **No character or episode required**—after cloning, use this to verify whether the voice matches, or use the audio elsewhere directly. Charged by text length (tts tier).",
231
+ "list_voices": "List available voices: my cloned private voices + platform public voices (voice_id/name/audition sample). Free.",
232
+ "delete_voice": "Delete a cloned voice from my voice library (platform public voices cannot be deleted). Free.",
233
+ "design_voice": "**When there is no voice sample**, create a new voice from a one-sentence description (e.g. a dedicated voice for narration or a character). After submission, candidates are generated in the background (about 1~3 minutes). Poll with get_voice_design and audition them, then choose one and save it to the voice library with save_designed_voice. **Generation is free** (1 concurrent task per person, 30 times per 24 hours); saving charges the same as voice cloning.\n★Describing “what you want” works better than “what you do not want”: age, gender, timbre (deep/clear/hoarse/breathy), speaking speed, emotion.\n★You must choose and fix one voice before dubbing: the same description generates a different person each time. Only after fixing a sample and cloning it will the whole episode use the same voice. Therefore there is no tool to “dub the whole episode directly from a description”; this is intentional.\n★Do not use real person/celebrity names in the description to imitate a specific person’s voice (same authorization red line as voice cloning).",
234
+ "get_voice_design": "Check progress of a design_voice task. After status=done, download each candidate to a local wav (returns local_path) and provide it to the client for audition and selection; when queued/waiting_memory/running, check again after a dozen seconds. Free. Candidates are retained for 6 hours.",
235
+ "save_designed_voice": "Save the candidate selected by the client into the voice library and return voice_id (like lib:12). **Charged the same as voice cloning** (saving the same candidate repeatedly does not charge again). Then bind it to a character with set_character_voice (narrator is also a character) before using it for dubbing; you can also use speak_with_voice first to audition more sentences.",
236
+ "set_character_voice": "Bind a voice to a character; later generate_tts will use it to dub that character. Free. This is only needed when producing video—cloning and auditioning do not require a character.\n★★【In native-audio dramas (use_clip_audio=true, default), this step is “voice locking”】When the bound voice is **the client’s own authorized voice** (cloned by clone_voice / uploaded by the client, not a public voice), later video generation will pass this audio directly to the video vendor as reference audio. The vendor will speak according to it, and lip sync is naturally aligned—otherwise each group/single shot samples the voice independently, so the same character’s voice may drift across shots. Public voices are only used for TTS dubbing and will not be passed to the vendor.\n★Cost: shots where this character appears will no longer feed a character-sheet video anchor during video generation (the reference video’s audio track overrides reference audio; only one can be used). Character identity must instead be carried by the character sheet/reference images—so confirm the character sheet and reference images are ready before binding.\n★Only affects videos generated **after binding**: bind first, then generate_videos. For videos already generated, the cheapest way to unify the voice is repair_episode_dialogue (only_flagged=false, re-dub full lines with the cloned voice, do not regenerate video, charged at the TTS tier); regenerate_shot_video also works but is orders of magnitude more expensive.\n★After binding, assign_voices will no longer overwrite this character (the client’s own voice has highest priority).",
237
+ "set_voice_anchor_from_shot": "Select a character’s voice line (voice baseline) from a shot in this episode. Free. No external audio source is required from the client—use the voice this character has already spoken in the video.\n★★【In native-audio dramas (use_clip_audio=true, default), this is “voice locking”】After selection, later video generation will pass this audio to the video vendor as reference audio, so the same character’s voice across shots follows it; without locking, the vendor samples each shot independently and the voice may drift across shots.\n★Which shot to choose: a shot where the character **speaks alone, has a longer line, and has no background music or interruptions by others**; start_s/dur_s can clip only part of it (if omitted, the default window is used, and duration is automatically clamped to each engine’s limit).\n★Only affects videos generated **afterward**. Shots already generated before locking will appear in get_pipeline_status under native_voice_anchor.stale_shots; regenerate them with regenerate_shot_video to unify the voice. The cheapest workflow is: generate one shot for each speaking character first, select the voice line, then batch-generate the remaining shots.\n★Works even if the dialogue field is empty: actual audio is authoritative—the platform uses calibrated voice activity detection to confirm there is speech in the selected interval, and uses the transcription text as anchor text; if no speech is detected or no usable text can be transcribed, it rejects (a wrong anchor would pollute all later shots’ voices, so reject rather than guess). The response field text_source indicates whether text came from dialogue or transcription.\n★Preview first with preview:true: only clips and returns preview_url plus anchor text, **without writing to the character**; if it sounds right, remove preview and formally submit with the same start_s/dur_s.\n★Noise removal and acceptance check (effective when enabled by the platform for the episode; response contains hygiene): automatically removes pure environmental-noise pauses between two lines and measures sample noise floor (noise_floor_before/after, threshold threshold). In preview, preview_url is the **cleaned** sample and raw_preview_url is the original—**ask the client to compare both before/after by listening**. verdict=fail means obvious environmental noise or music is under the voice (removing pauses cannot fix it; cloning and the video vendor will learn it as part of the timbre), and formal submission will be rejected: choose a cleaner shot, or adjust start_s/dur_s to avoid background sound; only pass allow_issues:true to write it if the client has listened and explicitly insists.\n★If the client has an authorized external audio source, use clone_voice + set_character_voice instead; choose one of the two, and the later setting overrides the earlier one.",
238
+ "export_handoff_pack": "After delivery traceability is enabled, an immutable export manifest is saved (assets are not modified). Keep pack_id and manifest_sha256, and reference them when returning an external final cut. Export the “asset handoff package” manifest for this episode: downloadable URLs for each-shot raw clips + dialogue tracks + sound effects + music + subtitles, for you to complete transition decisions, stitching, mixing, and subtitle burn-in **on your own side**—the platform does not participate in final assembly. Free, zero credits.\n★Local color grading / third-party AI post: purpose=local_color; when there are only images, pass media_type=images, no need to generate video. This mode preserves source files, disables the export package’s automatic LUT, and includes post-production notes and a local comparison-page flow; it does not upload to third parties, charge for generation, or backfill the platform. Image sources may already have been processed, so not all exported images can be promised as ungraded originals.\n\n【Recommended workflow】① Call this tool to get manifest; ② Download raw clips locally via clips[].url; ③ Watch the clips yourself and decide which transition to use at each seam (manifest provides scene_boundary as a scene-boundary criterion), write a plan.json; ④ Use get_handoff_toolchain to get compile_timeline.py to expand the timeline and assemble.sh to assemble the final cut. The toolchain already calculates how subtitles/dialogue/SFX shift after overlapping transitions are added.\n\n【Three facts that will break things if ignored】\n① **Where the voice is must be read per shot from `shots[].voice_track.location`, not from the episode-level audio_contract.mode**—the latter is an episode-level declaration, while in all-offscreen-narration shots the narration is mixed into the raw clip on the platform completion side, so it can differ per shot within the same episode. The four values require different handling: `separate_file`=dialogue is in dialogue_audio; if you do not lay it in, this shot has no lines; `baked_in_clip`=already in the raw clip audio track; overlaying it again causes double voice; `missing`=**platform side confirmed missing** (narration compensation failed); subtitles still exist but the sound is nowhere—regenerate this shot on the platform; extending a transition cannot hide it; `unknown`=there are lines but the source cannot be found, **you must listen to the raw clip** before deciding. ★Subtitles never imply there is sound: subtitles are per sentence, audio is per shot. For shots with `conflicts_with_contract=true`, trust measurement; notes already name them by shot number.\n② Each shot must be trimmed using trim_head_ms / duration_ms before use; directly stitching the full raw clip will include head/tail deformed frames that the platform already QC’d out.\n③ Subtitle cues, dialogue_audio.offset_ms, and sfx[].offset_ms are all based on “millisecond 0 after this shot’s trim”, not absolute final-cut time. No matter how many overlapping transitions you add, do not modify them—let compile_timeline.py expand them; do not manually accumulate times.\n\nIf you want the platform to assemble it, or need platform-level quality gates (final assembly precheck / equal audio-video duration / loudness mastering), use compose_episode.",
239
+ "get_handoff_toolchain": "Get the source code for the asset handoff package assembly toolchain (compile_timeline.py timeline compiler / assemble.sh ffmpeg assembly script). Free. This tool only returns source text and **will not** write files on your machine—save it to your working directory yourself before running.\ncompile_timeline.py expands “shot-relative” subtitle/dialogue/SFX anchors into absolute timecodes on your own timeline and handles global offsets caused by overlapping transitions; assemble.sh is a complete ffmpeg assembly baseline from raw clips to final cut (trim → normalize → concat/xfade → music sidechain → subtitles → two-pass master). Dependencies: ffmpeg (with libass for subtitle burn-in), ffprobe, jq, python3.",
240
+ "save_handoff_toolchain": "Write the assembly toolchain (fetch_pack.py / compile_timeline.py / assemble.sh) directly to a local directory, avoiding manual copy/paste. Free. The directory must **already exist** and be an absolute path; filenames are fixed and cannot be customized.\nRefuses to write into hidden directories (~/.ssh, ~/.config, .git…) and system directories—this is disk writing, not reading, and overwriting the wrong place is irreversible.\nFull workflow after writing to disk:\n python3 fetch_pack.py manifest.json -o ./pack # Download assets and materialize inline subtitles as SRT\n python3 compile_timeline.py ./pack [--transitions plan.json]\n ./assemble.sh ./pack out.mp4 [plan.json]"
241
+ }
package/openapi.json CHANGED
@@ -2,8 +2,8 @@
2
2
  "openapi": "3.1.0",
3
3
  "info": {
4
4
  "title": "StarReel Production API",
5
- "version": "0.1.173",
6
- "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`). For video, quote == actual charge. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.173 tool surface (operationIds match MCP tool names 1:1)."
5
+ "version": "0.1.174",
6
+ "description": "Turn a script into a finished, downloadable short-drama episode over REST.\n\nPipeline: script → AI rewrite → cast/scenes/props extraction → storyboards → portraits & sheets + scene plates → keyframes → video shots → TTS → final cut (.mp4).\n\n**Billing is prepaid and agent-safe**: big-ticket stages are quote-then-generate (`quote_*` returns a `quote_id`). For video, quote == actual charge. For images the quote is a *range* — models billed per reference image are priced before those are assembled, so `estimated_points` is the upper bound (size the balance by it and a run never dies half-way) and `typical_points` is the usual cost; fixed-price models return the two equal. Insufficient balance returns 402 — nothing half-runs and the account never goes negative.\n\nAuth: exchange your API key at `POST /v1/agent/token` for a 15-minute bearer token.\n\nGenerated from the @starreel/mcp v0.1.174 tool surface (operationIds match MCP tool names 1:1)."
7
7
  },
8
8
  "servers": [
9
9
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starreel/mcp",
3
- "version": "0.1.173",
3
+ "version": "0.1.174",
4
4
  "mcpName": "ai.starreel/starreel",
5
5
  "description": "StarReel MCP server — drive the AI short-drama production pipeline (script → storyboards → frames → video → final cut) from Claude, Cursor, or any MCP client",
6
6
  "license": "MIT",
package/server.json CHANGED
@@ -2,13 +2,13 @@
2
2
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
3
3
  "name": "ai.starreel/starreel",
4
4
  "description": "Turn a script into a finished, downloadable short-drama episode — via MCP or REST.",
5
- "version": "0.1.173",
5
+ "version": "0.1.174",
6
6
  "websiteUrl": "https://starreel.ai",
7
7
  "packages": [
8
8
  {
9
9
  "registryType": "npm",
10
10
  "identifier": "@starreel/mcp",
11
- "version": "0.1.173",
11
+ "version": "0.1.174",
12
12
  "transport": {
13
13
  "type": "stdio"
14
14
  },