Spark Video Cast logo

Spark Video Cast

Organization
modelstudioai
spark-video-cast

Scaffold and generate reference assets for characters (cast), locations (movie-set / set dressing), and key props — the three pillars of visual consistency in spark-video. Wraps bl image generate / edit for portrait creation. Use when adding new characters/locations/props or when costume/state changes are needed.

Overview

Publishermodelstudioai
Repositoryskills
Skill namespark-video-cast
Stars
59
Forks
8
Bundled files
Instructions only
LicenseApache-2.0
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by modelstudioai on GitHub. Read the source before you install it.

Installation

Install the Spark Video Cast AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/modelstudioai/skills/tree/main/skills/spark-video/references/spark-video-cast
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/modelstudioai/skills.git /tmp/skills
mkdir -p .claude/skills
cp -r /tmp/skills/skills/spark-video/references/spark-video-cast .claude/skills/spark-video-cast
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Spark Video Cast in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Spark Video Cast on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Spark Video Cast is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Cast / Set / Prop Skill — spark-video Art Department (all-in-one)

You are the art department of the pipeline. Your job is to scaffold folder structures and generate reference images for the three things that pin visual consistency:

PillarPinsFolder pattern
CastFaces, hairstyle, costume, buildcast/<name>/
Movie-setLocations, lighting, decormovie-set/<name>/
PropHero objects that recur or change stateprops/<name>/

All three follow the same mental model: one folder = one reference image = one frozen visual state. State changes (day→night, intact→torn, casual→formal) = separate folders.

Set env vars:

bash
export SPARK_VIDEO_PROJECT=<project_id>
export SPARK_VIDEO_EPISODE=<NN>
export SPARK_VIDEO_PHASE=portrait

Two-tier model — project vs episode

Both cast, set, and prop live under two tiers. Episode tier overrides project tier on name collision:

projects/<p>/
├── cast/<name>/          ← project mains (shared across all episodes)
├── movie-set/<name>/     ← project recurring locations (sitcom rooms)
├── props/<name>/         ← project recurring hero objects
└── <episode>/
    ├── cast/<name>/      ← episode NPCs OR project-cast overrides (fork)
    ├── movie-set/<name>/ ← one-off locations for this episode
    └── props/<name>/     ← one-off or state-overrides for this episode

Use the project tier when an asset is shared across episodes (sitcom recurring rooms, series mains). Use the episode tier for one-off NPCs / locations / state-changes (episode-wide costume forks, episode-only hero items, one-off rooms).

⚠ THE ONE-FOLDER-ONE-STATE RULE (hard rule, applies to all 3)

The video model reads reference images literally. Mixing two visual states into one folder produces a muddy averaged intermediate.

Pillar"Same X, different…" → separate folder
CastEpisode-wide costume change (wedding dress / battle wounds / period vs modern) → fork into episode tier
SetTime-of-day (day/night), season (spring/autumn), color grade (cool/warm), weather (clear/rain)
PropState (intact/creased/torn), damage (clean/bloodied), open/closed

Naming convention: <base_name>-<discriminator>:

  • 同福客栈大堂-白天 / 同福客栈大堂-夜晚
  • 红包-完整 / 红包-起皱 / 红包-撕碎
  • 陆辰-汉服 (forked from 陆辰 for one episode)

Procedure 1 — scaffold a cast

1.1 Lead / project-tier character

bash
# Scaffold the folder + soul card template
uv run scripts/scaffold.py cast --name "陆辰"
# Edit projects/<p>/cast/陆辰/cast.md to fill: age, gender, personality, catchphrase,
# visual anchor (one-line appearance), do / don't

Then generate the portrait via bl:

bash
./scripts/bl image generate \
  --model wan2.6-t2i \
  --prompt "28-year-old man, short hair, dark T-shirt, photorealistic style, half-body portrait, $(uv run scripts/scaffold.py mood-anchor)" \
  --size 16:9 \
  --out-dir projects/$SPARK_VIDEO_PROJECT/cast/陆辰/ \
  --out-prefix portrait

Notes:

  • Default model wan2.6-t2i: produces stable cast portraits compatible with downstream r2v. qwen-image-2.0 is newer but visual style differs; test before switching.
  • Append lore.mood_anchor to every portrait prompt so the visual style matches the rest of the production. The scaffold.py mood-anchor helper prints lore's mood_anchor for piping.
  • Drop one ground-truth photo into the folder if you have one (real actor reference, hand-drawn concept art) — it overrides the generated portrait at r2v time.

Optional: voice reference for reference-voice r2v (Wan / bl both support):

  • Drop a 5–10s clean speech sample as voice.mp3 in the cast folder.

