{"id":"36406703-0666-4219-99d7-af9d228f4447","entityType":"agent","slug":"clawhub-dlazyai-batch-image","name":"多商品批量生图 Batch Image","canonicalUrl":"https://www.xpersona.co/agent/clawhub-dlazyai-batch-image","canonicalPath":"/agent/clawhub-dlazyai-batch-image","generatedAt":"2026-10-10T23:45:22.773Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T20:10:04.361Z","emptyReason":null},"description":"多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。 Skill: 多商品批量生图 Batch Image Owner: dlazyai Summary: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。 Tags: latest:1.0.19 Version history: v1.0.19 | 2026-10-10T01:45:32.203Z | user 例行版本更新 2026-10-10 v1.0.18 | 2026-10-08T01:39:03.583Z | user 例行版本更新 2026-10-08 v1.0.17 | 2026-10-04T01:39:39.100Z | user 例行版本更新 2026-10-04 v1.0.16 | 2026-10-02T05:13:29.975Z | user 例行版本更新 2026-1","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:batch-image","sourceUrl":"https://clawhub.ai/dlazyai/batch-image","homepage":"https://clawhub.ai/dlazyai/skills/batch-image","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/dlazyai/batch-image","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/dlazyai/skills/batch-image","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。 Skill: 多商品批量生图 Batch Image Owner: dlazyai Summary: 多商品批量生图流水线。商"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T20:10:04.361Z","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-10T20:10:04.361Z","emptyReason":null},"stars":null,"forks":null,"downloads":1270,"packageName":null,"latestVersion":"1.0.19","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T20:10:04.360Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T20:10:04.361Z","lastCrawledAt":"2026-10-10T20:10:04.360Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T20:10:04.360Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.19","createdAt":"2026-10-10T01:45:32.203Z","changelog":"例行版本更新 2026-10-10","fileCount":15,"zipByteSize":42660},{"version":"1.0.18","createdAt":"2026-10-08T01:39:03.583Z","changelog":"例行版本更新 2026-10-08","fileCount":15,"zipByteSize":42788},{"version":"1.0.17","createdAt":"2026-10-04T01:39:39.100Z","changelog":"例行版本更新 2026-10-04","fileCount":15,"zipByteSize":42765},{"version":"1.0.16","createdAt":"2026-10-02T05:13:29.975Z","changelog":"例行版本更新 2026-10-02","fileCount":15,"zipByteSize":42698},{"version":"1.0.15","createdAt":"2026-09-30T01:42:35.078Z","changelog":"例行版本更新 2026-09-30","fileCount":15,"zipByteSize":42763},{"version":"1.0.14","createdAt":"2026-09-28T02:33:22.225Z","changelog":"例行版本更新 2026-09-28","fileCount":15,"zipByteSize":42668},{"version":"1.0.13","createdAt":"2026-09-24T06:55:05.098Z","changelog":"例行版本更新 2026-09-24","fileCount":15,"zipByteSize":43006},{"version":"1.0.12","createdAt":"2026-09-22T01:37:03.960Z","changelog":"例行版本更新 2026-09-22","fileCount":15,"zipByteSize":42914}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170j1ymymrxasgd00dsk7tckx84cf45:batch-image","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-batch-image/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-batch-image/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-batch-image/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-batch-image/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-batch-image/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-batch-image/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-10T23:45:22.770Z"}},"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-batch-image/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-batch-image/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-batch-image/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dlazyai-batch-image/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-10T20:10:04.361Z","emptyReason":null},"readme":"Skill: 多商品批量生图 Batch Image\n\nOwner: dlazyai\n\nSummary: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n\nTags: latest:1.0.19\n\nVersion history:\n\nv1.0.19 | 2026-10-10T01:45:32.203Z | user\n\n例行版本更新 2026-10-10\n\nv1.0.18 | 2026-10-08T01:39:03.583Z | user\n\n例行版本更新 2026-10-08\n\nv1.0.17 | 2026-10-04T01:39:39.100Z | user\n\n例行版本更新 2026-10-04\n\nv1.0.16 | 2026-10-02T05:13:29.975Z | user\n\n例行版本更新 2026-10-02\n\nv1.0.15 | 2026-09-30T01:42:35.078Z | user\n\n例行版本更新 2026-09-30\n\nv1.0.14 | 2026-09-28T02:33:22.225Z | user\n\n例行版本更新 2026-09-28\n\nv1.0.13 | 2026-09-24T06:55:05.098Z | user\n\n例行版本更新 2026-09-24\n\nv1.0.12 | 2026-09-22T01:37:03.960Z | user\n\n例行版本更新 2026-09-22\n\nv1.0.11 | 2026-09-20T01:46:30.762Z | user\n\n例行版本更新 2026-09-20\n\nv1.0.10 | 2026-09-18T02:06:14.100Z | user\n\n例行版本更新 2026-09-18\n\nv1.0.9 | 2026-09-14T01:33:48.026Z | user\n\n例行版本更新 2026-09-14\n\nv1.0.8 | 2026-09-10T01:31:45.832Z | user\n\n例行版本更新 2026-09-10\n\nv1.0.7 | 2026-09-08T01:37:39.572Z | user\n\n例行版本更新 2026-09-08\n\nv1.0.6 | 2026-09-07T01:46:10.145Z | user\n\n例行版本更新 2026-09-07\n\nv1.0.5 | 2026-09-04T01:39:11.770Z | user\n\n例行版本更新 2026-09-04\n\nv1.0.4 | 2026-09-02T01:34:39.766Z | user\n\n例行版本更新 2026-09-02\n\nv1.0.3 | 2026-08-31T07:01:17.289Z | user\n\n源码仓库迁移至 github.com/dlazy-ai/ecommerce-skills\n\nv1.0.2 | 2026-08-31T05:23:23.124Z | user\n\n源码仓库迁移至 github.com/dlazy-ai/ecommerce-skills\n\nv1.0.1 | 2026-08-29T03:54:42.806Z | user\n\nSync from GitHub\n\nv1.0.0 | 2026-08-18T04:37:46.518Z | user\n\nSync from GitHub\n\nArchive index:\n\nArchive v1.0.19: 15 files, 42660 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2132b), SKILL.md (13199b), _meta.json (131b)\n\nFile v1.0.19:SKILL.md\n\n---\nname: batch-image\nversion: 1.0.19\ndescription: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n---\n\n# batch-image — 多商品批量生图\n\n把单张生图变成**流水线**：一份商品清单 → 一整套风格统一的商拍图。\n\n批量的难点不是「跑很多次」，而是**跑出来的图要像一套**。本技能的核心是**规范段与变量段分离**：视觉规范逐字不变，只有商品描述随 SKU 变化。\n\n---\n\n## 生成效果示例\n\n| 输入：商品清单（2 个 SKU） |\n| --- |\n| `SKU001` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-a-sweater.jpg\" width=\"150\"> `军绿色麻花针织圆领毛衣，落肩宽松版型` |\n| `SKU002` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-b-shoes.jpg\" width=\"150\"> `黑色亮面皮革布洛克德比鞋，厚底系带` |\n\n实际执行的命令（循环体，两个 SKU 只有 `DESC` 与 `--images` 不同，规范段逐字相同）：\n\n```bash\nfor sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone\n```\n\n**输出：同一套视觉规范下的两个 SKU**\n\n| SKU001 | SKU002 |\n| --- | --- |\n| <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-a-sweater.jpg\" width=\"280\"> | <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-b-shoes.jpg\" width=\"280\"> |\n| 1:1 / 2K，5 credits | 1:1 / 2K，5 credits |\n\n两张的背景色、光位、视角与投影方向一致——因为规范段逐字相同；商品各自保真。100 个 SKU 就是这个循环跑 100 次，总价约 500 credits。\n\n---\n\n## 1、能力边界\n\n| 能力 | 说明 |\n| --- | --- |\n| 批量规模 | 一批最多 100 个商品（对应企业功能的规格） |\n| 成本优势 | 批量场景下单图算力成本可降至约 7 折 |\n| 协作 | 多人在线协作、出片进度实时追踪 |\n| 资产共享 | 共享模特 / 参考图 / 作品 / 算力点 |\n| 本技能落地 | 清单驱动循环 + 并发控制 + 失败重试 + 按 SKU 归档 + 汇总报告 |\n\n**不做**：不在同一批里混用不同视觉规范（那不是一批）；不跳过抽样质检直接全量上架；不因为批量就放宽商品保真要求。\n\n---\n\n## 2、输入素材规则\n\n生成前先自检这几条硬性约束：\n\n- 大小：**20KB ~ 15MB**\n- 分辨率：**大于 400×400**\n- 格式：**jpg / jpeg / png / webp**\n\n**商品清单（manifest）** 是批量的输入，建议 CSV：\n\n```csv\nsku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\n```\n\n**每张商品图仍要满足单图规则**：20KB~15MB、>400×400、jpg/jpeg/png/webp。\n\n**批量前必做的事**\n\n| 步骤 | 说明 |\n| --- | --- |\n| ✅ 先跑通 1 个 SKU | 单个跑不对，跑 100 个只是错 100 次 |\n| ✅ 再抽样 5 个 SKU | 覆盖品类/颜色/深浅色的边界情况 |\n| ✅ 确认成本 | `--dry-run` 单价 × SKU 数 × batch 数 |\n| ❌ 直接全量 | 最容易烧算力的做法 |\n\n---\n\n## 3、规范段 / 变量段分离\n\n这是批量出统一视觉的唯一方法：\n\n```text\nprompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]\n```\n\n| 段 | 内容 | 是否变 |\n| --- | --- | --- |\n| 规范段 | 背景、光位、机位、构图留白、投影、色调、输出风格、`no text, no watermark` | **整批逐字不变** |\n| 变量段 | 商品品类 + 颜色 + 材质 + 关键结构特征 | 每个 SKU 不同 |\n\n写成 shell：\n\n```bash\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/batch-image/out/${SKU}.jpg\"\ndone < manifest.csv\n```\n\n**规范段一旦改动就必须整批重跑**——否则同一批里会出现两种视觉。\n\n---\n\n## 4、并发、重试与进度\n\n**并发**：dlazy 是单次调用一个任务，批量靠 shell 并发。控制在 4~6 路，太高容易触发限流。\n\n```bash\nrun_one() { ... }               # 单个 SKU 的生成逻辑\nexport -f run_one\nxargs -P 5 -I{} bash -c 'run_one {}' < sku-list.txt     # 5 路并发\n```\n\n**重试**：网络与服务端偶发失败很正常，包一层重试。\n\n```bash\nfor attempt in 1 2 3; do\n  dlazy ... && break\n  echo \"retry $attempt for $SKU\" >&2; sleep $((attempt * 10))\ndone\n```\n\n**异步模式**：SKU 很多时用 `--no-wait` 先把任务全部提交，拿到 `generateId` 后再统一轮询，避免长时间占着进程。\n\n```bash\nGID=$(dlazy seedream-5.0 --no-wait ... | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"task\"][\"generateId\"])')\necho \"$SKU,$GID\" >> tasks.csv\n# 稍后统一收结果\nwhile IFS=, read -r SKU GID; do dlazy status \"$GID\" --wait; done < tasks.csv\n```\n\n**进度与汇总**：每个 SKU 记一行状态，跑完输出报告。\n\n```bash\necho \"$SKU,$(test -f out/$SKU.jpg && echo ok || echo fail)\" >> report.csv\nawk -F, '{c[$2]++} END{for(k in c) print k, c[k]}' report.csv\n```\n\n---\n\n## 5、工具调用\n\n本技能使用 dLazy 的 **`seedream-5.0`**（批量场景的关键指标是**单图成本**与**参考图支持**：本模型单张约 5 credits、支持最多 10 张参考图、支持 2K/3K/4K；100 个 SKU 的成本量级从数百降到数十。对商品保真要求极高的批次改用 `gpt-image-2`）。\n\n### 调用方式\n\n两种等价写法，选一种。统一入口会自动选后端、失败重试、建目录落盘、估算成本：\n\n```bash\n# A. 统一入口（推荐）：可切任意后端，加 --dry-run 不计费空跑\nnode scripts/gen.mjs --task batch-image \\\n  --prompt '<见下方 Prompt 模板>' \\\n  --images <按下表顺序> \\\n  --save output/batch-image-<sku>.jpg\n\n# B. 直接用 dLazy CLI（不想引入 Node 依赖时，效果等价）\ndlazy seedream-5.0 --prompt '...' --images ... --save output/batch-image.jpg\n```\n\n**参数约定（本技能固定用法）**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--images` | `[该 SKU 的商品图]`（+ 整批共用的参考图 / 模特图） | 共用素材放在固定位置，prompt 里用固定图号引用 |\n| `--size` | 整批统一（`1:1` 主图 / `3:4` 竖版） | 不统一就不是一套 |\n| `--resolution` | `2k` | 上架足够；4K 只给需要印刷的批次 |\n| `--batch` | `1`（批量场景靠 SKU 数量，不靠 batch） | batch 会让成本翻倍 |\n| `--no-wait` | SKU 很多时开启 | 先提交后轮询，避免长时间阻塞 |\n| `--save` | `docs/batch-image/out/<SKU>.jpg` | 用 SKU 命名，便于回填到商品库 |\n\n> **模型切换**：`seedream-5.0` 便宜、适合氛围与场景图；对商品保真要求极高（图案位置、五金细节）的批次换 `gpt-image-2`，成本约 6 倍。同一批内不要混用两个模型。\n\n### Command Examples\n\n```bash\n# basic call: 单个 SKU（先跑通这个，再谈批量）\ndlazy seedream-5.0 \\\n  --prompt '电商商拍图。图1 是商品：军绿色麻花针织圆领毛衣，落肩宽松版型。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影。真实商业产品摄影，无文字无水印。' \\\n  --images docs/batch-image/sku-a-sweater.jpg --size 1:1 --resolution 2k\n\n# complex call: 完整流水线（清单驱动 + 5 路并发 + 3 次重试 + 汇总报告）\ncat > manifest.csv <<'CSV'\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\nCSV\n\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\nmkdir -p docs/batch-image/out\n\nrun_one() {\n  IFS=, read -r SKU IMG DESC <<< \"$1\"\n  for attempt in 1 2 3; do\n    dlazy seedream-5.0 \\\n      --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n      --images \"$IMG\" --size 1:1 --resolution 2k \\\n      --save \"docs/batch-image/out/${SKU}.jpg\" >/dev/null 2>&1 && break\n    sleep $((attempt * 10))\n  done\n  if [ -f \"docs/batch-image/out/${SKU}.jpg\" ]; then echo \"${SKU},ok\"; else echo \"${SKU},fail\"; fi\n}\nexport -f run_one; export SPEC\n\nxargs -P 5 -I{} bash -c 'run_one \"{}\"' < manifest.csv | tee docs/batch-image/report.csv\nawk -F, '{c[$2]++} END{printf \"\\n=== 汇总 ===\\n\"; for(k in c) printf \"%s: %d\\n\", k, c[k]}' docs/batch-image/report.csv\n\n# 先估价：单价 × SKU 数\ndlazy seedream-5.0 --dry-run --prompt '...' --images a.jpg --size 1:1 | grep estimatedCost\necho \"SKU 数：$(wc -l < manifest.csv)\"\n\n```\n\n### 延伸阅读\n\n| 要查什么 | 去哪 |\n| --- | --- |\n| 认证、多后端配置、输出结构、错误码 | [`references/provider-cli.md`](references/provider-cli.md) |\n| `seedream-5.0` 的全部可用参数 | [`references/model-flags.md`](references/model-flags.md) |\n| 统一入口的全部选项 | `node scripts/gen.mjs --help` |\n\n## 6、Prompt 模板\n\n```text\n【变量段 · 每个 SKU 不同】\n电商商拍图。图1 是商品：[品类 + 颜色 + 材质 + 关键结构特征]。\n商品的颜色、材质纹理、款式细节必须与图1完全一致。\n\n【规范段 · 整批逐字不变】\n放置在同一套统一视觉里：[背景]，[光位]，[机位/视角]，\n画面下方留出统一的商品投影，构图与留白在整组图中保持一致。\n真实商业产品摄影，无文字无水印。\n```\n\n**按问题追加的修正句**（改了就要整批重跑）\n\n| 问题 | 处理 |\n| --- | --- |\n| 深色商品在浅背景上发灰 | 规范段补 `深色商品需加右侧轮廓光勾边，避免与背景糊在一起` |\n| 不同 SKU 的商品大小忽大忽小 | 规范段补 `商品在画面中的占比统一为约 [X]%，边距一致` |\n| 投影方向不一致 | 规范段补 `投影统一朝画面右下方，长度约为商品高度的 [X]` |\n| 某些 SKU 保真度不够 | 那部分 SKU 单独用 `gpt-image-2` 重跑，并在报告里标注 |\n\n---\n\n## 7、执行流程\n\n1. **建清单**：`sku,image,desc` 三列 CSV，每张商品图先过单图规则校验。\n2. **写规范段**：背景 / 光位 / 机位 / 占比 / 投影 / 色调 / 输出风格——**定稿后不许改**。\n3. **跑通 1 个 SKU**：确认规范段和变量段都对。\n4. **抽样 5 个 SKU**：覆盖深色 / 浅色 / 反光 / 大件 / 小件的边界。\n5. **`--dry-run` 估总价**：单价 × SKU 数。\n6. **全量跑**：5 路并发 + 3 次重试；SKU 很多时用 `--no-wait` 提交后统一轮询。\n7. **看汇总报告**：失败的单独重跑。\n8. **抽样质检**：随机抽 10% 过 [detect-task](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/detect-task/skill.md)；不合格的 SKU 单独用 `gpt-image-2` 重跑。\n\n---\n\n## 8、常见问题\n\n| 现象 | 原因 | 处理 |\n| --- | --- | --- |\n| 同一批里视觉不统一 | 中途改了规范段 | 规范段定稿后不许改；改了就整批重跑 |\n| 深色商品糊进背景 | 缺轮廓光 | 规范段补轮廓光句，整批重跑 |\n| 商品占比忽大忽小 | 未约束占比 | 规范段补占比与边距句 |\n| 部分 SKU 保真度不够 | 低价模型的局限 | 那些 SKU 单独用 `gpt-image-2` 重跑 |\n| 跑到一半失败一堆 | 并发太高触发限流 | 并发降到 4~5，加重试与退避 |\n| 成本超预算 | 用了 `--batch` 或 4K | 批量场景 `--batch 1` + `2k` |\n| 跑完不知道哪些失败了 | 没有报告 | 用第四节的 report.csv + 汇总 |\n\n---\n\n## Tips\n\nVisit https://dlazy.com for more information.\n\nFile v1.0.19:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"batch-image\",\n  \"version\": \"1.0.19\",\n  \"publishedAt\": 1791596732203\n}\n\nFile v1.0.19:references/model-flags.md\n\n# `seedream-5.0` 参数清单\r\n\r\n本技能默认用的模型的完整参数。日常只需要「参数约定」里那几个，\r\n这份清单在需要用到非常规参数时再看。\r\n\r\n**CRITICAL INSTRUCTION FOR AGENT**:\r\nRun the `dlazy seedream-5.0` command to get results.\r\n\r\n```bash\r\ndlazy seedream-5.0 -h\r\n\r\nOptions:\r\n  --prompt <prompt>          Prompt\r\n  --images [images...]       Images [image: url or local path] (max 10)\r\n  --resolution <resolution>  Resolution [default: 2k] (choices: \"2k\", \"3k\",\r\n                             \"4k\")\r\n  --size <size>              Size [default: 16:9] (choices: \"1:1\", \"4:3\",\r\n                             \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\")\r\n  --dry-run                  Print payload without executing the tool\r\n  --no-wait                  Return generateId immediately for async tasks\r\n  --timeout <seconds>        Max seconds to wait for async completion (default:\r\n                             \"1800\")\r\n  --input <jsonOrFile>       Inline JSON or @path/to/file.json — merged under\r\n                             flag values (flags win)\r\n  --save <path>              Download the result asset to this local path\r\n                             (mkdir + retry handled for you). A destination\r\n                             path — NOT a response format; for stdout shape use\r\n                             --format\r\n  --batch <n>                Fan-out N parallel runs (cloud tools only)\r\n                             (default: \"1\")\r\n  -h, --help                 display help for command\r\n```\r\n\r\n> Any flag also accepts pipe references — `-` (auto-pick from upstream stdin), `@N` (n-th output), `@N.path` (jsonpath into output), `@*` (all primary values), `@stdin` / `@stdin:path` (whole envelope). See `dlazy --help` for details.\r\n\r\n---\r\n\r\n换其他后端时参数由 `scripts/gen.mjs` 统一翻译，见 [`provider-cli.md`](provider-cli.md)。\n\nFile v1.0.19:references/platform-specs.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/platform-specs.md 同步生成，不要直接改这里。 -->\r\n# 平台图片规格（可机检子集）\r\n\r\n`scripts/check_listing.py` 内置的规则来源与口径。**平台规则会变，以各平台最新官方文档为准**；\r\n需要覆盖时写一份 JSON 用 `--rules` 传入，结构与下表字段一一对应。\r\n\r\n---\r\n\r\n## 字段含义\r\n\r\n| 字段 | 含义 |\r\n| --- | --- |\r\n| `pure_white_bg` | 是否要求纯白 RGB(255,255,255) 背景 |\r\n| `bg_tolerance` | 判定「纯白」允许的单通道偏差 |\r\n| `bg_coverage` | 边缘一圈需要有多大比例落在容差内 |\r\n| `min_long_side` / `recommend_long_side` / `max_long_side` | 最长边像素 |\r\n| `min_occupancy` | 商品包围盒面积 ÷ 画面面积 的下限 |\r\n| `allow_alpha` | 是否允许透明通道 |\r\n| `allow_border` | 是否允许描边 / 外框 |\r\n| `formats` / `max_bytes` / `aspect` | 允许格式、体积上限、允许比例 |\r\n\r\n---\r\n\r\n## 内置规则\r\n\r\n| 平台 | 纯白底 | 最长边（下限 / 建议） | 主体占比 | 比例 | 体积上限 |\r\n| --- | --- | --- | --- | --- | --- |\r\n| `amazon` | 是 | 1000 / 1600 | ≥ 85% | 不限 | 10 MB |\r\n| `tiktok-shop` | 否 | 800 / 1600 | ≥ 60% | 1:1 或 3:4 | 5 MB |\r\n| `temu` | 是 | 800 / 1350 | ≥ 70% | 1:1 | 3 MB |\r\n| `shopee` | 否 | 500 / 1024 | ≥ 55% | 1:1 | 2 MB |\r\n| `shopify` | 否 | 1024 / 2048 | 不限 | 不限 | 20 MB |\r\n| `taobao` | 是 | 800 / 1200 | ≥ 70% | 1:1 | 3 MB |\r\n\r\n---\r\n\r\n## 几个容易踩的点\r\n\r\n- **透明 PNG**：Amazon 会把透明像素转成黑色。永远压平成白底 JPEG 再传。\r\n- **「白底」不等于「看起来是白的」**：棚拍的浅灰墙（约 RGB 208）肉眼像白，机检直接判不合格。\r\n- **主体占比**：留白过多是最常见的驳回原因之一，比分辨率不够更常见。\r\n- **文字 / 水印 / 拼图**：像素层测不了，交给 `detect-task` 的视觉模型或人工。\r\n- **自动修复的边界**：`--fix` 能压白底、按占比重构画布、补分辨率、压体积；\r\n  它**不会**修图，也不会去水印——那是 `item-repair` 和 `remove-watermark` 的活。\n\nFile v1.0.19: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.19: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.19:skill-card.md\n\n## Description:\n\nGenerates visually consistent product images from a SKU list, with concurrency, retries, resume support, cost controls, and a contact sheet for review.\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 teams and developers use this skill to turn a CSV of products and reference images into consistent product photography, track batch results, and review images before publication.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product descriptions and reference images are sent to the configured image-generation provider.\n\nMitigation: Use only intended images and prompts, and review the provider's data-sharing terms before running.\n\nRisk: Large batches may incur substantial generation costs.\n\nMitigation: Start with a dry run and a small SKU sample, then set a batch credit limit.\n\nRisk: Example brand settings or generated images may not match a merchant's requirements.\n\nMitigation: Customize the brand template and review sample outputs before publishing the full batch.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/batch-image)\n- [Provider CLI reference](references/provider-cli.md)\n- [Model flags](references/model-flags.md)\n- [Platform specifications](references/platform-specs.md)\n- [dLazy CLI](https://github.com/dlazy-ai/cli)\n\n## Skill Output:\n\n**Output Type(s):** [Images, Files, Shell commands, Guidance]\n\n**Output Format:** [Product image files, JSON batch manifest, HTML contact sheet, and text guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Per-SKU results, retries, resume state, and estimated credit budget controls.]\n\n## Skill Version(s):\n\n1.0.19 (source: frontmatter and server-resolved release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.19: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.18: 15 files, 42788 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2379b), SKILL.md (13199b), _meta.json (131b)\n\nFile v1.0.18:SKILL.md\n\n---\nname: batch-image\nversion: 1.0.18\ndescription: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n---\n\n# batch-image — 多商品批量生图\n\n把单张生图变成**流水线**：一份商品清单 → 一整套风格统一的商拍图。\n\n批量的难点不是「跑很多次」，而是**跑出来的图要像一套**。本技能的核心是**规范段与变量段分离**：视觉规范逐字不变，只有商品描述随 SKU 变化。\n\n---\n\n## 生成效果示例\n\n| 输入：商品清单（2 个 SKU） |\n| --- |\n| `SKU001` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-a-sweater.jpg\" width=\"150\"> `军绿色麻花针织圆领毛衣，落肩宽松版型` |\n| `SKU002` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-b-shoes.jpg\" width=\"150\"> `黑色亮面皮革布洛克德比鞋，厚底系带` |\n\n实际执行的命令（循环体，两个 SKU 只有 `DESC` 与 `--images` 不同，规范段逐字相同）：\n\n```bash\nfor sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone\n```\n\n**输出：同一套视觉规范下的两个 SKU**\n\n| SKU001 | SKU002 |\n| --- | --- |\n| <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-a-sweater.jpg\" width=\"280\"> | <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-b-shoes.jpg\" width=\"280\"> |\n| 1:1 / 2K，5 credits | 1:1 / 2K，5 credits |\n\n两张的背景色、光位、视角与投影方向一致——因为规范段逐字相同；商品各自保真。100 个 SKU 就是这个循环跑 100 次，总价约 500 credits。\n\n---\n\n## 1、能力边界\n\n| 能力 | 说明 |\n| --- | --- |\n| 批量规模 | 一批最多 100 个商品（对应企业功能的规格） |\n| 成本优势 | 批量场景下单图算力成本可降至约 7 折 |\n| 协作 | 多人在线协作、出片进度实时追踪 |\n| 资产共享 | 共享模特 / 参考图 / 作品 / 算力点 |\n| 本技能落地 | 清单驱动循环 + 并发控制 + 失败重试 + 按 SKU 归档 + 汇总报告 |\n\n**不做**：不在同一批里混用不同视觉规范（那不是一批）；不跳过抽样质检直接全量上架；不因为批量就放宽商品保真要求。\n\n---\n\n## 2、输入素材规则\n\n生成前先自检这几条硬性约束：\n\n- 大小：**20KB ~ 15MB**\n- 分辨率：**大于 400×400**\n- 格式：**jpg / jpeg / png / webp**\n\n**商品清单（manifest）** 是批量的输入，建议 CSV：\n\n```csv\nsku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\n```\n\n**每张商品图仍要满足单图规则**：20KB~15MB、>400×400、jpg/jpeg/png/webp。\n\n**批量前必做的事**\n\n| 步骤 | 说明 |\n| --- | --- |\n| ✅ 先跑通 1 个 SKU | 单个跑不对，跑 100 个只是错 100 次 |\n| ✅ 再抽样 5 个 SKU | 覆盖品类/颜色/深浅色的边界情况 |\n| ✅ 确认成本 | `--dry-run` 单价 × SKU 数 × batch 数 |\n| ❌ 直接全量 | 最容易烧算力的做法 |\n\n---\n\n## 3、规范段 / 变量段分离\n\n这是批量出统一视觉的唯一方法：\n\n```text\nprompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]\n```\n\n| 段 | 内容 | 是否变 |\n| --- | --- | --- |\n| 规范段 | 背景、光位、机位、构图留白、投影、色调、输出风格、`no text, no watermark` | **整批逐字不变** |\n| 变量段 | 商品品类 + 颜色 + 材质 + 关键结构特征 | 每个 SKU 不同 |\n\n写成 shell：\n\n```bash\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/batch-image/out/${SKU}.jpg\"\ndone < manifest.csv\n```\n\n**规范段一旦改动就必须整批重跑**——否则同一批里会出现两种视觉。\n\n---\n\n## 4、并发、重试与进度\n\n**并发**：dlazy 是单次调用一个任务，批量靠 shell 并发。控制在 4~6 路，太高容易触发限流。\n\n```bash\nrun_one() { ... }               # 单个 SKU 的生成逻辑\nexport -f run_one\nxargs -P 5 -I{} bash -c 'run_one {}' < sku-list.txt     # 5 路并发\n```\n\n**重试**：网络与服务端偶发失败很正常，包一层重试。\n\n```bash\nfor attempt in 1 2 3; do\n  dlazy ... && break\n  echo \"retry $attempt for $SKU\" >&2; sleep $((attempt * 10))\ndone\n```\n\n**异步模式**：SKU 很多时用 `--no-wait` 先把任务全部提交，拿到 `generateId` 后再统一轮询，避免长时间占着进程。\n\n```bash\nGID=$(dlazy seedream-5.0 --no-wait ... | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"task\"][\"generateId\"])')\necho \"$SKU,$GID\" >> tasks.csv\n# 稍后统一收结果\nwhile IFS=, read -r SKU GID; do dlazy status \"$GID\" --wait; done < tasks.csv\n```\n\n**进度与汇总**：每个 SKU 记一行状态，跑完输出报告。\n\n```bash\necho \"$SKU,$(test -f out/$SKU.jpg && echo ok || echo fail)\" >> report.csv\nawk -F, '{c[$2]++} END{for(k in c) print k, c[k]}' report.csv\n```\n\n---\n\n## 5、工具调用\n\n本技能使用 dLazy 的 **`seedream-5.0`**（批量场景的关键指标是**单图成本**与**参考图支持**：本模型单张约 5 credits、支持最多 10 张参考图、支持 2K/3K/4K；100 个 SKU 的成本量级从数百降到数十。对商品保真要求极高的批次改用 `gpt-image-2`）。\n\n### 调用方式\n\n两种等价写法，选一种。统一入口会自动选后端、失败重试、建目录落盘、估算成本：\n\n```bash\n# A. 统一入口（推荐）：可切任意后端，加 --dry-run 不计费空跑\nnode scripts/gen.mjs --task batch-image \\\n  --prompt '<见下方 Prompt 模板>' \\\n  --images <按下表顺序> \\\n  --save output/batch-image-<sku>.jpg\n\n# B. 直接用 dLazy CLI（不想引入 Node 依赖时，效果等价）\ndlazy seedream-5.0 --prompt '...' --images ... --save output/batch-image.jpg\n```\n\n**参数约定（本技能固定用法）**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--images` | `[该 SKU 的商品图]`（+ 整批共用的参考图 / 模特图） | 共用素材放在固定位置，prompt 里用固定图号引用 |\n| `--size` | 整批统一（`1:1` 主图 / `3:4` 竖版） | 不统一就不是一套 |\n| `--resolution` | `2k` | 上架足够；4K 只给需要印刷的批次 |\n| `--batch` | `1`（批量场景靠 SKU 数量，不靠 batch） | batch 会让成本翻倍 |\n| `--no-wait` | SKU 很多时开启 | 先提交后轮询，避免长时间阻塞 |\n| `--save` | `docs/batch-image/out/<SKU>.jpg` | 用 SKU 命名，便于回填到商品库 |\n\n> **模型切换**：`seedream-5.0` 便宜、适合氛围与场景图；对商品保真要求极高（图案位置、五金细节）的批次换 `gpt-image-2`，成本约 6 倍。同一批内不要混用两个模型。\n\n### Command Examples\n\n```bash\n# basic call: 单个 SKU（先跑通这个，再谈批量）\ndlazy seedream-5.0 \\\n  --prompt '电商商拍图。图1 是商品：军绿色麻花针织圆领毛衣，落肩宽松版型。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影。真实商业产品摄影，无文字无水印。' \\\n  --images docs/batch-image/sku-a-sweater.jpg --size 1:1 --resolution 2k\n\n# complex call: 完整流水线（清单驱动 + 5 路并发 + 3 次重试 + 汇总报告）\ncat > manifest.csv <<'CSV'\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\nCSV\n\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\nmkdir -p docs/batch-image/out\n\nrun_one() {\n  IFS=, read -r SKU IMG DESC <<< \"$1\"\n  for attempt in 1 2 3; do\n    dlazy seedream-5.0 \\\n      --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n      --images \"$IMG\" --size 1:1 --resolution 2k \\\n      --save \"docs/batch-image/out/${SKU}.jpg\" >/dev/null 2>&1 && break\n    sleep $((attempt * 10))\n  done\n  if [ -f \"docs/batch-image/out/${SKU}.jpg\" ]; then echo \"${SKU},ok\"; else echo \"${SKU},fail\"; fi\n}\nexport -f run_one; export SPEC\n\nxargs -P 5 -I{} bash -c 'run_one \"{}\"' < manifest.csv | tee docs/batch-image/report.csv\nawk -F, '{c[$2]++} END{printf \"\\n=== 汇总 ===\\n\"; for(k in c) printf \"%s: %d\\n\", k, c[k]}' docs/batch-image/report.csv\n\n# 先估价：单价 × SKU 数\ndlazy seedream-5.0 --dry-run --prompt '...' --images a.jpg --size 1:1 | grep estimatedCost\necho \"SKU 数：$(wc -l < manifest.csv)\"\n\n```\n\n### 延伸阅读\n\n| 要查什么 | 去哪 |\n| --- | --- |\n| 认证、多后端配置、输出结构、错误码 | [`references/provider-cli.md`](references/provider-cli.md) |\n| `seedream-5.0` 的全部可用参数 | [`references/model-flags.md`](references/model-flags.md) |\n| 统一入口的全部选项 | `node scripts/gen.mjs --help` |\n\n## 6、Prompt 模板\n\n```text\n【变量段 · 每个 SKU 不同】\n电商商拍图。图1 是商品：[品类 + 颜色 + 材质 + 关键结构特征]。\n商品的颜色、材质纹理、款式细节必须与图1完全一致。\n\n【规范段 · 整批逐字不变】\n放置在同一套统一视觉里：[背景]，[光位]，[机位/视角]，\n画面下方留出统一的商品投影，构图与留白在整组图中保持一致。\n真实商业产品摄影，无文字无水印。\n```\n\n**按问题追加的修正句**（改了就要整批重跑）\n\n| 问题 | 处理 |\n| --- | --- |\n| 深色商品在浅背景上发灰 | 规范段补 `深色商品需加右侧轮廓光勾边，避免与背景糊在一起` |\n| 不同 SKU 的商品大小忽大忽小 | 规范段补 `商品在画面中的占比统一为约 [X]%，边距一致` |\n| 投影方向不一致 | 规范段补 `投影统一朝画面右下方，长度约为商品高度的 [X]` |\n| 某些 SKU 保真度不够 | 那部分 SKU 单独用 `gpt-image-2` 重跑，并在报告里标注 |\n\n---\n\n## 7、执行流程\n\n1. **建清单**：`sku,image,desc` 三列 CSV，每张商品图先过单图规则校验。\n2. **写规范段**：背景 / 光位 / 机位 / 占比 / 投影 / 色调 / 输出风格——**定稿后不许改**。\n3. **跑通 1 个 SKU**：确认规范段和变量段都对。\n4. **抽样 5 个 SKU**：覆盖深色 / 浅色 / 反光 / 大件 / 小件的边界。\n5. **`--dry-run` 估总价**：单价 × SKU 数。\n6. **全量跑**：5 路并发 + 3 次重试；SKU 很多时用 `--no-wait` 提交后统一轮询。\n7. **看汇总报告**：失败的单独重跑。\n8. **抽样质检**：随机抽 10% 过 [detect-task](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/detect-task/skill.md)；不合格的 SKU 单独用 `gpt-image-2` 重跑。\n\n---\n\n## 8、常见问题\n\n| 现象 | 原因 | 处理 |\n| --- | --- | --- |\n| 同一批里视觉不统一 | 中途改了规范段 | 规范段定稿后不许改；改了就整批重跑 |\n| 深色商品糊进背景 | 缺轮廓光 | 规范段补轮廓光句，整批重跑 |\n| 商品占比忽大忽小 | 未约束占比 | 规范段补占比与边距句 |\n| 部分 SKU 保真度不够 | 低价模型的局限 | 那些 SKU 单独用 `gpt-image-2` 重跑 |\n| 跑到一半失败一堆 | 并发太高触发限流 | 并发降到 4~5，加重试与退避 |\n| 成本超预算 | 用了 `--batch` 或 4K | 批量场景 `--batch 1` + `2k` |\n| 跑完不知道哪些失败了 | 没有报告 | 用第四节的 report.csv + 汇总 |\n\n---\n\n## Tips\n\nVisit https://dlazy.com for more information.\n\nFile v1.0.18:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"batch-image\",\n  \"version\": \"1.0.18\",\n  \"publishedAt\": 1791423543583\n}\n\nFile v1.0.18:references/model-flags.md\n\n# `seedream-5.0` 参数清单\r\n\r\n本技能默认用的模型的完整参数。日常只需要「参数约定」里那几个，\r\n这份清单在需要用到非常规参数时再看。\r\n\r\n**CRITICAL INSTRUCTION FOR AGENT**:\r\nRun the `dlazy seedream-5.0` command to get results.\r\n\r\n```bash\r\ndlazy seedream-5.0 -h\r\n\r\nOptions:\r\n  --prompt <prompt>          Prompt\r\n  --images [images...]       Images [image: url or local path] (max 10)\r\n  --resolution <resolution>  Resolution [default: 2k] (choices: \"2k\", \"3k\",\r\n                             \"4k\")\r\n  --size <size>              Size [default: 16:9] (choices: \"1:1\", \"4:3\",\r\n                             \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\")\r\n  --dry-run                  Print payload without executing the tool\r\n  --no-wait                  Return generateId immediately for async tasks\r\n  --timeout <seconds>        Max seconds to wait for async completion (default:\r\n                             \"1800\")\r\n  --input <jsonOrFile>       Inline JSON or @path/to/file.json — merged under\r\n                             flag values (flags win)\r\n  --save <path>              Download the result asset to this local path\r\n                             (mkdir + retry handled for you). A destination\r\n                             path — NOT a response format; for stdout shape use\r\n                             --format\r\n  --batch <n>                Fan-out N parallel runs (cloud tools only)\r\n                             (default: \"1\")\r\n  -h, --help                 display help for command\r\n```\r\n\r\n> Any flag also accepts pipe references — `-` (auto-pick from upstream stdin), `@N` (n-th output), `@N.path` (jsonpath into output), `@*` (all primary values), `@stdin` / `@stdin:path` (whole envelope). See `dlazy --help` for details.\r\n\r\n---\r\n\r\n换其他后端时参数由 `scripts/gen.mjs` 统一翻译，见 [`provider-cli.md`](provider-cli.md)。\n\nFile v1.0.18:references/platform-specs.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/platform-specs.md 同步生成，不要直接改这里。 -->\r\n# 平台图片规格（可机检子集）\r\n\r\n`scripts/check_listing.py` 内置的规则来源与口径。**平台规则会变，以各平台最新官方文档为准**；\r\n需要覆盖时写一份 JSON 用 `--rules` 传入，结构与下表字段一一对应。\r\n\r\n---\r\n\r\n## 字段含义\r\n\r\n| 字段 | 含义 |\r\n| --- | --- |\r\n| `pure_white_bg` | 是否要求纯白 RGB(255,255,255) 背景 |\r\n| `bg_tolerance` | 判定「纯白」允许的单通道偏差 |\r\n| `bg_coverage` | 边缘一圈需要有多大比例落在容差内 |\r\n| `min_long_side` / `recommend_long_side` / `max_long_side` | 最长边像素 |\r\n| `min_occupancy` | 商品包围盒面积 ÷ 画面面积 的下限 |\r\n| `allow_alpha` | 是否允许透明通道 |\r\n| `allow_border` | 是否允许描边 / 外框 |\r\n| `formats` / `max_bytes` / `aspect` | 允许格式、体积上限、允许比例 |\r\n\r\n---\r\n\r\n## 内置规则\r\n\r\n| 平台 | 纯白底 | 最长边（下限 / 建议） | 主体占比 | 比例 | 体积上限 |\r\n| --- | --- | --- | --- | --- | --- |\r\n| `amazon` | 是 | 1000 / 1600 | ≥ 85% | 不限 | 10 MB |\r\n| `tiktok-shop` | 否 | 800 / 1600 | ≥ 60% | 1:1 或 3:4 | 5 MB |\r\n| `temu` | 是 | 800 / 1350 | ≥ 70% | 1:1 | 3 MB |\r\n| `shopee` | 否 | 500 / 1024 | ≥ 55% | 1:1 | 2 MB |\r\n| `shopify` | 否 | 1024 / 2048 | 不限 | 不限 | 20 MB |\r\n| `taobao` | 是 | 800 / 1200 | ≥ 70% | 1:1 | 3 MB |\r\n\r\n---\r\n\r\n## 几个容易踩的点\r\n\r\n- **透明 PNG**：Amazon 会把透明像素转成黑色。永远压平成白底 JPEG 再传。\r\n- **「白底」不等于「看起来是白的」**：棚拍的浅灰墙（约 RGB 208）肉眼像白，机检直接判不合格。\r\n- **主体占比**：留白过多是最常见的驳回原因之一，比分辨率不够更常见。\r\n- **文字 / 水印 / 拼图**：像素层测不了，交给 `detect-task` 的视觉模型或人工。\r\n- **自动修复的边界**：`--fix` 能压白底、按占比重构画布、补分辨率、压体积；\r\n  它**不会**修图，也不会去水印——那是 `item-repair` 和 `remove-watermark` 的活。\n\nFile v1.0.18: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.18: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.18:skill-card.md\n\n## Description:\n\nCreates visually consistent product photos from a SKU list using shared styling, with retries, resume support, spending limits, and a review contact sheet.\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 teams and developers use this skill to turn a product CSV and reference photos into a consistent set of SKU-specific commercial images, then review results and rerun failures.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images, prompts, and brand or model reference files may be sent to the selected cloud image provider.\n\nMitigation: Confirm which provider account and key are active, and approve sharing the source materials before running the batch.\n\nRisk: Large batches can consume credits unexpectedly.\n\nMitigation: Run a dry run, estimate the total cost, and set a credit limit before processing all SKUs.\n\nRisk: Generated product details may not accurately match the source images.\n\nMitigation: Test a small sample and review generated images before listing them.\n\nRisk: The bundled task list includes a remove-watermark helper available for manual use.\n\nMitigation: Review the shared task list before use and avoid that helper if it is not appropriate for your workflow.\n\n## Reference(s):\n\n- [ClawHub batch-image release](https://clawhub.ai/dlazyai/skills/batch-image)\n- [Provider setup and data flow](references/provider-cli.md)\n- [Image model options](references/model-flags.md)\n- [Platform image specifications](references/platform-specs.md)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Image files, JSON reports, HTML contact sheet]\n\n**Output Format:** [Markdown guidance with local image files, JSON batch manifest, and optional HTML contact sheet]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [SKU-based outputs; supports dry runs, retries, resume, and an estimated-credit limit.]\n\n## Skill Version(s):\n\n1.0.18 (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.18: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.17: 15 files, 42765 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2303b), SKILL.md (13199b), _meta.json (131b)\n\nFile v1.0.17:SKILL.md\n\n---\nname: batch-image\nversion: 1.0.17\ndescription: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n---\n\n# batch-image — 多商品批量生图\n\n把单张生图变成**流水线**：一份商品清单 → 一整套风格统一的商拍图。\n\n批量的难点不是「跑很多次」，而是**跑出来的图要像一套**。本技能的核心是**规范段与变量段分离**：视觉规范逐字不变，只有商品描述随 SKU 变化。\n\n---\n\n## 生成效果示例\n\n| 输入：商品清单（2 个 SKU） |\n| --- |\n| `SKU001` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-a-sweater.jpg\" width=\"150\"> `军绿色麻花针织圆领毛衣，落肩宽松版型` |\n| `SKU002` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-b-shoes.jpg\" width=\"150\"> `黑色亮面皮革布洛克德比鞋，厚底系带` |\n\n实际执行的命令（循环体，两个 SKU 只有 `DESC` 与 `--images` 不同，规范段逐字相同）：\n\n```bash\nfor sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone\n```\n\n**输出：同一套视觉规范下的两个 SKU**\n\n| SKU001 | SKU002 |\n| --- | --- |\n| <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-a-sweater.jpg\" width=\"280\"> | <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-b-shoes.jpg\" width=\"280\"> |\n| 1:1 / 2K，5 credits | 1:1 / 2K，5 credits |\n\n两张的背景色、光位、视角与投影方向一致——因为规范段逐字相同；商品各自保真。100 个 SKU 就是这个循环跑 100 次，总价约 500 credits。\n\n---\n\n## 1、能力边界\n\n| 能力 | 说明 |\n| --- | --- |\n| 批量规模 | 一批最多 100 个商品（对应企业功能的规格） |\n| 成本优势 | 批量场景下单图算力成本可降至约 7 折 |\n| 协作 | 多人在线协作、出片进度实时追踪 |\n| 资产共享 | 共享模特 / 参考图 / 作品 / 算力点 |\n| 本技能落地 | 清单驱动循环 + 并发控制 + 失败重试 + 按 SKU 归档 + 汇总报告 |\n\n**不做**：不在同一批里混用不同视觉规范（那不是一批）；不跳过抽样质检直接全量上架；不因为批量就放宽商品保真要求。\n\n---\n\n## 2、输入素材规则\n\n生成前先自检这几条硬性约束：\n\n- 大小：**20KB ~ 15MB**\n- 分辨率：**大于 400×400**\n- 格式：**jpg / jpeg / png / webp**\n\n**商品清单（manifest）** 是批量的输入，建议 CSV：\n\n```csv\nsku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\n```\n\n**每张商品图仍要满足单图规则**：20KB~15MB、>400×400、jpg/jpeg/png/webp。\n\n**批量前必做的事**\n\n| 步骤 | 说明 |\n| --- | --- |\n| ✅ 先跑通 1 个 SKU | 单个跑不对，跑 100 个只是错 100 次 |\n| ✅ 再抽样 5 个 SKU | 覆盖品类/颜色/深浅色的边界情况 |\n| ✅ 确认成本 | `--dry-run` 单价 × SKU 数 × batch 数 |\n| ❌ 直接全量 | 最容易烧算力的做法 |\n\n---\n\n## 3、规范段 / 变量段分离\n\n这是批量出统一视觉的唯一方法：\n\n```text\nprompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]\n```\n\n| 段 | 内容 | 是否变 |\n| --- | --- | --- |\n| 规范段 | 背景、光位、机位、构图留白、投影、色调、输出风格、`no text, no watermark` | **整批逐字不变** |\n| 变量段 | 商品品类 + 颜色 + 材质 + 关键结构特征 | 每个 SKU 不同 |\n\n写成 shell：\n\n```bash\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/batch-image/out/${SKU}.jpg\"\ndone < manifest.csv\n```\n\n**规范段一旦改动就必须整批重跑**——否则同一批里会出现两种视觉。\n\n---\n\n## 4、并发、重试与进度\n\n**并发**：dlazy 是单次调用一个任务，批量靠 shell 并发。控制在 4~6 路，太高容易触发限流。\n\n```bash\nrun_one() { ... }               # 单个 SKU 的生成逻辑\nexport -f run_one\nxargs -P 5 -I{} bash -c 'run_one {}' < sku-list.txt     # 5 路并发\n```\n\n**重试**：网络与服务端偶发失败很正常，包一层重试。\n\n```bash\nfor attempt in 1 2 3; do\n  dlazy ... && break\n  echo \"retry $attempt for $SKU\" >&2; sleep $((attempt * 10))\ndone\n```\n\n**异步模式**：SKU 很多时用 `--no-wait` 先把任务全部提交，拿到 `generateId` 后再统一轮询，避免长时间占着进程。\n\n```bash\nGID=$(dlazy seedream-5.0 --no-wait ... | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"task\"][\"generateId\"])')\necho \"$SKU,$GID\" >> tasks.csv\n# 稍后统一收结果\nwhile IFS=, read -r SKU GID; do dlazy status \"$GID\" --wait; done < tasks.csv\n```\n\n**进度与汇总**：每个 SKU 记一行状态，跑完输出报告。\n\n```bash\necho \"$SKU,$(test -f out/$SKU.jpg && echo ok || echo fail)\" >> report.csv\nawk -F, '{c[$2]++} END{for(k in c) print k, c[k]}' report.csv\n```\n\n---\n\n## 5、工具调用\n\n本技能使用 dLazy 的 **`seedream-5.0`**（批量场景的关键指标是**单图成本**与**参考图支持**：本模型单张约 5 credits、支持最多 10 张参考图、支持 2K/3K/4K；100 个 SKU 的成本量级从数百降到数十。对商品保真要求极高的批次改用 `gpt-image-2`）。\n\n### 调用方式\n\n两种等价写法，选一种。统一入口会自动选后端、失败重试、建目录落盘、估算成本：\n\n```bash\n# A. 统一入口（推荐）：可切任意后端，加 --dry-run 不计费空跑\nnode scripts/gen.mjs --task batch-image \\\n  --prompt '<见下方 Prompt 模板>' \\\n  --images <按下表顺序> \\\n  --save output/batch-image-<sku>.jpg\n\n# B. 直接用 dLazy CLI（不想引入 Node 依赖时，效果等价）\ndlazy seedream-5.0 --prompt '...' --images ... --save output/batch-image.jpg\n```\n\n**参数约定（本技能固定用法）**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--images` | `[该 SKU 的商品图]`（+ 整批共用的参考图 / 模特图） | 共用素材放在固定位置，prompt 里用固定图号引用 |\n| `--size` | 整批统一（`1:1` 主图 / `3:4` 竖版） | 不统一就不是一套 |\n| `--resolution` | `2k` | 上架足够；4K 只给需要印刷的批次 |\n| `--batch` | `1`（批量场景靠 SKU 数量，不靠 batch） | batch 会让成本翻倍 |\n| `--no-wait` | SKU 很多时开启 | 先提交后轮询，避免长时间阻塞 |\n| `--save` | `docs/batch-image/out/<SKU>.jpg` | 用 SKU 命名，便于回填到商品库 |\n\n> **模型切换**：`seedream-5.0` 便宜、适合氛围与场景图；对商品保真要求极高（图案位置、五金细节）的批次换 `gpt-image-2`，成本约 6 倍。同一批内不要混用两个模型。\n\n### Command Examples\n\n```bash\n# basic call: 单个 SKU（先跑通这个，再谈批量）\ndlazy seedream-5.0 \\\n  --prompt '电商商拍图。图1 是商品：军绿色麻花针织圆领毛衣，落肩宽松版型。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影。真实商业产品摄影，无文字无水印。' \\\n  --images docs/batch-image/sku-a-sweater.jpg --size 1:1 --resolution 2k\n\n# complex call: 完整流水线（清单驱动 + 5 路并发 + 3 次重试 + 汇总报告）\ncat > manifest.csv <<'CSV'\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\nCSV\n\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\nmkdir -p docs/batch-image/out\n\nrun_one() {\n  IFS=, read -r SKU IMG DESC <<< \"$1\"\n  for attempt in 1 2 3; do\n    dlazy seedream-5.0 \\\n      --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n      --images \"$IMG\" --size 1:1 --resolution 2k \\\n      --save \"docs/batch-image/out/${SKU}.jpg\" >/dev/null 2>&1 && break\n    sleep $((attempt * 10))\n  done\n  if [ -f \"docs/batch-image/out/${SKU}.jpg\" ]; then echo \"${SKU},ok\"; else echo \"${SKU},fail\"; fi\n}\nexport -f run_one; export SPEC\n\nxargs -P 5 -I{} bash -c 'run_one \"{}\"' < manifest.csv | tee docs/batch-image/report.csv\nawk -F, '{c[$2]++} END{printf \"\\n=== 汇总 ===\\n\"; for(k in c) printf \"%s: %d\\n\", k, c[k]}' docs/batch-image/report.csv\n\n# 先估价：单价 × SKU 数\ndlazy seedream-5.0 --dry-run --prompt '...' --images a.jpg --size 1:1 | grep estimatedCost\necho \"SKU 数：$(wc -l < manifest.csv)\"\n\n```\n\n### 延伸阅读\n\n| 要查什么 | 去哪 |\n| --- | --- |\n| 认证、多后端配置、输出结构、错误码 | [`references/provider-cli.md`](references/provider-cli.md) |\n| `seedream-5.0` 的全部可用参数 | [`references/model-flags.md`](references/model-flags.md) |\n| 统一入口的全部选项 | `node scripts/gen.mjs --help` |\n\n## 6、Prompt 模板\n\n```text\n【变量段 · 每个 SKU 不同】\n电商商拍图。图1 是商品：[品类 + 颜色 + 材质 + 关键结构特征]。\n商品的颜色、材质纹理、款式细节必须与图1完全一致。\n\n【规范段 · 整批逐字不变】\n放置在同一套统一视觉里：[背景]，[光位]，[机位/视角]，\n画面下方留出统一的商品投影，构图与留白在整组图中保持一致。\n真实商业产品摄影，无文字无水印。\n```\n\n**按问题追加的修正句**（改了就要整批重跑）\n\n| 问题 | 处理 |\n| --- | --- |\n| 深色商品在浅背景上发灰 | 规范段补 `深色商品需加右侧轮廓光勾边，避免与背景糊在一起` |\n| 不同 SKU 的商品大小忽大忽小 | 规范段补 `商品在画面中的占比统一为约 [X]%，边距一致` |\n| 投影方向不一致 | 规范段补 `投影统一朝画面右下方，长度约为商品高度的 [X]` |\n| 某些 SKU 保真度不够 | 那部分 SKU 单独用 `gpt-image-2` 重跑，并在报告里标注 |\n\n---\n\n## 7、执行流程\n\n1. **建清单**：`sku,image,desc` 三列 CSV，每张商品图先过单图规则校验。\n2. **写规范段**：背景 / 光位 / 机位 / 占比 / 投影 / 色调 / 输出风格——**定稿后不许改**。\n3. **跑通 1 个 SKU**：确认规范段和变量段都对。\n4. **抽样 5 个 SKU**：覆盖深色 / 浅色 / 反光 / 大件 / 小件的边界。\n5. **`--dry-run` 估总价**：单价 × SKU 数。\n6. **全量跑**：5 路并发 + 3 次重试；SKU 很多时用 `--no-wait` 提交后统一轮询。\n7. **看汇总报告**：失败的单独重跑。\n8. **抽样质检**：随机抽 10% 过 [detect-task](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/detect-task/skill.md)；不合格的 SKU 单独用 `gpt-image-2` 重跑。\n\n---\n\n## 8、常见问题\n\n| 现象 | 原因 | 处理 |\n| --- | --- | --- |\n| 同一批里视觉不统一 | 中途改了规范段 | 规范段定稿后不许改；改了就整批重跑 |\n| 深色商品糊进背景 | 缺轮廓光 | 规范段补轮廓光句，整批重跑 |\n| 商品占比忽大忽小 | 未约束占比 | 规范段补占比与边距句 |\n| 部分 SKU 保真度不够 | 低价模型的局限 | 那些 SKU 单独用 `gpt-image-2` 重跑 |\n| 跑到一半失败一堆 | 并发太高触发限流 | 并发降到 4~5，加重试与退避 |\n| 成本超预算 | 用了 `--batch` 或 4K | 批量场景 `--batch 1` + `2k` |\n| 跑完不知道哪些失败了 | 没有报告 | 用第四节的 report.csv + 汇总 |\n\n---\n\n## Tips\n\nVisit https://dlazy.com for more information.\n\nFile v1.0.17:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"batch-image\",\n  \"version\": \"1.0.17\",\n  \"publishedAt\": 1791077979100\n}\n\nFile v1.0.17:references/model-flags.md\n\n# `seedream-5.0` 参数清单\r\n\r\n本技能默认用的模型的完整参数。日常只需要「参数约定」里那几个，\r\n这份清单在需要用到非常规参数时再看。\r\n\r\n**CRITICAL INSTRUCTION FOR AGENT**:\r\nRun the `dlazy seedream-5.0` command to get results.\r\n\r\n```bash\r\ndlazy seedream-5.0 -h\r\n\r\nOptions:\r\n  --prompt <prompt>          Prompt\r\n  --images [images...]       Images [image: url or local path] (max 10)\r\n  --resolution <resolution>  Resolution [default: 2k] (choices: \"2k\", \"3k\",\r\n                             \"4k\")\r\n  --size <size>              Size [default: 16:9] (choices: \"1:1\", \"4:3\",\r\n                             \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\")\r\n  --dry-run                  Print payload without executing the tool\r\n  --no-wait                  Return generateId immediately for async tasks\r\n  --timeout <seconds>        Max seconds to wait for async completion (default:\r\n                             \"1800\")\r\n  --input <jsonOrFile>       Inline JSON or @path/to/file.json — merged under\r\n                             flag values (flags win)\r\n  --save <path>              Download the result asset to this local path\r\n                             (mkdir + retry handled for you). A destination\r\n                             path — NOT a response format; for stdout shape use\r\n                             --format\r\n  --batch <n>                Fan-out N parallel runs (cloud tools only)\r\n                             (default: \"1\")\r\n  -h, --help                 display help for command\r\n```\r\n\r\n> Any flag also accepts pipe references — `-` (auto-pick from upstream stdin), `@N` (n-th output), `@N.path` (jsonpath into output), `@*` (all primary values), `@stdin` / `@stdin:path` (whole envelope). See `dlazy --help` for details.\r\n\r\n---\r\n\r\n换其他后端时参数由 `scripts/gen.mjs` 统一翻译，见 [`provider-cli.md`](provider-cli.md)。\n\nFile v1.0.17:references/platform-specs.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/platform-specs.md 同步生成，不要直接改这里。 -->\r\n# 平台图片规格（可机检子集）\r\n\r\n`scripts/check_listing.py` 内置的规则来源与口径。**平台规则会变，以各平台最新官方文档为准**；\r\n需要覆盖时写一份 JSON 用 `--rules` 传入，结构与下表字段一一对应。\r\n\r\n---\r\n\r\n## 字段含义\r\n\r\n| 字段 | 含义 |\r\n| --- | --- |\r\n| `pure_white_bg` | 是否要求纯白 RGB(255,255,255) 背景 |\r\n| `bg_tolerance` | 判定「纯白」允许的单通道偏差 |\r\n| `bg_coverage` | 边缘一圈需要有多大比例落在容差内 |\r\n| `min_long_side` / `recommend_long_side` / `max_long_side` | 最长边像素 |\r\n| `min_occupancy` | 商品包围盒面积 ÷ 画面面积 的下限 |\r\n| `allow_alpha` | 是否允许透明通道 |\r\n| `allow_border` | 是否允许描边 / 外框 |\r\n| `formats` / `max_bytes` / `aspect` | 允许格式、体积上限、允许比例 |\r\n\r\n---\r\n\r\n## 内置规则\r\n\r\n| 平台 | 纯白底 | 最长边（下限 / 建议） | 主体占比 | 比例 | 体积上限 |\r\n| --- | --- | --- | --- | --- | --- |\r\n| `amazon` | 是 | 1000 / 1600 | ≥ 85% | 不限 | 10 MB |\r\n| `tiktok-shop` | 否 | 800 / 1600 | ≥ 60% | 1:1 或 3:4 | 5 MB |\r\n| `temu` | 是 | 800 / 1350 | ≥ 70% | 1:1 | 3 MB |\r\n| `shopee` | 否 | 500 / 1024 | ≥ 55% | 1:1 | 2 MB |\r\n| `shopify` | 否 | 1024 / 2048 | 不限 | 不限 | 20 MB |\r\n| `taobao` | 是 | 800 / 1200 | ≥ 70% | 1:1 | 3 MB |\r\n\r\n---\r\n\r\n## 几个容易踩的点\r\n\r\n- **透明 PNG**：Amazon 会把透明像素转成黑色。永远压平成白底 JPEG 再传。\r\n- **「白底」不等于「看起来是白的」**：棚拍的浅灰墙（约 RGB 208）肉眼像白，机检直接判不合格。\r\n- **主体占比**：留白过多是最常见的驳回原因之一，比分辨率不够更常见。\r\n- **文字 / 水印 / 拼图**：像素层测不了，交给 `detect-task` 的视觉模型或人工。\r\n- **自动修复的边界**：`--fix` 能压白底、按占比重构画布、补分辨率、压体积；\r\n  它**不会**修图，也不会去水印——那是 `item-repair` 和 `remove-watermark` 的活。\n\nFile v1.0.17: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.17: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.17:skill-card.md\n\n## Description:\n\nTurns a product CSV into a coordinated set of commercial product images, with batch progress tracking, retries, cost controls, and a contact sheet for review.\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 teams and developers use this skill to generate consistent product photography across a catalog of SKUs and review the resulting images before publication.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Large batches can incur substantial provider charges without an enforced budget or confirmation gate.\n\nMitigation: Run a dry run, set a positive maximum-credit limit, and test a small sample with a row limit before processing the full catalog.\n\nRisk: Product photos and prompts may be sent to third-party image providers.\n\nMitigation: Do not submit sensitive images or confidential prompts unless provider access and data handling meet your account and organizational policies.\n\nRisk: Generated product details or visual style can vary across a batch.\n\nMitigation: Keep the shared visual specification fixed, sample-check outputs, and review product fidelity before publishing.\n\n## Reference(s):\n\n- [Batch Image ClawHub release](https://clawhub.ai/dlazyai/skills/batch-image)\n- [Provider and authentication guide](artifact/references/provider-cli.md)\n- [Image model options](artifact/references/model-flags.md)\n- [Marketplace image specifications](artifact/references/platform-specs.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Images, Reports]\n\n**Output Format:** [Markdown guidance and commands; generated image files, JSON batch manifest, and optional HTML contact sheet]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Images are organized by SKU; batch progress and failures are recorded for review and resumption.]\n\n## Skill Version(s):\n\n1.0.17 (source: skill frontmatter and server release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.17: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.16: 15 files, 42698 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2136b), SKILL.md (13199b), _meta.json (131b)\n\nFile v1.0.16:SKILL.md\n\n---\nname: batch-image\nversion: 1.0.16\ndescription: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n---\n\n# batch-image — 多商品批量生图\n\n把单张生图变成**流水线**：一份商品清单 → 一整套风格统一的商拍图。\n\n批量的难点不是「跑很多次」，而是**跑出来的图要像一套**。本技能的核心是**规范段与变量段分离**：视觉规范逐字不变，只有商品描述随 SKU 变化。\n\n---\n\n## 生成效果示例\n\n| 输入：商品清单（2 个 SKU） |\n| --- |\n| `SKU001` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-a-sweater.jpg\" width=\"150\"> `军绿色麻花针织圆领毛衣，落肩宽松版型` |\n| `SKU002` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-b-shoes.jpg\" width=\"150\"> `黑色亮面皮革布洛克德比鞋，厚底系带` |\n\n实际执行的命令（循环体，两个 SKU 只有 `DESC` 与 `--images` 不同，规范段逐字相同）：\n\n```bash\nfor sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone\n```\n\n**输出：同一套视觉规范下的两个 SKU**\n\n| SKU001 | SKU002 |\n| --- | --- |\n| <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-a-sweater.jpg\" width=\"280\"> | <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-b-shoes.jpg\" width=\"280\"> |\n| 1:1 / 2K，5 credits | 1:1 / 2K，5 credits |\n\n两张的背景色、光位、视角与投影方向一致——因为规范段逐字相同；商品各自保真。100 个 SKU 就是这个循环跑 100 次，总价约 500 credits。\n\n---\n\n## 1、能力边界\n\n| 能力 | 说明 |\n| --- | --- |\n| 批量规模 | 一批最多 100 个商品（对应企业功能的规格） |\n| 成本优势 | 批量场景下单图算力成本可降至约 7 折 |\n| 协作 | 多人在线协作、出片进度实时追踪 |\n| 资产共享 | 共享模特 / 参考图 / 作品 / 算力点 |\n| 本技能落地 | 清单驱动循环 + 并发控制 + 失败重试 + 按 SKU 归档 + 汇总报告 |\n\n**不做**：不在同一批里混用不同视觉规范（那不是一批）；不跳过抽样质检直接全量上架；不因为批量就放宽商品保真要求。\n\n---\n\n## 2、输入素材规则\n\n生成前先自检这几条硬性约束：\n\n- 大小：**20KB ~ 15MB**\n- 分辨率：**大于 400×400**\n- 格式：**jpg / jpeg / png / webp**\n\n**商品清单（manifest）** 是批量的输入，建议 CSV：\n\n```csv\nsku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\n```\n\n**每张商品图仍要满足单图规则**：20KB~15MB、>400×400、jpg/jpeg/png/webp。\n\n**批量前必做的事**\n\n| 步骤 | 说明 |\n| --- | --- |\n| ✅ 先跑通 1 个 SKU | 单个跑不对，跑 100 个只是错 100 次 |\n| ✅ 再抽样 5 个 SKU | 覆盖品类/颜色/深浅色的边界情况 |\n| ✅ 确认成本 | `--dry-run` 单价 × SKU 数 × batch 数 |\n| ❌ 直接全量 | 最容易烧算力的做法 |\n\n---\n\n## 3、规范段 / 变量段分离\n\n这是批量出统一视觉的唯一方法：\n\n```text\nprompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]\n```\n\n| 段 | 内容 | 是否变 |\n| --- | --- | --- |\n| 规范段 | 背景、光位、机位、构图留白、投影、色调、输出风格、`no text, no watermark` | **整批逐字不变** |\n| 变量段 | 商品品类 + 颜色 + 材质 + 关键结构特征 | 每个 SKU 不同 |\n\n写成 shell：\n\n```bash\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/batch-image/out/${SKU}.jpg\"\ndone < manifest.csv\n```\n\n**规范段一旦改动就必须整批重跑**——否则同一批里会出现两种视觉。\n\n---\n\n## 4、并发、重试与进度\n\n**并发**：dlazy 是单次调用一个任务，批量靠 shell 并发。控制在 4~6 路，太高容易触发限流。\n\n```bash\nrun_one() { ... }               # 单个 SKU 的生成逻辑\nexport -f run_one\nxargs -P 5 -I{} bash -c 'run_one {}' < sku-list.txt     # 5 路并发\n```\n\n**重试**：网络与服务端偶发失败很正常，包一层重试。\n\n```bash\nfor attempt in 1 2 3; do\n  dlazy ... && break\n  echo \"retry $attempt for $SKU\" >&2; sleep $((attempt * 10))\ndone\n```\n\n**异步模式**：SKU 很多时用 `--no-wait` 先把任务全部提交，拿到 `generateId` 后再统一轮询，避免长时间占着进程。\n\n```bash\nGID=$(dlazy seedream-5.0 --no-wait ... | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"task\"][\"generateId\"])')\necho \"$SKU,$GID\" >> tasks.csv\n# 稍后统一收结果\nwhile IFS=, read -r SKU GID; do dlazy status \"$GID\" --wait; done < tasks.csv\n```\n\n**进度与汇总**：每个 SKU 记一行状态，跑完输出报告。\n\n```bash\necho \"$SKU,$(test -f out/$SKU.jpg && echo ok || echo fail)\" >> report.csv\nawk -F, '{c[$2]++} END{for(k in c) print k, c[k]}' report.csv\n```\n\n---\n\n## 5、工具调用\n\n本技能使用 dLazy 的 **`seedream-5.0`**（批量场景的关键指标是**单图成本**与**参考图支持**：本模型单张约 5 credits、支持最多 10 张参考图、支持 2K/3K/4K；100 个 SKU 的成本量级从数百降到数十。对商品保真要求极高的批次改用 `gpt-image-2`）。\n\n### 调用方式\n\n两种等价写法，选一种。统一入口会自动选后端、失败重试、建目录落盘、估算成本：\n\n```bash\n# A. 统一入口（推荐）：可切任意后端，加 --dry-run 不计费空跑\nnode scripts/gen.mjs --task batch-image \\\n  --prompt '<见下方 Prompt 模板>' \\\n  --images <按下表顺序> \\\n  --save output/batch-image-<sku>.jpg\n\n# B. 直接用 dLazy CLI（不想引入 Node 依赖时，效果等价）\ndlazy seedream-5.0 --prompt '...' --images ... --save output/batch-image.jpg\n```\n\n**参数约定（本技能固定用法）**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--images` | `[该 SKU 的商品图]`（+ 整批共用的参考图 / 模特图） | 共用素材放在固定位置，prompt 里用固定图号引用 |\n| `--size` | 整批统一（`1:1` 主图 / `3:4` 竖版） | 不统一就不是一套 |\n| `--resolution` | `2k` | 上架足够；4K 只给需要印刷的批次 |\n| `--batch` | `1`（批量场景靠 SKU 数量，不靠 batch） | batch 会让成本翻倍 |\n| `--no-wait` | SKU 很多时开启 | 先提交后轮询，避免长时间阻塞 |\n| `--save` | `docs/batch-image/out/<SKU>.jpg` | 用 SKU 命名，便于回填到商品库 |\n\n> **模型切换**：`seedream-5.0` 便宜、适合氛围与场景图；对商品保真要求极高（图案位置、五金细节）的批次换 `gpt-image-2`，成本约 6 倍。同一批内不要混用两个模型。\n\n### Command Examples\n\n```bash\n# basic call: 单个 SKU（先跑通这个，再谈批量）\ndlazy seedream-5.0 \\\n  --prompt '电商商拍图。图1 是商品：军绿色麻花针织圆领毛衣，落肩宽松版型。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影。真实商业产品摄影，无文字无水印。' \\\n  --images docs/batch-image/sku-a-sweater.jpg --size 1:1 --resolution 2k\n\n# complex call: 完整流水线（清单驱动 + 5 路并发 + 3 次重试 + 汇总报告）\ncat > manifest.csv <<'CSV'\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\nCSV\n\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\nmkdir -p docs/batch-image/out\n\nrun_one() {\n  IFS=, read -r SKU IMG DESC <<< \"$1\"\n  for attempt in 1 2 3; do\n    dlazy seedream-5.0 \\\n      --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n      --images \"$IMG\" --size 1:1 --resolution 2k \\\n      --save \"docs/batch-image/out/${SKU}.jpg\" >/dev/null 2>&1 && break\n    sleep $((attempt * 10))\n  done\n  if [ -f \"docs/batch-image/out/${SKU}.jpg\" ]; then echo \"${SKU},ok\"; else echo \"${SKU},fail\"; fi\n}\nexport -f run_one; export SPEC\n\nxargs -P 5 -I{} bash -c 'run_one \"{}\"' < manifest.csv | tee docs/batch-image/report.csv\nawk -F, '{c[$2]++} END{printf \"\\n=== 汇总 ===\\n\"; for(k in c) printf \"%s: %d\\n\", k, c[k]}' docs/batch-image/report.csv\n\n# 先估价：单价 × SKU 数\ndlazy seedream-5.0 --dry-run --prompt '...' --images a.jpg --size 1:1 | grep estimatedCost\necho \"SKU 数：$(wc -l < manifest.csv)\"\n\n```\n\n### 延伸阅读\n\n| 要查什么 | 去哪 |\n| --- | --- |\n| 认证、多后端配置、输出结构、错误码 | [`references/provider-cli.md`](references/provider-cli.md) |\n| `seedream-5.0` 的全部可用参数 | [`references/model-flags.md`](references/model-flags.md) |\n| 统一入口的全部选项 | `node scripts/gen.mjs --help` |\n\n## 6、Prompt 模板\n\n```text\n【变量段 · 每个 SKU 不同】\n电商商拍图。图1 是商品：[品类 + 颜色 + 材质 + 关键结构特征]。\n商品的颜色、材质纹理、款式细节必须与图1完全一致。\n\n【规范段 · 整批逐字不变】\n放置在同一套统一视觉里：[背景]，[光位]，[机位/视角]，\n画面下方留出统一的商品投影，构图与留白在整组图中保持一致。\n真实商业产品摄影，无文字无水印。\n```\n\n**按问题追加的修正句**（改了就要整批重跑）\n\n| 问题 | 处理 |\n| --- | --- |\n| 深色商品在浅背景上发灰 | 规范段补 `深色商品需加右侧轮廓光勾边，避免与背景糊在一起` |\n| 不同 SKU 的商品大小忽大忽小 | 规范段补 `商品在画面中的占比统一为约 [X]%，边距一致` |\n| 投影方向不一致 | 规范段补 `投影统一朝画面右下方，长度约为商品高度的 [X]` |\n| 某些 SKU 保真度不够 | 那部分 SKU 单独用 `gpt-image-2` 重跑，并在报告里标注 |\n\n---\n\n## 7、执行流程\n\n1. **建清单**：`sku,image,desc` 三列 CSV，每张商品图先过单图规则校验。\n2. **写规范段**：背景 / 光位 / 机位 / 占比 / 投影 / 色调 / 输出风格——**定稿后不许改**。\n3. **跑通 1 个 SKU**：确认规范段和变量段都对。\n4. **抽样 5 个 SKU**：覆盖深色 / 浅色 / 反光 / 大件 / 小件的边界。\n5. **`--dry-run` 估总价**：单价 × SKU 数。\n6. **全量跑**：5 路并发 + 3 次重试；SKU 很多时用 `--no-wait` 提交后统一轮询。\n7. **看汇总报告**：失败的单独重跑。\n8. **抽样质检**：随机抽 10% 过 [detect-task](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/detect-task/skill.md)；不合格的 SKU 单独用 `gpt-image-2` 重跑。\n\n---\n\n## 8、常见问题\n\n| 现象 | 原因 | 处理 |\n| --- | --- | --- |\n| 同一批里视觉不统一 | 中途改了规范段 | 规范段定稿后不许改；改了就整批重跑 |\n| 深色商品糊进背景 | 缺轮廓光 | 规范段补轮廓光句，整批重跑 |\n| 商品占比忽大忽小 | 未约束占比 | 规范段补占比与边距句 |\n| 部分 SKU 保真度不够 | 低价模型的局限 | 那些 SKU 单独用 `gpt-image-2` 重跑 |\n| 跑到一半失败一堆 | 并发太高触发限流 | 并发降到 4~5，加重试与退避 |\n| 成本超预算 | 用了 `--batch` 或 4K | 批量场景 `--batch 1` + `2k` |\n| 跑完不知道哪些失败了 | 没有报告 | 用第四节的 report.csv + 汇总 |\n\n---\n\n## Tips\n\nVisit https://dlazy.com for more information.\n\nFile v1.0.16:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"batch-image\",\n  \"version\": \"1.0.16\",\n  \"publishedAt\": 1790918009975\n}\n\nFile v1.0.16:references/model-flags.md\n\n# `seedream-5.0` 参数清单\r\n\r\n本技能默认用的模型的完整参数。日常只需要「参数约定」里那几个，\r\n这份清单在需要用到非常规参数时再看。\r\n\r\n**CRITICAL INSTRUCTION FOR AGENT**:\r\nRun the `dlazy seedream-5.0` command to get results.\r\n\r\n```bash\r\ndlazy seedream-5.0 -h\r\n\r\nOptions:\r\n  --prompt <prompt>          Prompt\r\n  --images [images...]       Images [image: url or local path] (max 10)\r\n  --resolution <resolution>  Resolution [default: 2k] (choices: \"2k\", \"3k\",\r\n                             \"4k\")\r\n  --size <size>              Size [default: 16:9] (choices: \"1:1\", \"4:3\",\r\n                             \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\")\r\n  --dry-run                  Print payload without executing the tool\r\n  --no-wait                  Return generateId immediately for async tasks\r\n  --timeout <seconds>        Max seconds to wait for async completion (default:\r\n                             \"1800\")\r\n  --input <jsonOrFile>       Inline JSON or @path/to/file.json — merged under\r\n                             flag values (flags win)\r\n  --save <path>              Download the result asset to this local path\r\n                             (mkdir + retry handled for you). A destination\r\n                             path — NOT a response format; for stdout shape use\r\n                             --format\r\n  --batch <n>                Fan-out N parallel runs (cloud tools only)\r\n                             (default: \"1\")\r\n  -h, --help                 display help for command\r\n```\r\n\r\n> Any flag also accepts pipe references — `-` (auto-pick from upstream stdin), `@N` (n-th output), `@N.path` (jsonpath into output), `@*` (all primary values), `@stdin` / `@stdin:path` (whole envelope). See `dlazy --help` for details.\r\n\r\n---\r\n\r\n换其他后端时参数由 `scripts/gen.mjs` 统一翻译，见 [`provider-cli.md`](provider-cli.md)。\n\nFile v1.0.16:references/platform-specs.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/platform-specs.md 同步生成，不要直接改这里。 -->\r\n# 平台图片规格（可机检子集）\r\n\r\n`scripts/check_listing.py` 内置的规则来源与口径。**平台规则会变，以各平台最新官方文档为准**；\r\n需要覆盖时写一份 JSON 用 `--rules` 传入，结构与下表字段一一对应。\r\n\r\n---\r\n\r\n## 字段含义\r\n\r\n| 字段 | 含义 |\r\n| --- | --- |\r\n| `pure_white_bg` | 是否要求纯白 RGB(255,255,255) 背景 |\r\n| `bg_tolerance` | 判定「纯白」允许的单通道偏差 |\r\n| `bg_coverage` | 边缘一圈需要有多大比例落在容差内 |\r\n| `min_long_side` / `recommend_long_side` / `max_long_side` | 最长边像素 |\r\n| `min_occupancy` | 商品包围盒面积 ÷ 画面面积 的下限 |\r\n| `allow_alpha` | 是否允许透明通道 |\r\n| `allow_border` | 是否允许描边 / 外框 |\r\n| `formats` / `max_bytes` / `aspect` | 允许格式、体积上限、允许比例 |\r\n\r\n---\r\n\r\n## 内置规则\r\n\r\n| 平台 | 纯白底 | 最长边（下限 / 建议） | 主体占比 | 比例 | 体积上限 |\r\n| --- | --- | --- | --- | --- | --- |\r\n| `amazon` | 是 | 1000 / 1600 | ≥ 85% | 不限 | 10 MB |\r\n| `tiktok-shop` | 否 | 800 / 1600 | ≥ 60% | 1:1 或 3:4 | 5 MB |\r\n| `temu` | 是 | 800 / 1350 | ≥ 70% | 1:1 | 3 MB |\r\n| `shopee` | 否 | 500 / 1024 | ≥ 55% | 1:1 | 2 MB |\r\n| `shopify` | 否 | 1024 / 2048 | 不限 | 不限 | 20 MB |\r\n| `taobao` | 是 | 800 / 1200 | ≥ 70% | 1:1 | 3 MB |\r\n\r\n---\r\n\r\n## 几个容易踩的点\r\n\r\n- **透明 PNG**：Amazon 会把透明像素转成黑色。永远压平成白底 JPEG 再传。\r\n- **「白底」不等于「看起来是白的」**：棚拍的浅灰墙（约 RGB 208）肉眼像白，机检直接判不合格。\r\n- **主体占比**：留白过多是最常见的驳回原因之一，比分辨率不够更常见。\r\n- **文字 / 水印 / 拼图**：像素层测不了，交给 `detect-task` 的视觉模型或人工。\r\n- **自动修复的边界**：`--fix` 能压白底、按占比重构画布、补分辨率、压体积；\r\n  它**不会**修图，也不会去水印——那是 `item-repair` 和 `remove-watermark` 的活。\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: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\nGuides batch generation of visually consistent e-commerce product images from a SKU list, with retries, resume support, cost limits, and review outputs.\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 teams and developers use this skill to turn product-image manifests into coordinated product photography while tracking batch progress, costs, and images needing review.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images, prompts, and referenced image URLs may be sent to a selected cloud image provider.\n\nMitigation: Use only approved product assets and choose an explicit provider after checking its data-handling terms.\n\nRisk: Large batches can incur unexpected generation charges or create unwanted local files.\n\nMitigation: Use dry-run and a small sample first, set a cost limit, and choose a safe output directory.\n\nRisk: Copying shell snippets with untrusted CSV rows can introduce unsafe command handling.\n\nMitigation: Prefer the included batch workflow over shell snippets for untrusted manifests.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dlazyai/skills/batch-image)\n- [Provider CLI reference](references/provider-cli.md)\n- [Image model options](references/model-flags.md)\n- [Platform image specifications](references/platform-specs.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Code, Configuration]\n\n**Output Format:** [Markdown with command examples and CSV manifest guidance]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Execution can save generated images, batch reports, and a contact sheet locally.]\n\n## Skill Version(s):\n\n1.0.16 (source: frontmatter and server-resolved release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.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: 15 files, 42763 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2328b), SKILL.md (13199b), _meta.json (131b)\n\nFile v1.0.15:SKILL.md\n\n---\nname: batch-image\nversion: 1.0.15\ndescription: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n---\n\n# batch-image — 多商品批量生图\n\n把单张生图变成**流水线**：一份商品清单 → 一整套风格统一的商拍图。\n\n批量的难点不是「跑很多次」，而是**跑出来的图要像一套**。本技能的核心是**规范段与变量段分离**：视觉规范逐字不变，只有商品描述随 SKU 变化。\n\n---\n\n## 生成效果示例\n\n| 输入：商品清单（2 个 SKU） |\n| --- |\n| `SKU001` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-a-sweater.jpg\" width=\"150\"> `军绿色麻花针织圆领毛衣，落肩宽松版型` |\n| `SKU002` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-b-shoes.jpg\" width=\"150\"> `黑色亮面皮革布洛克德比鞋，厚底系带` |\n\n实际执行的命令（循环体，两个 SKU 只有 `DESC` 与 `--images` 不同，规范段逐字相同）：\n\n```bash\nfor sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone\n```\n\n**输出：同一套视觉规范下的两个 SKU**\n\n| SKU001 | SKU002 |\n| --- | --- |\n| <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-a-sweater.jpg\" width=\"280\"> | <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-b-shoes.jpg\" width=\"280\"> |\n| 1:1 / 2K，5 credits | 1:1 / 2K，5 credits |\n\n两张的背景色、光位、视角与投影方向一致——因为规范段逐字相同；商品各自保真。100 个 SKU 就是这个循环跑 100 次，总价约 500 credits。\n\n---\n\n## 1、能力边界\n\n| 能力 | 说明 |\n| --- | --- |\n| 批量规模 | 一批最多 100 个商品（对应企业功能的规格） |\n| 成本优势 | 批量场景下单图算力成本可降至约 7 折 |\n| 协作 | 多人在线协作、出片进度实时追踪 |\n| 资产共享 | 共享模特 / 参考图 / 作品 / 算力点 |\n| 本技能落地 | 清单驱动循环 + 并发控制 + 失败重试 + 按 SKU 归档 + 汇总报告 |\n\n**不做**：不在同一批里混用不同视觉规范（那不是一批）；不跳过抽样质检直接全量上架；不因为批量就放宽商品保真要求。\n\n---\n\n## 2、输入素材规则\n\n生成前先自检这几条硬性约束：\n\n- 大小：**20KB ~ 15MB**\n- 分辨率：**大于 400×400**\n- 格式：**jpg / jpeg / png / webp**\n\n**商品清单（manifest）** 是批量的输入，建议 CSV：\n\n```csv\nsku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\n```\n\n**每张商品图仍要满足单图规则**：20KB~15MB、>400×400、jpg/jpeg/png/webp。\n\n**批量前必做的事**\n\n| 步骤 | 说明 |\n| --- | --- |\n| ✅ 先跑通 1 个 SKU | 单个跑不对，跑 100 个只是错 100 次 |\n| ✅ 再抽样 5 个 SKU | 覆盖品类/颜色/深浅色的边界情况 |\n| ✅ 确认成本 | `--dry-run` 单价 × SKU 数 × batch 数 |\n| ❌ 直接全量 | 最容易烧算力的做法 |\n\n---\n\n## 3、规范段 / 变量段分离\n\n这是批量出统一视觉的唯一方法：\n\n```text\nprompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]\n```\n\n| 段 | 内容 | 是否变 |\n| --- | --- | --- |\n| 规范段 | 背景、光位、机位、构图留白、投影、色调、输出风格、`no text, no watermark` | **整批逐字不变** |\n| 变量段 | 商品品类 + 颜色 + 材质 + 关键结构特征 | 每个 SKU 不同 |\n\n写成 shell：\n\n```bash\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/batch-image/out/${SKU}.jpg\"\ndone < manifest.csv\n```\n\n**规范段一旦改动就必须整批重跑**——否则同一批里会出现两种视觉。\n\n---\n\n## 4、并发、重试与进度\n\n**并发**：dlazy 是单次调用一个任务，批量靠 shell 并发。控制在 4~6 路，太高容易触发限流。\n\n```bash\nrun_one() { ... }               # 单个 SKU 的生成逻辑\nexport -f run_one\nxargs -P 5 -I{} bash -c 'run_one {}' < sku-list.txt     # 5 路并发\n```\n\n**重试**：网络与服务端偶发失败很正常，包一层重试。\n\n```bash\nfor attempt in 1 2 3; do\n  dlazy ... && break\n  echo \"retry $attempt for $SKU\" >&2; sleep $((attempt * 10))\ndone\n```\n\n**异步模式**：SKU 很多时用 `--no-wait` 先把任务全部提交，拿到 `generateId` 后再统一轮询，避免长时间占着进程。\n\n```bash\nGID=$(dlazy seedream-5.0 --no-wait ... | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"task\"][\"generateId\"])')\necho \"$SKU,$GID\" >> tasks.csv\n# 稍后统一收结果\nwhile IFS=, read -r SKU GID; do dlazy status \"$GID\" --wait; done < tasks.csv\n```\n\n**进度与汇总**：每个 SKU 记一行状态，跑完输出报告。\n\n```bash\necho \"$SKU,$(test -f out/$SKU.jpg && echo ok || echo fail)\" >> report.csv\nawk -F, '{c[$2]++} END{for(k in c) print k, c[k]}' report.csv\n```\n\n---\n\n## 5、工具调用\n\n本技能使用 dLazy 的 **`seedream-5.0`**（批量场景的关键指标是**单图成本**与**参考图支持**：本模型单张约 5 credits、支持最多 10 张参考图、支持 2K/3K/4K；100 个 SKU 的成本量级从数百降到数十。对商品保真要求极高的批次改用 `gpt-image-2`）。\n\n### 调用方式\n\n两种等价写法，选一种。统一入口会自动选后端、失败重试、建目录落盘、估算成本：\n\n```bash\n# A. 统一入口（推荐）：可切任意后端，加 --dry-run 不计费空跑\nnode scripts/gen.mjs --task batch-image \\\n  --prompt '<见下方 Prompt 模板>' \\\n  --images <按下表顺序> \\\n  --save output/batch-image-<sku>.jpg\n\n# B. 直接用 dLazy CLI（不想引入 Node 依赖时，效果等价）\ndlazy seedream-5.0 --prompt '...' --images ... --save output/batch-image.jpg\n```\n\n**参数约定（本技能固定用法）**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--images` | `[该 SKU 的商品图]`（+ 整批共用的参考图 / 模特图） | 共用素材放在固定位置，prompt 里用固定图号引用 |\n| `--size` | 整批统一（`1:1` 主图 / `3:4` 竖版） | 不统一就不是一套 |\n| `--resolution` | `2k` | 上架足够；4K 只给需要印刷的批次 |\n| `--batch` | `1`（批量场景靠 SKU 数量，不靠 batch） | batch 会让成本翻倍 |\n| `--no-wait` | SKU 很多时开启 | 先提交后轮询，避免长时间阻塞 |\n| `--save` | `docs/batch-image/out/<SKU>.jpg` | 用 SKU 命名，便于回填到商品库 |\n\n> **模型切换**：`seedream-5.0` 便宜、适合氛围与场景图；对商品保真要求极高（图案位置、五金细节）的批次换 `gpt-image-2`，成本约 6 倍。同一批内不要混用两个模型。\n\n### Command Examples\n\n```bash\n# basic call: 单个 SKU（先跑通这个，再谈批量）\ndlazy seedream-5.0 \\\n  --prompt '电商商拍图。图1 是商品：军绿色麻花针织圆领毛衣，落肩宽松版型。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影。真实商业产品摄影，无文字无水印。' \\\n  --images docs/batch-image/sku-a-sweater.jpg --size 1:1 --resolution 2k\n\n# complex call: 完整流水线（清单驱动 + 5 路并发 + 3 次重试 + 汇总报告）\ncat > manifest.csv <<'CSV'\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\nCSV\n\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\nmkdir -p docs/batch-image/out\n\nrun_one() {\n  IFS=, read -r SKU IMG DESC <<< \"$1\"\n  for attempt in 1 2 3; do\n    dlazy seedream-5.0 \\\n      --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n      --images \"$IMG\" --size 1:1 --resolution 2k \\\n      --save \"docs/batch-image/out/${SKU}.jpg\" >/dev/null 2>&1 && break\n    sleep $((attempt * 10))\n  done\n  if [ -f \"docs/batch-image/out/${SKU}.jpg\" ]; then echo \"${SKU},ok\"; else echo \"${SKU},fail\"; fi\n}\nexport -f run_one; export SPEC\n\nxargs -P 5 -I{} bash -c 'run_one \"{}\"' < manifest.csv | tee docs/batch-image/report.csv\nawk -F, '{c[$2]++} END{printf \"\\n=== 汇总 ===\\n\"; for(k in c) printf \"%s: %d\\n\", k, c[k]}' docs/batch-image/report.csv\n\n# 先估价：单价 × SKU 数\ndlazy seedream-5.0 --dry-run --prompt '...' --images a.jpg --size 1:1 | grep estimatedCost\necho \"SKU 数：$(wc -l < manifest.csv)\"\n\n```\n\n### 延伸阅读\n\n| 要查什么 | 去哪 |\n| --- | --- |\n| 认证、多后端配置、输出结构、错误码 | [`references/provider-cli.md`](references/provider-cli.md) |\n| `seedream-5.0` 的全部可用参数 | [`references/model-flags.md`](references/model-flags.md) |\n| 统一入口的全部选项 | `node scripts/gen.mjs --help` |\n\n## 6、Prompt 模板\n\n```text\n【变量段 · 每个 SKU 不同】\n电商商拍图。图1 是商品：[品类 + 颜色 + 材质 + 关键结构特征]。\n商品的颜色、材质纹理、款式细节必须与图1完全一致。\n\n【规范段 · 整批逐字不变】\n放置在同一套统一视觉里：[背景]，[光位]，[机位/视角]，\n画面下方留出统一的商品投影，构图与留白在整组图中保持一致。\n真实商业产品摄影，无文字无水印。\n```\n\n**按问题追加的修正句**（改了就要整批重跑）\n\n| 问题 | 处理 |\n| --- | --- |\n| 深色商品在浅背景上发灰 | 规范段补 `深色商品需加右侧轮廓光勾边，避免与背景糊在一起` |\n| 不同 SKU 的商品大小忽大忽小 | 规范段补 `商品在画面中的占比统一为约 [X]%，边距一致` |\n| 投影方向不一致 | 规范段补 `投影统一朝画面右下方，长度约为商品高度的 [X]` |\n| 某些 SKU 保真度不够 | 那部分 SKU 单独用 `gpt-image-2` 重跑，并在报告里标注 |\n\n---\n\n## 7、执行流程\n\n1. **建清单**：`sku,image,desc` 三列 CSV，每张商品图先过单图规则校验。\n2. **写规范段**：背景 / 光位 / 机位 / 占比 / 投影 / 色调 / 输出风格——**定稿后不许改**。\n3. **跑通 1 个 SKU**：确认规范段和变量段都对。\n4. **抽样 5 个 SKU**：覆盖深色 / 浅色 / 反光 / 大件 / 小件的边界。\n5. **`--dry-run` 估总价**：单价 × SKU 数。\n6. **全量跑**：5 路并发 + 3 次重试；SKU 很多时用 `--no-wait` 提交后统一轮询。\n7. **看汇总报告**：失败的单独重跑。\n8. **抽样质检**：随机抽 10% 过 [detect-task](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/detect-task/skill.md)；不合格的 SKU 单独用 `gpt-image-2` 重跑。\n\n---\n\n## 8、常见问题\n\n| 现象 | 原因 | 处理 |\n| --- | --- | --- |\n| 同一批里视觉不统一 | 中途改了规范段 | 规范段定稿后不许改；改了就整批重跑 |\n| 深色商品糊进背景 | 缺轮廓光 | 规范段补轮廓光句，整批重跑 |\n| 商品占比忽大忽小 | 未约束占比 | 规范段补占比与边距句 |\n| 部分 SKU 保真度不够 | 低价模型的局限 | 那些 SKU 单独用 `gpt-image-2` 重跑 |\n| 跑到一半失败一堆 | 并发太高触发限流 | 并发降到 4~5，加重试与退避 |\n| 成本超预算 | 用了 `--batch` 或 4K | 批量场景 `--batch 1` + `2k` |\n| 跑完不知道哪些失败了 | 没有报告 | 用第四节的 report.csv + 汇总 |\n\n---\n\n## Tips\n\nVisit https://dlazy.com for more information.\n\nFile v1.0.15:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"batch-image\",\n  \"version\": \"1.0.15\",\n  \"publishedAt\": 1790732555078\n}\n\nFile v1.0.15:references/model-flags.md\n\n# `seedream-5.0` 参数清单\r\n\r\n本技能默认用的模型的完整参数。日常只需要「参数约定」里那几个，\r\n这份清单在需要用到非常规参数时再看。\r\n\r\n**CRITICAL INSTRUCTION FOR AGENT**:\r\nRun the `dlazy seedream-5.0` command to get results.\r\n\r\n```bash\r\ndlazy seedream-5.0 -h\r\n\r\nOptions:\r\n  --prompt <prompt>          Prompt\r\n  --images [images...]       Images [image: url or local path] (max 10)\r\n  --resolution <resolution>  Resolution [default: 2k] (choices: \"2k\", \"3k\",\r\n                             \"4k\")\r\n  --size <size>              Size [default: 16:9] (choices: \"1:1\", \"4:3\",\r\n                             \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\")\r\n  --dry-run                  Print payload without executing the tool\r\n  --no-wait                  Return generateId immediately for async tasks\r\n  --timeout <seconds>        Max seconds to wait for async completion (default:\r\n                             \"1800\")\r\n  --input <jsonOrFile>       Inline JSON or @path/to/file.json — merged under\r\n                             flag values (flags win)\r\n  --save <path>              Download the result asset to this local path\r\n                             (mkdir + retry handled for you). A destination\r\n                             path — NOT a response format; for stdout shape use\r\n                             --format\r\n  --batch <n>                Fan-out N parallel runs (cloud tools only)\r\n                             (default: \"1\")\r\n  -h, --help                 display help for command\r\n```\r\n\r\n> Any flag also accepts pipe references — `-` (auto-pick from upstream stdin), `@N` (n-th output), `@N.path` (jsonpath into output), `@*` (all primary values), `@stdin` / `@stdin:path` (whole envelope). See `dlazy --help` for details.\r\n\r\n---\r\n\r\n换其他后端时参数由 `scripts/gen.mjs` 统一翻译，见 [`provider-cli.md`](provider-cli.md)。\n\nFile v1.0.15:references/platform-specs.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/platform-specs.md 同步生成，不要直接改这里。 -->\r\n# 平台图片规格（可机检子集）\r\n\r\n`scripts/check_listing.py` 内置的规则来源与口径。**平台规则会变，以各平台最新官方文档为准**；\r\n需要覆盖时写一份 JSON 用 `--rules` 传入，结构与下表字段一一对应。\r\n\r\n---\r\n\r\n## 字段含义\r\n\r\n| 字段 | 含义 |\r\n| --- | --- |\r\n| `pure_white_bg` | 是否要求纯白 RGB(255,255,255) 背景 |\r\n| `bg_tolerance` | 判定「纯白」允许的单通道偏差 |\r\n| `bg_coverage` | 边缘一圈需要有多大比例落在容差内 |\r\n| `min_long_side` / `recommend_long_side` / `max_long_side` | 最长边像素 |\r\n| `min_occupancy` | 商品包围盒面积 ÷ 画面面积 的下限 |\r\n| `allow_alpha` | 是否允许透明通道 |\r\n| `allow_border` | 是否允许描边 / 外框 |\r\n| `formats` / `max_bytes` / `aspect` | 允许格式、体积上限、允许比例 |\r\n\r\n---\r\n\r\n## 内置规则\r\n\r\n| 平台 | 纯白底 | 最长边（下限 / 建议） | 主体占比 | 比例 | 体积上限 |\r\n| --- | --- | --- | --- | --- | --- |\r\n| `amazon` | 是 | 1000 / 1600 | ≥ 85% | 不限 | 10 MB |\r\n| `tiktok-shop` | 否 | 800 / 1600 | ≥ 60% | 1:1 或 3:4 | 5 MB |\r\n| `temu` | 是 | 800 / 1350 | ≥ 70% | 1:1 | 3 MB |\r\n| `shopee` | 否 | 500 / 1024 | ≥ 55% | 1:1 | 2 MB |\r\n| `shopify` | 否 | 1024 / 2048 | 不限 | 不限 | 20 MB |\r\n| `taobao` | 是 | 800 / 1200 | ≥ 70% | 1:1 | 3 MB |\r\n\r\n---\r\n\r\n## 几个容易踩的点\r\n\r\n- **透明 PNG**：Amazon 会把透明像素转成黑色。永远压平成白底 JPEG 再传。\r\n- **「白底」不等于「看起来是白的」**：棚拍的浅灰墙（约 RGB 208）肉眼像白，机检直接判不合格。\r\n- **主体占比**：留白过多是最常见的驳回原因之一，比分辨率不够更常见。\r\n- **文字 / 水印 / 拼图**：像素层测不了，交给 `detect-task` 的视觉模型或人工。\r\n- **自动修复的边界**：`--fix` 能压白底、按占比重构画布、补分辨率、压体积；\r\n  它**不会**修图，也不会去水印——那是 `item-repair` 和 `remove-watermark` 的活。\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: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\nGenerates visually consistent product images from a SKU manifest, with concurrent processing, retries, resumable runs, cost limits, and a contact sheet for review.\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 teams and content creators use this skill to generate and review consistent product photography across a SKU catalog, while tracking progress and limiting generation costs.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images and prompts are sent to the selected image provider, including private image URLs if supplied.\n\nMitigation: Use only images approved for provider upload and avoid private or internal URLs unless sharing is intended.\n\nRisk: Large manifests and retries may consume substantial paid generation credits.\n\nMitigation: Run a dry-run first and set a credit cap before processing the full manifest.\n\nRisk: Batch jobs create local image and report files.\n\nMitigation: Keep inputs and output directories within a scoped project folder and review generated images before publishing.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dlazyai/skills/batch-image)\n- [Provider CLI and data flow](references/provider-cli.md)\n- [Model options](references/model-flags.md)\n- [Platform image specifications](references/platform-specs.md)\n- [dLazy CLI](https://github.com/dlazy-ai/cli)\n- [Image quality-check skill](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/detect-task/skill.md)\n\n## Skill Output:\n\n**Output Type(s):** [Guidance, Shell commands, Files]\n\n**Output Format:** [Markdown instructions and commands; generated image files, CSV reports, and an optional HTML contact sheet]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Output is organized by SKU; runs can be resumed and reviewed before publishing.]\n\n## Skill Version(s):\n\n1.0.15 (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.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: 15 files, 42668 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2057b), SKILL.md (13199b), _meta.json (131b)\n\nFile v1.0.14:SKILL.md\n\n---\nname: batch-image\nversion: 1.0.14\ndescription: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n---\n\n# batch-image — 多商品批量生图\n\n把单张生图变成**流水线**：一份商品清单 → 一整套风格统一的商拍图。\n\n批量的难点不是「跑很多次」，而是**跑出来的图要像一套**。本技能的核心是**规范段与变量段分离**：视觉规范逐字不变，只有商品描述随 SKU 变化。\n\n---\n\n## 生成效果示例\n\n| 输入：商品清单（2 个 SKU） |\n| --- |\n| `SKU001` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-a-sweater.jpg\" width=\"150\"> `军绿色麻花针织圆领毛衣，落肩宽松版型` |\n| `SKU002` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-b-shoes.jpg\" width=\"150\"> `黑色亮面皮革布洛克德比鞋，厚底系带` |\n\n实际执行的命令（循环体，两个 SKU 只有 `DESC` 与 `--images` 不同，规范段逐字相同）：\n\n```bash\nfor sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone\n```\n\n**输出：同一套视觉规范下的两个 SKU**\n\n| SKU001 | SKU002 |\n| --- | --- |\n| <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-a-sweater.jpg\" width=\"280\"> | <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-b-shoes.jpg\" width=\"280\"> |\n| 1:1 / 2K，5 credits | 1:1 / 2K，5 credits |\n\n两张的背景色、光位、视角与投影方向一致——因为规范段逐字相同；商品各自保真。100 个 SKU 就是这个循环跑 100 次，总价约 500 credits。\n\n---\n\n## 1、能力边界\n\n| 能力 | 说明 |\n| --- | --- |\n| 批量规模 | 一批最多 100 个商品（对应企业功能的规格） |\n| 成本优势 | 批量场景下单图算力成本可降至约 7 折 |\n| 协作 | 多人在线协作、出片进度实时追踪 |\n| 资产共享 | 共享模特 / 参考图 / 作品 / 算力点 |\n| 本技能落地 | 清单驱动循环 + 并发控制 + 失败重试 + 按 SKU 归档 + 汇总报告 |\n\n**不做**：不在同一批里混用不同视觉规范（那不是一批）；不跳过抽样质检直接全量上架；不因为批量就放宽商品保真要求。\n\n---\n\n## 2、输入素材规则\n\n生成前先自检这几条硬性约束：\n\n- 大小：**20KB ~ 15MB**\n- 分辨率：**大于 400×400**\n- 格式：**jpg / jpeg / png / webp**\n\n**商品清单（manifest）** 是批量的输入，建议 CSV：\n\n```csv\nsku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\n```\n\n**每张商品图仍要满足单图规则**：20KB~15MB、>400×400、jpg/jpeg/png/webp。\n\n**批量前必做的事**\n\n| 步骤 | 说明 |\n| --- | --- |\n| ✅ 先跑通 1 个 SKU | 单个跑不对，跑 100 个只是错 100 次 |\n| ✅ 再抽样 5 个 SKU | 覆盖品类/颜色/深浅色的边界情况 |\n| ✅ 确认成本 | `--dry-run` 单价 × SKU 数 × batch 数 |\n| ❌ 直接全量 | 最容易烧算力的做法 |\n\n---\n\n## 3、规范段 / 变量段分离\n\n这是批量出统一视觉的唯一方法：\n\n```text\nprompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]\n```\n\n| 段 | 内容 | 是否变 |\n| --- | --- | --- |\n| 规范段 | 背景、光位、机位、构图留白、投影、色调、输出风格、`no text, no watermark` | **整批逐字不变** |\n| 变量段 | 商品品类 + 颜色 + 材质 + 关键结构特征 | 每个 SKU 不同 |\n\n写成 shell：\n\n```bash\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/batch-image/out/${SKU}.jpg\"\ndone < manifest.csv\n```\n\n**规范段一旦改动就必须整批重跑**——否则同一批里会出现两种视觉。\n\n---\n\n## 4、并发、重试与进度\n\n**并发**：dlazy 是单次调用一个任务，批量靠 shell 并发。控制在 4~6 路，太高容易触发限流。\n\n```bash\nrun_one() { ... }               # 单个 SKU 的生成逻辑\nexport -f run_one\nxargs -P 5 -I{} bash -c 'run_one {}' < sku-list.txt     # 5 路并发\n```\n\n**重试**：网络与服务端偶发失败很正常，包一层重试。\n\n```bash\nfor attempt in 1 2 3; do\n  dlazy ... && break\n  echo \"retry $attempt for $SKU\" >&2; sleep $((attempt * 10))\ndone\n```\n\n**异步模式**：SKU 很多时用 `--no-wait` 先把任务全部提交，拿到 `generateId` 后再统一轮询，避免长时间占着进程。\n\n```bash\nGID=$(dlazy seedream-5.0 --no-wait ... | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"task\"][\"generateId\"])')\necho \"$SKU,$GID\" >> tasks.csv\n# 稍后统一收结果\nwhile IFS=, read -r SKU GID; do dlazy status \"$GID\" --wait; done < tasks.csv\n```\n\n**进度与汇总**：每个 SKU 记一行状态，跑完输出报告。\n\n```bash\necho \"$SKU,$(test -f out/$SKU.jpg && echo ok || echo fail)\" >> report.csv\nawk -F, '{c[$2]++} END{for(k in c) print k, c[k]}' report.csv\n```\n\n---\n\n## 5、工具调用\n\n本技能使用 dLazy 的 **`seedream-5.0`**（批量场景的关键指标是**单图成本**与**参考图支持**：本模型单张约 5 credits、支持最多 10 张参考图、支持 2K/3K/4K；100 个 SKU 的成本量级从数百降到数十。对商品保真要求极高的批次改用 `gpt-image-2`）。\n\n### 调用方式\n\n两种等价写法，选一种。统一入口会自动选后端、失败重试、建目录落盘、估算成本：\n\n```bash\n# A. 统一入口（推荐）：可切任意后端，加 --dry-run 不计费空跑\nnode scripts/gen.mjs --task batch-image \\\n  --prompt '<见下方 Prompt 模板>' \\\n  --images <按下表顺序> \\\n  --save output/batch-image-<sku>.jpg\n\n# B. 直接用 dLazy CLI（不想引入 Node 依赖时，效果等价）\ndlazy seedream-5.0 --prompt '...' --images ... --save output/batch-image.jpg\n```\n\n**参数约定（本技能固定用法）**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--images` | `[该 SKU 的商品图]`（+ 整批共用的参考图 / 模特图） | 共用素材放在固定位置，prompt 里用固定图号引用 |\n| `--size` | 整批统一（`1:1` 主图 / `3:4` 竖版） | 不统一就不是一套 |\n| `--resolution` | `2k` | 上架足够；4K 只给需要印刷的批次 |\n| `--batch` | `1`（批量场景靠 SKU 数量，不靠 batch） | batch 会让成本翻倍 |\n| `--no-wait` | SKU 很多时开启 | 先提交后轮询，避免长时间阻塞 |\n| `--save` | `docs/batch-image/out/<SKU>.jpg` | 用 SKU 命名，便于回填到商品库 |\n\n> **模型切换**：`seedream-5.0` 便宜、适合氛围与场景图；对商品保真要求极高（图案位置、五金细节）的批次换 `gpt-image-2`，成本约 6 倍。同一批内不要混用两个模型。\n\n### Command Examples\n\n```bash\n# basic call: 单个 SKU（先跑通这个，再谈批量）\ndlazy seedream-5.0 \\\n  --prompt '电商商拍图。图1 是商品：军绿色麻花针织圆领毛衣，落肩宽松版型。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影。真实商业产品摄影，无文字无水印。' \\\n  --images docs/batch-image/sku-a-sweater.jpg --size 1:1 --resolution 2k\n\n# complex call: 完整流水线（清单驱动 + 5 路并发 + 3 次重试 + 汇总报告）\ncat > manifest.csv <<'CSV'\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\nCSV\n\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\nmkdir -p docs/batch-image/out\n\nrun_one() {\n  IFS=, read -r SKU IMG DESC <<< \"$1\"\n  for attempt in 1 2 3; do\n    dlazy seedream-5.0 \\\n      --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n      --images \"$IMG\" --size 1:1 --resolution 2k \\\n      --save \"docs/batch-image/out/${SKU}.jpg\" >/dev/null 2>&1 && break\n    sleep $((attempt * 10))\n  done\n  if [ -f \"docs/batch-image/out/${SKU}.jpg\" ]; then echo \"${SKU},ok\"; else echo \"${SKU},fail\"; fi\n}\nexport -f run_one; export SPEC\n\nxargs -P 5 -I{} bash -c 'run_one \"{}\"' < manifest.csv | tee docs/batch-image/report.csv\nawk -F, '{c[$2]++} END{printf \"\\n=== 汇总 ===\\n\"; for(k in c) printf \"%s: %d\\n\", k, c[k]}' docs/batch-image/report.csv\n\n# 先估价：单价 × SKU 数\ndlazy seedream-5.0 --dry-run --prompt '...' --images a.jpg --size 1:1 | grep estimatedCost\necho \"SKU 数：$(wc -l < manifest.csv)\"\n\n```\n\n### 延伸阅读\n\n| 要查什么 | 去哪 |\n| --- | --- |\n| 认证、多后端配置、输出结构、错误码 | [`references/provider-cli.md`](references/provider-cli.md) |\n| `seedream-5.0` 的全部可用参数 | [`references/model-flags.md`](references/model-flags.md) |\n| 统一入口的全部选项 | `node scripts/gen.mjs --help` |\n\n## 6、Prompt 模板\n\n```text\n【变量段 · 每个 SKU 不同】\n电商商拍图。图1 是商品：[品类 + 颜色 + 材质 + 关键结构特征]。\n商品的颜色、材质纹理、款式细节必须与图1完全一致。\n\n【规范段 · 整批逐字不变】\n放置在同一套统一视觉里：[背景]，[光位]，[机位/视角]，\n画面下方留出统一的商品投影，构图与留白在整组图中保持一致。\n真实商业产品摄影，无文字无水印。\n```\n\n**按问题追加的修正句**（改了就要整批重跑）\n\n| 问题 | 处理 |\n| --- | --- |\n| 深色商品在浅背景上发灰 | 规范段补 `深色商品需加右侧轮廓光勾边，避免与背景糊在一起` |\n| 不同 SKU 的商品大小忽大忽小 | 规范段补 `商品在画面中的占比统一为约 [X]%，边距一致` |\n| 投影方向不一致 | 规范段补 `投影统一朝画面右下方，长度约为商品高度的 [X]` |\n| 某些 SKU 保真度不够 | 那部分 SKU 单独用 `gpt-image-2` 重跑，并在报告里标注 |\n\n---\n\n## 7、执行流程\n\n1. **建清单**：`sku,image,desc` 三列 CSV，每张商品图先过单图规则校验。\n2. **写规范段**：背景 / 光位 / 机位 / 占比 / 投影 / 色调 / 输出风格——**定稿后不许改**。\n3. **跑通 1 个 SKU**：确认规范段和变量段都对。\n4. **抽样 5 个 SKU**：覆盖深色 / 浅色 / 反光 / 大件 / 小件的边界。\n5. **`--dry-run` 估总价**：单价 × SKU 数。\n6. **全量跑**：5 路并发 + 3 次重试；SKU 很多时用 `--no-wait` 提交后统一轮询。\n7. **看汇总报告**：失败的单独重跑。\n8. **抽样质检**：随机抽 10% 过 [detect-task](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/detect-task/skill.md)；不合格的 SKU 单独用 `gpt-image-2` 重跑。\n\n---\n\n## 8、常见问题\n\n| 现象 | 原因 | 处理 |\n| --- | --- | --- |\n| 同一批里视觉不统一 | 中途改了规范段 | 规范段定稿后不许改；改了就整批重跑 |\n| 深色商品糊进背景 | 缺轮廓光 | 规范段补轮廓光句，整批重跑 |\n| 商品占比忽大忽小 | 未约束占比 | 规范段补占比与边距句 |\n| 部分 SKU 保真度不够 | 低价模型的局限 | 那些 SKU 单独用 `gpt-image-2` 重跑 |\n| 跑到一半失败一堆 | 并发太高触发限流 | 并发降到 4~5，加重试与退避 |\n| 成本超预算 | 用了 `--batch` 或 4K | 批量场景 `--batch 1` + `2k` |\n| 跑完不知道哪些失败了 | 没有报告 | 用第四节的 report.csv + 汇总 |\n\n---\n\n## Tips\n\nVisit https://dlazy.com for more information.\n\nFile v1.0.14:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"batch-image\",\n  \"version\": \"1.0.14\",\n  \"publishedAt\": 1790562802225\n}\n\nFile v1.0.14:references/model-flags.md\n\n# `seedream-5.0` 参数清单\r\n\r\n本技能默认用的模型的完整参数。日常只需要「参数约定」里那几个，\r\n这份清单在需要用到非常规参数时再看。\r\n\r\n**CRITICAL INSTRUCTION FOR AGENT**:\r\nRun the `dlazy seedream-5.0` command to get results.\r\n\r\n```bash\r\ndlazy seedream-5.0 -h\r\n\r\nOptions:\r\n  --prompt <prompt>          Prompt\r\n  --images [images...]       Images [image: url or local path] (max 10)\r\n  --resolution <resolution>  Resolution [default: 2k] (choices: \"2k\", \"3k\",\r\n                             \"4k\")\r\n  --size <size>              Size [default: 16:9] (choices: \"1:1\", \"4:3\",\r\n                             \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\")\r\n  --dry-run                  Print payload without executing the tool\r\n  --no-wait                  Return generateId immediately for async tasks\r\n  --timeout <seconds>        Max seconds to wait for async completion (default:\r\n                             \"1800\")\r\n  --input <jsonOrFile>       Inline JSON or @path/to/file.json — merged under\r\n                             flag values (flags win)\r\n  --save <path>              Download the result asset to this local path\r\n                             (mkdir + retry handled for you). A destination\r\n                             path — NOT a response format; for stdout shape use\r\n                             --format\r\n  --batch <n>                Fan-out N parallel runs (cloud tools only)\r\n                             (default: \"1\")\r\n  -h, --help                 display help for command\r\n```\r\n\r\n> Any flag also accepts pipe references — `-` (auto-pick from upstream stdin), `@N` (n-th output), `@N.path` (jsonpath into output), `@*` (all primary values), `@stdin` / `@stdin:path` (whole envelope). See `dlazy --help` for details.\r\n\r\n---\r\n\r\n换其他后端时参数由 `scripts/gen.mjs` 统一翻译，见 [`provider-cli.md`](provider-cli.md)。\n\nFile v1.0.14:references/platform-specs.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/platform-specs.md 同步生成，不要直接改这里。 -->\r\n# 平台图片规格（可机检子集）\r\n\r\n`scripts/check_listing.py` 内置的规则来源与口径。**平台规则会变，以各平台最新官方文档为准**；\r\n需要覆盖时写一份 JSON 用 `--rules` 传入，结构与下表字段一一对应。\r\n\r\n---\r\n\r\n## 字段含义\r\n\r\n| 字段 | 含义 |\r\n| --- | --- |\r\n| `pure_white_bg` | 是否要求纯白 RGB(255,255,255) 背景 |\r\n| `bg_tolerance` | 判定「纯白」允许的单通道偏差 |\r\n| `bg_coverage` | 边缘一圈需要有多大比例落在容差内 |\r\n| `min_long_side` / `recommend_long_side` / `max_long_side` | 最长边像素 |\r\n| `min_occupancy` | 商品包围盒面积 ÷ 画面面积 的下限 |\r\n| `allow_alpha` | 是否允许透明通道 |\r\n| `allow_border` | 是否允许描边 / 外框 |\r\n| `formats` / `max_bytes` / `aspect` | 允许格式、体积上限、允许比例 |\r\n\r\n---\r\n\r\n## 内置规则\r\n\r\n| 平台 | 纯白底 | 最长边（下限 / 建议） | 主体占比 | 比例 | 体积上限 |\r\n| --- | --- | --- | --- | --- | --- |\r\n| `amazon` | 是 | 1000 / 1600 | ≥ 85% | 不限 | 10 MB |\r\n| `tiktok-shop` | 否 | 800 / 1600 | ≥ 60% | 1:1 或 3:4 | 5 MB |\r\n| `temu` | 是 | 800 / 1350 | ≥ 70% | 1:1 | 3 MB |\r\n| `shopee` | 否 | 500 / 1024 | ≥ 55% | 1:1 | 2 MB |\r\n| `shopify` | 否 | 1024 / 2048 | 不限 | 不限 | 20 MB |\r\n| `taobao` | 是 | 800 / 1200 | ≥ 70% | 1:1 | 3 MB |\r\n\r\n---\r\n\r\n## 几个容易踩的点\r\n\r\n- **透明 PNG**：Amazon 会把透明像素转成黑色。永远压平成白底 JPEG 再传。\r\n- **「白底」不等于「看起来是白的」**：棚拍的浅灰墙（约 RGB 208）肉眼像白，机检直接判不合格。\r\n- **主体占比**：留白过多是最常见的驳回原因之一，比分辨率不够更常见。\r\n- **文字 / 水印 / 拼图**：像素层测不了，交给 `detect-task` 的视觉模型或人工。\r\n- **自动修复的边界**：`--fix` 能压白底、按占比重构画布、补分辨率、压体积；\r\n  它**不会**修图，也不会去水印——那是 `item-repair` 和 `remove-watermark` 的活。\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: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\nGuides agents through generating consistent product images from a SKU list with controlled concurrency, retries, resumable jobs, cost limits, and review outputs.\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 teams and developers use this skill to generate visually consistent product photos across a CSV of SKUs and review the resulting images before publication.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Product images and prompts are sent to the selected cloud provider.\n\nMitigation: Confirm the materials can be shared with that provider and choose it explicitly before running.\n\nRisk: Large jobs and retries can incur unexpected generation costs.\n\nMitigation: Run a dry run, test a small sample, and set an explicit budget limit before the full batch.\n\nRisk: Untrusted CSV entries or an unintended output location can affect local job outputs.\n\nMitigation: Use a trusted manifest and select a deliberate project output directory.\n\n## Reference(s):\n\n- [ClawHub skill release](https://clawhub.ai/dlazyai/skills/batch-image)\n- [Provider CLI reference](references/provider-cli.md)\n- [Model flags](references/model-flags.md)\n- [Platform image specifications](references/platform-specs.md)\n\n## Skill Output:\n\n**Output Type(s):** [Shell commands, Configuration instructions, Guidance]\n\n**Output Format:** [Markdown with shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [When executed, the workflow saves product images, a per-SKU report, and optionally a contact sheet for review.]\n\n## Skill Version(s):\n\n1.0.14 (source: skill frontmatter and server-resolved release)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.0.14:examples/brand.yaml\n\n# ⚠️ 由 scripts/build-skills.mjs 从 shared/examples/brand.yaml 同步生成，不要直接改这里。\r\n# 店铺品牌视觉规范 —— 所有生图技能读这一份，保证几百个 SKU 看起来像同一家店。\r\n#   node scripts/brand.mjs --brand brand.yaml --for flat-lay\r\n#   node scripts/gen.mjs --task flat-lay --brand brand.yaml --prompt '...'\r\n\r\nbrand:\r\n  name: 示例品牌\r\n  # 一句话概括调性，会原样进 prompt\r\n  tone: quiet minimalist, warm and lived-in, never glossy or commercial\r\n\r\nmodel:\r\n  # 锁模特：给一张脸的参考图，所有技能都会把它作为最后一张参考图传入\r\n  reference: assets/model/face-a.jpg\r\n  description: East Asian woman, late twenties, natural makeup, shoulder-length black hair\r\n  body: slim, height around 168cm\r\n\r\nphotography:\r\n  background: seamless off-white studio backdrop, RGB 248 248 246\r\n  lighting: soft large softbox from camera left, gentle fill, no hard shadows\r\n  camera: 85mm equivalent, eye level, shallow depth of field\r\n  grade: neutral white balance around 5200K, low contrast, slightly lifted blacks\r\n  crop: full body with headroom, product centered\r\n\r\nlayout:\r\n  # 给带排版的技能（主图 / 详情页）用\r\n  margin: at least 8% empty margin on all sides\r\n  typeface: clean sans-serif, no decorative fonts\r\n  text_color: near-black on light background\r\n\r\nforbid:\r\n  - no visible brand logos other than the product's own\r\n  - no text or watermark\r\n  - no exaggerated poses or dramatic wind effects\r\n  - no oversaturated colors\r\n\r\n# 可选：把这些直接写进合规目标，生成时就按平台要求出图\r\ncompliance:\r\n  platform: amazon\n\nArchive v1.0.13: 15 files, 43006 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2892b), SKILL.md (13199b), _meta.json (131b)\n\nFile v1.0.13:SKILL.md\n\n---\nname: batch-image\nversion: 1.0.13\ndescription: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n---\n\n# batch-image — 多商品批量生图\n\n把单张生图变成**流水线**：一份商品清单 → 一整套风格统一的商拍图。\n\n批量的难点不是「跑很多次」，而是**跑出来的图要像一套**。本技能的核心是**规范段与变量段分离**：视觉规范逐字不变，只有商品描述随 SKU 变化。\n\n---\n\n## 生成效果示例\n\n| 输入：商品清单（2 个 SKU） |\n| --- |\n| `SKU001` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-a-sweater.jpg\" width=\"150\"> `军绿色麻花针织圆领毛衣，落肩宽松版型` |\n| `SKU002` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-b-shoes.jpg\" width=\"150\"> `黑色亮面皮革布洛克德比鞋，厚底系带` |\n\n实际执行的命令（循环体，两个 SKU 只有 `DESC` 与 `--images` 不同，规范段逐字相同）：\n\n```bash\nfor sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone\n```\n\n**输出：同一套视觉规范下的两个 SKU**\n\n| SKU001 | SKU002 |\n| --- | --- |\n| <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-a-sweater.jpg\" width=\"280\"> | <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-b-shoes.jpg\" width=\"280\"> |\n| 1:1 / 2K，5 credits | 1:1 / 2K，5 credits |\n\n两张的背景色、光位、视角与投影方向一致——因为规范段逐字相同；商品各自保真。100 个 SKU 就是这个循环跑 100 次，总价约 500 credits。\n\n---\n\n## 1、能力边界\n\n| 能力 | 说明 |\n| --- | --- |\n| 批量规模 | 一批最多 100 个商品（对应企业功能的规格） |\n| 成本优势 | 批量场景下单图算力成本可降至约 7 折 |\n| 协作 | 多人在线协作、出片进度实时追踪 |\n| 资产共享 | 共享模特 / 参考图 / 作品 / 算力点 |\n| 本技能落地 | 清单驱动循环 + 并发控制 + 失败重试 + 按 SKU 归档 + 汇总报告 |\n\n**不做**：不在同一批里混用不同视觉规范（那不是一批）；不跳过抽样质检直接全量上架；不因为批量就放宽商品保真要求。\n\n---\n\n## 2、输入素材规则\n\n生成前先自检这几条硬性约束：\n\n- 大小：**20KB ~ 15MB**\n- 分辨率：**大于 400×400**\n- 格式：**jpg / jpeg / png / webp**\n\n**商品清单（manifest）** 是批量的输入，建议 CSV：\n\n```csv\nsku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\n```\n\n**每张商品图仍要满足单图规则**：20KB~15MB、>400×400、jpg/jpeg/png/webp。\n\n**批量前必做的事**\n\n| 步骤 | 说明 |\n| --- | --- |\n| ✅ 先跑通 1 个 SKU | 单个跑不对，跑 100 个只是错 100 次 |\n| ✅ 再抽样 5 个 SKU | 覆盖品类/颜色/深浅色的边界情况 |\n| ✅ 确认成本 | `--dry-run` 单价 × SKU 数 × batch 数 |\n| ❌ 直接全量 | 最容易烧算力的做法 |\n\n---\n\n## 3、规范段 / 变量段分离\n\n这是批量出统一视觉的唯一方法：\n\n```text\nprompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]\n```\n\n| 段 | 内容 | 是否变 |\n| --- | --- | --- |\n| 规范段 | 背景、光位、机位、构图留白、投影、色调、输出风格、`no text, no watermark` | **整批逐字不变** |\n| 变量段 | 商品品类 + 颜色 + 材质 + 关键结构特征 | 每个 SKU 不同 |\n\n写成 shell：\n\n```bash\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/batch-image/out/${SKU}.jpg\"\ndone < manifest.csv\n```\n\n**规范段一旦改动就必须整批重跑**——否则同一批里会出现两种视觉。\n\n---\n\n## 4、并发、重试与进度\n\n**并发**：dlazy 是单次调用一个任务，批量靠 shell 并发。控制在 4~6 路，太高容易触发限流。\n\n```bash\nrun_one() { ... }               # 单个 SKU 的生成逻辑\nexport -f run_one\nxargs -P 5 -I{} bash -c 'run_one {}' < sku-list.txt     # 5 路并发\n```\n\n**重试**：网络与服务端偶发失败很正常，包一层重试。\n\n```bash\nfor attempt in 1 2 3; do\n  dlazy ... && break\n  echo \"retry $attempt for $SKU\" >&2; sleep $((attempt * 10))\ndone\n```\n\n**异步模式**：SKU 很多时用 `--no-wait` 先把任务全部提交，拿到 `generateId` 后再统一轮询，避免长时间占着进程。\n\n```bash\nGID=$(dlazy seedream-5.0 --no-wait ... | python3 -c 'import sys,json;print(json.load(sys.stdin)[\"result\"][\"task\"][\"generateId\"])')\necho \"$SKU,$GID\" >> tasks.csv\n# 稍后统一收结果\nwhile IFS=, read -r SKU GID; do dlazy status \"$GID\" --wait; done < tasks.csv\n```\n\n**进度与汇总**：每个 SKU 记一行状态，跑完输出报告。\n\n```bash\necho \"$SKU,$(test -f out/$SKU.jpg && echo ok || echo fail)\" >> report.csv\nawk -F, '{c[$2]++} END{for(k in c) print k, c[k]}' report.csv\n```\n\n---\n\n## 5、工具调用\n\n本技能使用 dLazy 的 **`seedream-5.0`**（批量场景的关键指标是**单图成本**与**参考图支持**：本模型单张约 5 credits、支持最多 10 张参考图、支持 2K/3K/4K；100 个 SKU 的成本量级从数百降到数十。对商品保真要求极高的批次改用 `gpt-image-2`）。\n\n### 调用方式\n\n两种等价写法，选一种。统一入口会自动选后端、失败重试、建目录落盘、估算成本：\n\n```bash\n# A. 统一入口（推荐）：可切任意后端，加 --dry-run 不计费空跑\nnode scripts/gen.mjs --task batch-image \\\n  --prompt '<见下方 Prompt 模板>' \\\n  --images <按下表顺序> \\\n  --save output/batch-image-<sku>.jpg\n\n# B. 直接用 dLazy CLI（不想引入 Node 依赖时，效果等价）\ndlazy seedream-5.0 --prompt '...' --images ... --save output/batch-image.jpg\n```\n\n**参数约定（本技能固定用法）**\n\n| 参数 | 取值 | 理由 |\n| --- | --- | --- |\n| `--images` | `[该 SKU 的商品图]`（+ 整批共用的参考图 / 模特图） | 共用素材放在固定位置，prompt 里用固定图号引用 |\n| `--size` | 整批统一（`1:1` 主图 / `3:4` 竖版） | 不统一就不是一套 |\n| `--resolution` | `2k` | 上架足够；4K 只给需要印刷的批次 |\n| `--batch` | `1`（批量场景靠 SKU 数量，不靠 batch） | batch 会让成本翻倍 |\n| `--no-wait` | SKU 很多时开启 | 先提交后轮询，避免长时间阻塞 |\n| `--save` | `docs/batch-image/out/<SKU>.jpg` | 用 SKU 命名，便于回填到商品库 |\n\n> **模型切换**：`seedream-5.0` 便宜、适合氛围与场景图；对商品保真要求极高（图案位置、五金细节）的批次换 `gpt-image-2`，成本约 6 倍。同一批内不要混用两个模型。\n\n### Command Examples\n\n```bash\n# basic call: 单个 SKU（先跑通这个，再谈批量）\ndlazy seedream-5.0 \\\n  --prompt '电商商拍图。图1 是商品：军绿色麻花针织圆领毛衣，落肩宽松版型。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影。真实商业产品摄影，无文字无水印。' \\\n  --images docs/batch-image/sku-a-sweater.jpg --size 1:1 --resolution 2k\n\n# complex call: 完整流水线（清单驱动 + 5 路并发 + 3 次重试 + 汇总报告）\ncat > manifest.csv <<'CSV'\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\nCSV\n\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\nmkdir -p docs/batch-image/out\n\nrun_one() {\n  IFS=, read -r SKU IMG DESC <<< \"$1\"\n  for attempt in 1 2 3; do\n    dlazy seedream-5.0 \\\n      --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n      --images \"$IMG\" --size 1:1 --resolution 2k \\\n      --save \"docs/batch-image/out/${SKU}.jpg\" >/dev/null 2>&1 && break\n    sleep $((attempt * 10))\n  done\n  if [ -f \"docs/batch-image/out/${SKU}.jpg\" ]; then echo \"${SKU},ok\"; else echo \"${SKU},fail\"; fi\n}\nexport -f run_one; export SPEC\n\nxargs -P 5 -I{} bash -c 'run_one \"{}\"' < manifest.csv | tee docs/batch-image/report.csv\nawk -F, '{c[$2]++} END{printf \"\\n=== 汇总 ===\\n\"; for(k in c) printf \"%s: %d\\n\", k, c[k]}' docs/batch-image/report.csv\n\n# 先估价：单价 × SKU 数\ndlazy seedream-5.0 --dry-run --prompt '...' --images a.jpg --size 1:1 | grep estimatedCost\necho \"SKU 数：$(wc -l < manifest.csv)\"\n\n```\n\n### 延伸阅读\n\n| 要查什么 | 去哪 |\n| --- | --- |\n| 认证、多后端配置、输出结构、错误码 | [`references/provider-cli.md`](references/provider-cli.md) |\n| `seedream-5.0` 的全部可用参数 | [`references/model-flags.md`](references/model-flags.md) |\n| 统一入口的全部选项 | `node scripts/gen.mjs --help` |\n\n## 6、Prompt 模板\n\n```text\n【变量段 · 每个 SKU 不同】\n电商商拍图。图1 是商品：[品类 + 颜色 + 材质 + 关键结构特征]。\n商品的颜色、材质纹理、款式细节必须与图1完全一致。\n\n【规范段 · 整批逐字不变】\n放置在同一套统一视觉里：[背景]，[光位]，[机位/视角]，\n画面下方留出统一的商品投影，构图与留白在整组图中保持一致。\n真实商业产品摄影，无文字无水印。\n```\n\n**按问题追加的修正句**（改了就要整批重跑）\n\n| 问题 | 处理 |\n| --- | --- |\n| 深色商品在浅背景上发灰 | 规范段补 `深色商品需加右侧轮廓光勾边，避免与背景糊在一起` |\n| 不同 SKU 的商品大小忽大忽小 | 规范段补 `商品在画面中的占比统一为约 [X]%，边距一致` |\n| 投影方向不一致 | 规范段补 `投影统一朝画面右下方，长度约为商品高度的 [X]` |\n| 某些 SKU 保真度不够 | 那部分 SKU 单独用 `gpt-image-2` 重跑，并在报告里标注 |\n\n---\n\n## 7、执行流程\n\n1. **建清单**：`sku,image,desc` 三列 CSV，每张商品图先过单图规则校验。\n2. **写规范段**：背景 / 光位 / 机位 / 占比 / 投影 / 色调 / 输出风格——**定稿后不许改**。\n3. **跑通 1 个 SKU**：确认规范段和变量段都对。\n4. **抽样 5 个 SKU**：覆盖深色 / 浅色 / 反光 / 大件 / 小件的边界。\n5. **`--dry-run` 估总价**：单价 × SKU 数。\n6. **全量跑**：5 路并发 + 3 次重试；SKU 很多时用 `--no-wait` 提交后统一轮询。\n7. **看汇总报告**：失败的单独重跑。\n8. **抽样质检**：随机抽 10% 过 [detect-task](https://github.com/dlazy-ai/ecommerce-skills/blob/main/skills/detect-task/skill.md)；不合格的 SKU 单独用 `gpt-image-2` 重跑。\n\n---\n\n## 8、常见问题\n\n| 现象 | 原因 | 处理 |\n| --- | --- | --- |\n| 同一批里视觉不统一 | 中途改了规范段 | 规范段定稿后不许改；改了就整批重跑 |\n| 深色商品糊进背景 | 缺轮廓光 | 规范段补轮廓光句，整批重跑 |\n| 商品占比忽大忽小 | 未约束占比 | 规范段补占比与边距句 |\n| 部分 SKU 保真度不够 | 低价模型的局限 | 那些 SKU 单独用 `gpt-image-2` 重跑 |\n| 跑到一半失败一堆 | 并发太高触发限流 | 并发降到 4~5，加重试与退避 |\n| 成本超预算 | 用了 `--batch` 或 4K | 批量场景 `--batch 1` + `2k` |\n| 跑完不知道哪些失败了 | 没有报告 | 用第四节的 report.csv + 汇总 |\n\n---\n\n## Tips\n\nVisit https://dlazy.com for more information.\n\nFile v1.0.13:_meta.json\n\n{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"batch-image\",\n  \"version\": \"1.0.13\",\n  \"publishedAt\": 1790232905098\n}\n\nFile v1.0.13:references/model-flags.md\n\n# `seedream-5.0` 参数清单\r\n\r\n本技能默认用的模型的完整参数。日常只需要「参数约定」里那几个，\r\n这份清单在需要用到非常规参数时再看。\r\n\r\n**CRITICAL INSTRUCTION FOR AGENT**:\r\nRun the `dlazy seedream-5.0` command to get results.\r\n\r\n```bash\r\ndlazy seedream-5.0 -h\r\n\r\nOptions:\r\n  --prompt <prompt>          Prompt\r\n  --images [images...]       Images [image: url or local path] (max 10)\r\n  --resolution <resolution>  Resolution [default: 2k] (choices: \"2k\", \"3k\",\r\n                             \"4k\")\r\n  --size <size>              Size [default: 16:9] (choices: \"1:1\", \"4:3\",\r\n                             \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\")\r\n  --dry-run                  Print payload without executing the tool\r\n  --no-wait                  Return generateId immediately for async tasks\r\n  --timeout <seconds>        Max seconds to wait for async completion (default:\r\n                             \"1800\")\r\n  --input <jsonOrFile>       Inline JSON or @path/to/file.json — merged under\r\n                             flag values (flags win)\r\n  --save <path>              Download the result asset to this local path\r\n                             (mkdir + retry handled for you). A destination\r\n                             path — NOT a response format; for stdout shape use\r\n                             --format\r\n  --batch <n>                Fan-out N parallel runs (cloud tools only)\r\n                             (default: \"1\")\r\n  -h, --help                 display help for command\r\n```\r\n\r\n> Any flag also accepts pipe references — `-` (auto-pick from upstream stdin), `@N` (n-th output), `@N.path` (jsonpath into output), `@*` (all primary values), `@stdin` / `@stdin:path` (whole envelope). See `dlazy --help` for details.\r\n\r\n---\r\n\r\n换其他后端时参数由 `scripts/gen.mjs` 统一翻译，见 [`provider-cli.md`](provider-cli.md)。\n\nFile v1.0.13:references/platform-specs.md\n\n<!-- 由 scripts/build-skills.mjs 从 shared/references/platform-specs.md 同步生成，不要直接改这里。 -->\r\n# 平台图片规格（可机检子集）\r\n\r\n`scripts/check_listing.py` 内置的规则来源与口径。**平台规则会变，以各平台最新官方文档为准**；\r\n需要覆盖时写一份 JSON 用 `--rules` 传入，结构与下表字段一一对应。\r\n\r\n---\r\n\r\n## 字段含义\r\n\r\n| 字段 | 含义 |\r\n| --- | --- |\r\n| `pure_white_bg` | 是否要求纯白 RGB(255,255,255) 背景 |\r\n| `bg_tolerance` | 判定「纯白」允许的单通道偏差 |\r\n| `bg_coverage` | 边缘一圈需要有多大比例落在容差内 |\r\n| `min_long_side` / `recommend_long_side` / `max_long_side` | 最长边像素 |\r\n| `min_occupancy` | 商品包围盒面积 ÷ 画面面积 的下限 |\r\n| `allow_alpha` | 是否允许透明通道 |\r\n| `allow_border` | 是否允许描边 / 外框 |\r\n| `formats` / `max_bytes` / `aspect` | 允许格式、体积上限、允许比例 |\r\n\r\n---\r\n\r\n## 内置规则\r\n\r\n| 平台 | 纯白底 | 最长边（下限 / 建议） | 主体占比 | 比例 | 体积上限 |\r\n| --- | --- | --- | --- | --- | --- |\r\n| `amazon` | 是 | 1000 / 1600 | ≥ 85% | 不限 | 10 MB |\r\n| `tiktok-shop` | \n\nArchive v1.0.12: 15 files, 42914 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2583b), SKILL.md (13199b), _meta.json (131b)\n\nArchive v1.0.11: 15 files, 42909 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2591b), SKILL.md (13199b), _meta.json (131b)\n\nArchive v1.0.10: 15 files, 42906 bytes\n\nFiles: examples/brand.yaml (1655b), references/model-flags.md (1904b), references/platform-specs.md (2180b), references/provider-cli.md (4802b), scripts/batch.mjs (11264b), scripts/brand.mjs (4516b), scripts/check_listing.py (16313b), scripts/gen.mjs (9733b), scripts/lib/miniyaml.mjs (2901b), scripts/lib/providers.mjs (12510b), scripts/lib/tasks.json (3234b), scripts/run_loop.mjs (9938b), skill-card.md (2359b), SKILL.md (13199b), _meta.json (131b)","readmeExcerpt":"Skill: 多商品批量生图 Batch Image Owner: dlazyai Summary: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。 Tags: latest:1.0.19 Version history: v1.0.19 | 2026-10-10T01:45:32.203Z | user 例行版本更新 2026-10-10 v1.0.18 | 2026-10-08T01:39:03.583Z | user 例行版本更新 2026-10-08 v1.0.17 | 2026-10-04T01:39:39.100Z | user 例行版本更新 2026-10-04 v1.0.16 | 2026-10-02T05:13:29.975Z | user 例行版本更新 2026-1","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"for sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone"},{"language":"csv","snippet":"sku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带"},{"language":"text","snippet":"prompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]"},{"language":"bash","snippet":"SPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/batch-image/out/${SKU}.jpg\"\ndone < manifest.csv"},{"language":"bash","snippet":"run_one() { ... }               # 单个 SKU 的生成逻辑\nexport -f run_one\nxargs -P 5 -I{} bash -c 'run_one {}' < sku-list.txt     # 5 路并发"},{"language":"bash","snippet":"for attempt in 1 2 3; do\n  dlazy ... && break\n  echo \"retry $attempt for $SKU\" >&2; sleep $((attempt * 10))\ndone"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: batch-image\nversion: 1.0.19\ndescription: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。\n---\n\n# batch-image — 多商品批量生图\n\n把单张生图变成**流水线**：一份商品清单 → 一整套风格统一的商拍图。\n\n批量的难点不是「跑很多次」，而是**跑出来的图要像一套**。本技能的核心是**规范段与变量段分离**：视觉规范逐字不变，只有商品描述随 SKU 变化。\n\n---\n\n## 生成效果示例\n\n| 输入：商品清单（2 个 SKU） |\n| --- |\n| `SKU001` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-a-sweater.jpg\" width=\"150\"> `军绿色麻花针织圆领毛衣，落肩宽松版型` |\n| `SKU002` <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/sku-b-shoes.jpg\" width=\"150\"> `黑色亮面皮革布洛克德比鞋，厚底系带` |\n\n实际执行的命令（循环体，两个 SKU 只有 `DESC` 与 `--images` 不同，规范段逐字相同）：\n\n```bash\nfor sku in a-sweater b-shoes; do\n  case $sku in\n    a-sweater) DESC='军绿色麻花针织圆领毛衣，落肩宽松版型' ;;\n    b-shoes)   DESC='黑色亮面皮革布洛克德比鞋，厚底系带' ;;\n  esac\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。\" \\\n    --images docs/batch-image/sku-${sku}.jpg --size 1:1 --resolution 2k \\\n    --save docs/batch-image/example-output-${sku}.jpg\ndone\n```\n\n**输出：同一套视觉规范下的两个 SKU**\n\n| SKU001 | SKU002 |\n| --- | --- |\n| <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-a-sweater.jpg\" width=\"280\"> | <img src=\"https://raw.githubusercontent.com/dlazy-ai/ecommerce-skills/main/docs/batch-image/example-output-b-shoes.jpg\" width=\"280\"> |\n| 1:1 / 2K，5 credits | 1:1 / 2K，5 credits |\n\n两张的背景色、光位、视角与投影方向一致——因为规范段逐字相同；商品各自保真。100 个 SKU 就是这个循环跑 100 次，总价约 500 credits。\n\n---\n\n## 1、能力边界\n\n| 能力 | 说明 |\n| --- | --- |\n| 批量规模 | 一批最多 100 个商品（对应企业功能的规格） |\n| 成本优势 | 批量场景下单图算力成本可降至约 7 折 |\n| 协作 | 多人在线协作、出片进度实时追踪 |\n| 资产共享 | 共享模特 / 参考图 / 作品 / 算力点 |\n| 本技能落地 | 清单驱动循环 + 并发控制 + 失败重试 + 按 SKU 归档 + 汇总报告 |\n\n**不做**：不在同一批里混用不同视觉规范（那不是一批）；不跳过抽样质检直接全量上架；不因为批量就放宽商品保真要求。\n\n---\n\n## 2、输入素材规则\n\n生成前先自检这几条硬性约束：\n\n- 大小：**20KB ~ 15MB**\n- 分辨率：**大于 400×400**\n- 格式：**jpg / jpeg / png / webp**\n\n**商品清单（manifest）** 是批量的输入，建议 CSV：\n\n```csv\nsku,image,desc\nSKU001,docs/batch-image/sku-a-sweater.jpg,军绿色麻花针织圆领毛衣，落肩宽松版型\nSKU002,docs/batch-image/sku-b-shoes.jpg,黑色亮面皮革布洛克德比鞋，厚底系带\n```\n\n**每张商品图仍要满足单图规则**：20KB~15MB、>400×400、jpg/jpeg/png/webp。\n\n**批量前必做的事**\n\n| 步骤 | 说明 |\n| --- | --- |\n| ✅ 先跑通 1 个 SKU | 单个跑不对，跑 100 个只是错 100 次 |\n| ✅ 再抽样 5 个 SKU | 覆盖品类/颜色/深浅色的边界情况 |\n| ✅ 确认成本 | `--dry-run` 单价 × SKU 数 × batch 数 |\n| ❌ 直接全量 | 最容易烧算力的做法 |\n\n---\n\n## 3、规范段 / 变量段分离\n\n这是批量出统一视觉的唯一方法：\n\n```text\nprompt = [规范段：整批逐字不变]  +  [变量段：每个 SKU 不同]\n```\n\n| 段 | 内容 | 是否变 |\n| --- | --- | --- |\n| 规范段 | 背景、光位、机位、构图留白、投影、色调、输出风格、`no text, no watermark` | **整批逐字不变** |\n| 变量段 | 商品品类 + 颜色 + 材质 + 关键结构特征 | 每个 SKU 不同 |\n\n写成 shell：\n\n```bash\nSPEC='放置在同一套统一视觉里：纯米白色摄影棚背景，柔和顶光加左侧补光，45 度视角，画面下方留出统一的商品投影，构图与留白在整组图中保持一致。真实商业产品摄影，无文字无水印。'\n\nwhile IFS=, read -r SKU IMG DESC; do\n  dlazy seedream-5.0 \\\n    --prompt \"电商商拍图。图1 是商品：${DESC}。商品的颜色、材质纹理、款式细节必须与图1完全一致。${SPEC}\" \\\n    --images \"$IMG\" --size 1:1 --resolution 2k \\\n    --save \"docs/b"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7c5wgeajfcfvdfb5ceemvdb984cjpd\",\n  \"slug\": \"batch-image\",\n  \"version\": \"1.0.19\",\n  \"publishedAt\": 1791596732203\n}"},{"path":"references/model-flags.md","content":"# `seedream-5.0` 参数清单\r\n\r\n本技能默认用的模型的完整参数。日常只需要「参数约定」里那几个，\r\n这份清单在需要用到非常规参数时再看。\r\n\r\n**CRITICAL INSTRUCTION FOR AGENT**:\r\nRun the `dlazy seedream-5.0` command to get results.\r\n\r\n```bash\r\ndlazy seedream-5.0 -h\r\n\r\nOptions:\r\n  --prompt <prompt>          Prompt\r\n  --images [images...]       Images [image: url or local path] (max 10)\r\n  --resolution <resolution>  Resolution [default: 2k] (choices: \"2k\", \"3k\",\r\n                             \"4k\")\r\n  --size <size>              Size [default: 16:9] (choices: \"1:1\", \"4:3\",\r\n                             \"3:4\", \"16:9\", \"9:16\", \"3:2\", \"2:3\", \"21:9\")\r\n  --dry-run                  Print payload without executing the tool\r\n  --no-wait                  Return generateId immediately for async tasks\r\n  --timeout <seconds>        Max seconds to wait for async completion (default:\r\n                             \"1800\")\r\n  --input <jsonOrFile>       Inline JSON or @path/to/file.json — merged under\r\n                             flag values (flags win)\r\n  --save <path>              Download the result asset to this local path\r\n                             (mkdir + retry handled for you). A destination\r\n                             path — NOT a response format; for stdout shape use\r\n                             --format\r\n  --batch <n>                Fan-out N parallel runs (cloud tools only)\r\n                             (default: \"1\")\r\n  -h, --help                 display help for command\r\n```\r\n\r\n> Any flag also accepts pipe references — `-` (auto-pick from upstream stdin), `@N` (n-th output), `@N.path` (jsonpath into output), `@*` (all primary values), `@stdin` / `@stdin:path` (whole envelope). See `dlazy --help` for details.\r\n\r\n---\r\n\r\n换其他后端时参数由 `scripts/gen.mjs` 统一翻译，见 [`provider-cli.md`](provider-cli.md)。"},{"path":"references/platform-specs.md","content":"<!-- 由 scripts/build-skills.mjs 从 shared/references/platform-specs.md 同步生成，不要直接改这里。 -->\r\n# 平台图片规格（可机检子集）\r\n\r\n`scripts/check_listing.py` 内置的规则来源与口径。**平台规则会变，以各平台最新官方文档为准**；\r\n需要覆盖时写一份 JSON 用 `--rules` 传入，结构与下表字段一一对应。\r\n\r\n---\r\n\r\n## 字段含义\r\n\r\n| 字段 | 含义 |\r\n| --- | --- |\r\n| `pure_white_bg` | 是否要求纯白 RGB(255,255,255) 背景 |\r\n| `bg_tolerance` | 判定「纯白」允许的单通道偏差 |\r\n| `bg_coverage` | 边缘一圈需要有多大比例落在容差内 |\r\n| `min_long_side` / `recommend_long_side` / `max_long_side` | 最长边像素 |\r\n| `min_occupancy` | 商品包围盒面积 ÷ 画面面积 的下限 |\r\n| `allow_alpha` | 是否允许透明通道 |\r\n| `allow_border` | 是否允许描边 / 外框 |\r\n| `formats` / `max_bytes` / `aspect` | 允许格式、体积上限、允许比例 |\r\n\r\n---\r\n\r\n## 内置规则\r\n\r\n| 平台 | 纯白底 | 最长边（下限 / 建议） | 主体占比 | 比例 | 体积上限 |\r\n| --- | --- | --- | --- | --- | --- |\r\n| `amazon` | 是 | 1000 / 1600 | ≥ 85% | 不限 | 10 MB |\r\n| `tiktok-shop` | 否 | 800 / 1600 | ≥ 60% | 1:1 或 3:4 | 5 MB |\r\n| `temu` | 是 | 800 / 1350 | ≥ 70% | 1:1 | 3 MB |\r\n| `shopee` | 否 | 500 / 1024 | ≥ 55% | 1:1 | 2 MB |\r\n| `shopify` | 否 | 1024 / 2048 | 不限 | 不限 | 20 MB |\r\n| `taobao` | 是 | 800 / 1200 | ≥ 70% | 1:1 | 3 MB |\r\n\r\n---\r\n\r\n## 几个容易踩的点\r\n\r\n- **透明 PNG**：Amazon 会把透明像素转成黑色。永远压平成白底 JPEG 再传。\r\n- **「白底」不等于「看起来是白的」**：棚拍的浅灰墙（约 RGB 208）肉眼像白，机检直接判不合格。\r\n- **主体占比**：留白过多是最常见的驳回原因之一，比分辨率不够更常见。\r\n- **文字 / 水印 / 拼图**：像素层测不了，交给 `detect-task` 的视觉模型或人工。\r\n- **自动修复的边界**：`--fix` 能压白底、按占比重构画布、补分辨率、压体积；\r\n  它**不会**修图，也不会去水印——那是 `item-repair` 和 `remove-watermark` 的活。"},{"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"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。 Skill: 多商品批量生图 Batch Image Owner: dlazyai Summary: 多商品批量生图流水线。商品清单 CSV → 整批统一视觉的商拍图，带并发、重试、断点续跑、成本熔断与挑图联系表。当用户说「批量生图」「一批商品」「跑整个 SKU 表」「几百个商品出图」时使用。 Tags: latest:1.0.19 Version history: v1.0.19 | 2026-10-10T01:45:32.203Z | user 例行版本更新 2026-10-10 v1.0.18 | 2026-10-08T01:39:03.583Z | user 例行版本更新 2026-10-08 v1.0.17 | 2026-10-04T01:39:39.100Z | user 例行版本更新 2026-10-04 v1.0.16 | 2026-10-02T05:13:29.975Z | user 例行版本更新 2026-1","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":805,"uniquenessScore":55,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T20:10:04.361Z","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-10T20:10:04.361Z","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-10T23:45:22.773Z","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"}]}}}