0xsline/video-gen
| AI video generation via Seedance 2.0, Kling, and MiniMax Hailuo. Use when the user wants to generate a video clip — text-to-video, image-to-video, first/last-frame transitions, reference-guided generation, multi-shot, or generatively editing / extending an existing clip.
npx skills add https://github.com/0xsline/OpenChatCut --skill video-gen
Submits one video generation job per call and returns a jobId. Job management (wait / status) belongs to track_progress; this skill does not place videos on the timeline automatically.
Any time the user wants to generate a video clip — text-to-video, image-to-video, first-last-frame transition, reference-based generation, multi-shot storyboard, or generatively editing / extending an existing video (producing new generated footage based on a source clip; not timeline trimming).
| Model | Reference | Strengths |
| --- | --- | --- |
| seedance2 | references/seedance2.md | Default when configured. Multimodal refs, first/last, edit/extend/bridge, 2–15s, 480p/720p/1080p/4k, audio/seed/camera/watermark/last-frame/task controls. |
| kling | references/kling.md | Technical camera/performance; Omni multi-shot; images ≤7 (≤4 with one feature refVideos); std/pro; 3–15s. |
| hailuo | references/hailuo.md | MiniMax 海螺. T2V / I2V / first+last; 6s or 10s; 512P (Hailuo-02), 720p→768P, 1080P (6s); no multi-ref / multi-shot. |
IMPORTANT: Before generating, READ the chosen model's reference for capabilities, input channels, modes, prompt structure, and model-specific behavior. Never invent params the reference forbids.
Respect configured vendors from the capabilities prompt (only call a model whose key is on).
model, if configured.seedance2 when Seedance is configured.kling. Else if only MiniMax is on → hailuo.kling (confirm if not user-named).seedance2.hailuo with duration 6 or 10.If the required model is not configured, say so and offer: another configured video vendor, upload, or Motion Graphic — do not pretend the API exists.
Briefly tell the user what you will generate before submitting.
| Param | Values | Default |
| --- | --- | --- |
| prompt | video description | required (except Kling customize → use multiPrompts) |
| model | seedance2, kling, hailuo | seedance2 when available |
| durationSeconds | model-specific | seedance/kling ~5; hailuo 6 or 10 (1080p → 6 only) |
| ratio | see model docs | 16:9 (seedance/kling); ignored on hailuo |
| resolution | 480p, 512p, 720p, 1080p, 4k | provider-specific; hailuo adds 512p for Hailuo-02 |
| refVideoMode | feature, base | kling only, with refVideos |
| promptOptimizer / fastPretreatment | boolean | hailuo only |
| generateAudio, seed, cameraFixed, watermark | controls | seedance only |
| returnLastFrame, executionExpiresAfter, priority | controls | seedance only; requested last frame becomes another image asset |
| name | descriptive asset name | required for good pool UX |
| firstFrame | project image asset ref | optional |
| lastFrame | project image asset ref | seedance / kling / hailuo (requires firstFrame; not with multi-ref on seedance) |
| refImages / refVideos / refAudios | asset refs | seedance full; kling: images + 1 feature video (no audio); hailuo: none (frames / S2V subject) |
| mode / shotType / multiPrompts | Kling multi-shot | kling only |
Model-specific params — see the model's reference.
firstFrame / lastFrame / refImages / refVideos / refAudios all take a project asset reference. Prefer a full UUID or short prefix from read_project; asset://<id> and same-project asset URLs returned by read_project are also accepted. Per-slot type: frame slots and refImages → image; refVideos → video; refAudios → audio.
External URLs and base64 are not accepted. If the source is a public URL, download it into the project first (download_media for video/audio, submit_image for images) and pass the resulting asset id.
Four-step loop. For each new generation, restart from Step 1 if the user's intent has shifted.
Before writing any prompt, align on three dimensions:
If the user has already stated a direction ("做一段", "in one video", "分别生成", "split into N shots", etc.), follow it — don't second-guess.
Otherwise, surface the two paths and let the user pick:
Offer the trade-off; do not pick for the user.
Focus on the items that matter for this specific request and can't be safely inferred — don't turn this into a blank-filling exercise. Summarize the understood parts back to the user before proceeding.
For each dimension, check the user's words:
See the chosen model's reference for prompt structure and param combinations (e.g., Seedance's 8-element structure and modes; Kling's prompt tips). Before submitting, check:
name is a descriptive asset name — descriptive enough for the user (and you in later turns) to recognize this asset in the project library. Avoid vague names like "Untitled" or "clip 1".Submit one generation job at a time. Unless the user explicitly asked for multiple clips in parallel, do not submit the next clip until the current one completes and the user has reviewed it. Parallel submission hides problems: if the first shot has drift or wrong framing, the user would rather redo it once than have several misaligned shots to discard.
submit_video.ratio controls the generated asset only; it does not change the project timeline canvas. If the user requested a final output aspect ratio (for example "9:16 vertical" or "16:9 landscape"), set the timeline canvas to the same ratio with manage_timelines action=update (e.g. ratio:"9:16") before placing the completed asset. If the user asked for no black bars / full-bleed, pass fit:"cover" when setting the canvas or updating/adding the visual item.track_progress tool for status/wait.When the user wants a next clip, a revision, or a continuation:
Text alone cannot reliably maintain visual identity across shots; visual references constrain output far more precisely than words.
An anchor is a reference image or video pinned across every shot that shares the same character, object, or style. Any multi-shot sequence with recurring visual elements needs an anchor — don't try to reproduce them from text.
Have reference awareness. When the user's request involves a recurring character / object / scene, think about what anchor to use before writing prompts:
When no existing asset fits and one must be generated, propose it to the user first — it shapes every downstream shot. Model-specific paths — see the chosen model's ref.
@Image1 / @Video1 in the prompt — not vague phrases like "the same car as before".track_progress with action=wait) to obtain its assetId, then pass it as the anchor reference. Do not submit dependent shots in parallel.When a project has multiple named characters with distinct attributes (e.g. Faz with fire energy, Kev with ice energy), treat each character as a separate anchor — one reference asset per character. In every prompt:
Missing either explicit attribution or negation causes cross-character attribute mixing.
Multiple characters in the same frame. For shots where multiple characters appear together (especially facing the camera), the model is prone to face-swap or body-clipping. Add strong positional + outfit anchors to each character and prefer a fixed camera for that shot:
Positional words (left / right / foreground / background) + distinctive outfit colors give the model enough signal to keep the characters apart.
If a visual-identity issue (wrong character, drift, color mismatch) persists after two text-prompt adjustments on the same shot, stop adjusting text. Text is not a substitute for an anchor. Escalate to:
Do not submit a third text-only retry on the same consistency issue.
Simple, one-off, or exploratory requests do not need anchors — generate directly.
// Text-to-video (seedance2 default)
submit_video({
model: "seedance2",
prompt: "A cat walks across a sunny windowsill",
name: "Cat on windowsill",
});
// Image-to-video with seedance2 — pass the project asset id directly; the server resolves the asset's media URL
submit_video({
model: "seedance2",
prompt: "The scene comes to life, gentle breeze rustles the curtains",
firstFrame: "abc12345",
name: "Living room animation",
});
// Kling text-to-video — only after Model Selection check
submit_video({
model: "kling",
prompt: "A sports car drifts around a wet corner",
name: "Car drift shot",
});
// MiniMax Hailuo — 6s or 10s; optional firstFrame / lastFrame (with first)
submit_video({
model: "hailuo",
prompt: "A ceramic cup steams on a wooden table, soft morning light [Push in]",
durationSeconds: 6,
resolution: "720p",
name: "Coffee steam morning",
});
After submission, call the track_progress tool: action=status jobIds=<jobId> to poll, action=wait jobIds=<jobId> to block until terminal.
For complex multimodal jobs, build the full args object up front and pass it in a single call:
submit_video({
model: "seedance2",
prompt: "...",
name: "...",
firstFrame: "abc12345",
refImages: ["def67890", "ghi24680"],
refVideos: ["abc99999"],
refAudios: ["jkl55555"],
durationSeconds: 8,
ratio: "9:16",
});
--name with a descriptive asset name.--job, --wait, or --timeout — job management belongs to track_progress.edit_item only after the user wants them on the timeline (pool-first contract).Take 0xsline/video-gen from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.