1.2 NPC (episode-only)

bash
uv run scripts/scaffold.py cast --name "钱夫人" --episode
# → projects/<p>/<ep>/cast/钱夫人/

./scripts/bl image generate \
  --model wan2.6-t2i \
  --prompt "middle-aged woman, stout build, dark silk hanfu, gold hairpin, shrewd worldly expression, $(uv run scripts/scaffold.py mood-anchor)" \
  --out-dir projects/$SPARK_VIDEO_PROJECT/episode-$SPARK_VIDEO_EPISODE/cast/钱夫人/ \
  --out-prefix portrait

Then re-init the merged cast.json:

bash
uv run scripts/scaffold.py cast-init   # merges project + episode tiers

1.3 Cast fork — episode-wide costume change

When a character needs a different outfit for THIS episode only (wedding, period costume, battle-damaged version), DO NOT solve it in shot prompts. Fork the portrait:

bash
# Deep-copy the project cast folder into the episode, drop old portrait
uv run scripts/scaffold.py cast --fork --name "陆辰" --drop-portraits

# Regenerate the portrait with the new appearance
./scripts/bl image edit \
  --image projects/$SPARK_VIDEO_PROJECT/cast/陆辰/portrait1.png \
  --prompt "Change the character's outfit to a large red traditional Chinese wedding robe and red wedding cap; keep face and hairstyle unchanged, $(uv run scripts/scaffold.py mood-anchor)" \
  --out-dir projects/$SPARK_VIDEO_PROJECT/episode-$SPARK_VIDEO_EPISODE/cast/陆辰/ \
  --out-prefix portrait

uv run scripts/scaffold.py cast-init

bl image edit preserves face identity better than bl image generate for forks — always prefer edit when you have a project-tier portrait to base from.

For pixel-perfect face identity (edit can still drift slightly), drop a hand-edited PNG into the episode cast folder instead of using bl.

Procedure 2 — scaffold a movie-set

2.1 When to scaffold a set

Scaffold whenever:

  • Two or more shots happen in the same location with the same lighting.
  • The location matters enough that drift would be noticeable (recurring sitcom rooms, hero locations, key emotional spaces).
  • A location returns under DIFFERENT lighting → scaffold one new folder per lighting state.

Skip for one-shot pass-throughs or pure outdoors with no fixed landmarks.

2.2 Naming — lighting state in the folder name

Same physical place, different…Action
Time-of-day (day / dusk / night / pre-dawn)Separate folders (客栈大堂-白天, 客栈大堂-夜晚)
Season (spring / summer / autumn / winter)Separate if visible (willows / snow / red leaves)
Color grade (memory cold gray / present warm yellow / high-contrast neon)Separate folders
Weather (clear / rain / snow / fog)Separate when weather is in frame
Decor unchanged, action just moves around the roomSame folder

2.3 Scaffold + generate

bash
# Project-tier sitcom recurring room
uv run scripts/scaffold.py set --name "同福客栈大堂-白天"

# Episode-tier one-off
uv run scripts/scaffold.py set --name "出租屋客厅-暖灯" --episode

# Generate the reference image (description MUST include the lighting/
# season/tone you committed to in the folder name)
./scripts/bl image generate \
  --model wan2.6-t2i \
  --prompt "Ming-Qing style wooden inn lobby, two-story wooden staircase, red lanterns, three square tables, daytime natural light through windows, warm yellow tone, $(uv run scripts/scaffold.py mood-anchor)" \
  --size 16:9 \
  --out-dir projects/$SPARK_VIDEO_PROJECT/movie-set/同福客栈大堂-白天/ \
  --out-prefix set

# Rebuild movie_set.json
uv run scripts/scaffold.py set-init

The set.md frontmatter has explicit time_of_day / season / color_grade / lighting / weather axes — fill them in. They're informational today, but they're the contract that prevents a future director from reusing a daytime set in a night shot.

Procedure 3 — scaffold a prop

3.1 When to promote an object to a key prop

Promote any object to a key prop when it satisfies either:

  • It appears in 2+ shots and the audience would notice if it changed shape/material/color/wear (the red envelope in S01-003 → S01-007 → S04-002).
  • It's a story-critical hero object even in a single shot (the ring proposal close-up; the key reveal).

Skip for background dressing or non-recurring objects whose look doesn't matter to the plot. Budget: 3–6 named props per episode, more is a smell.

3.2 Scaffold + generate

bash
# Project-tier recurring prop (family heirloom)
uv run scripts/scaffold.py prop --name "戒指-完整"

# Episode-tier one-off or state-change
uv run scripts/scaffold.py prop --name "红包-起皱" --episode

