{"id":"dc10fe5a-6093-4d19-aa25-82412fdbd45f","entityType":"agent","slug":"clawhub-dlazyai-ugc-testimonial","name":"UGC 口播种草视频 UGC Testimonial","canonicalUrl":"https://www.xpersona.co/agent/clawhub-dlazyai-ugc-testimonial","canonicalPath":"/agent/clawhub-dlazyai-ugc-testimonial","generatedAt":"2026-10-11T07:41:12.853Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T05:33:58.132Z","emptyReason":null},"description":"UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。 Skill: UGC 口播种草视频 UGC Testimonial Owner: dlazyai Summary: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。 Tags: latest:1.0.16 Version history: v1.0.16 | 2026-10-10T01:57:48.468Z | user 例行版本更新 2026-10-10 v1.0.15 | 2026-10-08T01:48:42.323Z | user 例行版本更新 2026-10-08 v1.0.14 | 2026-10-04T01:48:05.559Z | user 例行版本更新 2026-10-04 v1.0.13 | 2026-10-02T05:19:34.924Z | user 例行版本更新 2026-10-02 v1.0.12 | 2","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:ugc-testimonial","sourceUrl":"https://clawhub.ai/dlazyai/ugc-testimonial","homepage":"https://clawhub.ai/dlazyai/skills/ugc-testimonial","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/dlazyai/ugc-testimonial","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/dlazyai/skills/ugc-testimonial","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。 Skill: UGC 口播种草视频 UGC Testimonial Owner: dlazyai Summary: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T05:33:58.132Z","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-11T05:33:58.132Z","emptyReason":null},"stars":null,"forks":null,"downloads":1145,"packageName":null,"latestVersion":"1.0.16","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T05:33:58.069Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T05:33:58.132Z","lastCrawledAt":"2026-10-11T05:33:58.069Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T05:33:58.069Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.16","createdAt":"2026-10-10T01:57:48.468Z","changelog":"例行版本更新 2026-10-10","fileCount":13,"zipByteSize":27857},{"version":"1.0.15","createdAt":"2026-10-08T01:48:42.323Z","changelog":"例行版本更新 2026-10-08","fileCount":13,"zipByteSize":27824},{"version":"1.0.14","createdAt":"2026-10-04T01:48:05.559Z","changelog":"例行版本更新 2026-10-04","fileCount":13,"zipByteSize":27851},{"version":"1.0.13","createdAt":"2026-10-02T05:19:34.924Z","changelog":"例行版本更新 2026-10-02","fileCount":13,"zipByteSize":27850},{"version":"1.0.12","createdAt":"2026-09-30T01:52:18.377Z","changelog":"例行版本更新 2026-09-30","fileCount":13,"zipByteSize":27969},{"version":"1.0.11","createdAt":"2026-09-28T02:40:53.331Z","changelog":"例行版本更新 2026-09-28","fileCount":13,"zipByteSize":27742},{"version":"1.0.10","createdAt":"2026-09-24T02:42:20.133Z","changelog":"例行版本更新 2026-09-24","fileCount":13,"zipByteSize":28333},{"version":"1.0.9","createdAt":"2026-09-22T01:45:27.356Z","changelog":"例行版本更新 2026-09-22","fileCount":13,"zipByteSize":27995}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:ugc-testimonial","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-ugc-testimonial/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-ugc-testimonial/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-ugc-testimonial/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-ugc-testimonial/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-ugc-testimonial/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-ugc-testimonial/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-11T07:41:12.849Z"}},"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-ugc-testimonial/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-ugc-testimonial/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-ugc-testimonial/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-ugc-testimonial/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-11T05:33:58.132Z","emptyReason":null},"readme":"Skill: UGC 口播种草视频 UGC Testimonial\n\nOwner: dlazyai\n\nSummary: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n\nTags: latest:1.0.16\n\nVersion history:\n\nv1.0.16 | 2026-10-10T01:57:48.468Z | user\n\n例行版本更新 2026-10-10\n\nv1.0.15 | 2026-10-08T01:48:42.323Z | user\n\n例行版本更新 2026-10-08\n\nv1.0.14 | 2026-10-04T01:48:05.559Z | user\n\n例行版本更新 2026-10-04\n\nv1.0.13 | 2026-10-02T05:19:34.924Z | user\n\n例行版本更新 2026-10-02\n\nv1.0.12 | 2026-09-30T01:52:18.377Z | user\n\n例行版本更新 2026-09-30\n\nv1.0.11 | 2026-09-28T02:40:53.331Z | user\n\n例行版本更新 2026-09-28\n\nv1.0.10 | 2026-09-24T02:42:20.133Z | user\n\n例行版本更新 2026-09-24\n\nv1.0.9 | 2026-09-22T01:45:27.356Z | user\n\n例行版本更新 2026-09-22\n\nv1.0.8 | 2026-09-20T01:58:51.810Z | user\n\n例行版本更新 2026-09-20\n\nv1.0.7 | 2026-09-18T02:16:57.074Z | user\n\n例行版本更新 2026-09-18\n\nv1.0.6 | 2026-09-10T01:39:09.098Z | user\n\n例行版本更新 2026-09-10\n\nv1.0.5 | 2026-09-08T01:46:31.953Z | user\n\n例行版本更新 2026-09-08\n\nv1.0.4 | 2026-09-07T01:55:32.797Z | user\n\n例行版本更新 2026-09-07\n\nv1.0.3 | 2026-09-04T01:46:51.709Z | user\n\n例行版本更新 2026-09-04\n\nv1.0.2 | 2026-09-02T01:42:32.590Z | user\n\n例行版本更新 2026-09-02\n\nv1.0.1 | 2026-08-31T07:09:40.948Z | user\n\n源码仓库迁移至 github.com/dlazy-ai/ecommerce-skills\n\nv1.0.0 | 2026-08-29T04:18:07.091Z | user\n\nSync from GitHub\n\nArchive index:\n\nArchive v1.0.16: 13 files, 27857 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (2025b), SKILL.md (5092b), _meta.json (135b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.16\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1791597468468\n}\n\nFile v1.0.16:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.16:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.16:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.16:skill-card.md\n\n## Description:\n\nCreates UGC-style product testimonial scripts, shot plans, and short videos from product details and a presenter persona.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMarketers and creators use this skill to draft persona-based product scripts and storyboards and produce UGC-style promotional videos with optional subtitles.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images, presenter references, prompts, and generated outputs may be handled by the selected media provider.\n\nMitigation: Use --dry-run first, avoid sensitive or private images, choose the provider and model deliberately, and keep API keys out of prompts and files.\n\nRisk: UGC-style videos may be mistaken for genuine buyer testimonials.\n\nMitigation: Do not present generated personas or scenarios as real customer reviews; follow the target platform's AI-content disclosure rules.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/ugc-testimonial)\n- [Video backend configuration](references/video-backends.md)\n- [Provider CLI guide](references/provider-cli.md)\n- [Brand-kit reference](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Storyboard configuration, Video files, Subtitle files]\n\n**Output Format:** [Markdown, JSON, MP4, and SRT]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Video generation requires an explicitly chosen model; subtitles may be embedded or supplied separately.]\n\n## Skill Version(s):\n\n1.0.16 (source: frontmatter and ClawHub release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.16:examples/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\n\nFile v1.0.16:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.15: 13 files, 27824 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (1979b), SKILL.md (5092b), _meta.json (135b)\n\nFile v1.0.15:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.15\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.15:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1791424122323\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\nCreates UGC-style product testimonial scripts, storyboards, and short videos with a handheld selfie aesthetic.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMarketing teams and creators use this skill to draft product recommendation scripts, plan selfie-style shots, and generate short UGC-style promotional videos for review before publication.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Selected product images, reference faces, prompts, and captions are sent to the configured generation provider.\n\nMitigation: Use only assets you are comfortable sharing with that provider, and run a dry-run before generation.\n\nRisk: Testimonial-style videos could be mistaken for genuine customer endorsements.\n\nMitigation: Do not impersonate real customers or present generated experiences as genuine reviews; check the target platform's AI-labeling rules before publishing.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/ugc-testimonial)\n- [Provider configuration and data flow](artifact/references/provider-cli.md)\n- [Video backends and subtitles](artifact/references/video-backends.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Shell commands, Configuration guidance, Video files, Subtitle files]\n\n**Output Format:** [Markdown guidance, JSON storyboards, MP4 video, and SRT subtitles]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Video generation requires a configured provider; voiceover is added separately.]\n\n## Skill Version(s):\n\n1.0.15 (source: 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.15:examples/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\n\nFile v1.0.15:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.14: 13 files, 27851 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (2055b), SKILL.md (5092b), _meta.json (135b)\n\nFile v1.0.14:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.14\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.14:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1791078485559\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\nCreates persona-led product testimonial scripts, storyboards, and UGC-style short videos with a casual selfie aesthetic.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nMarketers and creators use product details and a target persona to draft testimonial-style scripts and storyboards, then generate short promotional videos for review and editing.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts and supplied product or model images are sent to the selected generation provider.\n\nMitigation: Confirm the provider and obtain approval before sending sensitive images or prompts.\n\nRisk: Video generation can incur provider charges.\n\nMitigation: Review the script and use a dry run before paid generation.\n\nRisk: Synthetic testimonials can be mistaken for genuine customer experiences.\n\nMitigation: Do not attribute the video to real buyers; disclose AI generation as required by the publishing platform.\n\n## Reference(s):\n\n- [Generation provider guidance](references/provider-cli.md)\n- [Video backend and subtitle guidance](references/video-backends.md)\n- [Brand-kit model reference guidance](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Storyboards, Video files, Subtitle files]\n\n**Output Format:** [Markdown scripts and storyboard JSON; generated MP4 clips with optional SRT subtitles]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [A voiceover must be added separately; generated faces and lip sync may be imperfect.]\n\n## Skill Version(s):\n\n1.0.14 (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.14:examples/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\n\nFile v1.0.14:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.13: 13 files, 27850 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (2042b), SKILL.md (5092b), _meta.json (135b)\n\nFile v1.0.13:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.13\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.13:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.13\",\n  \"publishedAt\": 1790918374924\n}\n\nFile v1.0.13:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.13:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.13:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.13:skill-card.md\n\n## Description:\n\nCreates UGC-style product testimonial scripts and shot plans, with guidance for generating a selfie-style promotional video from a product and presenter persona.\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 marketers and creators use this skill to draft short product pitches and shot-by-shot plans, then generate UGC-style promotional clips with subtitles and optional voiceover editing.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts, product images, and face or reference images may be sent to a selected generation provider.\n\nMitigation: Use non-sensitive media, review inputs before submission, and run a dry-run first.\n\nRisk: Testimonial-style content may be mistaken for a real customer's experience or omit required AI disclosures.\n\nMitigation: Do not present generated testimonials as genuine buyer reviews; check the target platform's AI-content and advertising rules before publication.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/ugc-testimonial)\n- [Video backend configuration](artifact/references/video-backends.md)\n- [Provider CLI reference](artifact/references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, JSON, Shell commands, Guidance]\n\n**Output Format:** [Markdown scripts and shot plans with storyboard JSON and shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Configured generation providers can produce video clips and subtitle files; lip synchronization is not supported.]\n\n## Skill Version(s):\n\n1.0.13 (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.13:examples/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\n\nFile v1.0.13:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.12: 13 files, 27969 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (2207b), SKILL.md (5092b), _meta.json (135b)\n\nFile v1.0.12:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.12\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.12:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.12\",\n  \"publishedAt\": 1790733138377\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\nGenerates UGC-style product testimonial scripts, storyboards, and short videos from a product and presenter persona.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nCreators and marketing teams use this skill to draft persona-based product pitches and assemble short, selfie-style promotional videos with product shots and captions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts and selected reference images are sent to an external generation provider.\n\nMitigation: Use --dry-run first, avoid sensitive local files and internal URLs as image inputs, and select a provider whose data handling is acceptable.\n\nRisk: Generation may incur charges or expose API credentials.\n\nMitigation: Preview calls with --dry-run and use scoped, revocable API keys.\n\nRisk: A synthetic testimonial could be mistaken for a real customer endorsement.\n\nMitigation: Do not claim a real buyer's experience; disclose AI-generated content when the publishing platform requires it.\n\n## Reference(s):\n\n- [Provider CLI reference](references/provider-cli.md)\n- [Video backend configuration](references/video-backends.md)\n- [Brand-kit reference for consistent presenter identity](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Video files]\n\n**Output Format:** [Spoken script and storyboard JSON, with generated MP4 clips and optional SRT subtitles]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Video generation requires a configured provider and model; final assembly and subtitle embedding require ffmpeg. Narration is added separately because lip-sync is not supported.]\n\n## Skill Version(s):\n\n1.0.12 (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.12:examples/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\n\nFile v1.0.12:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.11: 13 files, 27742 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (1793b), SKILL.md (5092b), _meta.json (135b)\n\nFile v1.0.11:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.11\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.11:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.11\",\n  \"publishedAt\": 1790563253331\n}\n\nFile v1.0.11:references/provider-cli.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/provider-cli.md 同步生成，不要直接改这里。 -->\n# 后端调用参考\n\n技能正文只写「要生成什么」。认证、计费、错误码、输出结构这些每个技能都一样的东西放在这里，\n**用到时再读**，不占技能的常驻上下文。\n\n---\n\n## 一、认证\n\n### 默认后端 dLazy\n\n```bash\ndlazy login            # 设备码流程，远程 shell 也能用，自动写入本地配置\ndlazy auth set <KEY>   # 已有 key 时直接写入\n```\n\nkey 存在用户配置目录（macOS/Linux `~/.dlazy/config.json`，Windows `%USERPROFILE%\\.dlazy\\config.json`），\n权限限本机用户。也可以每次调用用环境变量 `DLAZY_API_KEY` 传入。\n\n手动获取：登录 [dlazy.com](https://dlazy.com) → [API Key 页面](https://dlazy.com/dashboard/organization/api-key)。\nkey 按组织隔离，可随时轮换或吊销。\n\n### 其他后端\n\n本技能库不锁定单一厂商。配好任意一家的 key 即可跑：\n\n| 后端 | 环境变量 | 说明 |\n| --- | --- | --- |\n| `dlazy` | `dlazy login` 或 `DLAZY_API_KEY` | 默认，最省事 |\n| `openai` | `OPENAI_API_KEY` | 走 `/v1/images/edits` 与 `/v1/images/generations` |\n| `gemini` | `GEMINI_API_KEY` | Nano Banana 系列 |\n| `fal` | `FAL_KEY` | |\n| `replicate` | `REPLICATE_API_TOKEN` | |\n| `ark` | `ARK_API_KEY` + `ARK_MODEL` | 火山方舟，模型 ID 需按开通情况填 |\n\n选路优先级：`--provider` 参数 > `PROVIDER` 环境变量 > 第一个配了 key 的 > `dlazy`。\n\n```bash\nnode scripts/gen.mjs --doctor     # 看当前哪个后端可用\n```\n\n各后端的模型 ID 可用 `GEN_MODEL_OPENAI` / `GEN_MODEL_GEMINI` / `GEN_MODEL_FAL` /\n`GEN_MODEL_REPLICATE` / `GEN_MODEL_ARK` 覆盖。**厂商目录会变，以各家最新文档为准。**\n\n---\n\n## 二、两种调用方式\n\n### 方式 A：统一入口（推荐）\n\n```bash\nnode scripts/gen.mjs --task <技能名> --prompt '...' --images a.jpg b.jpg --save out.jpg\n```\n\n它负责：后端选路、默认尺寸档位、失败重试（429/5xx 指数退避）、落盘建目录、成本估算。\n\n```bash\nnode scripts/gen.mjs --task flat-lay --prompt '...' --dry-run   # 不调用不计费，只看要发什么\nnode scripts/gen.mjs --help\n```\n\n### 方式 B：直接用 dLazy CLI\n\n不想引入 Node 依赖时，技能正文里的 `dlazy ...` 命令可以原样执行，效果等价。\n\n```bash\nnpx @dlazy/cli@1.2.3 <command>     # 不装全局二进制\n```\n\n- CLI 源码：[github.com/dlazy-ai/cli](https://github.com/dlazy-ai/cli) · npm 包 `@dlazy/cli`\n\n---\n\n## 三、数据流向\n\n调用 dLazy 时：提示词与参数发往 `api.dlazy.com`；传入的本地图片会上传到 `files.dlazy.com`\n供模型读取；产出 URL 同样托管在 `files.dlazy.com`。这是云端生成 API 的通用形态。\n换成其他后端时，数据流向对应厂商，不经过 dLazy。\n\n---\n\n## 四、输出结构\n\n`gen.mjs`（加 `--json`）：\n\n```json\n{\n  \"ok\": true,\n  \"task\": \"flat-lay\",\n  \"provider\": \"dlazy\",\n  \"model\": \"gpt-image-2\",\n  \"files\": [\"docs/flat-lay/output-sku001.jpg\"],\n  \"texts\": [],\n  \"estimatedCredits\": 60,\n  \"elapsedMs\": 58213\n}\n```\n\ndLazy CLI 原生：\n\n```json\n{\n  \"ok\": true,\n  \"result\": {\n    \"tool\": \"gpt-image-2\",\n    \"data\": { \"urls\": [\"https://files.dlazy.com/data/ai/....jpg\"] },\n    \"savedPath\": \"docs/flat-lay/example-output.jpg\"\n  }\n}\n```\n\n加 `--no-wait` 的异步任务不返回 `data`，返回 `task: { generateId, status }`，\n用 `dlazy status <generateId> --wait` 轮询。\n\n文本类模型（如质检）产出在 `result.data.texts[0]`：\n\n```bash\ndlazy claude-sonnet-5 --prompt '...' --images x.jpg \\\n  | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"data\"][\"texts\"][0])'\n```\n\n---\n\n## 五、错误处理\n\n| Code | 类型 | 示例 |\n| --- | --- | --- |\n| 401 | 未授权 / 无 key | `ok: false, code: \"unauthorized\"` |\n| 501 | 缺必填参数 | `error: required option '--prompt <prompt>' not specified` |\n| 502 | 本地文件读不到 | `Error: Image file not found: ...` |\n| 503 | 余额不足 | `ok: false, code: \"insufficient_balance\"` |\n| 503 | 服务端错误 | `HTTP status code error (500)` |\n| 504 | 异步任务失败 | `=== Generation Failed ===` / `Prompt violates safety policy` |\n\n**给 Agent 的硬性要求**\n\n1. 命中 `insufficient_balance` → 明确告诉用户算力不足，并给出充值入口\n   <https://dlazy.com/dashboard/organization/settings?tab=credits>\n2. 命中 `unauthorized` / 缺 key → 告诉用户去 <https://dlazy.com/dashboard/organization/api-key>\n   取 key，用 `dlazy auth set <key>` 存好再继续。\n3. 用 `gen.mjs` 时，429 与 5xx 已自动重试；仍失败才向用户报错。\n4. **不要**为了「跑通」而偷偷降级参数（尺寸、档位、批量），先问用户。\n\nFile v1.0.11:references/video-backends.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/video-backends.md 同步生成，不要直接改这里。 -->\r\n# 视频后端配置\r\n\r\n图像模型的默认值写死在 `lib/tasks.json` 里，视频模型没有——**因为各家的视频模型\r\nID 差异大、更新快，写死只会误导**。所以视频技能要求你显式指定。\r\n\r\n## 指定模型\r\n\r\n```bash\r\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\r\n# 或每次调用时\r\nnode scripts/video.mjs --mode clip --task main-image-video --model <id> ...\r\n```\r\n\r\n没设会直接报错，不会拿一个猜的模型名去跑。\r\n\r\n## 各后端\r\n\r\n| 后端 | 怎么配 | 说明 |\r\n| --- | --- | --- |\r\n| `dlazy` | `DLAZY_VIDEO_MODEL` | 用 `dlazy --help` 看当前账号可用的视频工具 |\r\n| `fal` | `FAL_KEY` + `GEN_MODEL_FAL=<视频模型路径>` | 产出在 `videos[]` 或 `video.url` |\r\n| `replicate` | `REPLICATE_API_TOKEN` + `GEN_MODEL_REPLICATE=<owner/model>` | 产出为 URL |\r\n\r\n图生视频时参考图走 `--images`，与图像技能一致。\r\n\r\n## 合成依赖\r\n\r\n拼接与字幕需要 ffmpeg：\r\n\r\n```bash\r\nbrew install ffmpeg        # macOS\r\napt install ffmpeg         # Debian/Ubuntu\r\n```\r\n\r\n没装也能跑——片段照常生成，脚本会输出 `concat.txt`，装好后一条命令补拼。\r\n\r\n## 字幕的三级降级\r\n\r\n1. **烧录进画面**：需要 ffmpeg 带 libass。很多发行版的预编译包没有。\r\n2. **软字幕轨**：`-c:s mov_text` 封进 MP4，播放器可开关。几乎总能成。\r\n3. **都不行**：`.srt` 留在产物目录旁边，可导入剪辑软件。\r\n\r\n脚本自动逐级尝试，不用你判断。查本机是否支持烧录：\r\n\r\n```bash\r\nffmpeg -hide_banner -filters | grep ' subtitles '\r\n```\r\n\r\n## 分镜文件\r\n\r\n```json\r\n{\r\n  \"shots\": [\r\n    { \"id\": \"s1\", \"seconds\": 3, \"image\": \"main.jpg\",\r\n      \"prompt\": \"Slow push-in on the product, soft light sweeps across the surface.\",\r\n      \"caption\": \"三层加厚，零下也不怕\" }\r\n  ]\r\n}\r\n```\r\n\r\n`caption` 会按 `seconds` 累加时间轴自动生成 SRT，不用手对时间码。\n\nFile v1.0.11:scripts/lib/tasks.json\n\n{\r\n  \"_note\": \"技能 → 默认模型与参数。dlazy 列为默认后端的模型名；其他后端走 providers.mjs 的通用映射，可用 GEN_MODEL_<PROVIDER> 覆盖。\",\r\n  \"_credits\": { \"gpt-image-2\": 60, \"seedream-5.0\": 30, \"seedream-5.0-pro\": 45, \"banana-pro\": 25, \"claude-sonnet-5\": 3 },\r\n  \"tasks\": {\r\n    \"flat-lay\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"wear-everything\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"image-fusion\":            { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"one-shot\":                { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"fission-pattern\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-detail\":             { \"model\": \"seedream-5.0-pro\", \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"creative-scene\":          { \"model\": \"banana-pro\",       \"size\": \"1024x1536\", \"format\": \"jpeg\" },\r\n    \"batch-image\":             { \"model\": \"seedream-5.0\",     \"size\": \"3:4\",       \"resolution\": \"2k\" },\r\n    \"to-3d\":                   { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-extraction\":     { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"fabric-on-body\":          { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-detail\":         { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"clothing-grass-planting\": { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"medium\", \"format\": \"jpeg\" },\r\n    \"item-selling-point\":      { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"item-change-background\":  { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"remove-watermark\":        { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"material-enhancement\":    { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"item-repair\":             { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"detect-task\":             { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"listing-optimizer\":       { \"model\": \"gpt-image-2\",      \"size\": \"1024x1024\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"cross-border-localize\":   { \"model\": \"seedream-5.0-pro\", \"size\": \"1:1\",       \"resolution\": \"2k\" },\r\n    \"brand-kit\":               { \"model\": \"gpt-image-2\",      \"size\": \"1024x1536\", \"quality\": \"high\",   \"format\": \"jpeg\" },\r\n    \"platform-compliance\":     { \"model\": \"claude-sonnet-5\",  \"text\": true },\r\n    \"main-image-video\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"product-video-ad\":        { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true },\r\n    \"ugc-testimonial\":         { \"model\": \"$DLAZY_VIDEO_MODEL\", \"video\": true }\r\n  }\r\n}\n\nFile v1.0.11:skill-card.md\n\n## Description:\n\nCreates persona-led UGC-style product testimonial scripts, shot plans, and short promotional videos with a handheld selfie aesthetic.\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 creators and marketing teams use this skill to draft persona-based product scripts and storyboards and generate UGC-style promotional video clips for review before publication.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts and selected product or model images may be sent to the configured generation provider.\n\nMitigation: Review the inputs and provider before running generation; use dry-run first.\n\nRisk: AI-generated testimonial content may be mistaken for a genuine customer review.\n\nMitigation: Do not present it as a real buyer's experience; disclose AI generation where required and check the destination platform's rules.\n\n## Reference(s):\n\n- [Video backend configuration](references/video-backends.md)\n- [Generation provider guidance](references/provider-cli.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, JSON, Shell commands, Video files]\n\n**Output Format:** [Product scripts, storyboard JSON, and generated video clips with optional subtitles]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Video clips may require voiceover and final editing.]\n\n## Skill Version(s):\n\n1.0.11 (source: frontmatter and ClawHub release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.11:examples/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\n\nFile v1.0.11:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.10: 13 files, 28333 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (2906b), SKILL.md (5092b), _meta.json (135b)\n\nFile v1.0.10:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.10\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.10:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.10\",\n  \"publishedAt\": 1790217740133\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\nUGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\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 creators, marketers, and ecommerce teams use this skill to draft UGC-style testimonial scripts, storyboard short product videos, and generate video clips with captions for commercial product promotion.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts and selected reference images may be sent to the configured generation provider and may incur provider billing.\n\nMitigation: Run the documented dry-run mode first, verify the selected provider and estimated cost, and confirm that the referenced media is appropriate to send to that provider.\n\nRisk: UGC-style video can mislead viewers if presented as a real buyer testimonial.\n\nMitigation: Use the skill's disclosure guidance: do not claim generated scenes are real customer experiences, avoid fake review artifacts, and follow the target platform's AI-generated-content labeling rules.\n\nRisk: Video model behavior may produce weak lip sync, inconsistent faces, or stiff expressions.\n\nMitigation: Use short talking-head clips, lock the face through the brand reference workflow, prefer voiceover instead of synchronized speech, and review outputs before publication.\n\nRisk: Generated commands may require credentials, local files, ffmpeg, and third-party provider tools to be present.\n\nMitigation: Review commands before execution, use documented authentication flows, install ffmpeg only when needed for assembly or subtitles, and keep API keys in the supported local configuration or environment variables.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/ugc-testimonial)\n- [Backend provider CLI reference](references/provider-cli.md)\n- [Video backend configuration](references/video-backends.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with JSON storyboards, shell commands, and generated video, subtitle, and configuration files]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Supports dry-run review, configurable model providers, local output files, storyboard clips, final MP4 assembly, and SRT subtitles.]\n\n## Skill Version(s):\n\n1.0.10 (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.10:examples/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\n\nFile v1.0.10:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.9: 13 files, 27995 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (2446b), SKILL.md (5091b), _meta.json (134b)\n\nFile v1.0.9:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.9\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.9:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.9\",\n  \"publishedAt\": 1790041527356\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\nGenerates UGC-style testimonial scripts, storyboards, and video-generation workflows from product and persona inputs with a casual creator-shot look.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dlazyai](https://clawhub.ai/user/dlazyai)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal marketers, ecommerce operators, and creative teams use this skill to draft UGC-style product testimonial scripts and storyboards, then run video-generation workflows for ad creatives. The skill is intended for AI-generated demonstrations, not fabricated real buyer reviews.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product prompts and reference images may be sent to the selected AI generation provider.\n\nMitigation: Use dry-run first, use only approved providers for the data involved, and avoid private customer data, secrets, or unreleased product information in prompts or reference assets.\n\nRisk: Untrusted image URLs or local files may be used as generation inputs.\n\nMitigation: Provide only trusted image URLs and files, and review the generated request before enabling a paid provider call.\n\nRisk: UGC-style generated content may be mistaken for a genuine buyer testimonial.\n\nMitigation: Label AI-generated content according to the target platform rules and avoid claims that the output is a real named customer's experience.\n\n## Reference(s):\n\n- [ClawHub Skill Page](https://clawhub.ai/dlazyai/skills/ugc-testimonial)\n- [Provider CLI Reference](artifact/references/provider-cli.md)\n- [Video Backend Configuration](artifact/references/video-backends.md)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Shell commands, Configuration, Files]\n\n**Output Format:** [Markdown guidance with bash commands, JSON storyboard examples, local file paths, and generated media outputs]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce dry-run request summaries, generated MP4 clips or final videos, SRT subtitle files, and concat files depending on the selected workflow.]\n\n## Skill Version(s):\n\n1.0.9 (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.9:examples/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\n\nFile v1.0.9:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.8: 13 files, 28298 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (2857b), SKILL.md (5091b), _meta.json (134b)\n\nFile v1.0.8:SKILL.md\n\n---\nname: ugc-testimonial\nversion: 1.0.8\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有**。大部分人静音刷视频。\n\nFile v1.0.8:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.8\",\n  \"publishedAt\": 1789869531810\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\nUGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\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 commerce operators and creative agents use this skill to turn product details and buyer personas into UGC-style testimonial scripts, storyboards, and generated short-form video assets. It is intended for disclosed AI-generated demonstrations, not undisclosed fake customer reviews.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Prompts, product data, and reference images may be sent to the selected generation provider.\n\nMitigation: Choose the provider intentionally, review provider data handling requirements, and avoid submitting sensitive images or confidential product material unless approved.\n\nRisk: Remote reference image URLs can expose data to third-party hosts or retrieve untrusted content.\n\nMitigation: Prefer trusted local assets and avoid untrusted remote image URLs.\n\nRisk: UGC-style output could be mistaken for a real customer testimonial.\n\nMitigation: Disclose AI-generated content where required and do not present generated scenes as real buyer reviews or authentic customer experiences.\n\nRisk: A generation run may incur provider cost or use an unintended model.\n\nMitigation: Run with --dry-run first, verify the selected provider and model, and set the video model explicitly before execution.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/dlazyai/skills/ugc-testimonial)\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- [Brand kit reference](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Markdown, Shell commands, Configuration, Files]\n\n**Output Format:** [Markdown guidance with bash and JSON examples; generated runs can produce MP4 video files, SRT subtitles, concat lists, and JSON status envelopes.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Supports dry-run previews, explicit provider/model selection, storyboard inputs, optional brand configuration, and ffmpeg-based concatenation/subtitle post-processing.]\n\n## Skill Version(s):\n\n1.0.8 (source: frontmatter and 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/ugc-board.json\n\n{\r\n  \"_note\": \"UGC 口播分镜示例。口播镜头与商品镜头交替，口播镜头必须用同一张脸的参考图。\",\r\n  \"shots\": [\r\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the product. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"零下五度，我就穿了这一件\" },\r\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"examples/shot-detail.jpg\",\r\n      \"prompt\": \"Handheld close-up of the product texture, phone-camera look, natural indoor light, slight shake.\",\r\n      \"caption\": \"粗棒针织，比看起来厚\" },\r\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"examples/face.jpg\",\r\n      \"prompt\": \"Handheld selfie-style shot, same woman, same apartment, she pulls the collar up and smiles. Phone-camera look, not cinematic.\",\r\n      \"caption\": \"洗了三次也没变形\" }\r\n  ]\r\n}\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\n\nArchive v1.0.7: 13 files, 27866 bytes\n\nFiles: examples/brand.yaml (1655b), examples/ugc-board.json (1016b), 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 (5091b), _meta.json (134b)","readmeExcerpt":"Skill: UGC 口播种草视频 UGC Testimonial Owner: dlazyai Summary: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。 Tags: latest:1.0.16 Version history: v1.0.16 | 2026-10-10T01:57:48.468Z | user 例行版本更新 2026-10-10 v1.0.15 | 2026-10-08T01:48:42.323Z | user 例行版本更新 2026-10-08 v1.0.14 | 2026-10-04T01:48:05.559Z | user 例行版本更新 2026-10-04 v1.0.13 | 2026-10-02T05:19:34.924Z | user 例行版本更新 2026-10-02 v1.0.12 | 2","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意"},{"language":"bash","snippet":"export DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles"},{"language":"json","snippet":"{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}"},{"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: ugc-testimonial\nversion: 1.0.16\ndescription: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。\n---\n\n# ugc-testimonial — UGC 口播种草\n\n投流素材里转化最好的一类往往不是精致广告，而是**看起来像真人随手拍的推荐**。\n\n这个技能生成那种质感：手持、家里的光、说人话。\n\n---\n\n## 一、能力边界\n\n| 能做 | 说明 |\n| --- | --- |\n| 口播脚本 | 商品 + 人设 → 一段能照着念的话 |\n| 分镜 | 口播镜头 + 商品特写的交替结构 |\n| UGC 质感 | 手持轻晃、室内自然光、非专业构图 |\n| 多人设 | 同一商品换人设出多版做 A/B |\n\n| 不能做 | 说明 |\n| --- | --- |\n| 对口型 | 生成模型做不好唇形同步，成片建议配旁白而不是同期声 |\n| 冒充真人 | 不要声称是真实买家评价，见下方「合规」 |\n\n---\n\n## 二、合规先说\n\nUGC 风格 ≠ 伪造评价。生成的内容**不能声称是真实买家的真实使用体验**。\n\n| 可以 | 不可以 |\n| --- | --- |\n| AI 生成的演示型口播 | 冒充具名真实买家的评价 |\n| 「这件我穿了一周」的场景演绎 | 伪造好评截图、伪造买家秀 |\n| 按平台要求标注 AI 生成 | 隐瞒 AI 生成身份（部分平台强制标注） |\n\n各平台对 AI 生成内容的标注要求不同，投放前确认目标平台的规则。\n\n---\n\n## 三、人设与脚本\n\n**人设三要素**：谁、什么场景、为什么可信。\n\n| 人设 | 开场白范式 |\n| --- | --- |\n| 通勤白领 | 「每天挤地铁，我需要一件不用打理的……」 |\n| 学生党 | 「预算两百，我对比了五家……」 |\n| 宝妈 | 「带娃根本没时间收拾自己，所以……」 |\n| 健身人群 | 「练完一身汗，这件……」 |\n\n**脚本骨架（15 秒）**\n\n```\n0-3s   钩子：说一个具体的痛点，不说商品\n3-8s   转折：为什么这个能解决 —— 给一个可验证的细节\n8-12s  展示：镜头切到商品特写\n12-15s 落点：给一个行动理由，语气随意\n```\n\n**写口播的三条铁律**\n\n1. **说具体的**。「特别暖和」无效，「零下五度我只穿了这一件」有效。\n2. **留犹豫**。真人说话有停顿和自我修正，全是完美长句就假了。\n3. **不念参数**。参数放字幕，嘴里说感受。\n\n---\n\n## 四、工具调用\n\n```bash\nexport DLAZY_VIDEO_MODEL=<你账号里可用的视频模型 ID>\n\nnode scripts/video.mjs --mode storyboard --task ugc-testimonial \\\n  --board examples/ugc-board.json --outdir out/ugc --subtitles\n```\n\n分镜里交替口播镜头与商品镜头：\n\n```json\n{\n  \"shots\": [\n    { \"id\": \"talk1\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, young woman talking to camera in a bright apartment, slight natural camera shake, warm window light, casual home background. She is wearing the olive cable-knit sweater.\",\n      \"caption\": \"零下五度，我就穿了这一件\" },\n    { \"id\": \"detail1\", \"seconds\": 3, \"image\": \"docs/flat-lay/garment-flatlay.jpg\",\n      \"prompt\": \"Handheld close-up of the sweater texture, phone-camera look, natural indoor light.\",\n      \"caption\": \"粗棒针织，比看起来厚\" },\n    { \"id\": \"talk2\", \"seconds\": 4, \"image\": \"assets/model/face-a.jpg\",\n      \"prompt\": \"Handheld selfie-style shot, same woman, she pulls the collar up and smiles, same apartment.\",\n      \"caption\": \"洗了三次也没变形\" }\n  ]\n}\n```\n\n**关键 prompt 词**：`handheld`、`selfie-style`、`slight natural camera shake`、\n`phone-camera look`、`natural indoor light`、`casual` —— 这些制造「不专业」的质感。\n不要写 `cinematic`、`professional lighting`、`studio`，那会把 UGC 感抹掉。\n\n---\n\n## 五、执行流程\n\n1. **先定人设**。问用户卖给谁，人设跟着买家画像走。\n2. **写脚本给用户确认**。口播文案比画面更决定转化。\n3. **锁脸**。多个口播镜头必须是同一个人，用 [brand-kit](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/brand-kit/skill.md) 的 `model.reference`。\n4. **`--dry-run` 过一遍**，再真跑。\n5. **配旁白**。生成的视频不做唇形同步，成片后用剪辑软件配一条旁白，比同期声自然。\n\n---\n\n## 六、常见问题\n\n| 现象 | 原因 | 怎么办 |\n| --- | --- | --- |\n| 看起来还是像广告 | prompt 里有 `cinematic` / `professional` | 换成 handheld / phone-camera look |\n| 几个镜头不是同一个人 | 没锁脸 | 用 `--brand` 带 `model.reference` |\n| 嘴型对不上 | 模型不做唇形同步 | 别用同期声，配旁白；或改用不露脸的手持镜头 |\n| 表情僵硬 | 人脸是视频模型弱项 | 缩短口播镜头，多用商品特写切换 |\n\n---\n\n## Tips\n\n- **口播镜头短、商品镜头长**。人脸生成越久越容易崩，3–4 秒一切。\n- **同一脚本换人设出三版**做 A/B，投流看数据说话。\n- **字幕必须有"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"ugc-testimonial\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1791597468468\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":"UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。 Skill: UGC 口播种草视频 UGC Testimonial Owner: dlazyai Summary: UGC 口播种草视频。商品 + 人设 → 口播脚本与成片，达人自拍质感。当用户说「口播视频」「种草视频」「达人风格」「UGC」「真人推荐」时使用。 Tags: latest:1.0.16 Version history: v1.0.16 | 2026-10-10T01:57:48.468Z | user 例行版本更新 2026-10-10 v1.0.15 | 2026-10-08T01:48:42.323Z | user 例行版本更新 2026-10-08 v1.0.14 | 2026-10-04T01:48:05.559Z | user 例行版本更新 2026-10-04 v1.0.13 | 2026-10-02T05:19:34.924Z | user 例行版本更新 2026-10-02 v1.0.12 | 2","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":959,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T05:33:58.132Z","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-11T05:33:58.132Z","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-11T07:41:12.853Z","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"}]}}}