{"id":"717cf974-acbb-4799-9710-2ac1185ff984","entityType":"agent","slug":"clawhub-dlazyai-main-image-video","name":"主图视频 Main Image Video","canonicalUrl":"https://www.xpersona.co/agent/clawhub-dlazyai-main-image-video","canonicalPath":"/agent/clawhub-dlazyai-main-image-video","generatedAt":"2026-10-11T11:25:51.261Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T09:17:12.731Z","emptyReason":null},"description":"静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。 Skill: 主图视频 Main Image Video Owner: dlazyai Summary: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。 Tags: latest:1.0.15 Version history: v1.0.15 | 2026-10-10T01:53:36.146Z | user 例行版本更新 2026-10-10 v1.0.14 | 2026-10-08T01:45:33.674Z | user 例行版本更新 2026-10-08 v1.0.13 | 2026-10-04T01:45:30.558Z | user 例行版本更新 2026-10-04 v1.0.12 | 2026-10-02T05:17:48.984Z | user 例行版本更新 2026-10-02 v1.0.11 | 2026-09-30T01","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:main-image-video","sourceUrl":"https://clawhub.ai/dlazyai/main-image-video","homepage":"https://clawhub.ai/dlazyai/skills/main-image-video","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/dlazyai/main-image-video","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/dlazyai/skills/main-image-video","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。 Skill: 主图视频 Main Image Video Owner: dlazyai Summary: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T09:17:12.731Z","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-11T09:17:12.731Z","emptyReason":null},"stars":null,"forks":null,"downloads":1102,"packageName":null,"latestVersion":"1.0.15","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T09:17:12.659Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T09:17:12.731Z","lastCrawledAt":"2026-10-11T09:17:12.659Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T09:17:12.659Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.15","createdAt":"2026-10-10T01:53:36.146Z","changelog":"例行版本更新 2026-10-10","fileCount":12,"zipByteSize":27004},{"version":"1.0.14","createdAt":"2026-10-08T01:45:33.674Z","changelog":"例行版本更新 2026-10-08","fileCount":12,"zipByteSize":26997},{"version":"1.0.13","createdAt":"2026-10-04T01:45:30.558Z","changelog":"例行版本更新 2026-10-04","fileCount":12,"zipByteSize":27020},{"version":"1.0.12","createdAt":"2026-10-02T05:17:48.984Z","changelog":"例行版本更新 2026-10-02","fileCount":12,"zipByteSize":26975},{"version":"1.0.11","createdAt":"2026-09-30T01:50:04.126Z","changelog":"例行版本更新 2026-09-30","fileCount":12,"zipByteSize":26953},{"version":"1.0.10","createdAt":"2026-09-28T02:38:35.335Z","changelog":"例行版本更新 2026-09-28","fileCount":12,"zipByteSize":26984},{"version":"1.0.9","createdAt":"2026-09-24T02:40:23.147Z","changelog":"例行版本更新 2026-09-24","fileCount":12,"zipByteSize":27355},{"version":"1.0.8","createdAt":"2026-09-22T01:43:13.107Z","changelog":"例行版本更新 2026-09-22","fileCount":12,"zipByteSize":27124}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:main-image-video","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-main-image-video/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-main-image-video/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-main-image-video/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-main-image-video/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-main-image-video/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-main-image-video/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-11T11:25:51.258Z"}},"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-main-image-video/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-main-image-video/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-main-image-video/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-main-image-video/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-11T09:17:12.731Z","emptyReason":null},"readme":"Skill: 主图视频 Main Image Video\n\nOwner: dlazyai\n\nSummary: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n\nTags: latest:1.0.15\n\nVersion history:\n\nv1.0.15 | 2026-10-10T01:53:36.146Z | user\n\n例行版本更新 2026-10-10\n\nv1.0.14 | 2026-10-08T01:45:33.674Z | user\n\n例行版本更新 2026-10-08\n\nv1.0.13 | 2026-10-04T01:45:30.558Z | user\n\n例行版本更新 2026-10-04\n\nv1.0.12 | 2026-10-02T05:17:48.984Z | user\n\n例行版本更新 2026-10-02\n\nv1.0.11 | 2026-09-30T01:50:04.126Z | user\n\n例行版本更新 2026-09-30\n\nv1.0.10 | 2026-09-28T02:38:35.335Z | user\n\n例行版本更新 2026-09-28\n\nv1.0.9 | 2026-09-24T02:40:23.147Z | user\n\n例行版本更新 2026-09-24\n\nv1.0.8 | 2026-09-22T01:43:13.107Z | user\n\n例行版本更新 2026-09-22\n\nv1.0.7 | 2026-09-18T02:14:06.884Z | user\n\n例行版本更新 2026-09-18\n\nv1.0.6 | 2026-09-10T01:37:02.048Z | user\n\n例行版本更新 2026-09-10\n\nv1.0.5 | 2026-09-08T01:44:02.629Z | user\n\n例行版本更新 2026-09-08\n\nv1.0.4 | 2026-09-07T01:53:17.680Z | user\n\n例行版本更新 2026-09-07\n\nv1.0.3 | 2026-09-04T01:44:35.257Z | user\n\n例行版本更新 2026-09-04\n\nv1.0.2 | 2026-09-02T01:40:24.627Z | user\n\n例行版本更新 2026-09-02\n\nv1.0.1 | 2026-08-31T07:07:16.127Z | user\n\n源码仓库迁移至 github.com/dlazy-ai/ecommerce-skills\n\nv1.0.0 | 2026-08-29T04:11:25.191Z | user\n\nSync from GitHub\n\nArchive index:\n\nArchive v1.0.15: 12 files, 27004 bytes\n\nFiles: 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 (2016b), SKILL.md (5101b), _meta.json (136b)\n\nFile v1.0.15:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.15\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.15:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1791597216146\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 a product image into a short main-image video with controlled camera and material motion.\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\nE-commerce sellers and content teams use this skill to turn existing product images into short product-listing videos without a new shoot.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images and prompts are sent to the selected generation provider.\n\nMitigation: Confirm the provider's data handling is acceptable before submitting product assets.\n\nRisk: Video generation may incur provider charges.\n\nMitigation: Select the intended provider and model explicitly, use dry-run first, and test one short clip before batching.\n\nRisk: Generated motion may distort product details or fail a marketplace's video requirements.\n\nMitigation: Inspect the source image and generated clip, then check the destination platform's current video specifications before publishing.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dlazyai/skills/main-image-video)\n- [Video backend configuration](references/video-backends.md)\n- [Provider CLI reference](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Configuration instructions]\n\n**Output Format:** [Markdown guidance and commands; generated video is saved as an MP4 file]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Typically produces a 3–5 second clip from one product image; requires an explicitly selected video model.]\n\n## Skill Version(s):\n\n1.0.15 (source: frontmatter and ClawHub 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.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: 12 files, 26997 bytes\n\nFiles: 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 (1985b), SKILL.md (5101b), _meta.json (136b)\n\nFile v1.0.14:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.14\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.14:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1791423933674\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\nTurns a product image into a short main-listing video with controlled camera movement and subtle material motion.\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\nE-commerce sellers and content creators use this skill to turn an existing product image into a short product-listing video without a new shoot.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images, prompts, and optional brand-reference images may be sent to the configured cloud provider.\n\nMitigation: Choose a trusted provider; avoid confidential local files and internal-only image URLs, and inspect the request with dry-run before sending it.\n\nRisk: Video generation can incur provider charges and produce footage that distorts the product or misses listing specifications.\n\nMitigation: Set the video model explicitly, test one short clip before batching, and review product fidelity and platform specifications before publishing.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dlazyai/skills/main-image-video)\n- [Video backend configuration](references/video-backends.md)\n- [Provider setup and data flow](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Configuration instructions]\n\n**Output Format:** [Markdown with shell commands and video prompts]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Execution can save a short MP4 video; duration and quality depend on the selected provider and model.]\n\n## Skill Version(s):\n\n1.0.14 (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.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: 12 files, 27020 bytes\n\nFiles: 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 (2099b), SKILL.md (5101b), _meta.json (136b)\n\nFile v1.0.13:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.13\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.13:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.13\",\n  \"publishedAt\": 1791078330558\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\nHelps turn a product image into a short ecommerce listing video using a selected video generation provider.\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\nEcommerce sellers and content creators use this skill to plan and generate short product-image videos for listing placements.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images and prompts may be sent to the selected external provider.\n\nMitigation: Confirm the provider and model, and share only images and prompts approved for that provider.\n\nRisk: Untrusted image URLs can reference private-network resources.\n\nMitigation: Use trusted image sources; avoid untrusted URLs that could point to private networks.\n\nRisk: Generation can incur charges or produce inaccurate product details.\n\nMitigation: Preview with dry-run, test one short clip before batching, and review the video and platform requirements before publishing.\n\nRisk: Suggested CLI installation commands may install third-party software.\n\nMitigation: Review any installation commands and packages before executing them.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dlazyai/skills/main-image-video)\n- [Video backend configuration](references/video-backends.md)\n- [Provider CLI reference](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Configuration instructions]\n\n**Output Format:** [Markdown with prompt examples and shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [The workflow can save a generated MP4 or preview a request with dry-run.]\n\n## Skill Version(s):\n\n1.0.13 (source: frontmatter and server-resolved 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.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: 12 files, 26975 bytes\n\nFiles: 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 (1909b), SKILL.md (5101b), _meta.json (136b)\n\nFile v1.0.12:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.12\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.12:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.12\",\n  \"publishedAt\": 1790918268984\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 a product image into a short, animated main-image video for an online listing.\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\nE-commerce sellers and content creators use a product photo to generate a 3–5 second listing video with subtle camera or material motion.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images, prompts, and related metadata are sent to the selected cloud generation provider.\n\nMitigation: Preview with dry-run, explicitly choose a trusted provider and model, and check its data handling terms before sharing confidential assets.\n\nRisk: Generated motion can distort product details, and a finished video may not meet a marketplace's listing requirements.\n\nMitigation: Review a short test clip for product fidelity and manually check the target platform's video specifications before publishing or generating a batch.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/main-image-video)\n- [Video backend configuration](artifact/references/video-backends.md)\n- [Provider CLI and data flow](artifact/references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Video files, Shell commands, Guidance]\n\n**Output Format:** [MP4 video with text guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Supports a dry-run preview; video generation requires an explicitly selected cloud model.]\n\n## Skill Version(s):\n\n1.0.12 (source: skill frontmatter and ClawHub 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.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: 12 files, 26953 bytes\n\nFiles: 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 (1897b), SKILL.md (5101b), _meta.json (136b)\n\nFile v1.0.11:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.11\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.11:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1790733004126\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\nTurns a product image into a 3–5-second video for an e-commerce listing using a selected video provider.\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\nE-commerce sellers and content teams use this skill to turn existing product photos into short listing videos with controlled camera motion.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images and prompts may be uploaded to the selected cloud video provider.\n\nMitigation: Use non-sensitive assets and confirm the provider's data handling before generation.\n\nRisk: Video generation and batch runs can incur charges.\n\nMitigation: Run --dry-run first, explicitly select the intended video model and provider, and confirm costs before batch generation.\n\nRisk: Local generation depends on external executables.\n\nMitigation: Use trusted local binaries for dlazy, node, and ffmpeg.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/main-image-video)\n- [Video backend configuration](references/video-backends.md)\n- [Provider CLI reference](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Configuration instructions]\n\n**Output Format:** [Markdown with shell commands and video prompts]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Commands can save generated MP4 clips locally; model and provider must be selected explicitly.]\n\n## Skill Version(s):\n\n1.0.11 (source: skill 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.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: 12 files, 26984 bytes\n\nFiles: 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 (1904b), SKILL.md (5101b), _meta.json (136b)\n\nFile v1.0.10:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.10\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.10:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.10\",\n  \"publishedAt\": 1790563115335\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\nHelps turn a product's main image into a short ecommerce video with subtle camera movement and material effects.\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\nEcommerce sellers and content creators use this skill to plan and generate short product-listing videos from existing product photos.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Automatic provider selection may send product photos to an unintended third-party service, including a backend unsuitable for video.\n\nMitigation: Choose a video-capable provider explicitly and preview the destination with --dry-run before sending sensitive media.\n\nRisk: Generated video may distort the product or fail marketplace video requirements.\n\nMitigation: Test one short clip, inspect the result, and check the target marketplace's specifications before publishing or generating a batch.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/main-image-video)\n- [Video backend configuration](references/video-backends.md)\n- [Provider CLI reference](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Configuration instructions]\n\n**Output Format:** [Markdown with inline bash code blocks]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Running the commands can generate a 3–5 second MP4 video; check marketplace requirements before publishing.]\n\n## Skill Version(s):\n\n1.0.10 (source: 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.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: 12 files, 27355 bytes\n\nFiles: 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 (2682b), SKILL.md (5100b), _meta.json (135b)\n\nFile v1.0.9:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.9\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.9\",\n  \"publishedAt\": 1790217623147\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静态主图转主图视频。一张商品图转换为 3-5 秒可上架的主图短视频，并 guides the agent through backend selection, prompt construction, dry-run checks, and generation commands.\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 ecommerce sellers, operators, and agent-assisted creative teams use this skill to turn an existing product hero image into a short main-image video for product listings. The skill helps the agent select a video backend, require an explicit model, draft motion prompts, dry-run requests, and save generated video files.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Selected product images and prompts may be sent to the configured cloud video-generation provider.\n\nMitigation: Use only assets the user has rights to share, avoid sensitive inputs, and explicitly choose the provider and model before generation.\n\nRisk: Video generation can incur cost or consume credits, especially during batch runs.\n\nMitigation: Run the documented dry-run path first, generate a single short clip for review, and batch only after confirmation.\n\nRisk: Generated video can distort the product or fail marketplace video requirements.\n\nMitigation: Keep prompts constrained to preserve product shape, color, texture, and logo placement, then manually review the output against platform duration, ratio, file-size, and content rules.\n\nRisk: Shared tooling references unrelated tasks, including watermark removal.\n\nMitigation: Ignore unrelated shared tasks unless the user has clear rights and the task is directly requested.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/dlazyai/skills/main-image-video)\n- [Video backend configuration](references/video-backends.md)\n- [Provider CLI reference](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, markdown, shell commands, configuration]\n\n**Output Format:** [Markdown guidance with inline shell commands, prompt templates, and configuration notes]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May cause configured cloud providers to generate and save short video files from user-selected product images.]\n\n## Skill Version(s):\n\n1.0.9 (source: server release evidence and SKILL.md 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.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: 12 files, 27124 bytes\n\nFiles: 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 (2245b), SKILL.md (5100b), _meta.json (135b)\n\nFile v1.0.8:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.8\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.8\",\n  \"publishedAt\": 1790041393107\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-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.8:skill-card.md\n\n## Description:\n\nConverts a static product main image into a 3-5 second listing-ready main image video with controlled camera motion and product-preserving prompt constraints.\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 users, ecommerce operators, and agent-assisted content teams use this skill to turn one product image into a short main-image listing video, preview the planned backend request, and save generated video output for marketplace review.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images, prompts, and brand references may be sent to the selected video or image backend.\n\nMitigation: Use --dry-run first, set an explicit provider and model, and avoid private or internal image URLs unless that backend is approved for the data.\n\nRisk: Generated files are written to paths chosen at invocation time.\n\nMitigation: Choose an explicit save path where media output is expected and permitted.\n\nRisk: Video generation can amplify flaws in the source product image or alter product appearance during motion.\n\nMitigation: Inspect and repair the input image first, run a single short test clip, then review the result before batch use.\n\n## Reference(s):\n\n- [Provider CLI Reference](references/provider-cli.md)\n- [Video Backend Configuration](references/video-backends.md)\n- [dLazy CLI Source](https://github.com/dlazy-ai/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Configuration instructions, Files]\n\n**Output Format:** [Markdown guidance with inline bash commands; optional JSON command output and saved MP4 files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Supports dry-run previews, explicit provider/model selection, and user-selected save paths.]\n\n## Skill Version(s):\n\n1.0.8 (source: SKILL.md 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.8: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.7: 12 files, 27197 bytes\n\nFiles: 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 (2351b), SKILL.md (5100b), _meta.json (135b)\n\nFile v1.0.7:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.7\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.7:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.7\",\n  \"publishedAt\": 1789697646884\n}\n\nFile v1.0.7: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.7: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.7: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.7:skill-card.md\n\n## Description:\n\n静态主图转主图视频。一张商品图生成 3-5 秒可上架的主图短视频。\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 users, developers, and ecommerce operators use this skill to turn a single product main image into a short product video with controlled camera motion, material movement, and optional brand styling.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Selected product images, prompts, and provider credentials may be sent to the configured generation backend.\n\nMitigation: Use dry-run first, confirm the selected provider and request details, and only use provider credentials intended for this workflow.\n\nRisk: Video generation can incur provider costs and may use the wrong model if the environment is misconfigured.\n\nMitigation: Set an explicit video model before generation and review the dry-run cost and request preview before running paid jobs.\n\nRisk: The bundled shared generator supports broader image-generation tasks beyond main-image video creation.\n\nMitigation: Limit use to product-image-to-video tasks and avoid unrelated transformations such as watermark removal unless rights to the assets are clear.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/dlazyai/skills/main-image-video)\n- [Backend call reference](references/provider-cli.md)\n- [Video backend configuration](references/video-backends.md)\n- [dLazy CLI source](https://github.com/dlazy-ai/cli)\n\n## Skill Output:\n\n**Output Type(s):** [guidance, shell commands, configuration, code, files]\n\n**Output Format:** [Markdown guidance with bash commands and generated MP4 video file paths]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Supports dry-run request previews, explicit video model selection, provider credentials, optional brand configuration, and local MP4 outputs.]\n\n## Skill Version(s):\n\n1.0.7 (source: SKILL.md 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.7: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.6: 12 files, 27113 bytes\n\nFiles: 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 (2241b), SKILL.md (5100b), _meta.json (135b)\n\nFile v1.0.6:SKILL.md\n\n---\nname: main-image-video\nversion: 1.0.6\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-enhancement](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/material-enhancement/skill.md) 提清晰度 |\n| 模特脸在动的时候崩 | 人脸是视频模型的重灾区 | 改用不露脸的景别，或改成商品特写 |\n| 时长对不上 | 多数模型的时长是档位不是连续值 | 按模型支持的档位取，别硬凑 |\n| 报错说没指定模型 | `DLAZY_VIDEO_MODEL` 没设 | 见「先配后端」 |\n\n---\n\n## Tips\n\n- **3 秒够用**。主图位视频不是广告片，讲清楚一个卖点就行。\n- **别加文字**。主图视频的文字规则和主图一样严，字幕留给 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md)。\n- **首帧就是封面**。用商品最好看的角度做输入图，因为它大概率是静止时显示的那一帧。\n\nFile v1.0.6:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.6\",\n  \"publishedAt\": 1789004222048\n}\n\nFile v1.0.6: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.c","readmeExcerpt":"Skill: 主图视频 Main Image Video Owner: dlazyai Summary: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。 Tags: latest:1.0.15 Version history: v1.0.15 | 2026-10-10T01:53:36.146Z | user 例行版本更新 2026-10-10 v1.0.14 | 2026-10-08T01:45:33.674Z | user 例行版本更新 2026-10-08 v1.0.13 | 2026-10-04T01:45:30.558Z | user 例行版本更新 2026-10-04 v1.0.12 | 2026-10-02T05:17:48.984Z | user 例行版本更新 2026-10-02 v1.0.11 | 2026-09-30T01","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"export DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>"},{"language":"bash","snippet":"node scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run"},{"language":"text","snippet":"<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic."},{"language":"bash","snippet":"dlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入"},{"language":"bash","snippet":"node scripts/gen.mjs --doctor     # 看当前哪个后端可用"},{"language":"bash","snippet":"node scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: main-image-video\nversion: 1.0.15\ndescription: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。\n---\n\n# main-image-video — 主图视频\n\n主图坑位旁边那个视频位，大多数店铺是空的。它不需要重新拍，\n**一张已有的主图就能生成**。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 图生视频 | 一张商品图 → 3–5 秒运动镜头 |\n| 运镜控制 | 推、拉、环绕、俯仰、微距扫过 |\n| 材质动态 | 面料飘动、金属反光扫过、液体晃动 |\n| 批量 | 配合 [batch-image](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/batch-image/skill.md) 整批出 |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 长视频 | 超过 8 秒请用 [product-video-ad](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/product-video-ad/skill.md) 分镜串联 |\n| 口播 | 用 [ugc-testimonial](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/ugc-testimonial/skill.md) |\n| 改商品 | 视频模型会放大原图的瑕疵，先用 [item-repair](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/item-repair/skill.md) 修好 |\n\n---\n\n## 二、先配后端\n\n视频模型 ID 因后端而异，**必须显式指定**，脚本不会替你猜：\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n```\n\n拼接与字幕需要 ffmpeg（本技能的单镜模式用不到，分镜才需要）。\n完整说明见 [`references/video-backends.md`](references/video-backends.md)。\n\n---\n\n## 三、工具调用\n\n```bash\nnode scripts/video.mjs --mode clip --task main-image-video \\\n  --image docs/flat-lay/example-output.jpg \\\n  --prompt 'Slow push-in on the model. The cable-knit sweater fibers catch the light softly. Subtle natural body sway. Camera stays level, no cuts.' \\\n  --seconds 3 \\\n  --save out/sku001-main.mp4\n\n# 先看会发什么，不计费\nnode scripts/video.mjs --mode clip --task main-image-video --image x.jpg \\\n  --prompt '...' --dry-run\n```\n\n**参数约定**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--image` | 一张主图 | 竖版 3:4 或方图，分辨率越高越好 |\n| `--seconds` | `3` ~ `5` | 主图位视频普遍偏短，超过 5 秒完播率掉得快 |\n| `--brand` | `brand.yaml` | 让运镜与色调跟全店一致 |\n\n---\n\n## 四、Prompt 模板\n\n**结构：运镜 + 主体动态 + 环境动态 + 约束**\n\n```\n<Camera move>. <What the product does>. <What the environment does>.\nKeep the product identical to the reference image — same shape, color, texture, logo placement.\nNo cuts, no text overlay, no watermark. Photorealistic.\n```\n\n**运镜词表**\n\n| 目标 | 英文 |\n| --- | --- |\n| 缓推 | `slow push-in` |\n| 缓拉 | `slow pull-back reveal` |\n| 环绕 | `smooth 30-degree orbit around the product` |\n| 俯冲 | `gentle top-down tilt` |\n| 微距扫过 | `macro pan across the surface texture` |\n\n**材质动态词表**\n\n| 品类 | 英文 |\n| --- | --- |\n| 针织 / 毛呢 | `fibers catch the light, fabric breathes subtly` |\n| 真丝 / 雪纺 | `fabric ripples in a gentle draft` |\n| 金属 / 珠宝 | `specular highlight sweeps across the metal` |\n| 玻璃 / 液体 | `liquid settles, light refracts through the glass` |\n| 皮革 | `soft sheen shifts across the grain` |\n\n---\n\n## 五、执行流程\n\n1. **先检查静态图**。视频模型会放大原图的一切瑕疵。原图有崩就先修，别指望视频救。\n2. **确认后端**。`DLAZY_VIDEO_MODEL` 没设就先问用户用哪个模型。\n3. **单张试跑**。视频比图贵得多，先跑一条 3 秒的看运镜对不对。\n4. **确认后再批量**。\n5. **过一遍平台规格**。视频也有规格要求（时长、比例、体积），\n   目前 [platform-compliance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/platform-compliance/skill.md) 只校验静态图，视频请人工对照平台文档。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 商品在动的过程中变形 | 运动幅度给太大 | 换成 `slow` / `subtle` 系的词，缩短时长 |\n| 画面糊 | 原图分辨率不够 | 先用 [material-"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"main-image-video\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1791597216146\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":"静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。 Skill: 主图视频 Main Image Video Owner: dlazyai Summary: 静态主图转主图视频。一张商品图 → 3–5 秒可上架的主图短视频。当用户说「主图视频」「图转视频」「让图动起来」「加个视频」时使用。 Tags: latest:1.0.15 Version history: v1.0.15 | 2026-10-10T01:53:36.146Z | user 例行版本更新 2026-10-10 v1.0.14 | 2026-10-08T01:45:33.674Z | user 例行版本更新 2026-10-08 v1.0.13 | 2026-10-04T01:45:30.558Z | user 例行版本更新 2026-10-04 v1.0.12 | 2026-10-02T05:17:48.984Z | user 例行版本更新 2026-10-02 v1.0.11 | 2026-09-30T01","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":997,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T09:17:12.731Z","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-11T09:17:12.731Z","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-11T11:25:51.261Z","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"}]}}}