# Generate a clean product-style reference image when no photo exists
./scripts/bl image generate \
  --model wan2.6-t2i \
  --prompt "Standard Chinese red envelope, large red hot-stamped pattern, printed with '囍', flat with no creases, pure white background, product photography style, $(uv run scripts/scaffold.py mood-anchor)" \
  --size 1:1 \
  --out-dir projects/$SPARK_VIDEO_PROJECT/props/红包-完整/ \
  --out-prefix prop

# State change — produce creased state as a separate folder + image
./scripts/bl image edit \
  --image projects/$SPARK_VIDEO_PROJECT/props/红包-完整/prop1.png \
  --prompt "Add obvious creases and grip-worn folds to the red envelope; keep color, print, and shape exactly unchanged" \
  --out-dir projects/$SPARK_VIDEO_PROJECT/episode-$SPARK_VIDEO_EPISODE/props/红包-起皱/ \
  --out-prefix prop

# Rebuild props.json
uv run scripts/scaffold.py prop-init

For state changes, always prefer bl image edit with the base state image as input — preserves shape/print/material continuity. bl image generate from scratch will draw a different-looking red envelope each time.

Generation tips (apply to all three)

Mood anchor — append it to every t2i prompt

bash
# Helper that prints lore's mood_anchor for piping:
uv run scripts/scaffold.py mood-anchor

Without it, your asset visual style won't match the rendered shots.

Aspect ratio defaults

Asset type--size
Cast portrait (half-body)16:9 or 3:4
Cast portrait (full-body)9:16
Set establishing16:9
Prop (product-style)1:1

Batch generation in parallel

bl image generate supports --n N --concurrent K — useful when scaffolding many NPCs or sets at once. Each --n produces a candidate; keep the best, delete the rest.

bash
./scripts/bl image generate --n 3 --concurrent 3 \
  --model wan2.6-t2i \
  --prompt "..." \
  --out-dir projects/.../cast/陆辰/ \
  --out-prefix candidate
# → candidate1.png, candidate2.png, candidate3.png; rename winner to portrait1.png

Multi-image merge (cast fork only)

bl image edit accepts multiple --image flags. Useful when forking a cast with a costume reference photo:

bash
./scripts/bl image edit \
  --image cast/陆辰/portrait1.png \
  --image refs/hanfu-reference.png \
  --prompt "Dress the person in 图1 in the hanfu from the reference in 图2; keep face and hairstyle unchanged" \
  --out-dir projects/.../episode-X/cast/陆辰/

After scaffolding — rebuild manifests

The merged manifests (cast.json, movie_set.json, props.json) must be rebuilt after any folder change. They drive the director's shot-id lookups and the renderer's media[] resolution:

bash
uv run scripts/scaffold.py cast-init
uv run scripts/scaffold.py set-init
uv run scripts/scaffold.py prop-init
# or all three:
uv run scripts/scaffold.py manifests

Tell the director (or the producer at GATE 2) when you've added new assets — they need to read the updated manifests before storyboarding any scene that references them.

DON'Ts

  • ❌ Don't put two lighting states (day + night) in the same set folder. The model averages and produces "neutral gray noon-night" garbage.
  • ❌ Don't put two prop states (intact + creased) in the same prop folder. Same reason.
  • ❌ Don't solve a costume change by writing "wearing XXX" in shot prompts. Fork the cast portrait instead.
  • ❌ Don't omit the mood_anchor in t2i prompts. Visual cohesion will break across shots vs portraits.
  • ❌ Don't use generic names like cast/nurse — name by role+story-id (cast/nurse-xiaoli). When two episodes both have a "nurse", you can't tell whose portrait is whose.
  • ❌ Don't generate reference images with --watermark. The watermark becomes a baked-in artifact that drifts into rendered shots.
  • ❌ Don't skip scaffold.py *-init after adding folders. The manifests are the only thing the rest of the pipeline reads.

Frequently asked questions

What does the Spark Video Cast AI skill do?

Scaffold and generate reference assets for characters (cast), locations (movie-set / set dressing), and key props — the three pillars of visual consistency in spark-video. Wraps bl image generate / edit for portrait creation. Use when adding new characters/locations/props or when costume/state changes are needed.

Why use Spark Video Cast on TypingMind?

Because you install it once and use it with any model. Spark Video Cast is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Spark Video Cast in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/modelstudioai/skills/tree/main/skills/spark-video/references/spark-video-cast. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Spark Video Cast?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Spark Video Cast?

As many as you like. As long as a model supports skills, you can use Spark Video Cast with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Spark Video Cast AI skill free?

Yes. It is published on GitHub by modelstudioai under the Apache-2.0 license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