{"id":"0247f6c7-4b9a-4825-8448-e296e3e63f6f","entityType":"agent","slug":"clawhub-dlazyai-product-video-ad","name":"商品短视频广告 Product Video Ad","canonicalUrl":"https://www.xpersona.co/agent/clawhub-dlazyai-product-video-ad","canonicalPath":"/agent/clawhub-dlazyai-product-video-ad","generatedAt":"2026-10-11T10:52:47.045Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T07:07:23.882Z","emptyReason":null},"description":"商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。 Skill: 商品短视频广告 Product Video Ad Owner: dlazyai Summary: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。 Tags: latest:1.0.16 Version history: v1.0.16 | 2026-10-10T01:55:35.451Z | user 例行版本更新 2026-10-10 v1.0.15 | 2026-10-08T01:47:14.929Z | user 例行版本更新 2026-10-08 v1.0.14 | 2026-10-04T01:47:01.083Z | user 例行版本更新 2026-10-04 v1.0.13 | 2026-10-02T05:18:49.314Z | user 例行版本更新 2026-10-02 v1.0.12 | 2026","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:product-video-ad","sourceUrl":"https://clawhub.ai/dlazyai/product-video-ad","homepage":"https://clawhub.ai/dlazyai/skills/product-video-ad","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/dlazyai/product-video-ad","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/dlazyai/skills/product-video-ad","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。 Skill: 商品短视频广告 Product Video Ad Owner: dlazyai Summary: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T07:07:23.882Z","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-11T07:07:23.882Z","emptyReason":null},"stars":null,"forks":null,"downloads":1127,"packageName":null,"latestVersion":"1.0.16","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T07:07:23.821Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T07:07:23.882Z","lastCrawledAt":"2026-10-11T07:07:23.821Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T07:07:23.821Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.16","createdAt":"2026-10-10T01:55:35.451Z","changelog":"例行版本更新 2026-10-10","fileCount":13,"zipByteSize":28034},{"version":"1.0.15","createdAt":"2026-10-08T01:47:14.929Z","changelog":"例行版本更新 2026-10-08","fileCount":13,"zipByteSize":27938},{"version":"1.0.14","createdAt":"2026-10-04T01:47:01.083Z","changelog":"例行版本更新 2026-10-04","fileCount":13,"zipByteSize":28097},{"version":"1.0.13","createdAt":"2026-10-02T05:18:49.314Z","changelog":"例行版本更新 2026-10-02","fileCount":13,"zipByteSize":28020},{"version":"1.0.12","createdAt":"2026-09-30T01:51:21.727Z","changelog":"例行版本更新 2026-09-30","fileCount":13,"zipByteSize":27907},{"version":"1.0.11","createdAt":"2026-09-28T02:39:50.885Z","changelog":"例行版本更新 2026-09-28","fileCount":13,"zipByteSize":27965},{"version":"1.0.10","createdAt":"2026-09-24T02:41:31.343Z","changelog":"例行版本更新 2026-09-24","fileCount":13,"zipByteSize":28094},{"version":"1.0.9","createdAt":"2026-09-22T01:44:21.730Z","changelog":"例行版本更新 2026-09-22","fileCount":13,"zipByteSize":28277}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:product-video-ad","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"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-product-video-ad/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-product-video-ad/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-product-video-ad/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-product-video-ad/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-product-video-ad/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-product-video-ad/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-11T10:52:47.042Z"}},"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-product-video-ad/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-product-video-ad/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-product-video-ad/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-product-video-ad/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":"high","updatedAt":"2026-10-11T07:07:23.882Z","emptyReason":null},"readme":"Skill: 商品短视频广告 Product Video Ad\n\nOwner: dlazyai\n\nSummary: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n\nTags: latest:1.0.16\n\nVersion history:\n\nv1.0.16 | 2026-10-10T01:55:35.451Z | user\n\n例行版本更新 2026-10-10\n\nv1.0.15 | 2026-10-08T01:47:14.929Z | user\n\n例行版本更新 2026-10-08\n\nv1.0.14 | 2026-10-04T01:47:01.083Z | user\n\n例行版本更新 2026-10-04\n\nv1.0.13 | 2026-10-02T05:18:49.314Z | user\n\n例行版本更新 2026-10-02\n\nv1.0.12 | 2026-09-30T01:51:21.727Z | user\n\n例行版本更新 2026-09-30\n\nv1.0.11 | 2026-09-28T02:39:50.885Z | user\n\n例行版本更新 2026-09-28\n\nv1.0.10 | 2026-09-24T02:41:31.343Z | user\n\n例行版本更新 2026-09-24\n\nv1.0.9 | 2026-09-22T01:44:21.730Z | user\n\n例行版本更新 2026-09-22\n\nv1.0.8 | 2026-09-20T01:58:03.399Z | user\n\n例行版本更新 2026-09-20\n\nv1.0.7 | 2026-09-18T02:15:33.403Z | user\n\n例行版本更新 2026-09-18\n\nv1.0.6 | 2026-09-10T01:38:14.797Z | user\n\n例行版本更新 2026-09-10\n\nv1.0.5 | 2026-09-08T01:45:27.756Z | user\n\n例行版本更新 2026-09-08\n\nv1.0.4 | 2026-09-07T01:54:35.199Z | user\n\n例行版本更新 2026-09-07\n\nv1.0.3 | 2026-09-04T01:45:47.215Z | user\n\n例行版本更新 2026-09-04\n\nv1.0.2 | 2026-09-02T01:41:39.441Z | user\n\n例行版本更新 2026-09-02\n\nv1.0.1 | 2026-08-31T07:08:40.436Z | user\n\n源码仓库迁移至 github.com/dlazy-ai/ecommerce-skills\n\nv1.0.0 | 2026-08-29T04:15:11.433Z | user\n\nSync from GitHub\n\nArchive index:\n\nArchive v1.0.16: 13 files, 28034 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (2126b), SKILL.md (5411b), _meta.json (136b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.16\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1791597335451\n}\n\nFile v1.0.16:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.16:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.16:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.16:skill-card.md\n\n## Description:\n\nCreates short product ads from selling points by planning shots, generating video clips, and assembling subtitles and a final video.\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\nMarketing teams and creators use this skill to turn product selling points into a reviewed multi-shot storyboard and a short video ad with captions for campaigns.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts and selected reference images may be sent to an external AI provider.\n\nMitigation: Use the dry-run first and share sensitive or proprietary media only when the selected provider is acceptable for that data.\n\nRisk: Example brand demographics may not match the intended campaign audience.\n\nMitigation: Edit the example brand settings to reflect the actual campaign requirements before generating clips.\n\nRisk: Generated clips can differ in product appearance or require editing before publication.\n\nMitigation: Review the storyboard and finished ad, reuse a consistent product reference image, and rerun individual shots as needed.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/product-video-ad)\n- [Video backend configuration](references/video-backends.md)\n- [Provider and data-flow reference](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands, Configuration guidance]\n\n**Output Format:** [Markdown storyboard and JSON shot plan with generation commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Execution can save individual MP4 clips, a final MP4 ad, and SRT subtitles; ffmpeg is needed for assembly.]\n\n## Skill Version(s):\n\n1.0.16 (source: skill frontmatter and server-resolved 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.0.16:examples/board.json\n\n{\r\n  \"_note\": \"商品短视频广告的分镜示例。image 换成你自己的图，prompt 与 caption 按商品改。\",\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"Slow push-in on the model wearing the product, cold morning light, breath faintly visible. Keep the product identical to the reference image. No text overlay, no watermark. Photorealistic, cinematic.\",\r\n      \"caption\": \"零下十度，只穿了这一件\" },\r\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Macro pan across the surface texture, fibers catch the light. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"粗棒针织，三层锁温\" },\r\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"The model walks through a city street, the garment moves naturally with the body. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"通勤、约会、周末都能穿\" },\r\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"现在下单立减 50\" }\r\n  ]\r\n}\n\nFile v1.0.16:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.15: 13 files, 27938 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (1945b), SKILL.md (5411b), _meta.json (136b)\n\nFile v1.0.15:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.15\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.15:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1791424034929\n}\n\nFile v1.0.15:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.15:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.15:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.15:skill-card.md\n\n## Description:\n\nTurns product selling points into a shot-by-shot ad storyboard, generates clips, and assembles a subtitled product video.\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\nMarketers and creators use this skill to turn product benefits and reference images into short, multi-shot video ads with captions for promotional campaigns.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images, prompts, captions, and brand settings may be sent to the selected generation provider.\n\nMitigation: Use a provider whose data handling you accept and run a dry-run before generation.\n\nRisk: Unauthorized product assets or unchanged example brand and model details could appear in an ad.\n\nMitigation: Use only assets you are authorized to use and customize the example brand and model fields before reuse.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dlazyai/skills/product-video-ad)\n- [Video backend configuration](artifact/references/video-backends.md)\n- [Provider CLI reference](artifact/references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Shell commands, Video files, Subtitle files]\n\n**Output Format:** [Storyboard text and JSON shot list; MP4 clips and assembled video; SRT captions]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Optional subtitled MP4 and concat list; clip generation requires a configured video provider, and assembly requires ffmpeg.]\n\n## Skill Version(s):\n\n1.0.15 (source: skill frontmatter and ClawHub release metadata)\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.0.15:examples/board.json\n\n{\r\n  \"_note\": \"商品短视频广告的分镜示例。image 换成你自己的图，prompt 与 caption 按商品改。\",\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"Slow push-in on the model wearing the product, cold morning light, breath faintly visible. Keep the product identical to the reference image. No text overlay, no watermark. Photorealistic, cinematic.\",\r\n      \"caption\": \"零下十度，只穿了这一件\" },\r\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Macro pan across the surface texture, fibers catch the light. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"粗棒针织，三层锁温\" },\r\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"The model walks through a city street, the garment moves naturally with the body. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"通勤、约会、周末都能穿\" },\r\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"现在下单立减 50\" }\r\n  ]\r\n}\n\nFile v1.0.15:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.14: 13 files, 28097 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (2225b), SKILL.md (5411b), _meta.json (136b)\n\nFile v1.0.14:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.14\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.14:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1791078421083\n}\n\nFile v1.0.14:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.14:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.14:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.14:skill-card.md\n\n## Description:\n\nHelps create short product ads from selling points by planning shots, generating video clips, assembling them, and adding subtitles.\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 marketers use this skill to turn product benefits into a shot-by-shot script and a short advertising video with captions for distribution on social platforms.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Ad prompts and selected product or model reference images may be sent to a cloud generation provider.\n\nMitigation: Confirm the selected provider and its data handling before use; share only images and prompts approved for external processing.\n\nRisk: Generation may incur charges or use a provider different from the one expected.\n\nMitigation: Select the provider explicitly, preview the shot plan with --dry-run, and use scoped, revocable API keys.\n\nRisk: The example brand profile includes demographic defaults that may not fit the intended campaign.\n\nMitigation: Replace the example model and brand settings with campaign-appropriate choices and review the ad for compliance before publication.\n\n## Reference(s):\n\n- [Product Video Ad release](https://clawhub.ai/dlazyai/skills/product-video-ad)\n- [Video backend configuration](artifact/references/video-backends.md)\n- [Provider setup and data flow](artifact/references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Shell commands, Configuration guidance]\n\n**Output Format:** [Markdown guidance and a JSON shot list with shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Running the workflow can produce MP4 clips, a combined video, and SRT captions; voiceover and music require separate editing.]\n\n## Skill Version(s):\n\n1.0.14 (source: SKILL.md frontmatter and server 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.0.14:examples/board.json\n\n{\r\n  \"_note\": \"商品短视频广告的分镜示例。image 换成你自己的图，prompt 与 caption 按商品改。\",\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"Slow push-in on the model wearing the product, cold morning light, breath faintly visible. Keep the product identical to the reference image. No text overlay, no watermark. Photorealistic, cinematic.\",\r\n      \"caption\": \"零下十度，只穿了这一件\" },\r\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Macro pan across the surface texture, fibers catch the light. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"粗棒针织，三层锁温\" },\r\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"The model walks through a city street, the garment moves naturally with the body. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"通勤、约会、周末都能穿\" },\r\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"现在下单立减 50\" }\r\n  ]\r\n}\n\nFile v1.0.14:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.13: 13 files, 28020 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (2170b), SKILL.md (5411b), _meta.json (136b)\n\nFile v1.0.13:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.13\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.13:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.13\",\n  \"publishedAt\": 1790918329314\n}\n\nFile v1.0.13:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.13:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.13:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.13:skill-card.md\n\n## Description:\n\nCreates short product video ads by turning selling points into a storyboard, generating individual shots, assembling them, and adding subtitles.\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 marketers use this skill to plan and generate multi-shot product ads for social media, with assembled video and timed captions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product prompts and selected reference images are sent to the configured media provider.\n\nMitigation: Avoid sensitive local images and review the storyboard image paths and shot IDs before generation.\n\nRisk: Generation may incur provider charges or expose a long-lived API key.\n\nMitigation: Use dry-run to check inputs before generating and keep provider keys scoped and revocable.\n\nRisk: Independently generated shots may show inconsistent product details.\n\nMitigation: Use the same product reference across shots and review the assembled video before publication.\n\n## Reference(s):\n\n- [Product Video Ad on ClawHub](https://clawhub.ai/dlazyai/skills/product-video-ad)\n- [Provider CLI reference](artifact/references/provider-cli.md)\n- [Video backend configuration](artifact/references/video-backends.md)\n- [dLazy CLI source](https://github.com/dlazy-ai/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, JSON storyboard, Shell commands, Video files, Subtitle files]\n\n**Output Format:** [Markdown guidance and JSON storyboard; generated MP4 clips and assembled video, with SRT captions]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Optional subtitles; video assembly requires ffmpeg, and generation requires a configured media provider.]\n\n## Skill Version(s):\n\n1.0.13 (source: skill frontmatter and server-resolved 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.0.13:examples/board.json\n\n{\r\n  \"_note\": \"商品短视频广告的分镜示例。image 换成你自己的图，prompt 与 caption 按商品改。\",\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"Slow push-in on the model wearing the product, cold morning light, breath faintly visible. Keep the product identical to the reference image. No text overlay, no watermark. Photorealistic, cinematic.\",\r\n      \"caption\": \"零下十度，只穿了这一件\" },\r\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Macro pan across the surface texture, fibers catch the light. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"粗棒针织，三层锁温\" },\r\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"The model walks through a city street, the garment moves naturally with the body. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"通勤、约会、周末都能穿\" },\r\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"现在下单立减 50\" }\r\n  ]\r\n}\n\nFile v1.0.13:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.12: 13 files, 27907 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (1850b), SKILL.md (5411b), _meta.json (136b)\n\nFile v1.0.12:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.12\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.12:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.12\",\n  \"publishedAt\": 1790733081727\n}\n\nFile v1.0.12:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.12:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.12:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.12:skill-card.md\n\n## Description:\n\nTurns product selling points into a storyboard, generates individual shots, and assembles a subtitled short video ad.\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\nMarketers and creators use this skill to plan and produce short, multi-shot product ads with captions for social and ecommerce campaigns.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images, prompts, and campaign details may be sent to a cloud generation provider.\n\nMitigation: Select an approved provider and avoid confidential unreleased assets unless its data handling is acceptable.\n\nRisk: Generation requests may incur provider charges.\n\nMitigation: Confirm the storyboard and run the dry-run preview before generating clips.\n\n## Reference(s):\n\n- [ClawHub product-video-ad release](https://clawhub.ai/dlazyai/skills/product-video-ad)\n- [Video backend configuration](artifact/references/video-backends.md)\n- [Provider setup and data flow](artifact/references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Markdown, Configuration, Shell commands, Video files, Subtitle files]\n\n**Output Format:** [Storyboard text and JSON shot plan; MP4 clips and assembled video with SRT captions when run.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Offers a dry-run preview; video assembly and subtitle embedding require ffmpeg.]\n\n## Skill Version(s):\n\n1.0.12 (source: frontmatter and server release metadata)\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.0.12:examples/board.json\n\n{\r\n  \"_note\": \"商品短视频广告的分镜示例。image 换成你自己的图，prompt 与 caption 按商品改。\",\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"Slow push-in on the model wearing the product, cold morning light, breath faintly visible. Keep the product identical to the reference image. No text overlay, no watermark. Photorealistic, cinematic.\",\r\n      \"caption\": \"零下十度，只穿了这一件\" },\r\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Macro pan across the surface texture, fibers catch the light. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"粗棒针织，三层锁温\" },\r\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"The model walks through a city street, the garment moves naturally with the body. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"通勤、约会、周末都能穿\" },\r\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"现在下单立减 50\" }\r\n  ]\r\n}\n\nFile v1.0.12:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.11: 13 files, 27965 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (1991b), SKILL.md (5411b), _meta.json (136b)\n\nFile v1.0.11:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.11\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.11:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1790563190885\n}\n\nFile v1.0.11:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.11:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.11:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.11:skill-card.md\n\n## Description:\n\nCreates short product ads from selling points by planning shots, generating clips, assembling video, and adding subtitles.\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\nMarketers and creators use this skill to turn product selling points and reference images into a multi-shot, subtitled short-form video ad.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product prompts and reference images may be sent to the selected third-party generation provider.\n\nMitigation: Choose the provider deliberately and review what will be shared using a dry run before generation.\n\nRisk: Generation uses provider API credentials.\n\nMitigation: Use scoped, rotatable API keys and avoid sharing credentials in prompts or storyboards.\n\nRisk: Example brand or model settings may not match the campaign.\n\nMitigation: Replace example defaults and confirm the storyboard and reference images before generating the ad.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dlazyai/skills/product-video-ad)\n- [Video backends](references/video-backends.md)\n- [Provider CLI](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Shell commands, Video files, Subtitle files]\n\n**Output Format:** [Storyboard JSON and text prompts; MP4 clips and assembled ad; SRT subtitles]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Video assembly requires ffmpeg; subtitles can be burned in, embedded as a selectable track, or delivered as an SRT file.]\n\n## Skill Version(s):\n\n1.0.11 (source: release metadata and skill frontmatter)\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.0.11:examples/board.json\n\n{\r\n  \"_note\": \"商品短视频广告的分镜示例。image 换成你自己的图，prompt 与 caption 按商品改。\",\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"Slow push-in on the model wearing the product, cold morning light, breath faintly visible. Keep the product identical to the reference image. No text overlay, no watermark. Photorealistic, cinematic.\",\r\n      \"caption\": \"零下十度，只穿了这一件\" },\r\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Macro pan across the surface texture, fibers catch the light. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"粗棒针织，三层锁温\" },\r\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"The model walks through a city street, the garment moves naturally with the body. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"通勤、约会、周末都能穿\" },\r\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"现在下单立减 50\" }\r\n  ]\r\n}\n\nFile v1.0.11:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.10: 13 files, 28094 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (2295b), SKILL.md (5411b), _meta.json (136b)\n\nFile v1.0.10:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.10\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.10:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.10\",\n  \"publishedAt\": 1790217691343\n}\n\nFile v1.0.10:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.10:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.10:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.10:skill-card.md\n\n## Description:\n\nCreates product short-video ads by turning selling points into a storyboard, generating shot clips, joining them, and adding subtitles.\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\nExternal marketers, ecommerce operators, and agent users use this skill to plan and generate 15-30 second product video ads from product selling points, reference images, storyboard prompts, and captions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product prompts and referenced images may be sent to the selected generation provider.\n\nMitigation: Use the documented dry-run first, choose the provider deliberately, and avoid sending sensitive or unauthorized content.\n\nRisk: The skill uses provider credentials and writes generated media to local output paths.\n\nMitigation: Configure only the intended provider credentials, rotate keys when needed, and review output files before sharing or publishing them.\n\nRisk: Sample brand and model descriptions may not match the user's lawful brand rights or advertising requirements.\n\nMitigation: Replace sample brand guidance with lawful, appropriate brand guidance and review generated ads before use.\n\n## Reference(s):\n\n- [Backend Calling Reference](references/provider-cli.md)\n- [Video Backend Configuration](references/video-backends.md)\n- [dLazy CLI](https://github.com/dlazy-ai/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Files]\n\n**Output Format:** [Markdown guidance with JSON storyboard inputs, shell commands, MP4 video files, SRT subtitles, concat manifests, and optional JSON status output.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Supports dry-run planning before provider calls; generated clips and subtitles are written to the selected output directory.]\n\n## Skill Version(s):\n\n1.0.10 (source: frontmatter and server release metadata)\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.0.10:examples/board.json\n\n{\r\n  \"_note\": \"商品短视频广告的分镜示例。image 换成你自己的图，prompt 与 caption 按商品改。\",\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"Slow push-in on the model wearing the product, cold morning light, breath faintly visible. Keep the product identical to the reference image. No text overlay, no watermark. Photorealistic, cinematic.\",\r\n      \"caption\": \"零下十度，只穿了这一件\" },\r\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Macro pan across the surface texture, fibers catch the light. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"粗棒针织，三层锁温\" },\r\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"The model walks through a city street, the garment moves naturally with the body. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"通勤、约会、周末都能穿\" },\r\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"现在下单立减 50\" }\r\n  ]\r\n}\n\nFile v1.0.10:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.9: 13 files, 28277 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (2495b), SKILL.md (5410b), _meta.json (135b)\n\nFile v1.0.9:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.9\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.9\",\n  \"publishedAt\": 1790041461730\n}\n\nFile v1.0.9:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.9:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.9:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.9:skill-card.md\n\n## Description:\n\n商品短视频广告。卖点 -> 分镜脚本 -> 分段生成 -> 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\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\nMarketing operators, ecommerce teams, and agents use this skill to turn product selling points into storyboarded short-form product video ads with generated clips, captions, and stitched final media.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts and referenced product or model images may be sent to the selected external generation provider.\n\nMitigation: Use the skill only with data suitable for the chosen provider, select the provider explicitly when destination matters, and avoid supplying sensitive product or personal imagery unless approved.\n\nRisk: Video generation may incur provider costs or use an unintended backend if configuration is implicit.\n\nMitigation: Run with --dry-run before generation and set --provider and model configuration explicitly for cost and routing control.\n\nRisk: The example brand configuration may not match every campaign or product.\n\nMitigation: Review and customize examples/brand.yaml before reuse so default model, brand, and visual constraints match the intended advertisement.\n\n## Reference(s):\n\n- [Skill page](https://clawhub.ai/dlazyai/skills/product-video-ad)\n- [Provider CLI reference](references/provider-cli.md)\n- [Video backend configuration](references/video-backends.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON storyboard examples and shell commands; execution can produce MP4 clips, SRT captions, concat manifests, and final MP4 video files.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Supports dry-run planning, explicit provider/model selection, optional brand configuration, and local ffmpeg stitching/subtitle workflows.]\n\n## Skill Version(s):\n\n1.0.9 (source: frontmatter and server release evidence)\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.0.9:examples/board.json\n\n{\r\n  \"_note\": \"商品短视频广告的分镜示例。image 换成你自己的图，prompt 与 caption 按商品改。\",\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"Slow push-in on the model wearing the product, cold morning light, breath faintly visible. Keep the product identical to the reference image. No text overlay, no watermark. Photorealistic, cinematic.\",\r\n      \"caption\": \"零下十度，只穿了这一件\" },\r\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Macro pan across the surface texture, fibers catch the light. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"粗棒针织，三层锁温\" },\r\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"examples/shot-hero.jpg\",\r\n      \"prompt\": \"The model walks through a city street, the garment moves naturally with the body. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"通勤、约会、周末都能穿\" },\r\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm. Keep the product identical to the reference image. No text overlay, no watermark.\",\r\n      \"caption\": \"现在下单立减 50\" }\r\n  ]\r\n}\n\nFile v1.0.9:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.8: 13 files, 28171 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (2625b), SKILL.md (5410b), _meta.json (135b)\n\nFile v1.0.8:SKILL.md\n\n---\nname: product-video-ad\nversion: 1.0.8\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是后期加的，\n让模型自己画文字必然出乱码。\n\n---\n\n## 七、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 镜头之间商品不一致 | 每镜独立生成，模型各画各的 | 全部镜头传同一张商品参考图，并用 `--brand` |\n| 拼接后画面跳 | 各镜编码参数不同 | 脚本会自动重编码兜底；仍跳就统一各镜的尺寸 |\n| 字幕没烧进去 | ffmpeg 没带 libass | 脚本自动降级为软字幕轨，播放器可开关 |\n| 没装 ffmpeg | — | 片段照常生成，用输出的 `concat.txt` 事后补拼 |\n| 成片太长 | 分镜时长加起来超了 | 投流素材 15 秒最稳，超过 30 秒完播率明显下滑 |\n\n---\n\n## Tips\n\n- **前 3 秒决定一切**。钩子镜头值得多跑几版挑一条。\n- **字幕写口语**。「零下十度只穿了这一件」比「优质保暖面料」有效得多。\n- **竖版 9:16**。投流素材几乎都是竖版，生成时就按竖版出，别事后裁。\n\nFile v1.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.8\",\n  \"publishedAt\": 1789869483399\n}\n\nFile v1.0.8:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.8:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.8:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-sc\n\nArchive v1.0.7: 13 files, 28250 bytes\n\nFiles: examples/board.json (1373b), examples/brand.yaml (1655b), references/provider-cli.md (4802b), references/video-backends.md (2085b), scripts/brand.mjs (4516b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/video.mjs (8822b), skill-card.md (2415b), SKILL.md (5410b), _meta.json (135b)","readmeExcerpt":"Skill: 商品短视频广告 Product Video Ad Owner: dlazyai Summary: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。 Tags: latest:1.0.16 Version history: v1.0.16 | 2026-10-10T01:55:35.451Z | user 例行版本更新 2026-10-10 v1.0.15 | 2026-10-08T01:47:14.929Z | user 例行版本更新 2026-10-08 v1.0.14 | 2026-10-04T01:47:01.083Z | user 例行版本更新 2026-10-04 v1.0.13 | 2026-10-02T05:18:49.314Z | user 例行版本更新 2026-10-02 v1.0.12 | 2026","codeSnippets":[],"executableExamples":[{"language":"json","snippet":"{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}"},{"language":"bash","snippet":"export DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run"},{"language":"text","snippet":"out/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片"},{"language":"text","snippet":"<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic."},{"language":"bash","snippet":"dlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入"},{"language":"bash","snippet":"node scripts/gen.mjs --doctor     # 看当前哪个后端可用"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: product-video-ad\nversion: 1.0.16\ndescription: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。\n---\n\n# product-video-ad — 商品短视频广告\n\n从卖点到成片：写分镜 → 逐镜生成 → 拼接 → 上字幕。\n\n和 [main-image-video](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/main-image-video/skill.md) 的分工：那个是主图位的 3 秒单镜，\n这个是**多镜串联的完整广告**，15–30 秒，用于投流。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 分镜脚本 | 卖点 → 镜头序列，含时长、画面、字幕 |\n| 逐镜生成 | 每个镜头独立生成，失败只重跑那一个 |\n| 自动拼接 | ffmpeg 串成成片，编码不一致时自动重编码 |\n| 字幕 | 按分镜时长自动生成 SRT，烧录或封装 |\n| 品牌一致 | `--brand` 让全片色调运镜统一 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 配音配乐 | 脚本给文案，配音配乐请用剪辑软件 |\n| 精确卡点 | 生成模型的时长是档位，卡音乐点请后期调 |\n| 真人口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n\n---\n\n## 二、分镜结构\n\n15 秒带货视频的通用骨架，四段：\n\n| 段 | 时长 | 干什么 | 画面 |\n| --- | --- | --- | --- |\n| 钩子 | 0–3s | 让人停下来 | 最强视觉冲击：使用场景、痛点对比、意外角度 |\n| 卖点 | 3–9s | 说清为什么买 | 2–3 个特写，一个卖点一个镜头 |\n| 场景 | 9–13s | 让人代入 | 真实使用场景，模特或环境 |\n| 落点 | 13–15s | 给行动理由 | 商品全貌 + 价格/优惠字幕 |\n\n**一个镜头只讲一件事。** 一个镜头塞两个卖点，两个都记不住。\n\n---\n\n## 三、分镜文件\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"Slow push-in on the model wearing the olive cable-knit sweater, cold morning light, breath visible.\",\n      \"caption\": \"零下十度，只穿了这一件\" },\n    { \"id\": \"s2\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Macro pan across the cable knit texture, fibers catch the light.\",\n      \"caption\": \"粗棒针织，三层锁温\" },\n    { \"id\": \"s3\", \"seconds\": 4, \"image\": \"docs/flat-lay/example-output.jpg\",\n      \"prompt\": \"The model walks through a city street, sweater moves naturally with the body.\",\n      \"caption\": \"通勤、约会、周末都能穿\" },\n    { \"id\": \"s4\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Product laid flat on light wood, slow top-down pull-back, clean and calm.\",\n      \"caption\": \"现在下单立减 50\" }\n  ]\n}\n```\n\n`caption` 会按 `seconds` 累加自动排时间轴生成 SRT，不用手对时间码。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --subtitles --brand examples/brand.yaml\n\n# 先看计划，不计费\nnode scripts/video.mjs --mode storyboard --task product-video-ad \\\n  --board examples/board.json --outdir out/ad --dry-run\n```\n\n产出：\n\n```\nout/ad/s1.mp4 … s4.mp4     每个镜头\nout/ad/captions.srt        字幕\nout/ad/concat.txt          拼接清单\nout/ad/final.mp4           成片\nout/ad/final-sub.mp4       带字幕成片\n```\n\n某个镜头失败不影响其他镜头——重跑那一个，再手动拼一次即可。\n\n---\n\n## 五、执行流程\n\n1. **先要卖点，不要直接写分镜**。问用户：主推什么、给谁看、投哪个平台。\n2. **写分镜给用户确认**。文字确认比生成完再改便宜一个数量级。\n3. **`--dry-run` 看一遍**。确认每镜的 prompt 和参考图对得上。\n4. **跑**。逐镜生成，失败的单独补。\n5. **看成片**。不满意就改单个镜头重跑，别整条重来。\n\n---\n\n## 六、Prompt 写法\n\n每镜遵循：**运镜 + 主体 + 环境 + 保真约束**\n\n```\n<Camera move>. <Subject action>. <Environment>.\nKeep the product identical to the reference image.\nNo text overlay in the frame, no watermark. Photorealistic, cinematic.\n```\n\n**关键：`No text overlay in the frame`。** 字幕是"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"product-video-ad\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1791597335451\n}"},{"path":"references/provider-cli.md","content":"<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTT"},{"path":"references/video-backends.md","content":"<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。"},{"path":"scripts/lib/tasks.json","content":"{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。 Skill: 商品短视频广告 Product Video Ad Owner: dlazyai Summary: 商品短视频广告。卖点 → 分镜脚本 → 分段生成 → 拼接加字幕成片。当用户说「做条广告」「短视频」「投流素材」「分镜脚本」「带货视频」时使用。 Tags: latest:1.0.16 Version history: v1.0.16 | 2026-10-10T01:55:35.451Z | user 例行版本更新 2026-10-10 v1.0.15 | 2026-10-08T01:47:14.929Z | user 例行版本更新 2026-10-08 v1.0.14 | 2026-10-04T01:47:01.083Z | user 例行版本更新 2026-10-04 v1.0.13 | 2026-10-02T05:18:49.314Z | user 例行版本更新 2026-10-02 v1.0.12 | 2026","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":941,"uniquenessScore":48,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T07:07:23.882Z","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-11T07:07:23.882Z","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-11T10:52:47.045Z","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"}]}}}