Install
openclaw skills install dlazy-idea2videoTurn a user's idea into a detailed video pipeline by generating story, characters, portraits, scenes, shots, keyframes, and concatenated shot videos via a pl...
openclaw skills install dlazy-idea2video所有请求都需要 dLazy API key。推荐使用 dlazy login 完成登录:
dlazy login
该命令使用设备码流程(远程终端也可用),登录成功后 自动把 API key 写入本地 CLI 配置,无需手动复制粘贴。
如果你已有 API key,也可以直接保存:
dlazy auth set YOUR_API_KEY
CLI 会把 key 保存在你的用户配置目录(macOS/Linux 上为 ~/.dlazy/config.json,Windows 上为 %USERPROFILE%\.dlazy\config.json),文件权限仅限当前操作系统用户访问。你也可以用 DLAZY_API_KEY 环境变量按次传入。
每个 key 都属于你自己的 dLazy 组织,可在同一控制面板随时轮换或吊销。
@dlazy/cli(本技能 install 字段固定到 1.0.9 版本)如果你不希望在系统上长期保留一个全局 CLI,可以按需运行:
npx @dlazy/cli@latest <command>
如选择全局安装,技能的 metadata.clawdbot.install 字段已固定到 npm install -g @dlazy/cli@latest。安装前建议先到 GitHub 仓库审阅源码。
此技能是 dLazy 托管 API 的轻量封装。调用时:
api.dlazy.com)进行推理。files.dlazy.com),以便模型读取 —— 与任何云端生成 API 的流程一致。files.dlazy.com 托管。这是标准的 SaaS 调用模式;技能本身不会越权访问网络或文件系统,所有动作都由 dLazy CLI 完成。
Turn a user's idea into the full pipeline: story → characters → 3-view portraits → scenes → shots → keyframes → shot videos → concat. First emit a plan template for the user to confirm, then expand it into canvas shapes and call drawToCanvas.
Every reply must start with this line:
**Current State:** [state] | **Next:** [goal]| State | Goal | Needs user confirmation |
|---|---|---|
| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |
| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |
| 3. Plan adjustment | Patch the template per user feedback | ✅ |
| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |
| 5. Apply to canvas | Call drawToCanvas to write shapes | ❌ |
Collect these inputs; ask if any is missing:
idea — the core creative seed (one sentence to one paragraph)user_requirement — audience / runtime / max scenes / max shots (optional)style — visual style ("realistic warm", "cyberpunk", "watercolor 2D"...)aspectRatio — defaults to 16:9; alternatives 9:16 / 1:1sceneCount — let the model decide by default, but discloseshotsPerScene — let the model decide by defaultOutput a bulleted requirement list, ending with:
<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>Build a plan template per the Plan Template Schema (see Appendix A).
Construction rules:
Strictly use models registered in config/models/. Recommended for idea2video:
qwen3_6-plus — every LLM step (story / characters / script / storyboard / shot decomposition)banana-pro — character 3-view portraits, shot first/last framesveo_3_1-fast — shot videos (i2v)merge — video concatenationMirror the canonical 7-segment idea2video structure (Appendix B):
develop_story (LLM)extract_characters (LLM, parse=json)portraits (map: front → side/back)write_script (LLM, parse=json)scenes map (with nested shots map)
storyboard (LLM, parse=json)shots map: shot_desc → first_frame → last_frame(when) → shot_videoscene_concat (merge)final_video (merge)Reference rules (critical, do not get wrong):
promptRefs: ["$node.X"]; do not inline shape:// inside prompt.{{$node.X.json.field}} placeholder inside prompt.images / videos / audio arrays; values use $node.X or shape://shape:X.$node.<mapId>[*].<bodyId> (e.g. $node.portraits[*].front).$item, index is $idx; nested maps access outer index via $ctx.<outerMapId>.idx.Do not paraphrase tool prompts — keep field names aligned with each model's inputSchema.
when for conditional nodes (e.g. last_frame only when variation_type ∈ {medium, large}):
"when": { "$in": ["$node.shot_desc.json.variation_type", ["medium", "large"]] }
When presenting to the user, summarize in plain language, do not expose raw JSON:
The plan will create X nodes:
· 1 story node
· 1 character-extraction node
· Character 3-views (front + side + back, expanded per character)
· 1 scenes node
· Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node
· 1 final concat node
Models:
· LLM: qwen3_6-plus
· Image: banana-pro
· Video: veo_3_1-fast
· Concat: merge
End with:
<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>Common requests:
Patch the template, re-summarize, wait for explicit confirmation again.
Expand the plan template into a flat shape list suitable for drawToCanvas.
tool node → 1 shape:
type is determined by the model's output type:
qwen3_6-plus → textbanana-pro / doubao-seedream-* → imageveo_* / doubao-seedance-* / kling-* → videomerge → video (or audio if merging audios)shape.id = shape:<templatePath> or shape:<templatePath>__i<iter> (inside a map)shape.props.model = template modelshape.props.input = template input, with all $node.X / $item.X / {{...}} resolved to literals or shape://shape:Y whenever possibleshape.props.input.promptRefs is built from template promptRefs: each $node.X → shape://shape:Xshape.parentId = enclosing frame shape id (when inside a map)shape.meta.fromTemplateId = the dotted template path (e.g., scenes.shots.first_frame)map node → 1 frame shape + body subtree per iteration:
type: "frame", props.name = the map's namewhen is false. If when references an upstream not yet completed (e.g. shot_desc.json.variation_type), expand optimistically: still emit the shape with status: "pending"; the runtime expander will reconcile after upstream completes.{{$node.X.json.field}} placeholders stay in the prompt string (status pending). Do not substitute placeholder text.(x, y, w, h) are not part of the plan — compute at drawToCanvas time:
direction.Call drawToCanvas with createShapes = the expanded shape list.
Pre-flight checks before the call:
props.input validates against the corresponding model's inputSchema (drawToCanvas re-checks; pre-checking saves a round-trip).shape://shape:X reference points to an X present in the same createShapes payload.parentId exists).After success, reply:
✅ Plan added to canvas (N nodes, M pending).
Click "Run Workflow" on the canvas to execute the whole pipeline.
Top level:
{
"version": 1,
"name": "idea2video",
"inputs": { "idea": {...}, "user_requirement": {...}, "style": {...} },
"output": "$node.final_video.url",
"nodes": [ /* tool or map nodes */ ]
}
Nodes:
// tool node
{
"id": "<unique>",
"kind": "tool",
"model": "<id registered in config/models>",
"name": "<display name; may use {{$item.X}} / {{$idx}} templates>",
"parse": "json", // optional — url contains JSON
"when": { "$in": [...] }, // optional — conditional node
"input": {
"prompt": "...containing {{$node.X.json.field}} placeholders...",
"promptRefs": ["$node.upstream"], // whole-text injection
"images": ["$node.front"], // media references
"imageSize": "1K",
...
}
}
// map node
{
"id": "<unique>",
"kind": "map",
"name": "<frame name>",
"over": "$node.upstream.json", // must resolve to an array
"mode": "parallel" | "sequential",
"direction": "horizontal" | "vertical",
"body": [ /* child template nodes */ ]
}
Assemble the plan with this fixed shape:
develop_story — qwen3_6-plus; prompt uses {{$input.idea}} and {{$input.user_requirement}}extract_characters — qwen3_6-plus; parse: "json"; promptRefs: ["$node.develop_story"]portraits — map(over=$node.extract_characters.json, parallel, horizontal)
front → side (images:[$node.front]) → back (images:[$node.front])write_script — qwen3_6-plus; parse: "json"; promptRefs: ["$node.develop_story"]scenes — map(over=$node.write_script.json, sequential, vertical)
storyboard — qwen3_6-plus; parse: "json"; promptRefs: ["$node.extract_characters"]shots — map(over=$node.storyboard.json, parallel, vertical)
shot_desc — qwen3_6-plus; parse: "json"; promptRefs: ["$node.extract_characters"]first_frame — banana-pro; prompt with {{$node.shot_desc.json.ff_desc}}; images: $node.portraits[*].frontlast_frame — banana-pro; when: variation_type ∈ {medium, large}; images: [$node.first_frame]shot_video — veo_3_1-fast; prompt with {{$node.shot_desc.json.motion_desc}} and {{$node.shot_desc.json.audio_desc}}; images includes first_frame (+ last_frame if present)scene_concat — merge; videos: $node.shots[*].shot_videofinal_video — merge; videos: $node.scenes[*].scene_concattaskId to the user — summarize with bullets.drawToCanvas fails (usually input not matching the model's schema), explain why and propose a fix.你是可以执行终端命令的智能 Agent!
【严格禁止行为】
【必须遵循的交互与执行流程】 你必须严格分步执行,并在每一步停下来等待用户回复:
dlazy seedream-4.5 --prompt "..."),每次只能执行一个生成命令。重要:必须使用同步命令,绝不要在命令末尾加 &,绝不要使用 &&,这是在 Windows PowerShell 下运行!