{"id":"6ae2176a-ee1d-4c25-bfcd-0ad8ee37ce24","entityType":"agent","slug":"clawhub-dlazyai-dlazy-idea2video","name":"创意转视频 Idea to Video","canonicalUrl":"https://www.xpersona.co/agent/clawhub-dlazyai-dlazy-idea2video","canonicalPath":"/agent/clawhub-dlazyai-dlazy-idea2video","generatedAt":"2026-10-09T23:35:53.693Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:47:26.422Z","emptyReason":null},"description":"Turn a user's idea into the full pipeline: **story → characters → 3-view portraits → scenes → shots → keyframes → shot videos → concat**. First emit a **plan...","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 3.8K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:dlazy-idea2video","sourceUrl":"https://clawhub.ai/dlazyai/dlazy-idea2video","homepage":"https://clawhub.ai/dlazyai/skills/dlazy-idea2video","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/dlazyai/dlazy-idea2video","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/dlazyai/skills/dlazy-idea2video","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":72,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"创意转视频 Idea to Video technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:47:26.422Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:47:26.422Z","emptyReason":null},"stars":null,"forks":null,"downloads":3798,"packageName":null,"latestVersion":"1.3.29","tractionLabel":"3.8K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:47:26.422Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T06:47:26.422Z","lastCrawledAt":"2026-10-09T06:47:26.422Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T06:47:26.422Z","lastVerifiedAt":null,"highlights":[{"version":"1.3.29","createdAt":"2026-10-08T01:13:19.634Z","changelog":"例行版本更新 2026-10-08","fileCount":4,"zipByteSize":15672},{"version":"1.3.28","createdAt":"2026-10-04T01:12:02.521Z","changelog":"例行版本更新 2026-10-04","fileCount":4,"zipByteSize":15660},{"version":"1.3.27","createdAt":"2026-10-02T04:54:54.355Z","changelog":"例行版本更新 2026-10-02","fileCount":4,"zipByteSize":15593},{"version":"1.3.26","createdAt":"2026-09-30T01:11:23.589Z","changelog":"例行版本更新 2026-09-30","fileCount":4,"zipByteSize":15639},{"version":"1.3.25","createdAt":"2026-09-28T02:09:44.700Z","changelog":"例行版本更新 2026-09-28","fileCount":4,"zipByteSize":15569},{"version":"1.3.24","createdAt":"2026-09-28T01:12:12.597Z","changelog":"例行版本更新 2026-09-28","fileCount":4,"zipByteSize":15593},{"version":"1.3.23","createdAt":"2026-09-24T01:48:40.118Z","changelog":"例行版本更新 2026-09-24","fileCount":4,"zipByteSize":15657},{"version":"1.3.22","createdAt":"2026-09-22T01:09:51.944Z","changelog":"例行版本更新 2026-09-22","fileCount":4,"zipByteSize":15710}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:dlazy-idea2video","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:dlazy-idea2video` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/dlazyai/dlazy-idea2video before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T23:35:53.690Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-dlazy-idea2video/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T06:47:26.422Z","emptyReason":null},"readme":"Skill: 创意转视频 Idea to Video\n\nOwner: dlazyai\n\nSummary: Turn a user's idea into the full pipeline: **story → characters → 3-view portraits → scenes → shots → keyframes → shot videos → concat**. First emit a **plan...\n\nTags: latest:1.3.29\n\nVersion history:\n\nv1.3.29 | 2026-10-08T01:13:19.634Z | user\n\n例行版本更新 2026-10-08\n\nv1.3.28 | 2026-10-04T01:12:02.521Z | user\n\n例行版本更新 2026-10-04\n\nv1.3.27 | 2026-10-02T04:54:54.355Z | user\n\n例行版本更新 2026-10-02\n\nv1.3.26 | 2026-09-30T01:11:23.589Z | user\n\n例行版本更新 2026-09-30\n\nv1.3.25 | 2026-09-28T02:09:44.700Z | user\n\n例行版本更新 2026-09-28\n\nv1.3.24 | 2026-09-28T01:12:12.597Z | user\n\n例行版本更新 2026-09-28\n\nv1.3.23 | 2026-09-24T01:48:40.118Z | user\n\n例行版本更新 2026-09-24\n\nv1.3.22 | 2026-09-22T01:09:51.944Z | user\n\n例行版本更新 2026-09-22\n\nv1.3.21 | 2026-09-18T01:36:21.770Z | user\n\n例行版本更新 2026-09-18\n\nv1.3.20 | 2026-09-14T01:11:09.269Z | user\n\n例行版本更新 2026-09-14\n\nv1.3.19 | 2026-09-10T01:09:26.525Z | user\n\n例行版本更新 2026-09-10\n\nv1.3.18 | 2026-09-08T01:10:01.828Z | user\n\n例行版本更新 2026-09-08\n\nv1.3.17 | 2026-09-07T01:12:55.689Z | user\n\n例行版本更新 2026-09-07\n\nv1.3.16 | 2026-09-04T01:15:15.323Z | user\n\n例行版本更新 2026-09-04\n\nv1.3.15 | 2026-09-02T01:09:59.710Z | user\n\n例行版本更新 2026-09-02\n\nv1.3.14 | 2026-08-31T02:50:46.439Z | user\n\n源码仓库迁移至 github.com/dlazy-ai/cli\n\nv1.3.13 | 2026-08-24T09:21:38.950Z | user\n\nRestore Chinese display name\n\nv1.3.12 | 2026-08-17T09:03:41.371Z | user\n\nRestore Chinese display name\n\nv1.3.11 | 2026-08-10T05:45:18.768Z | user\n\nRestore Chinese display name\n\nv1.3.10 | 2026-08-10T03:59:53.739Z | user\n\nRestore Chinese display name\n\nv1.3.9 | 2026-07-21T07:53:36.019Z | auto\n\ndlazy-idea2video v1.3.9\n\n- Documentation updates in SKILL.md and SKILL-cn.md for clarity and accuracy.\n- Removed the deprecated skill-card.md file.\n- No logic or functionality changes; this release is documentation-only.\n\nv1.3.8 | 2026-07-21T02:16:03.070Z | auto\n\nVersion 1.3.8\n\n- Updated CLI version requirement to @dlazy/cli@1.2.3 in both install instructions and metadata.\n- Documentation changes in SKILL.md and SKILL-cn.md to match updated CLI guidance and improve clarity.\n- Removed outdated skill-card.md file.\n\nv1.3.7 | 2026-07-20T06:02:45.739Z | user\n\ntest-writeread\n\nv1.3.6 | 2026-07-20T05:57:47.817Z | user\n\ntest\n\nv1.3.5 | 2026-07-20T05:51:40.586Z | user\n\n规范 dlazy- 前缀命名，补充中文显示名\n\nv1.3.4 | 2026-07-17T10:36:32.826Z | auto\n\ndlazy-idea2video v1.3.4\n\n- Documentation updated in both English and Chinese guides (SKILL.md, SKILL-cn.md).\n- Obsolete or redundant file (skill-card.md) removed.\n- No functional or API changes; only docs and structure improved.\n\nv1.2.2 | 2026-07-17T08:42:11.527Z | auto\n\ndlazy-idea2video 1.2.2\n\n- Documentation updated: SKILL.md and SKILL-cn.md revised for clarity and accuracy.\n- Obsolete file removed: skill-card.md deleted.\n- No code or functional changes; this is a documentation maintenance release.\n\nv1.3.3 | 2026-07-09T01:46:39.136Z | user\n\nset Chinese display name for CN search\n\nv1.3.2 | 2026-07-09T01:46:24.656Z | user\n\nset Chinese display name for CN search\n\nv1.3.1 | 2026-07-09T01:28:03.140Z | user\n\nset Chinese display name for CN search\n\nv1.3.0 | 2026-07-07T19:42:12.774Z | auto\n\ndlazy-idea2video v1.3.0\n\n- Documentation updates in both English and Chinese guides (SKILL.md, SKILL-cn.md).\n- No functional or code logic changes—this is a doc-focused release.\n- Clarifies workflow, schemas, and recommended model usage.\n\nv1.2.1 | 2026-07-07T18:30:53.333Z | auto\n\n**dlazy-idea2video 1.2.1 Changelog**\n\n- Updated documentation (SKILL.md, SKILL-cn.md) with clearer pipeline and workflow descriptions.\n- Improved model recommendations: updated LLM from qwen3_6-plus to qwen3_7-plus in documentation.\n- Refined references and model usage instructions for generating video from idea.\n- Removed obsolete file: skill-card.md.\n- No functional code/API changes in this version—documentation and doc field updates only.\n\nv1.2.0 | 2026-06-02T10:03:39.078Z | auto\n\nidea2video 1.2.0\n\n- Updated CLI install instructions and metadata to always use the latest @dlazy/cli package, replacing version pinning.\n- Revised documentation for consistency with new install method (`npm install -g @dlazy/cli@latest`).\n- Removed the outdated skill-card.md file.\n\nv1.1.2 | 2026-06-02T01:40:31.815Z | user\n\nUpdate model skills (names/params refreshed); add search-audio/image/video\n\nv1.1.1 | 2026-05-06T14:13:06.606Z | auto\n\n- Documentation updates in both English and Chinese (SKILL.md, SKILL-cn.md).\n- No changes to functionality or workflow; the skill pipeline and instructions remain unchanged.\n- Version bump to 1.1.1 to reflect minor documentation edits.\n\nv1.1.0 | 2026-05-02T11:33:01.112Z | auto\n\nidea2video 1.1.0\n\n- Introduced a stateful workflow to guide users from idea input through video generation, with explicit user confirmation at each major planning step.\n- Added a canonical 7-segment idea-to-video pipeline: story → characters → 3-view portraits → script → scenes/shots → video generation → concatenation.\n- Enforced strict use of registered models for each workflow stage (qwen3_6-plus, banana-pro, veo_3_1-fast, merge).\n- Included detailed instructions and schema for plan template construction and canvas expansion.\n- Provided comprehensive authentication and usage instructions for both CLI and API key management.\n- Enhanced user guidance and suggestion prompts throughout the workflow.\n\nArchive index:\n\nArchive v1.3.29: 4 files, 15672 bytes\n\nFiles: skill-card.md (2193b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nFile v1.3.29:SKILL.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nFile v1.3.29:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"dlazy-idea2video\",\n  \"version\": \"1.3.29\",\n  \"publishedAt\": 1791421999634\n}\n\nFile v1.3.29:skill-card.md\n\n## Description:\n\nTurns an idea into a reviewable video-production plan covering story, characters, scenes, shots, images, and video assembly.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nCreators and production teams use this skill to turn an idea into a structured, user-reviewed plan for generating visual assets and assembling a video.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The canvas plan and later terminal-generation instructions conflict, leaving execution authority unclear.\n\nMitigation: Clarify the intended workflow with the publisher and require explicit user approval before running commands or starting generation.\n\nRisk: Installing or running the dLazy CLI and storing an API key locally may expose credentials or execute unreviewed commands.\n\nMitigation: Review CLI installation and generation commands before execution; use a per-run DLAZY_API_KEY when persistent storage is not desired.\n\nRisk: Prompts and supplied media are sent to dLazy services, and generation consumes remote resources.\n\nMitigation: Obtain approval for external uploads and resource use; avoid submitting sensitive material without authorization.\n\n## Reference(s):\n\n- [dLazy CLI source and usage reference](https://github.com/dlazy-ai/cli)\n- [dLazy CLI npm package](https://www.npmjs.com/package/@dlazy/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands, Configuration instructions, Media links]\n\n**Output Format:** [Markdown plans, canvas workflow guidance, command snippets, and generated media URLs]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Video generation and media delivery depend on dLazy services and user confirmation.]\n\n## Skill Version(s):\n\n1.3.29 (source: ClawHub release metadata; artifact frontmatter states 1.3.9)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.3.29:SKILL-cn.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nArchive v1.3.28: 4 files, 15660 bytes\n\nFiles: skill-card.md (2212b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nFile v1.3.28:SKILL.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nFile v1.3.28:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"dlazy-idea2video\",\n  \"version\": \"1.3.28\",\n  \"publishedAt\": 1791076322521\n}\n\nFile v1.3.28:skill-card.md\n\n## Description:\n\nHelps turn a creative idea into a reviewed video-production plan, canvas workflow, and generated media through dLazy services.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nCreators and developers use this skill to plan a story-to-video workflow, review its stages, and build a canvas pipeline for characters, scenes, shots, and a final video. It also describes optional dLazy CLI-assisted media generation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Executing an external CLI from the terminal may run unreviewed package code or leave a persistent global install.\n\nMitigation: Review the CLI package before use and prefer a contained environment or on-demand npx invocation over global installation.\n\nRisk: Prompts and referenced media are sent to dLazy services for processing.\n\nMitigation: Confirm that content is appropriate to share with the service before generation.\n\nRisk: The dLazy API key may be stored in local CLI configuration.\n\nMitigation: Protect local credentials, use a per-session environment variable when appropriate, and rotate or revoke exposed keys.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/dlazy-idea2video)\n- [dLazy CLI source (referenced by skill metadata; not verified skill provenance)](https://github.com/dlazy-ai/cli)\n- [dLazy CLI package](https://www.npmjs.com/package/@dlazy/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Guidance]\n\n**Output Format:** [Markdown plan summaries and instructions; canvas workflow shapes after approval]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Can return links to generated media when the external CLI is used.]\n\n## Skill Version(s):\n\n1.3.28 (source: ClawHub release metadata; bundled frontmatter says 1.3.9)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.3.28:SKILL-cn.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nArchive v1.3.27: 4 files, 15593 bytes\n\nFiles: skill-card.md (2099b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nFile v1.3.27:SKILL.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nFile v1.3.27:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"dlazy-idea2video\",\n  \"version\": \"1.3.27\",\n  \"publishedAt\": 1790916894355\n}\n\nFile v1.3.27:skill-card.md\n\n## Description:\n\nTurns an idea into a reviewable video-production plan, builds a canvas workflow for story, characters, scenes, shots and video assembly, and supports stepwise generation.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nCreators and teams use this skill to turn an idea into a confirmed production plan and canvas workflow for generating and assembling a video.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The dLazy CLI may save an API key on the local machine.\n\nMitigation: Review local credential storage before login and rotate or revoke the key if needed.\n\nRisk: Prompts and selected media may be sent to dLazy servers.\n\nMitigation: Share only content you are comfortable sending to the service.\n\nRisk: The workflow combines canvas planning with terminal-based generation commands.\n\nMitigation: Confirm each generation step, review commands before execution, and check the intended @dlazy/cli version before installing.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/dlazy-idea2video)\n- [dLazy CLI source (tool reference; skill import provenance unavailable)](https://github.com/dlazy-ai/cli)\n- [dLazy CLI npm package](https://www.npmjs.com/package/@dlazy/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Configuration, Shell commands]\n\n**Output Format:** [Markdown plan and status updates, canvas workflow configuration, and generation result links]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Plan review precedes canvas application; generation steps require user confirmation.]\n\n## Skill Version(s):\n\n1.3.27 (source: server-resolved ClawHub release; artifact frontmatter says 1.3.9)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.3.27:SKILL-cn.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nArchive v1.3.26: 4 files, 15639 bytes\n\nFiles: skill-card.md (2123b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nFile v1.3.26:SKILL.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nFile v1.3.26:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"dlazy-idea2video\",\n  \"version\": \"1.3.26\",\n  \"publishedAt\": 1790730683589\n}\n\nFile v1.3.26:skill-card.md\n\n## Description:\n\nGuides creators from an idea through a reviewed video-production plan, then expands the plan into canvas nodes for story, characters, scenes, shots, and final video assembly.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nCreators and production teams use the skill to turn a video idea into a reviewable story-to-video workflow on a canvas, with character portraits, shot frames, generated clips, and a final merge.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The workflow calls for terminal commands and installing a third-party CLI that stores an API key locally.\n\nMitigation: Review the CLI package before installation, use npx to avoid a persistent global install if preferred, and require explicit approval for each command.\n\nRisk: Prompts and referenced media may be transmitted to dLazy's hosted generation service.\n\nMitigation: Use only content authorized for upload and confirm the service and data-handling terms before sending sensitive material.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/dlazy-idea2video)\n- [dLazy CLI package](https://www.npmjs.com/package/@dlazy/cli)\n- [dLazy service](https://dlazy.com)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Markdown, Configuration, Shell commands]\n\n**Output Format:** [Markdown plan summaries and canvas workflow instructions, with optional CLI commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires user confirmation before advancing the plan or running generation commands; source-import provenance for this release is unavailable.]\n\n## Skill Version(s):\n\n1.3.26 (source: server-resolved ClawHub release metadata; bundled frontmatter says 1.3.9)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.3.26:SKILL-cn.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nArchive v1.3.25: 4 files, 15569 bytes\n\nFiles: skill-card.md (2001b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nFile v1.3.25:SKILL.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nFile v1.3.25:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"dlazy-idea2video\",\n  \"version\": \"1.3.25\",\n  \"publishedAt\": 1790561384700\n}\n\nFile v1.3.25:skill-card.md\n\n## Description:\n\nHelps users turn an idea into a confirmed video-production plan covering story, characters, scenes, frames, clips, and assembly.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nCreators and developers use this skill to plan a video from an idea, review its scenes and shots, and optionally create canvas workflows or generate media through dLazy.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Canvas planning and direct terminal generation instructions may lead to an unexpected execution path.\n\nMitigation: Review the proposed plan and commands, and confirm which workflow should run before execution.\n\nRisk: Prompts and selected local media may be sent to dLazy's cloud services.\n\nMitigation: Share only material approved for external processing and review selected media before upload.\n\nRisk: The dLazy API key may be stored in local CLI configuration.\n\nMitigation: Protect local credentials and rotate or revoke the key if it is exposed.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/dlazy-idea2video)\n- [dLazy CLI source (linked by the skill)](https://github.com/dlazy-ai/cli)\n- [dLazy CLI npm package](https://www.npmjs.com/package/@dlazy/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Markdown, Shell commands]\n\n**Output Format:** [Markdown with plan summaries, inline shell commands, and media URLs]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires user confirmation before expanding plans or generating media.]\n\n## Skill Version(s):\n\n1.3.25 (source: server-resolved ClawHub release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.3.25:SKILL-cn.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|---|\n| 1. Requirement gathering | Lock idea / audience / style / scale | ✅ |\n| 2. Plan generation | Build plan template; show node summary | ✅ (strict gate) |\n| 3. Plan adjustment | Patch the template per user feedback | ✅ |\n| 4. Canvas expansion | Expand template into flat shapes | ❌ (internal) |\n| 5. Apply to canvas | Call `drawToCanvas` to write shapes | ❌ |\n\n## State 1: Requirement Gathering\n\nCollect these inputs; ask if any is missing:\n\n- `idea` — the core creative seed (one sentence to one paragraph)\n- `user_requirement` — audience / runtime / max scenes / max shots (optional)\n- `style` — visual style (\"realistic warm\", \"cyberpunk\", \"watercolor 2D\"...)\n- `aspectRatio` — defaults to `16:9`; alternatives `9:16` / `1:1`\n- `sceneCount` — let the model decide by default, but disclose\n- `shotsPerScene` — let the model decide by default\n\nOutput a bulleted requirement list, ending with:\n\n- `<suggestion>Requirements ready — confirm to enter plan generation?</suggestion>`\n\n## State 2: Plan Generation\n\nBuild a plan template per the **Plan Template Schema** (see Appendix A).\n\nConstruction rules:\n\n1. **Strictly use models registered in `config/models/`**. Recommended for idea2video:\n   - `qwen3_6-plus` — every LLM step (story / characters / script / storyboard / shot decomposition)\n   - `banana-pro` — character 3-view portraits, shot first/last frames\n   - `veo_3_1-fast` — shot videos (i2v)\n   - `merge` — video concatenation\n2. **Mirror the canonical 7-segment idea2video structure** (Appendix B):\n   - `develop_story` (LLM)\n   - `extract_characters` (LLM, parse=json)\n   - `portraits` (map: front → side/back)\n   - `write_script` (LLM, parse=json)\n   - `scenes` map (with nested `shots` map)\n     - `storyboard` (LLM, parse=json)\n     - `shots` map: `shot_desc` → `first_frame` → `last_frame`(when) → `shot_video`\n     - `scene_concat` (merge)\n   - `final_video` (merge)\n3. **Reference rules** (critical, do not get wrong):\n   - Whole-text injection of an upstream → `promptRefs: [\"$node.X\"]`; **do not** inline `shape://` inside `prompt`.\n   - Sub-field injection from upstream JSON → keep `{{$node.X.json.field}}` placeholder inside `prompt`.\n   - Media references (image/video/audio) → put in `images` / `videos` / `audio` arrays; values use `$node.X` or `shape://shape:X`.\n   - Cross-iteration aggregation inside a map → `$node.<mapId>[*].<bodyId>` (e.g. `$node.portraits[*].front`).\n   - Inside a map, current item is `$item`, index is `$idx`; nested maps access outer index via `$ctx.<outerMapId>.idx`.\n4. **Do not paraphrase tool prompts** — keep field names aligned with each model's `inputSchema`.\n5. **`when` for conditional nodes** (e.g. `last_frame` only when `variation_type ∈ {medium, large}`):\n\n   ```json\n   \"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }\n   ```\n\nWhen presenting to the user, **summarize in plain language**, do not expose raw JSON:\n\n```\nThe plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge\n```\n\nEnd with:\n\n- `<suggestion>Plan ready — confirm to expand to canvas? Or tell me what to adjust.</suggestion>`\n\n## State 3: Plan Adjustment\n\nCommon requests:\n\n- Swap a model (\"use doubao-seedream-4_5 for image\")\n- Change structure (\"drop the last-frame branch\", \"add a narration audio node\")\n- Change scale (\"limit to 1 character\", \"fix 3 shots per scene\")\n\nPatch the template, re-summarize, wait for explicit confirmation again.\n\n## State 4: Canvas Expansion (internal)\n\nExpand the plan template into a **flat shape list** suitable for `drawToCanvas`.\n\n### Expansion rules\n\n1. **`tool` node → 1 shape**:\n   - Shape `type` is determined by the model's output type:\n     - `qwen3_6-plus` → `text`\n     - `banana-pro` / `doubao-seedream-*` → `image`\n     - `veo_*` / `doubao-seedance-*` / `kling-*` → `video`\n     - `merge` → `video` (or `audio` if merging audios)\n   - `shape.id` = `shape:<templatePath>` or `shape:<templatePath>__i<iter>` (inside a map)\n   - `shape.props.model` = template `model`\n   - `shape.props.input` = template `input`, with all `$node.X` / `$item.X` / `{{...}}` resolved to literals or `shape://shape:Y` whenever possible\n   - `shape.props.input.promptRefs` is built from template `promptRefs`: each `$node.X` → `shape://shape:X`\n   - `shape.parentId` = enclosing frame shape id (when inside a map)\n   - `shape.meta.fromTemplateId` = the dotted template path (e.g., `scenes.shots.first_frame`)\n2. **`map` node → 1 frame shape + body subtree per iteration**:\n   - frame `type: \"frame\"`, `props.name` = the map's `name`\n   - frame itself runs no model\n3. **Skip nodes whose `when` 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.\n4. **Unresolved `{{$node.X.json.field}}` placeholders** stay in the prompt string (status `pending`). Do not substitute placeholder text.\n5. **Coordinates `(x, y, w, h)` are not part of the plan** — compute at `drawToCanvas` time:\n   - Lay out columns along data flow; 800px column gap.\n   - Stack same-column nodes vertically with 100px gap.\n   - Frame size = bounding box of children + 100px padding.\n   - Map children: horizontal vs. vertical follows `direction`.\n   - Default sizes: text 600×400, image 1600×900 (16:9) or 1024×1024 (1:1), video 1600×900, frame auto.\n\n## State 5: Apply to Canvas\n\nCall `drawToCanvas` with `createShapes` = the expanded shape list.\n\nPre-flight checks before the call:\n\n- Every shape's `props.input` validates against the corresponding model's `inputSchema` (drawToCanvas re-checks; pre-checking saves a round-trip).\n- Every `shape://shape:X` reference points to an X present in the same `createShapes` payload.\n- Frames appear before children (`parentId` exists).\n\nAfter success, reply:\n\n```\n✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline.\n```\n\n---\n\n## Appendix A: Plan Template Schema (for construction)\n\nTop level:\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"idea2video\",\n  \"inputs\": { \"idea\": {...}, \"user_requirement\": {...}, \"style\": {...} },\n  \"output\": \"$node.final_video.url\",\n  \"nodes\": [ /* tool or map nodes */ ]\n}\n```\n\nNodes:\n\n```jsonc\n// tool node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"tool\",\n  \"model\": \"<id registered in config/models>\",\n  \"name\": \"<display name; may use {{$item.X}} / {{$idx}} templates>\",\n  \"parse\": \"json\",                  // optional — url contains JSON\n  \"when\": { \"$in\": [...] },        // optional — conditional node\n  \"input\": {\n    \"prompt\": \"...containing {{$node.X.json.field}} placeholders...\",\n    \"promptRefs\": [\"$node.upstream\"],  // whole-text injection\n    \"images\": [\"$node.front\"],       // media references\n    \"imageSize\": \"1K\",\n    ...\n  }\n}\n\n// map node\n{\n  \"id\": \"<unique>\",\n  \"kind\": \"map\",\n  \"name\": \"<frame name>\",\n  \"over\": \"$node.upstream.json\",   // must resolve to an array\n  \"mode\": \"parallel\" | \"sequential\",\n  \"direction\": \"horizontal\" | \"vertical\",\n  \"body\": [ /* child template nodes */ ]\n}\n```\n\n## Appendix B: Canonical idea2video Structure\n\nAssemble the plan with this fixed shape:\n\n1. `develop_story` — qwen3_6-plus; prompt uses `{{$input.idea}}` and `{{$input.user_requirement}}`\n2. `extract_characters` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n3. `portraits` — map(over=`$node.extract_characters.json`, parallel, horizontal)\n   - body: `front` → `side (images:[$node.front])` → `back (images:[$node.front])`\n4. `write_script` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.develop_story\"]`\n5. `scenes` — map(over=`$node.write_script.json`, sequential, vertical)\n   - body:\n     - `storyboard` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n     - `shots` — map(over=`$node.storyboard.json`, parallel, vertical)\n       - body:\n         - `shot_desc` — qwen3_6-plus; `parse: \"json\"`; `promptRefs: [\"$node.extract_characters\"]`\n         - `first_frame` — banana-pro; prompt with `{{$node.shot_desc.json.ff_desc}}`; `images: $node.portraits[*].front`\n         - `last_frame` — banana-pro; `when: variation_type ∈ {medium, large}`; `images: [$node.first_frame]`\n         - `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)\n     - `scene_concat` — merge; `videos: $node.shots[*].shot_video`\n6. `final_video` — merge; `videos: $node.scenes[*].scene_concat`\n\n## Output Norms\n\n- Never expose raw plan JSON, shape JSON, or `taskId` to the user — summarize with bullets.\n- If `drawToCanvas` fails (usually input not matching the model's schema), explain why and propose a fix.\n- Strict gates: states 2 and 3 must wait for an explicit \"confirm / continue / proceed\" before advancing.\n\n\n## 🛠️ 执行与生成指南 (CRITICAL EXECUTION INSTRUCTIONS)\n\n**你是可以执行终端命令的智能 Agent！**\n\n**【严格禁止行为】**\n- 严禁：将提示词保存到任何文件中（如 txt, md）。\n- 严禁：要求用户自己去第三方平台（如 Midjourney）生成图片。\n- 严禁：一次性批量生成所有图片，或一次性执行多个命令。\n\n**【必须遵循的交互与执行流程】**\n你必须**严格分步**执行，并在每一步停下来等待用户回复：\n\n1. **第一步：主动收集需求**。当用户提出需求时，不要做任何设计和生成，先向用户提问（如产品特点、目标人群、想要几张图等）。**必须等待用户回答。**\n2. **第二步：输出草案并请求确认**。根据用户的回答，制定套图计划，并输出**第一张图**的提示词草案。**询问用户：“是否确认这个提示词，可以开始生成第一张图了吗？” 必须等待用户回答“确认”。**\n3. **第三步：单次执行终端命令**。用户确认后，你**必须使用终端执行命令**（如 `dlazy seedream-4.5 --prompt \"...\"`），每次只能执行一个生成命令。**重要：必须使用同步命令，绝不要在命令末尾加 `&`，绝不要使用 `&&`，这是在 Windows PowerShell 下运行！**\n4. **第四步：交付与循环**。命令返回结果后，把图片 URL 发给用户，并询问“对这张满意吗？我们可以继续生成下一张了吗？”。收到确认后再继续下一步。\n\nArchive v1.3.24: 4 files, 15593 bytes\n\nFiles: skill-card.md (2138b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nFile v1.3.24:SKILL.md\n\n---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: Tu\n\nArchive v1.3.23: 4 files, 15657 bytes\n\nFiles: skill-card.md (2253b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nArchive v1.3.22: 4 files, 15710 bytes\n\nFiles: skill-card.md (2414b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nArchive v1.3.21: 4 files, 15634 bytes\n\nFiles: skill-card.md (2238b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)\n\nArchive v1.3.20: 4 files, 15709 bytes\n\nFiles: skill-card.md (2278b), SKILL-cn.md (14926b), SKILL.md (14926b), _meta.json (136b)","readmeExcerpt":"Skill: 创意转视频 Idea to Video Owner: dlazyai Summary: Turn a user's idea into the full pipeline: **story → characters → 3-view portraits → scenes → shots → keyframes → shot videos → concat**. First emit a **plan... Tags: latest:1.3.29 Version history: v1.3.29 | 2026-10-08T01:13:19.634Z | user 例行版本更新 2026-10-08 v1.3.28 | 2026-10-04T01:12:02.521Z | user 例行版本更新 2026-10-04 v1.3.27 | 2026-10-02T04:54:54.355Z | user 例行版本更新 20","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"dlazy login"},{"language":"bash","snippet":"dlazy auth set YOUR_API_KEY"},{"language":"bash","snippet":"npx @dlazy/cli@1.2.3 <command>"},{"language":"json","snippet":"\"when\": { \"$in\": [\"$node.shot_desc.json.variation_type\", [\"medium\", \"large\"]] }"},{"language":"text","snippet":"The plan will create X nodes:\n  · 1 story node\n  · 1 character-extraction node\n  · Character 3-views (front + side + back, expanded per character)\n  · 1 scenes node\n  · Per scene: 1 storyboard node + N shots (each shot = shot description + first frame + [last frame] + video) + 1 concat node\n  · 1 final concat node\n\nModels:\n  · LLM: qwen3_6-plus\n  · Image: banana-pro\n  · Video: veo_3_1-fast\n  · Concat: merge"},{"language":"text","snippet":"✅ Plan added to canvas (N nodes, M pending). \nClick \"Run Workflow\" on the canvas to execute the whole pipeline."}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|--"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"dlazy-idea2video\",\n  \"version\": \"1.3.29\",\n  \"publishedAt\": 1791421999634\n}"},{"path":"skill-card.md","content":"## Description:\n\nTurns an idea into a reviewable video-production plan covering story, characters, scenes, shots, images, and video assembly.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nCreators and production teams use this skill to turn an idea into a structured, user-reviewed plan for generating visual assets and assembling a video.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The canvas plan and later terminal-generation instructions conflict, leaving execution authority unclear.\n\nMitigation: Clarify the intended workflow with the publisher and require explicit user approval before running commands or starting generation.\n\nRisk: Installing or running the dLazy CLI and storing an API key locally may expose credentials or execute unreviewed commands.\n\nMitigation: Review CLI installation and generation commands before execution; use a per-run DLAZY_API_KEY when persistent storage is not desired.\n\nRisk: Prompts and supplied media are sent to dLazy services, and generation consumes remote resources.\n\nMitigation: Obtain approval for external uploads and resource use; avoid submitting sensitive material without authorization.\n\n## Reference(s):\n\n- [dLazy CLI source and usage reference](https://github.com/dlazy-ai/cli)\n- [dLazy CLI npm package](https://www.npmjs.com/package/@dlazy/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands, Configuration instructions, Media links]\n\n**Output Format:** [Markdown plans, canvas workflow guidance, command snippets, and generated media URLs]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Video generation and media delivery depend on dLazy services and user confirmation.]\n\n## Skill Version(s):\n\n1.3.29 (source: ClawHub release metadata; artifact frontmatter states 1.3.9)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"SKILL-cn.md","content":"---\nname: dlazy-idea2video\nversion: 1.3.9\ndescription: 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 confi\ntriggers:\n  - Idea → Video Generation Plan\nmetadata: {\"clawdbot\":{\"emoji\":\"🤖\",\"requires\":{\"bins\":[\"npm\",\"npx\"]},\"install\":\"npm install -g @dlazy/cli@1.2.3\",\"installAlternative\":\"npx @dlazy/cli@1.2.3\",\"homepage\":\"https://github.com/dlazy-ai/cli\",\"source\":\"https://github.com/dlazy-ai/cli\",\"author\":\"dlazyai\",\"license\":\"see-repo\",\"npm\":\"https://www.npmjs.com/package/@dlazy/cli\",\"configLocation\":\"~/.dlazy/config.json\",\"apiEndpoints\":[\"api.dlazy.com\",\"files.dlazy.com\"]},\"openclaw\":{\"systemPrompt\":\"当你需要使用此技能时，请严格遵循此技能提供的指南进行规划和执行。你可以通过调用 dlazy CLI 的各类生成模型（如 dlazy seedream-4.5 等）来完成实际的图片渲染。注意：Windows PowerShell 中不允许使用 `&` 或 `&&` 进行命令串联或后台运行，请单独且同步地执行命令。\"}}\n---\n\n## 身份验证 (Authentication)\n\n所有请求都需要 dLazy API key。**推荐使用** `dlazy login` 完成登录：\n\n```bash\ndlazy login\n```\n\n该命令使用设备码流程（远程终端也可用），登录成功后 **自动把 API key 写入本地 CLI 配置**，无需手动复制粘贴。\n\n### 备选：手动设置 API Key\n\n如果你已有 API key，也可以直接保存：\n\n```bash\ndlazy auth set YOUR_API_KEY\n```\n\nCLI 会把 key 保存在你的用户配置目录（macOS/Linux 上为 `~/.dlazy/config.json`，Windows 上为 `%USERPROFILE%\\.dlazy\\config.json`），文件权限仅限当前操作系统用户访问。你也可以用 `DLAZY_API_KEY` 环境变量按次传入。\n\n### 手动获取 API Key\n\n1. 登录或在 [dlazy.com](https://dlazy.com) 创建账号\n2. 访问 [dlazy.com/dashboard/organization/api-key](https://dlazy.com/dashboard/organization/api-key)\n3. 复制 API Key 区域显示的密钥\n\n每个 key 都属于你自己的 dLazy 组织，可在同一控制面板**随时轮换或吊销**。\n\n## 关于与来源 (Provenance)\n\n- **CLI 源代码**: [github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli)\n- **维护者**: dlazyai\n- **npm 包名**: `@dlazy/cli`（本技能 install 字段固定到 `1.0.9` 版本）\n- **官网**: [dlazy.com](https://dlazy.com)\n\n如果你不希望在系统上长期保留一个全局 CLI，可以按需运行：\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>\n```\n\n如选择全局安装，技能的 `metadata.clawdbot.install` 字段已固定到 `npm install -g @dlazy/cli@1.2.3`。安装前建议先到 GitHub 仓库审阅源码。\n\n## 工作原理 (How It Works)\n\n此技能是 dLazy 托管 API 的轻量封装。调用时：\n\n- 你提供的提示词与参数会发送到 dLazy API（`api.dlazy.com`）进行推理。\n- 传入图像 / 视频 / 音频字段的本地文件路径会被 CLI 上传到 dLazy 媒体存储（`files.dlazy.com`），以便模型读取 —— 与任何云端生成 API 的流程一致。\n- API 返回的生成结果 URL 由 `files.dlazy.com` 托管。\n\n这是标准的 SaaS 调用模式；技能本身不会越权访问网络或文件系统，所有动作都由 dLazy CLI 完成。\n\n---\nname: 'idea2video'\ndescription: 'One-click pipeline that turns a single idea into a complete video-production plan: produces a plan template for the user to review/adjust, then expands it into canvas shapes and applies them via drawToCanvas.'\n---\n\n# 创意转视频 Idea to Video\n\n[English](./SKILL.md) · [中文](./SKILL-cn.md)\n\nTurn 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`.\n\n## Workflow Overview (5 states)\n\nEvery reply must start with this line:\n\n- `**Current State:** [state] | **Next:** [goal]`\n\n| State | Goal | Needs user confirmation |\n|---|---|--"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1283,"uniquenessScore":40,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T06:47:26.422Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T06:47:26.422Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T23:35:53.693Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}