Nodes/Jingyuma Storyboard/Jingyuma Refresh Shot
ComfyUI Node

Jingyuma Refresh Shot

Reroll the One Shot That Came Back Flat

By huchengAI·Created 2 months ago·Updated 25 days ago· 1
Jingyuma Refresh Shot
    • new_prompt
    ◄shot_text►
    ◄api_key►
    ◄modemood►
    ◄moodHealing / Warm►
    ◄themeTransmigration System►

    Fixing one shot without redoing the chapter

    You generated a storyboard, rendered eleven shots, and shot 12 is dull - flat lighting, no tension, the character just standing there. Your options are usually "hand-edit the prompt and hope" or "regenerate everything," and inside this pack the second one isn't even available: the Storyboard node's output is cached, so re-queueing it gives you the identical forty shots.

    Refresh Shot is the third option. You hand it one shot's source sentence, tell it which emotional or genre lens you want this time, and it comes back with a different description of that same moment. Same story beat, different read.

    Feed it the right text

    This is the trap, and it's the one thing to internalize. shot_text wants the shot's original prose - the line from your novel that the storyboard engine split out - not the visual prompt it produced. The tooltip says it plainly: copy from the original_text field in raw_json.

    Why it matters: if you paste a visual description into a node whose whole job is to write visual descriptions, you're asking it to describe a description. Details compound, the shot drifts away from your actual scene, and three refreshes later you're rendering something the chapter never said. Pull original_text out of the raw_json output of the Storyboard node and work from that.

    Inputs, outputs, and the two dropdowns

    Required: shot_text (multiline) and api_key. Also required, oddly, are the two enrichment dropdowns - mood and theme - because this node has no "off" state. mood defaults to Healing / Warm from a set of ten; theme defaults to Transmigration System from a set of twenty-one. Note what's missing compared to the Storyboard node: no "(not set)" and no "(auto detect)". You must name a lens.

    mode picks which one applies - mood or theme, default mood. Both widgets sit on the node either way; only the one matching the mode is sent. And there's no basic option here, because there's nothing to refresh in basic mode: the tooltip says fast mode has no refresh, and the README backs it up by marking this a Standard/Pro feature.

    The output is a single STRING, new_prompt. No [Shot NNN] prefix - it's a bare description, so it goes straight into a CLIP Text Encode, or into your notes next to the shot you're replacing.

    What it does under the hood

    It POSTs to a different endpoint than the Storyboard node - /api/v1/rotate_variant rather than /api/v1/generate - with {shot_text, mode} plus whichever enrichment applies, and returns the server's data.visual. Same key, same header, no model on your machine.

    Two consequences of the implementation worth knowing. First, there is no use_cache toggle on this node, unlike Storyboard, and that's the honest design: a cached reroll is a contradiction. Every time it executes, it costs. Billing follows the character count of the shot's original sentence, which is cheap for one line - but it's a metered call, so treat it as one.

    Second, its error handling is thinner than the Storyboard node's. Instead of the friendly per-code messages, you get Refresh failed 401: … or Refresh failed 403: …. Read the number: 401 is your key, 403 usually means your plan doesn't cover mood or theme refresh, 402 means credits.

    Making it actually roll again

    ComfyUI only re-runs a node whose inputs changed. Queue the workflow twice with the same everything and nothing happens - no new variant, no charge, just the same new_prompt from cache. To get a genuinely different reading you have to change an input: flip mode to theme, or pick a different mood from the list. Ten moods and twenty-one themes means there's real variety on tap for one sentence, though you'll keep maybe one in five.

    The workflow I'd actually use: keep a Refresh Shot node parked next to the split-shot branch, paste the problematic line into it, and iterate the mood until you get a description worth rendering. Then paste the winning new_prompt into a text node and feed that to the sampler, rather than leaving the refresh node in the live path - otherwise every unrelated change you make to the graph is a chance to re-bill it.

    Install

    Same pack, same two minutes. ComfyUI Manager → search Jingyuma Storyboard (publisher huchengAI), or:

    cd ComfyUI/custom_nodes/
    git clone https://github.com/huchengAI/comfyui-jingyuma-storyboard.git
    pip install -r requirements.txt
    

    Restart ComfyUI; all three nodes land under the Jingyuma category. The only dependency is requests - nothing to download, no GPU work. You'll need an API key from https://shotstory.cn/?register=1 (phone number plus SMS code; the key is copied to your clipboard on signup), and a plan that includes refresh - the free tier does not.

    CategoryJingyuma

    Inputs (5)

    NameTypeDefaultDescription
    shot_textSTRINGShot's original text (copy from the 'original_text' field in raw_json)
    api_keySTRINGJingyuma API key
    modeCOMBOmoodRefresh requires 'mood' or 'theme'. Fast mode (basic) has no refresh.
    moodCOMBOHealing / WarmOnly used when mode = mood
    themeCOMBOTransmigration SystemOnly used when mode = theme

    Outputs (1)

    NameTypeDescription
    new_promptSTRING—