Change what happens in one scene (and redraw it)
change_story_sceneCHANGES WHAT HAPPENS IN ONE SCENE of an episode parked at frames review and redraws its opening picture from the change. You pass a PLAIN SENTENCE ('the kid should look super sad', 'move it outside at night'); aicut rewrites that scene's setting / people / action text from it and draws the new picture: ONE image generation. The change STICKS (the scene video made at fire uses it). It is the tool for 'change scene 2, X should be Y'; regenerate_story_frame draws the SAME scene again from the SAME text. CAN: change the SETTING, the ACTION and WHO IS IN FRAME. CANNOT: the SPOKEN LINES, the scene's LENGTH, or a scene pinned to a reference still (the web editor's). An ask ONLY about what somebody SAYS is REFUSED, 400 dialogue_only, nothing written or charged (an estimate_only refuses it too): say dialogue is edited in the web editor and offer a visible change. A MIXED ask applies the VISIBLE half only and the response says so: relay it, never let the user believe the line changed. You never write scene text: pass the user's words as one sentence and do not read the rewrite back. WHEN: story.stage is frames_review; scene_index is zero-based in story.frames (users count from ONE); each frame's summary and dialogue are what you check the ask against before you spend. AFTER: returns image_id (status generating), changed (which parts moved) and a report: RELAY THE report AS WRITTEN. An empty changed means NOTHING moved, whatever the new image_id suggests. This call opens its own card with the scene marked as redrawing: no show_generation, no narrating the wait. CHECK attached: false means the image is charged but will NOT replace the frame at fire: say so and redraw before firing. IF THE PICTURE FAILS OR THE ACCOUNT RUNS OUT (402) THE SCENE HAS ALREADY CHANGED (changed_text: true): it has the new beat and its old picture; regenerate_story_frame draws the new one, and you must NOT send this again (a second rewrite and picture). changed_text_unknown: true means aicut DOES NOT KNOW whether the scene changed, and neither do you: not a success, never re-send at once (it would apply twice): say it could not be confirmed, read that scene's summary in get_video, and send again only if it lacks the change. COST: one standard image at the series' RESOLVED start-frame model, the same as regenerate_story_frame (pricing.frame_regen_tokens). estimate_only: true spends nothing and changes NOTHING: pass the real change with it so a refusal (dialogue_only, a reference-built scene) comes back BEFORE you ask for a spend (best-effort; it can answer 429 utility_rate_limited). THE GO THIS ONE NEEDS: one change, one named scene, one priced ask: a complaint ('scene 3 is wrong') is a reason to ASK what should change and OFFER this with its price, never a go. Never change more scenes than named. Changing a scene is not firing. SPENDS TOKENS: price with estimate_only: true, ask in the SAME message as the price, and wait for a go that names THIS purchase (SPENDING RULES, this server's instructions). IDEMPOTENCY: idempotency_key keys the PICTURE only: a reused key replays that picture, but the scene's text is rewritten again on every call, so after an unknown outcome check get_video first (see above) instead of resending.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| change | Yes | What should be different, as ONE plain sentence in the user's own words ('the kid should look super sad'). It must be VISIBLE (setting, action, who is in frame): a sentence only about what somebody SAYS is refused (`dialogue_only`). At most 600 characters. | |
| video_id | Yes | The episode's job id from `generate_story_video`. | |
| scene_index | Yes | The zero-based scene index exactly as `get_video`'s `story.frames` lists it (users count from ONE: 'change scene 2' is the SECOND frame). | |
| estimate_only | No | Price only; creates nothing. | |
| idempotency_key | No | Retry-safety key (IDEMPOTENCY). |