Skill: gaoyuji12138/ecommerce-livestream-overlay-generator (version 2.0.0)

--- name: ecommerce-livestream-overlay-generator description: > 电商直播贴片生成器 / 电商直播视觉包装工具。 适用于淘宝直播、抖音直播带货、拼多多直播、快手直播等电商直播场景。 输入品牌、产品、促销信息或产品照片，自动生成完整电商直播视觉包装： 背景、标题栏、主播形象、价格卡、产品货架、福利条、促销贴片。 支持绿幕抠图、自动合成预览、打包交付。 E-commerce livestream overlay generator for Taobao, Douyin, PDD, Kuaishou streaming. Generate background, title banner, host persona, pricing card, product shelf, benefits bar. Supports green screen removal, auto-composite preview, and packaged delivery. homepage: https://github.com/gaoyuji12138/e-commerce-livestream-overlay-skill user-invocable: true metadata: '{"openclaw":{"emoji":"🎨","primaryEnv":"VOLCENGINE_ARK_API_KEY","requires":{"env":["VOLCENGINE_ARK_API_KEY"],"bins":["python3","pip3"]}}}' --- # 直播间装修贴片生成 Skill ## 一、前置条件 ### 依赖 - Python 3 + Pillow + opencv-python-headless + numpy - 火山方舟 API Key ### API Key 获取 1. 前往 [火山引擎控制台](https://console.volcengine.com/ark) 注册并登录 2. 在「模型推理」页面开通豆包视觉模型 3. 在控制台凭证页面创建 API Key > **每个用户需要自己的 API Key**：使用时从环境变量 `VOLCENGINE_ARK_API_KEY` 读取。 ### 安装依赖 ```bash pip3 install Pillow==12.2.0 opencv-python-headless==4.13.0 numpy==2.3.2 ``` ## 二、数据隐私与透明度 ### 数据流向 | 数据类型 | 发送目标 | 用途 | 是否持久化 | |----------|----------|------|-----------| | 文本 Prompt（品牌/促销文案等） | 火山引擎 API | 图像生成请求 | ❌ 仅传输，不存储 | | 用户产品照片 | 火山引擎 API | 作为图像生成参考输入 | ❌ 仅传输，不存储 | | 生成的图片 | 本地磁盘 | 交付给用户 | ✅ 保存到本地输出目录 | > **AI 内置视觉能力**：当用户仅提供产品照片未附文字说明时，由 AI Agent 内置视觉能力识别图中商品信息（本地运行），无需额外 API 调用。 **本 Skill 不会做的事：** - ❌ 在本地或远程存储、记录或缓存用户输入数据（文本 Prompt、产品照片） - ❌ 将数据转发到火山引擎以外的任何第三方 - ❌ 进行任何购买、支付或金融操作 - ❌ 进行任何加密货币或区块链操作 > ⚠️ 用户产品照片和文本 Prompt 会发送至火山引擎 API。上传敏感或专有产品图片前，请阅读[火山引擎隐私政策](https://www.volcengine.com/docs/6369/71845)。API 返回的生成图片会保存到本地输出目录。 ## 三、需求确认（正式生成前必须执行） > ⚠️ 收到用户生成请求后，不要立即开始生成图片。先确认以下信息，确保一次性出图到位。 ### 2.1 必须确认的信息 | 信息 | 说明 | 必填 | |------|------|------| | 品牌 | 如 戴森、茅台、三只松鼠等 | ✅ | | 主推商品 | 具体品名和型号 | ✅ | | 促销活动 | 满减、买赠、积分兑换等具体内容 | ✅ | | 风格偏好 | 如有特殊要求（颜色、氛围、调性） | ❌ | ### 2.2 确认流程 1. **用户已提供完整信息** → 列出理解的需求摘要，请用户确认后直接开始 2. **用户信息不完整** → 只追问缺失的必要信息，其他自动推导 3. **用户只发了商品图片没文字** → 识别图中商品，推测品牌和品类，列出理解的需求摘要请用户确认 4. **用户说"按案例来"/"照着做"** → 直接用下方案例的需求生成 ### 2.4 需求描述案例（首次触发时主动展示） > 收到用户的生成请求后，主动展示以下案例，让用户可以照着描述或直接要求按案例生成。 **示例需求描述**： > 做一套戴森吹风机直播间贴片，主品是戴森Supersonic HD16吹风机和Airwrap多功能美发棒，买吹风机送两支造型风嘴，满3000减300，直播间限定礼盒包装 **首次回复模板**： ``` 你可以直接告诉我你的品牌和促销信息，比如： > 做一套戴森吹风机直播间贴片，主品是戴森Supersonic HD16吹风机和Airwrap多功能美发棒，买吹风机送两支造型风嘴，满3000减300，直播间限定礼盒包装 也可以直接说「按戴森案例来」，我就直接用这个需求生成。 你的需求是什么？ ``` **最低限度只需提供**：品牌 + 主推商品 + 促销活动（三个核心信息） **文案、风格色调、人物造型、权益**均由 AI 自动推导生成，用户可选择性修改。 ## 四、文案自动生成规则 ### 3.1 主标题 - 必须含品牌名并具有氛围感 - **禁用**"官方""旗舰"等字样 - 不能直接写商品名，要有宣传感和下单欲望 ### 3.2 副标题 - 核心利益点（福利/功效/场景）或正在进行的活动 - 简洁有力 ### 3.3 促销竖卡 - 根据促销活动拆分为 2-3 层 - 每层包含：金额/权益 + 使用条件 ### 3.4 权益文案 - 通常 3 个：赠品相关 + 正品保障 + 物流/售后 - ⚠️ 避免使用"正品""保障"等触发审核的词，替换为"品质""保证" ## 五、组件清单与尺寸 > ⚠️ 尺寸已根据 `doubao-seedream-4-5-251128` 的最低像素限制调整 | # | 组件 | 尺寸 | 绿幕 | 说明 | |---|------|------|------|------| | 1 | 背景图 | **1440×2560** | ❌ | C4D 场景 | | 2 | 标题横卡 | **3328×1109** | ✅ | 异形贴纸 | | 3 | 人物 | **1440×2560** | ✅ | 素颜+幼态脸+精致造型（不用手持商品） | | 4 | 促销竖卡 | **1920×1920** | ✅ | 正方形异形贴纸 | | 5 | 桌面商品贴 | **3328×1109** | ✅ | 40+单品密集排列 | | 6 | 权益下贴 | **3328×1109** | ❌ | 铺满底部 | ## 六、Prompt 写法标准 ### 核心原则 - 所有组件使用统一风格前缀确保色调一致 - 必须包含反向约束条件 - 背景图使用"纯色均匀绿色背景"（不是#00FF00） ### 5.1 背景图 Prompt **约束**：无文字、无人物、无产品。 **模板**： ``` 融合[风格描述]的C4D商业空间场景。[主色调]为主色调，[辅助色]辅助，[点缀色]点缀，[中性色]平衡。空间结构[结构描述]，[氛围]氛围。灯光[灯光描述]，突显质感与层次。材质[材质]，展现[风格]魅力。布局上[元素1]、[元素2]、[元素3]等抽象展示元素散落，营造[整体感受]空间体验。 ``` ### 5.2 标题横卡 Prompt **模板**： ``` 纯色均匀绿色背景#00FF00。画面正中是一个[颜色]渐变的异形横条卡片，卡片有[边框质感]，四边是不规则的艺术形状。卡片内部左侧[文字区域底色]，大字「[主标题]」用[字体描述]，下方「[副标题]」用[字体描述]。卡片右侧是[产品插画描述]。整个卡片颜色浓郁厚重，绝对没有白色底色区域，不要任何绿色青色蓝绿色。卡片是一个完整的实体贴纸，边界清晰。 ``` ### 5.3 人物 Prompt > ⚠️ 核心规则（v2 更新）： > 1. **人物模型用 `doubao-seedream-5-0-260128`**（其他组件仍用 `doubao-seedream-4-5-251128`） > 2. **完全不化妆的素颜**（不是"清透裸妆"） > 3. **不手持商品**，双手自然下垂微曲（v2 取消了手持商品） > 4. **网红幼态脸短中庭**，眼部轮廓深邃有水润感，唇部有果冻感水润饱满 > 5. **服装必须提前设计好**，prompt 中完整描述上衣+下装（不含鞋子）+ 配饰 > 6. **发色尽量黑色**，发质柔顺有光泽，发型精致可加配饰，符合品牌调性 > 7. 背景用"纯色均匀绿色"（不是#00FF00） **模板**： ``` 纯色均匀绿色背景（无渐变无纹理）。竖版人像，头顶到大腿中段，人物居中占满画面。25岁年轻女主播，完全素颜，冷白皮，网红幼态脸短中庭，{眼型描述}，眼部深邃有水润感，{眼周描述}，唇部{唇型描述}有果冻感水润{唇色描述}，{气质描述}。面部无任何妆容。身穿{上衣描述}，下身{下装描述}，{配饰描述}。{发型发色描述}，{发型配饰描述}。正面柔和灯光，双手自然下垂微曲。 ``` **人物造型设计示例（v2 版）**： 兰蔻菁纯： ``` 网红幼态脸短中庭，眼型圆眼微微下垂显无辜感，眼部轮廓深邃有水润感，眼周皮肤细腻透亮，唇部饱满嘟嘟唇有果冻感水润透亮，五官精致甜美亲和。身穿白色细针织短款开衫，内搭米白色蕾丝吊带，下身穿高腰浅粉色百褶缎面半裙，胸前戴一条玫瑰金细锁骨链，左手腕戴一只玫瑰金细手镯，右手戴一枚简约珍珠戒指。黑色长直发柔顺有光泽披落至锁骨下方，头顶偏右侧夹一个珍珠小发夹，几缕碎发自然垂落在脸颊两侧修饰脸型。 ``` ### 5.4 促销竖卡 Prompt > ⚠️ 尺寸从 896×1344 改为 **1920×1920**（正方形） **模板**： ``` 纯色均匀绿色背景#00FF00。画面正中是一个紧凑的竖向异形标签贴纸，整体为[深色系]实心底色，没有任何白色区域、没有任何浅色区域、没有任何渐变到白色的部分，不要任何绿色青色蓝绿色。贴纸形状为圆角矩形加顶部弧形装饰。顶部有[装饰元素]。大字「[大标题]」用[字体描述]；下方分三层：「[内容1]」「[内容2]」「[内容3]」。整个贴纸颜色浓郁深实，边界清晰锐利，是一个实心异形贴纸。贴纸占据画面约40%面积，紧凑不松散。 ``` ### 5.5 桌面商品贴 Prompt（⚠️ 与原始 skill 完全不同） > ⚠️ 关键区别： > 1. **白色哑光大理石展示桌面**（不是纯绿底+白平面） > 2. **分层聚核+左右镜像+前后递进**布局逻辑 > 3. **商品总数至少40个以上单品**（不是"丰富一些"） > 4. 中层核心区分左中右三块，中心区视觉焦点 **模板**： ``` 纯色均匀绿色背景。画面下方白色哑光大理石展示桌面（占画面底部40%），产品按分层聚核+左右镜像+前后递进布局，≥40单品密集排列。【中层核心区】左中右三块，中心视觉焦点：{产品布局描述}。所有产品竖立正面朝向观众，阶梯状层次。除商品和白色金属陈列架外无其他内容，禁止出现人体任何部位。光线均匀自然，纯静物陈列。 ``` > ⚠️ prod_layout 里**不能出现"最前方留手持位"**——手持商品是人物图的事，桌面商品贴是纯产品陈列 ### 5.7 用户商品图（可选） 当用户提供真实商品照片时： **a) 去背景**：根据商品图的背景类型选择策略 | 商品背景 | 去背景方法 | |---------|-----------| | 白色/浅色纯色背景 | HSV 阈值去除白色区域 | | 深色纯色背景 | HSV 阈值去除对应深色 | | 复杂场景背景 | GrabCut 或 Rembg | ```python import cv2, numpy as np def remove_white_bg(img_path, output_path): """HSV 阈值去除白色/浅色背景，输出 RGBA PNG""" img = cv2.imread(img_path) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.bitwise_or( cv2.inRange(hsv, np.array([0,0,200]), np.array([180,30,255])), cv2.inRange(hsv, np.array([0,0,160]), np.array([180,50,240]))) k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7)) mask = cv2.GaussianBlur(cv2.morphologyEx(cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k, 5), cv2.MORPH_OPEN, k, 3), (5,5), 0) mask = (mask > 200).astype(np.uint8) * 255 b, g, r = cv2.split(img) cv2.imwrite(output_path, cv2.merge([b, g, r, 255 - mask])) ``` **b) 桌面商品贴 Prompt 调整**：中心区留白，供用户商品图叠加 ``` 在原有的桌面商品贴 prompt 中，将中心区描述改为： "中心区域留出足够的空白空间用于放置主推商品（大约占中心30%面积保持干净）， 周边按分层聚核加左右镜像加前后递进逻辑摆放配套产品" ``` **c) 合成时叠加**：用户商品图缩放后放在产品区域中心偏上 **d) 新增交付物**： | 文件名 | 说明 | |--------|------| | 用户商品图.png | 去背景后的用户商品图，已定位到画布坐标 | ### 5.6 权益下贴 Prompt **模板**： ``` 左右对称构图，平视视角。核心元素呈现在上半部分：三个简单权益图标，下方对应文字「[权益1] / [权益2] / [权益3]」。背景[背景描述]。风格：平面，光影简约。色彩：[主色]，简洁大方。 ``` ## 七、生图 API | 项目 | 内容 | |------|------| | 地址 | `https://ark.cn-beijing.volces.com/api/v3/images/generations` | | 方式 | POST | | Content-Type | application/json | | **通用模型** | **`doubao-seedream-4-5-251128`** | | **人物模型** | **`doubao-seedream-5-0-260128`**（仅人物组件用此模型） | ### 请求参数 ```json { "model": "doubao-seedream-4-5-251128", "stream": false, "watermark": false, "sequential_image_generation": "disabled", "prompt": "<中文prompt>", "size": "<宽>x<高>" } ``` ### 请求示例 ## 八、绿幕抠图 对组件 2（标题横卡）、3（人物）、4（促销竖卡）、5（桌面商品贴）执行绿幕去除。 ```python import cv2, numpy as np def remove_green(img_path, output_path): """HSV 阈值去除绿幕背景，输出 RGBA PNG""" img = cv2.imread(img_path) hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) mask = cv2.bitwise_or( cv2.inRange(hsv, np.array([35,80,80]), np.array([85,255,255])), cv2.inRange(hsv, np.array([30,40,120]), np.array([90,255,255]))) k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)) mask = cv2.GaussianBlur(cv2.morphologyEx(cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k, 3), cv2.MORPH_OPEN, k, 2), (3,3), 0) mask = (mask > 127).astype(np.uint8) * 255 b, g, r = cv2.split(img) cv2.imwrite(output_path, cv2.merge([b, g, r, 255 - mask])) ``` ## 九、合成预览 > ⚠️ 布局参数与原始 skill 完全不同 ### 布局参数 ```python layout = { "title": {"scale": 0.95, "pos": "center-top", "y_pct": 0.07}, "person": {"scale": 0.70, "pos": "left", "x_pct": 0.15, "y_pct": 0.14}, "promo": {"scale": 0.40, "pos": "right", "x_pct": 0.55, "y_pct": 0.22}, "product": {"zoom": 1.2, "pos": "bottom-full", "above": "benefit"}, "benefit": {"scale": 1.0, "pos": "bottom-full"}, } ``` ### 合成代码 ```python from PIL import Image def compose_preview(bg_path, person_nobg, title_nobg, promo_nobg, product_nobg, benefit_path, output_path): bg = Image.open(bg_path).convert("RGBA"); cw, ch = bg.size def fit(img, w_ratio, center=True): w = int(cw * w_ratio); s = w / img.width r = img.resize((w, int(img.height * s)), Image.LANCZOS) return r, (cw - w) // 2 if center else cw - w def fit_full(img): s = cw / img.width; return img.resize((cw, int(img.height * s)), Image.LANCZOS) def zoom_crop(img, zoom): w = int(cw * zoom); s = w / img.width; h = int(img.height * s) r = img.resize((w, h), Image.LANCZOS); cx = (w - cw) // 2 return r.crop((cx, 0, cx + cw, h)) title = Image.open(title_nobg).convert("RGBA") person = Image.open(person_nobg).convert("RGBA") promo = Image.open(promo_nobg).convert("RGBA") product = Image.open(product_nobg).convert("RGBA") benefit = Image.open(benefit_path).convert("RGBA") tr, tx = fit(title, 0.95); ty = int(ch * 0.07) prr, prx = fit(promo, 0.40, center=False); prx = int(cw * 0.55); pry = int(ch * 0.22) per, perx = fit(person, 0.70); perx = int(cw * 0.15); pery = int(ch * 0.14) pdr = zoom_crop(product, 1.2); pdy = ch - fit_full(benefit).height - pdr.height bfr = fit_full(benefit); bfy = ch - bfr.height canvas = bg.copy() for img, pos in [(prr,(prx,pry)),(per,(perx,pery)),(pdr,(0,pdy)),(tr,(tx,ty)),(bfr,(0,bfy))]: canvas.paste(img, pos, img) canvas.convert("RGB").save(output_path, "JPEG", quality=95) ``` ### 后处理：人物提亮 合成前对人物图层单独提亮，避免合成后人物偏暗： ```python from PIL import ImageEnhance person_bright = ImageEnhance.Brightness(person).enhance(1.17) ``` > ⚠️ 只提亮人物图层（17%），不动其他图层。最终交付的人物.png 也使用提亮后的版本。 ## 十、打包交付 ### 交付文件（固定7个） | 文件名 | 格式 | 说明 | |--------|------|------| | 背景.png | PNG 1440×2560 | 全铺 | | 标题横卡.png | PNG 1440×2560 透明 | 内容在预览位置 | | 人物.png | PNG 1440×2560 透明 | 已提亮处理（不标注"提亮"） | | 促销竖卡.png | PNG 1440×2560 透明 | 内容在预览位置 | | 桌面商品贴.png | PNG 1440×2560 透明 | 内容在预览位置 | | 权益下贴.png | PNG 1440×2560 透明 | 内容在预览位置 | | 预览.jpg | JPG 1440×2560 | 合成预览效果 | 若提供了用户商品图，该商品图会合成到桌面商品贴的中心区域，不单独输出。 ### 交付方式（二选一，自动判断） **方式一：对话内直接发送（当通道支持文件发送时）** 1. 先发送预览图（`预览.jpg`）到对话 2. 再发送压缩包（命名为「{品牌名}直播间_全套贴图.zip」，内含上述7个文件） **方式二：桌面文件夹（当通道不支持文件发送时）** 1. 在用户桌面创建文件夹，命名为「{品牌名}直播间贴片」 2. 文件夹内只放上述7个文件，不包含中间文件、不包含压缩包 3. 用 `open` 命令直接打开预览图，让用户看到效果 4. 用 `open` 命令直接打开文件夹，让用户浏览文件 > ⚠️ 注意：webchat（Control UI）当前不支持文件发送，走方式二。飞书、微信等走方式一。 ## 十、完整工作流 ``` 1. 收集需求（品牌、促销活动、可选：用户商品图） 2. 分析品牌风格 → 确定色调 3. 为人物设计造型（幼态脸+水润眼+果冻唇+服装+发型发色+配饰） 4. 自动生成缺失文案 5. 编写 6 个组件的 prompt（人物用 v2 模板，不用手持商品） - 若有用户商品图：桌面商品贴 prompt 中心区留白 6. 通用组件调用 doubao-seedream-4-5-251128，人物组件调用 doubao-seedream-5-0-260128 7. 对组件 2/3/4/5 执行绿幕抠图 8. 对人物图层提亮17%（ImageEnhance.Brightness 1.17） 9. [可选] 对用户商品图执行去背景（白底/浅色背景用HSV阈值） 10. 合成预览图（使用提亮后的人物图层，用户商品图叠加在桌面产品区中央） 11. 打包交付 ```

path: SKILL_V1_EN_BACKUP.md
content: ---
name: ecommerce-livestream-overlay-generator
description: >
  电商直播贴片生成器 / 电商直播视觉包装工具。
  适用于淘宝直播、抖音直播带货、拼多多直播、快手直播等电商直播场景。
  输入品牌、产品、促销信息或产品照片，自动生成完整电商直播视觉包装：
  背景、标题栏、主播形象、价格卡、产品货架、福利条、促销贴片。
  支持绿幕抠图、自动合成预览、打包交付。
  E-commerce livestream overlay generator for Taobao, Douyin, PDD, Kuaishou streaming.
  Generate background, title banner, host persona, pricing card, product shelf, benefits bar.
  Supports green screen removal, auto-composite preview, and packaged delivery.
homepage: https://github.com/gaoyuji12138/e-commerce-livestream-overlay-skill
user-invocable: true
metadata: '{"openclaw":{"emoji":"🎨","primaryEnv":"VOLCENGINE_ARK_API_KEY","requires":{"env":["VOLCENGINE_ARK_API_KEY"],"bins":["python3","pip3"]}}}'
---

# E-Commerce Livestream Overlay Generator Skill

## I. Prerequisites

### Dependencies
- Python 3 + Pillow + opencv-python-headless + numpy

### Environment Variables

- `VOLCENGINE_ARK_API_KEY` - Volcano Engine (Doubao) Ark API Key（必填）

**获取方式**：
1. 登录 [火山引擎控制台](https://console.volcengine.com/ark/region:ark+cn-beijing/model)
2. 进入 Ark 模型平台，启用以下模型：
   - `doubao-seedream-4-5-251128`（通用组件）
   - `doubao-seedream-5-0-260128`（主播人像组件）
3. 在控制台凭证页面创建 API Key

> **每个用户需要自己的 API Key**：使用时从环境变量 `VOLCENGINE_ARK_API_KEY` 读取。

### Install dependencies
```bash
pip3 install Pillow==12.2.0 opencv-python-headless==4.13.0 numpy==2.3.2
```

## II. Data Privacy & Transparency

This skill sends **text prompts** and **optionally user-supplied product photos** to the Volcano Engine (Doubao) image generation API. All subsequent processing (green screen removal, compositing, packaging) runs **entirely locally**.

| What is sent | Where | Purpose |
|-------------|-------|---------|
| Text prompts (brand/product/style descriptions) | `https://ark.cn-beijing.volces.com/api/v3/images/generations` | Generate overlay component images (background, title, host persona, pricing card, product shelf, benefits bar) |
| User-supplied product photos (optional) | `https://ark.cn-beijing.volces.com/api/v3/images/generations` | Used as reference image input for product shelf generation |

**Data handling details:**
- **Text prompts** and **user product photos** (when provided) are sent to the Volcano Engine API endpoint listed above. No data is forwarded to any other third party.
- **Generated images** are returned from the API and saved locally. They are not re-uploaded anywhere.
- **All post-processing** (green screen removal, compositing, brightness adjustment, packaging) runs **entirely locally** on the user's machine using Python (OpenCV + Pillow).

**What this skill does NOT do:**
- ❌ Store, log, or cache user input data (text prompts, product photos) locally or remotely
- ❌ Forward data to any third party beyond the Volcano Engine API
- ❌ Make purchases, handle payments, or interact with any financial services
- ❌ Perform any cryptocurrency or blockchain operations

> Generated images returned from the API are saved to the local output directory for your use.

> ⚠️ User product photos and text prompts are sent to Volcano Engine's API. Please review [Volcano Engine's privacy policy](https://www.volcengine.com/docs/6369/71845) before uploading sensitive or proprietary product images.

## III. Requirement Confirmation (Must Complete Before Generation)

> ⚠️ Upon receiving a generation request, do NOT start generating images immediately. Confirm the following info first to ensure one-pass success.

### 3.1 Required Information

| Info | Description | Required |
|------|-------------|----------|
| Brand | e.g. Dyson, Moutai, Three Squirrels | ✅ |
| Featured Product | Specific product name and model | ✅ |
| Promotion | Discounts, gifts, loyalty points, etc. | ✅ |
| Style Preference | Special requirements (color, mood, tone) | ❌ |

### 3.2 Confirmation Flow

1. **User provides complete info** → Summarize understanding, ask user to confirm, then start
2. **User info is incomplete** → Only ask for missing required fields, auto-infer the rest
3. **User sends a product photo with no text** → AI agent identifies the product using its built-in vision capability, infers brand & category, summarizes and asks user to confirm
4. **User says "use the example"** → Generate directly using the Dyson example below

### 3.3 Confirmation Example Reply

```
Let me confirm the requirements:

📋 **Brand**: Dyson
📋 **Featured Product**: Dyson Supersonic HD16 Hair Dryer + Airwrap Multi-Styler
📋 **Promotion**: ¥300 off every ¥3,000 spent
📋 **Gift**: Free 2 styling nozzle attachments with hair dryer purchase
📋 **Packaging**: Livestream-exclusive gift box
📋 **Style**: Tech-luxury (inferred from Dyson brand)

Here's my copy design:
- Main title: "Dyson · Salon-Grade Styling"
- Subtitle: "Limited Edition · Luxe Experience"
- Pricing card: "¥300 off ¥3,000+ / Free styling nozzles with hair dryer / Exclusive gift box"
- Benefits: "2-year warranty / Free shipping / Premium gift packaging"

If this looks good I'll start generating. Let me know if you want any changes 👇
```

### 3.4 Example Requirement (Show Proactively on First Trigger)

> When receiving a generation request, proactively show the example below so the user can follow it or ask to use it directly.

**Example requirement:**
> Generate a full Dyson livestream overlay set. Featured products: Dyson Supersonic HD16 Hair Dryer and Airwrap Multi-Styler. Free 2 styling nozzle attachments with hair dryer purchase. ¥300 off every ¥3,000 spent. Livestream-exclusive gift box.

**First reply template:**
```
You can just tell me your brand and promo info, like:

> Generate a full Dyson livestream overlay set. Featured products: Dyson Supersonic HD16 Hair Dryer and Airwrap Multi-Styler. Free 2 styling nozzle attachments with hair dryer purchase. ¥300 off every ¥3,000 spent. Livestream-exclusive gift box.

Or just say "use the Dyson example" and I'll generate with that spec.

What's your requirement?
```

**Minimum needed**: Brand + Featured Product + Promotion (3 core fields)
**Copy, style, host design, benefits** are all auto-generated by AI. User can optionally modify.

## IV. Auto Copywriting Rules

### 4.1 Main Title
- Must include brand name with atmospheric feel
- **NEVER use** "official" or "flagship" or similar words
- Don't just write the product name — it needs marketing appeal and purchase desire

### 4.2 Subtitle
- Core benefit (perks / efficacy / scenario) or current campaign
- Concise and impactful

### 4.3 Pricing Card
- Split promotion into 2-3 tiers
- Each tier: amount/benefit + conditions

### 4.4 Benefits Copy
- Usually 3 items: gift-related + authenticity guarantee + logistics/after-sales
- ⚠️ Avoid audit-triggering words like "authentic" or "guarantee" — use "quality" and "assured" instead

## V. Component List & Dimensions

> ⚠️ Dimensions calibrated for `doubao-seedream-4-5-251128` minimum pixel limits

| # | Component | Size | Green Screen | Notes |
|---|-----------|------|-------------|-------|
| 1 | Background | **1440×2560** | ❌ | C4D scene |
| 2 | Title Banner | **3328×1109** | ✅ | Die-cut sticker |
| 3 | Host Persona | **1440×2560** | ✅ | Bare-faced + youthful face + styled look (no product in hand) |
| 4 | Pricing Card | **1920×1920** | ✅ | Square die-cut sticker |
| 5 | Product Shelf | **3328×1109** | ✅ | 40+ items dense arrangement |
| 6 | Benefits Bar | **3328×1109** | ❌ | Full-width bottom |

## VI. Prompt Writing Standards

### Core Principles
- All components use a unified style prefix for color consistency
- Must include negative constraints
- Background uses "pure solid green" (not #00FF00)

### 6.1 Background Prompt
**Constraint**: No text, no people, no products.

**Template**:
```
A C4D commercial space scene blending [style description]. The space uses [primary color] as the dominant tone, complemented by [secondary color], with [accent color] details, all balanced by [neutral color]. The spatial structure presents [structure description], creating a [atmosphere]. Lighting design [lighting description] highlights texture and depth. Materials include [materials], showcasing the charm of [style]. Modular abstract display elements are scattered throughout, such as [element 1], [element 2], and [element 3], together creating a [overall feeling] spatial experience.
```

### 6.2 Title Banner Prompt
**Template**:
```
Solid uniform green background #00FF00. Center of frame is a [color] gradient die-cut horizontal card with [border texture], irregular artistic edges on all four sides. Inside the card, left side has [text area background color], large text "[MAIN TITLE]" in [font description], below it "[SUBTITLE]" in [font description]. Right side of card shows [product illustration description]. The entire card has rich deep colors with absolutely no white background areas, no green/cyan/teal. The card is a complete solid sticker with crisp sharp edges.
```

### 6.3 Host Persona Prompt

> ⚠️ Core rules (v2 update):
> 1. **Use `doubao-seedream-5-0-260128` for host persona** (other components still use `doubao-seedream-4-5-251128`)
> 2. **Completely bare-faced, no makeup** (not "natural nude makeup")
> 3. **Do NOT hold products** — hands hang naturally, slightly bent (v2 removed hand-held product)
> 4. **Internet-celebrity youthful face with short midface**, deep watery eyes, jelly-glossy lips
> 5. **Outfit must be pre-designed** — fully describe top + bottom (no shoes) + accessories in prompt
> 6. **Hair color preferably black**, silky smooth, styled with possible accessories matching brand tone
> 7. Background uses "pure solid green" (not #00FF00)

**Template**:
```
Pure solid green uniform background, absolutely uniform pure color with no gradients, no texture, no shadows, no light spots, no impurities. Vertical portrait, person standing facing camera, framed from top of head to mid-thigh, person centered and occupying most of the frame, top of head very close to frame top. 25-year-old beautiful young female host, completely bare-faced with no makeup, cool-toned fair skin that is clear and translucent, internet-celebrity youthful face with short midface, {eye type description}, deep watery eyes, {eye area description}, lips {lip shape description} with jelly-glossy {lip color description}, {temperament description}. Completely bare-faced, no makeup on face whatsoever, no eyeshadow, eyeliner, mascara, blush, lipstick, or foundation. Wearing {top description}, {bottom description}, {accessories description}. {hair style and color description}, {hair accessories description}. Soft even front lighting. Person standing naturally, both arms hanging naturally with slight bend, relaxed elegant posture.
```

**Face Differentiation (Must specify these dimensions each time)**:

| Dimension | Description | Examples |
|-----------|-------------|----------|
| Face shape | Internet-celebrity youthful face, short midface (fixed) | Heart/oval/melon/square-round |
| Eye type | Round/almond/peach-blossom/phoenix | Describe "slightly downturned for innocent look" or "slightly upturned for elegance" |
| Eye hydration | Fixed requirement | "Deep watery eyes, delicate translucent skin around eyes" |
| Lip jelly feel | Fixed requirement | "Full pouty lips with jelly-glossy translucent shine" / "Thin lips natural pale pink with jelly feel" |
| Temperament | Sweet & approachable / cool & premium / elegant & intellectual / energetic / confident | Varies by brand |
| Outfit | Must be pre-designed, top + bottom + accessories | No shoes |
| Hairstyle | Must be pre-designed, primarily black + accessories | Silky smooth, refined with design sense |

**Host Design Examples (v2)**:

Lancôme Absolue:
```
Internet-celebrity youthful face with short midface, round eyes slightly downturned for innocent look, deep watery eyes, delicate translucent skin around eyes, full pouty lips with jelly-glossy translucent shine, refined sweet and approachable features. Wearing white fine-knit cropped cardigan, layered over cream-white lace camisole, high-waisted light pink pleated satin midi skirt, rose-gold delicate collarbone chain on chest, rose-gold thin bracelet on left wrist, simple pearl ring on right hand. Long straight black hair silky smooth falling to below collarbone, a small pearl hair clip clipped on the right side of crown, a few wispy strands naturally framing the face.
```

Helena Rubinstein Re-Plasty:
```
Internet-celebrity youthful face with short midface, phoenix eyes slightly upturned, deep watery eyes with natural cool-premium feel at outer corners, thin lips natural pale pink with jelly-glossy hydration, refined cool-premium features. Wearing black high-neck slim-fit silk shirt, sleeves rolled up to elbows revealing slender wrists, black high-waisted wide-leg suit pants, a 2-carat diamond stud on left earlobe, ultra-fine silver chain bracelet on right wrist. Long straight black hair silky smooth with center part falling naturally to center of back, a minimalist black ultra-thin hairpin placed near right temple for clean structured look.
```

La Mer:
```
Internet-celebrity youthful face with short midface, bright large almond eyes, deep watery eyes with warm soulful gaze, standard lips with jelly-glossy natural pink full hydration, refined soft and clear features. Wearing pearl-white silk satin loose shirt with top button undone revealing delicate collarbone, puffy bubble sleeve design, champagne high-waisted satin wide-leg trousers, ultra-fine champagne-gold necklace with small pearl pendant on neck, white jade thin bracelet on left wrist. Long curly black hair silky smooth with natural large waves falling to shoulder blades, a loose refined French braid woven from left side of crown, tiny pearl hairpins scattered through the braid.
```

### 6.4 Pricing Card Prompt
> ⚠️ Size changed from 896×1344 to **1920×1920** (square)

**Template**:
```
Solid uniform green background #00FF00. Center of frame is a compact vertical die-cut label sticker, entirely [dark color scheme] solid background, absolutely no white areas, no light-colored areas, no gradients to white, no green/cyan/teal. Sticker shape is rounded rectangle with arched top decoration. Top has [decorative elements]. Large text "[HEADLINE]" in [font description]; below divided into three tiers: "[TIER 1]" "[TIER 2]" "[TIER 3]". The entire sticker has rich deep solid colors with crisp sharp edges, a solid die-cut sticker. Sticker occupies about 40% of frame area, compact not sparse.
```

### 6.5 Product Shelf Prompt (⚠️ Different from original skill)

> ⚠️ Key differences:
> 1. **White matte marble display tabletop** (not pure green + white plane)
> 2. **Layered cluster + left-right mirror + front-back progression** layout logic
> 3. **At least 40+ individual product units** (not "make it rich")
> 4. Middle core zone split into left-center-right sections, center as visual focal point

**Template**:
```
Background is pure solid green uniform. At the bottom of frame is a front-facing flat white premium display tabletop (white matte marble texture), completely horizontal with no tilt, occupying bottom 40% of frame height. Products arranged by layered cluster plus left-right mirror plus front-back progression logic, at least 40+ individual product units densely covering most tabletop area: [Middle core display zone split into left-center-right] Center visual focal point: {product layout description} [Overall layout requirements] All products standing upright facing the viewer. Height differences create stepped layering. Appropriate blank spacing between left/right zones and center zone for breathing room. Dense and full product arrangement, at least 40+ individual units. Nothing else besides products and white matte metal display stands, absolutely no hands, fingers, arms, or any human body parts. Even lighting. Pure still-life product display photo with no human presence whatsoever.
```

> ⚠️ Do NOT include "leave hand-holding space at front" in the layout — hand-held products are for the host persona image; the product shelf is pure product display.

### 6.6 User Product Photo (Optional)

When the user provides a real product photo:

**a) Background removal**: Select strategy based on product photo background

| Product Background | Removal Method |
|-------------------|----------------|
| White/light solid background | HSV threshold to remove white areas |
| Dark solid background | HSV threshold to remove corresponding dark color |
| Complex scene background | GrabCut or Rembg |

```python
import cv2
import numpy as np

def remove_white_bg(img_path, output_path):
    """Remove white/light background — runs entirely locally"""
    img = cv2.imread(img_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask_w = cv2.inRange(hsv, np.array([0, 0, 200]), np.array([180, 30, 255]))
    mask_g = cv2.inRange(hsv, np.array([0, 0, 160]), np.array([180, 50, 240]))
    mask = cv2.bitwise_or(mask_w, mask_g)
    k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k, iterations=5)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, k, iterations=3)
    mask = cv2.GaussianBlur(mask, (5, 5), 0)
    mask = (mask > 200).astype(np.uint8) * 255
    b, g, r = cv2.split(img)
    cv2.imwrite(output_path, cv2.merge([b, g, r, 255 - mask]))
```

**b) Product Shelf Prompt adjustment**: Leave center area blank for user's product

```
In the product shelf prompt, change the center zone description to:
"Leave sufficient blank space in the center area for the main featured product
(about 30% of center area kept clean), surrounding products arranged by
layered cluster plus left-right mirror plus front-back progression logic"
```

**c) Composite overlay**: User product photo scaled and placed at center of product area

```python
# User product: scale to 25% of canvas width, center of product area
up_target_w = int(cw * 0.25)
ups = up_target_w / user_product.width
up_resized = user_product.resize((int(user_product.width * ups), int(user_product.height * ups)), Image.LANCZOS)
upx = (cw - up_resized.width) // 2
upy = pdy + int(pdr.height * 0.05)

# Paste order: user product after product shelf, before title banner
canvas.paste(pdr, (0, pdy), pdr)
canvas.paste(up_resized, (upx, upy), up_resized)  # ← user product
canvas.paste(tr, (tx, ty), tr)
```

### 6.7 Benefits Bar Prompt
**Template**:
```
Symmetrical left-right composition, eye-level view. Core elements in upper half: three simple benefit icons, with corresponding text below: "[BENEFIT 1] / [BENEFIT 2] / [BENEFIT 3]". Background [background description]. Style: flat design, minimalist lighting. Color: [primary color], clean and elegant.
```

## VII. Image Generation API

| Item | Content |
|------|---------|
| Endpoint | `https://ark.cn-beijing.volces.com/api/v3/images/generations` |
| Method | POST |
| Content-Type | application/json |
| **General model** | **`doubao-seedream-4-5-251128`** |
| **Persona model** | **`doubao-seedream-5-0-260128`** (host persona component only) |

> 📋 The API key is obtained from the [Volcano Engine Ark Console](https://console.volcengine.com/ark/region:ark+cn-beijing/model). Text prompts are sent to this endpoint; no images or personal data are transmitted.

### Request parameters
```json
{
  "model": "doubao-seedream-4-5-251128",
  "stream": false,
  "watermark": false,
  "sequential_image_generation": "disabled",
  "prompt": "<prompt in Chinese>",
  "size": "<width>x<height>"
}
```

### Request example
```bash
curl -s "https://ark.cn-beijing.volces.com/api/v3/images/generations" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $VOLCENGINE_ARK_API_KEY" \
  -d '{
    "model": "doubao-seedream-4-5-251128",
    "stream": false,
    "watermark": false,
    "sequential_image_generation": "disabled",
    "prompt": "prompt content",
    "size": "1440x2560"
  }'
```

> 📋 The API key is read from the environment variable `VOLCENGINE_ARK_API_KEY`. Text prompts are sent to this endpoint; no images or personal data are transmitted.

## VIII. Green Screen Removal

Execute green screen removal on components 2 (Title Banner), 3 (Host Persona), 4 (Pricing Card), and 5 (Product Shelf).

> 🔒 This processing runs **entirely locally** — no data leaves the machine.

```python
import cv2
import numpy as np

def remove_green(img_path, output_path):
    img = cv2.imread(img_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask1 = cv2.inRange(hsv, np.array([35, 80, 80]), np.array([85, 255, 255]))
    mask2 = cv2.inRange(hsv, np.array([30, 40, 120]), np.array([90, 255, 255]))
    mask = cv2.bitwise_or(mask1, mask2)
    k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k, iterations=3)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, k, iterations=2)
    mask = cv2.GaussianBlur(mask, (3, 3), 0)
    mask = (mask > 127).astype(np.uint8) * 255
    b, g, r = cv2.split(img)
    rgba = cv2.merge([b, g, r, 255 - mask])
    cv2.imwrite(output_path, rgba)
```

## IX. Composite Preview

> ⚠️ Layout parameters differ from original skill
> 🔒 All compositing runs **entirely locally** — no data leaves the machine.

### Layout Parameters

```python
layout = {
    "title":   {"scale": 0.95, "pos": "center-top", "y_pct": 0.07},
    "person":  {"scale": 0.70, "pos": "left", "x_pct": 0.15, "y_pct": 0.14},
    "promo":   {"scale": 0.40, "pos": "right", "x_pct": 0.55, "y_pct": 0.22},
    "product": {"zoom": 1.2,  "pos": "bottom-full", "above": "benefit"},
    "benefit": {"scale": 1.0,  "pos": "bottom-full"},
}
```

### Composite Code

```python
from PIL import Image

def compose_preview(bg_path, person_nobg, title_nobg, promo_nobg, product_nobg, benefit_path, output_path):
    bg = Image.open(bg_path).convert("RGBA")
    cw, ch = bg.size

    def fit(img, w_ratio, center=True):
        w = int(cw * w_ratio)
        s = w / img.width
        r = img.resize((w, int(img.height * s)), Image.LANCZOS)
        x = (cw - w) // 2 if center else cw - w
        return r, x

    def fit_full(img):
        s = cw / img.width
        return img.resize((cw, int(img.height * s)), Image.LANCZOS)

    def zoom_crop(img, zoom):
        w = int(cw * zoom)
        s = w / img.width
        h = int(img.height * s)
        r = img.resize((w, h), Image.LANCZOS)
        cx = (w - cw) // 2
        return r.crop((cx, 0, cx + cw, h))

    title = Image.open(title_nobg).convert("RGBA")
    person = Image.open(person_nobg).convert("RGBA")
    promo = Image.open(promo_nobg).convert("RGBA")
    product = Image.open(product_nobg).convert("RGBA")
    benefit = Image.open(benefit_path).convert("RGBA")

    tr, tx = fit(title, 0.95); ty = int(ch * 0.07)
    prr, prx = fit(promo, 0.40, center=False); prx = int(cw * 0.55); pry = int(ch * 0.22)
    per, perx = fit(person, 0.70); perx = int(cw * 0.15); pery = int(ch * 0.14)
    pdr = zoom_crop(product, 1.2); pdy = ch - fit_full(benefit).height - pdr.height
    bfr = fit_full(benefit); bfy = ch - bfr.height

    # Layer order: background → pricing card → host → product shelf → title banner → benefits bar
    # To place title behind host, move tr paste before per paste
    canvas = bg.copy()
    canvas.paste(prr, (prx, pry), prr)
    canvas.paste(per, (perx, pery), per)
    canvas.paste(pdr, (0, pdy), pdr)
    canvas.paste(tr, (tx, ty), tr)
    canvas.paste(bfr, (0, bfy), bfr)

    canvas.convert("RGB").save(output_path, "JPEG", quality=95)
```

### Post-processing: Host Brightness Boost

Boost the host layer brightness before compositing to prevent dark appearance:

```python
from PIL import ImageEnhance

# Boost host layer by 17% before compositing
person_bright = ImageEnhance.Brightness(person).enhance(1.17)
# Use person_bright instead of person in compositing
```

> ⚠️ Only boost the host layer (17%). Do NOT touch other layers. The delivered 人物.png should also use the boosted version.

## X. Delivery & Packaging

### Deliverables (Fixed 7 files)

| Filename | Format | Notes |
|----------|--------|-------|
| 背景.png | PNG 1440×2560 | Full-bleed |
| 标题横卡.png | PNG 1440×2560 transparent | Content at preview position |
| 人物.png | PNG 1440×2560 transparent | Brightness boosted (don't label "boosted") |
| 促销竖卡.png | PNG 1440×2560 transparent | Content at preview position |
| 桌面商品贴.png | PNG 1440×2560 transparent | Content at preview position |
| 权益下贴.png | PNG 1440×2560 transparent | Content at preview position |
| 预览.jpg | JPG 1440×2560 | Composite preview |

If a user product photo is provided, it will be composited into the center of the product shelf — not delivered separately.

### Delivery Methods (Auto-select based on channel)

**Method 1: Send in chat (when channel supports file sending)**
1. Send preview image (`预览.jpg`) to chat first
2. Send zip archive (named `{Brand}_livestream_overlays.zip`, containing all 7 files)

```bash
cd output/
zip -j "../{Brand}_livestream_overlays.zip" 背景.png 标题横卡.png 人物.png 促销竖卡.png 桌面商品贴.png 权益下贴.png 预览.jpg
```

**Method 2: Desktop folder (when channel doesn't support file sending)**
1. Create folder on user's desktop named `{Brand}_overlays`
2. Put only the 7 files inside — no intermediate files, no zip
3. Use `open` command to show the preview image
4. Use `open` command to open the folder

> ⚠️ Note: webchat (Control UI) does not support file sending — use Method 2. Feishu, WeChat etc. use Method 1.

## XI. Complete Workflow

```
1. Collect requirements (brand, promotion, optional: user product photo)
2. Analyze brand style → determine color palette
3. Design host appearance (youthful face + watery eyes + jelly lips + outfit + hairstyle + accessories)
4. Auto-generate missing copy
5. Write prompts for all 6 components (host uses v2 template, no hand-held products)
   - If user product photo: leave center blank in product shelf prompt
6. General components → doubao-seedream-4-5-251128, host → doubao-seedream-5-0-260128
7. Green screen removal on components 2/3/4/5
8. Boost host layer brightness by 17% (ImageEnhance.Brightness 1.17)
9. [Optional] Remove background from user product photo (white/light bg → HSV threshold)
10. Composite preview (use boosted host, user product overlaid at center of product area)
11. Package and deliver
```


path: SKILL_V2_CN_BASE.md
content: ---
name: 生成电商带货直播间全套贴片
description: >
  直播间装修贴片全自动生成。
  根据品牌、商品和活动信息，或直接根据商品图片，自动生成完整直播间视觉套装：
  背景图、标题横卡、人物、促销竖卡、桌面商品贴、权益下贴。
  支持绿幕抠图、自动合成预览、打包交付。
---

# 直播间装修贴片生成 Skill

## 一、前置条件

### 依赖
- Python 3 + Pillow + opencv-python-headless + numpy
- 火山方舟 API Key

### 安装依赖
```bash
pip3 install Pillow==12.2.0 opencv-python-headless==4.13.0 numpy==2.3.2
```

## 二、需求确认（正式生成前必须执行）

> ⚠️ 收到用户生成请求后，不要立即开始生成图片。先确认以下信息，确保一次性出图到位。

### 2.1 必须确认的信息

| 信息 | 说明 | 必填 |
|------|------|------|
| 品牌 | 如 戴森、茅台、三只松鼠等 | ✅ |
| 主推商品 | 具体品名和型号 | ✅ |
| 促销活动 | 满减、买赠、积分兑换等具体内容 | ✅ |
| 风格偏好 | 如有特殊要求（颜色、氛围、调性） | ❌ |

### 2.2 确认流程

1. **用户已提供完整信息** → 列出理解的需求摘要，请用户确认后直接开始
2. **用户信息不完整** → 只追问缺失的必要信息，其他自动推导
3. **用户只发了商品图片没文字** → 识别图中商品，推测品牌和品类，列出理解的需求摘要请用户确认
4. **用户说"按案例来"/"照着做"** → 直接用下方案例的需求生成

### 2.3 需求确认示例回复

```
我确认一下需求：

📋 **品牌**：戴森
📋 **主推商品**：戴森Supersonic HD16吹风机 + Airwrap多功能美发棒
📋 **促销活动**：满3000减300
📋 **买赠**：买吹风机送两支造型风嘴
📋 **包装**：直播间限定礼盒包装
📋 **风格**：科技奢华风（根据戴森品牌推导）

文案我这样设计：
- 主标题：「Dyson·沙龙级造型」
- 副标题：「限定礼盒·奢宠体验」
- 促销竖卡：「满3000立减300 / 买吹风机送造型风嘴 / 直播间限定礼盒」
- 权益：「两年质保无忧 / 顺丰包邮到家 / 专属礼盒包装」

确认OK的话我就开始生成了，有想调整的随时说 👇
```

### 2.4 需求描述案例（首次触发时主动展示）

> 收到用户的生成请求后，主动展示以下案例，让用户可以照着描述或直接要求按案例生成。

**示例需求描述**：
> 做一套戴森吹风机直播间贴片，主品是戴森Supersonic HD16吹风机和Airwrap多功能美发棒，买吹风机送两支造型风嘴，满3000减300，直播间限定礼盒包装

**首次回复模板**：
```
你可以直接告诉我你的品牌和促销信息，比如：

> 做一套戴森吹风机直播间贴片，主品是戴森Supersonic HD16吹风机和Airwrap多功能美发棒，买吹风机送两支造型风嘴，满3000减300，直播间限定礼盒包装

也可以直接说「按戴森案例来」，我就直接用这个需求生成。

你的需求是什么？
```

**最低限度只需提供**：品牌 + 主推商品 + 促销活动（三个核心信息）
**文案、风格色调、人物造型、权益**均由 AI 自动推导生成，用户可选择性修改。

## 三、文案自动生成规则

### 3.1 主标题
- 必须含品牌名并具有氛围感
- **禁用**"官方""旗舰"等字样
- 不能直接写商品名，要有宣传感和下单欲望

### 3.2 副标题
- 核心利益点（福利/功效/场景）或正在进行的活动
- 简洁有力

### 3.3 促销竖卡
- 根据促销活动拆分为 2-3 层
- 每层包含：金额/权益 + 使用条件

### 3.4 权益文案
- 通常 3 个：赠品相关 + 正品保障 + 物流/售后
- ⚠️ 避免使用"正品""保障"等触发审核的词，替换为"品质""保证"

## 四、组件清单与尺寸

> ⚠️ 尺寸已根据 `doubao-seedream-4-5-251128` 的最低像素限制调整

| # | 组件 | 尺寸 | 绿幕 | 说明 |
|---|------|------|------|------|
| 1 | 背景图 | **1440×2560** | ❌ | C4D 场景 |
| 2 | 标题横卡 | **3328×1109** | ✅ | 异形贴纸 |
| 3 | 人物 | **1440×2560** | ✅ | 素颜+幼态脸+精致造型（不用手持商品） |
| 4 | 促销竖卡 | **1920×1920** | ✅ | 正方形异形贴纸 |
| 5 | 桌面商品贴 | **3328×1109** | ✅ | 40+单品密集排列 |
| 6 | 权益下贴 | **3328×1109** | ❌ | 铺满底部 |

## 五、Prompt 写法标准

### 核心原则
- 所有组件使用统一风格前缀确保色调一致
- 必须包含反向约束条件
- 背景图使用"纯色均匀绿色背景"（不是#00FF00）

### 5.1 背景图 Prompt
**约束**：无文字、无人物、无产品。

**模板**：
```
这是一幅融合[风格描述]的C4D商业空间场景。空间以[主色调]为主色调，搭配[辅助色]作为辅助色，点缀以[点缀色]的细节元素，整体被[中性色]所平衡。空间结构呈现出[结构描述]，营造出[氛围]的氛围。灯光设计[灯光描述]，突显出空间的质感与层次。材质上运用了[材质]，展现出[风格]的魅力。布局上，模块化的抽象展示元素散落其中，如[元素1]、[元素2]和[元素3]，共同营造出一种[整体感受]的空间体验。
```

### 5.2 标题横卡 Prompt
**模板**：
```
纯色均匀绿色背景#00FF00。画面正中是一个[颜色]渐变的异形横条卡片，卡片有[边框质感]，四边是不规则的艺术形状。卡片内部左侧[文字区域底色]，大字「[主标题]」用[字体描述]，下方「[副标题]」用[字体描述]。卡片右侧是[产品插画描述]。整个卡片颜色浓郁厚重，绝对没有白色底色区域，不要任何绿色青色蓝绿色。卡片是一个完整的实体贴纸，边界清晰。
```

### 5.3 人物 Prompt

> ⚠️ 核心规则（v2 更新）：
> 1. **人物模型用 `doubao-seedream-5-0-260128`**（其他组件仍用 `doubao-seedream-4-5-251128`）
> 2. **完全不化妆的素颜**（不是"清透裸妆"）
> 3. **不手持商品**，双手自然下垂微曲（v2 取消了手持商品）
> 4. **网红幼态脸短中庭**，眼部轮廓深邃有水润感，唇部有果冻感水润饱满
> 5. **服装必须提前设计好**，prompt 中完整描述上衣+下装（不含鞋子）+ 配饰
> 6. **发色尽量黑色**，发质柔顺有光泽，发型精致可加配饰，符合品牌调性
> 7. 背景用"纯色均匀绿色"（不是#00FF00）

**模板**：
```
纯色均匀绿色背景，颜色绝对均匀纯净无渐变无纹理无阴影无光斑无杂色。竖版人像，人物站立面对镜头，取景从头顶到大腿中段，人物位于画面中央且占据画面大部分面积，头顶距画面顶部很近。25岁年轻漂亮女主播，完全不化妆的素颜，冷白皮白皙通透肌肤，网红幼态脸短中庭，{眼型描述}，眼部轮廓深邃有水润感，{眼周描述}，唇部{唇型描述}有果冻感水润{唇色描述}，{气质描述}。完全不化妆素颜出镜，面部没有任何妆容，没有任何眼影眼线睫毛膏腮红口红粉底，完全素净的面容。身穿{上衣描述}，下身穿{下装描述}，{配饰描述}。{发型发色描述}，{发型配饰描述}。正面柔和均匀灯光。人物自然站立，双手自然下垂微曲，姿态放松优雅。
```

**面孔差异化（必须每次指定以下维度）**：

| 维度 | 说明 | 示例 |
|------|------|------|
| 脸型 | 网红幼态脸短中庭（固定） | 心形脸/鹅蛋脸/瓜子脸/方圆脸 |
| 眼型 | 圆眼/丹凤眼/杏眼/桃花眼 | 需描述"微微下垂显无辜感"或"细长微微上挑"等 |
| 眼部水润感 | 固定要求 | "眼部轮廓深邃有水润感，眼周皮肤细腻透亮" |
| 唇部果冻感 | 固定要求 | "饱满嘟嘟唇有果冻感水润透亮" / "薄唇自然淡粉色有果冻感" |
| 气质 | 甜美亲和/清冷高级/知性优雅/元气活泼/自信从容 | 每个品牌不同 |
| 服装 | 必须提前设计，上衣+下装+配饰 | 不含鞋子 |
| 发型 | 必须提前设计，黑色为主+配饰 | 柔顺有光泽，精致有设计感 |

**人物造型设计示例（v2 版）**：

兰蔻菁纯：
```
网红幼态脸短中庭，眼型圆眼微微下垂显无辜感，眼部轮廓深邃有水润感，眼周皮肤细腻透亮，唇部饱满嘟嘟唇有果冻感水润透亮，五官精致甜美亲和。身穿白色细针织短款开衫，内搭米白色蕾丝吊带，下身穿高腰浅粉色百褶缎面半裙，胸前戴一条玫瑰金细锁骨链，左手腕戴一只玫瑰金细手镯，右手戴一枚简约珍珠戒指。黑色长直发柔顺有光泽披落至锁骨下方，头顶偏右侧夹一个珍珠小发夹，几缕碎发自然垂落在脸颊两侧修饰脸型。
```

赫莲娜黑绷带：
```
网红幼态脸短中庭，丹凤眼细长微微上挑，眼部轮廓深邃有水润感，眼尾自带清冷高级感，唇部薄唇自然淡粉色有果冻感水润，五官偏清冷高级感。身穿黑色高领修身真丝衬衫，袖口挽至手肘处露出纤细手腕，下身穿黑色高腰阔腿西装裤，左侧耳垂戴一颗两克拉钻石耳钉，右手腕戴一条极细银色手链。黑色长直发柔顺有光泽中分后自然垂落至背部中央，右侧太阳穴旁别一枚黑色极细发簪造型简约利落。
```

海蓝之谜：
```
网红幼态脸短中庭，杏眼明亮圆大，眼部轮廓深邃有水润感，眼神温柔灵动有灵气，唇部标准唇有果冻感自然粉润水润饱满，五官柔和清透。身穿珍珠白色丝缎面宽松衬衫，领口微微解开一颗扣子露出精致锁骨，袖口蓬松泡泡袖设计，下身穿香槟色高腰缎面阔腿长裤，颈间戴一条极细香槟金项链配一颗小珍珠吊坠，左手腕戴一只白玉细手镯。黑色长卷发柔顺有光泽自然大波浪卷披落至肩胛骨，头顶编一个松散的精致法式麻花辫从左侧垂落，发间点缀几颗极小的珍珠发扣。
```

### 5.4 促销竖卡 Prompt
> ⚠️ 尺寸从 896×1344 改为 **1920×1920**（正方形）

**模板**：
```
纯色均匀绿色背景#00FF00。画面正中是一个紧凑的竖向异形标签贴纸，整体为[深色系]实心底色，没有任何白色区域、没有任何浅色区域、没有任何渐变到白色的部分，不要任何绿色青色蓝绿色。贴纸形状为圆角矩形加顶部弧形装饰。顶部有[装饰元素]。大字「[大标题]」用[字体描述]；下方分三层：「[内容1]」「[内容2]」「[内容3]」。整个贴纸颜色浓郁深实，边界清晰锐利，是一个实心异形贴纸。贴纸占据画面约40%面积，紧凑不松散。
```

### 5.5 桌面商品贴 Prompt（⚠️ 与原始 skill 完全不同）

> ⚠️ 关键区别：
> 1. **白色哑光大理石展示桌面**（不是纯绿底+白平面）
> 2. **分层聚核+左右镜像+前后递进**布局逻辑
> 3. **商品总数至少40个以上单品**（不是"丰富一些"）
> 4. 中层核心区分左中右三块，中心区视觉焦点

**模板**：
```
背景为纯色均匀绿色背景。画面正下方是一张正面平放的白色高级展示桌面（白色哑光大理石质感），桌面完全水平不倾斜，桌面宽阔占满画面底部40%高度。桌面上产品按分层聚核加左右镜像加前后递进逻辑摆放，商品总数至少40个以上单品，密集排列覆盖绝大部分桌面面积：【中层核心展示区分左中右三块】中心区视觉焦点：放置{产品布局描述}【整体布局要求】所有产品竖立放置正面朝向观众。高度差控制形成阶梯状层次。左右区与中心区之间各留适当空白间距保证呼吸感。桌面产品密集饱满，商品总数至少40个以上单品。除了商品和白色哑光金属陈列架外不要出现任何其他内容，绝对不要出现人的手、手指、手臂、人体任何部位，不要出现人和手。光线均匀自然。这是一个纯静物产品陈列照片，没有任何人参与。
```

> ⚠️ prod_layout 里**不能出现"最前方留手持位"**——手持商品是人物图的事，桌面商品贴是纯产品陈列

### 5.7 用户商品图（可选）

当用户提供真实商品照片时：

**a) 去背景**：根据商品图的背景类型选择策略

| 商品背景 | 去背景方法 |
|---------|-----------|
| 白色/浅色纯色背景 | HSV 阈值去除白色区域 |
| 深色纯色背景 | HSV 阈值去除对应深色 |
| 复杂场景背景 | GrabCut 或 Rembg |

```python
import cv2
import numpy as np

def remove_white_bg(img_path, output_path):
    """去除白色/浅色背景"""
    img = cv2.imread(img_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask_w = cv2.inRange(hsv, np.array([0, 0, 200]), np.array([180, 30, 255]))
    mask_g = cv2.inRange(hsv, np.array([0, 0, 160]), np.array([180, 50, 240]))
    mask = cv2.bitwise_or(mask_w, mask_g)
    k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k, iterations=5)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, k, iterations=3)
    mask = cv2.GaussianBlur(mask, (5, 5), 0)
    mask = (mask > 200).astype(np.uint8) * 255
    b, g, r = cv2.split(img)
    cv2.imwrite(output_path, cv2.merge([b, g, r, 255 - mask]))
```

**b) 桌面商品贴 Prompt 调整**：中心区留白，供用户商品图叠加

```
在原有的桌面商品贴 prompt 中，将中心区描述改为：
"中心区域留出足够的空白空间用于放置主推商品（大约占中心30%面积保持干净），
周边按分层聚核加左右镜像加前后递进逻辑摆放配套产品"
```

**c) 合成时叠加**：用户商品图缩放后放在产品区域中心偏上

```python
# 用户商品图：缩放到画面宽度25%，放在产品区域中心
up_target_w = int(cw * 0.25)
ups = up_target_w / user_product.width
up_resized = user_product.resize((int(user_product.width * ups), int(user_product.height * ups)), Image.LANCZOS)
upx = (cw - up_resized.width) // 2
upy = pdy + int(pdr.height * 0.05)  # 略高于产品区域顶部

# 在 paste 顺序中，用户商品图在桌面商品贴之后、标题横卡之前
canvas.paste(pdr, (0, pdy), pdr)
canvas.paste(up_resized, (upx, upy), up_resized)  # ← 用户商品图
canvas.paste(tr, (tx, ty), tr)
```

**d) 新增交付物**：

| 文件名 | 说明 |
|--------|------|
| 用户商品图.png | 去背景后的用户商品图，已定位到画布坐标 |

### 5.6 权益下贴 Prompt
**模板**：
```
左右对称构图，平视视角。核心元素呈现在上半部分：三个简单权益图标，下方对应文字「[权益1] / [权益2] / [权益3]」。背景[背景描述]。风格：平面，光影简约。色彩：[主色]，简洁大方。
```

## 六、生图 API

| 项目 | 内容 |
|------|------|
| 地址 | `https://ark.cn-beijing.volces.com/api/v3/images/generations` |
| 方式 | POST |
| Content-Type | application/json |
| **通用模型** | **`doubao-seedream-4-5-251128`** |
| **人物模型** | **`doubao-seedream-5-0-260128`**（仅人物组件用此模型） |

### 请求参数
```json
{
  "model": "doubao-seedream-4-5-251128",
  "stream": false,
  "watermark": false,
  "sequential_image_generation": "disabled",
  "prompt": "<中文prompt>",
  "size": "<宽>x<高>"
}
```

### 请求示例
```bash
curl -s "https://ark.cn-beijing.volces.com/api/v3/images/generations" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API_KEY>" \
  -d '{
    "model": "doubao-seedream-4-5-251128",
    "stream": false,
    "watermark": false,
    "sequential_image_generation": "disabled",
    "prompt": "prompt内容",
    "size": "1440x2560"
  }'
```

## 七、绿幕抠图

对组件 2（标题横卡）、3（人物）、4（促销竖卡）、5（桌面商品贴）执行绿幕去除。

```python
import cv2
import numpy as np

def remove_green(img_path, output_path):
    img = cv2.imread(img_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask1 = cv2.inRange(hsv, np.array([35, 80, 80]), np.array([85, 255, 255]))
    mask2 = cv2.inRange(hsv, np.array([30, 40, 120]), np.array([90, 255, 255]))
    mask = cv2.bitwise_or(mask1, mask2)
    k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k, iterations=3)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, k, iterations=2)
    mask = cv2.GaussianBlur(mask, (3, 3), 0)
    mask = (mask > 127).astype(np.uint8) * 255
    b, g, r = cv2.split(img)
    rgba = cv2.merge([b, g, r, 255 - mask])
    cv2.imwrite(output_path, rgba)
```

## 八、合成预览

> ⚠️ 布局参数与原始 skill 完全不同

### 布局参数

```python
layout = {
    "title":   {"scale": 0.95, "pos": "center-top", "y_pct": 0.07},
    "person":  {"scale": 0.70, "pos": "left", "x_pct": 0.15, "y_pct": 0.14},
    "promo":   {"scale": 0.40, "pos": "right", "x_pct": 0.55, "y_pct": 0.22},
    "product": {"zoom": 1.2,  "pos": "bottom-full", "above": "benefit"},
    "benefit": {"scale": 1.0,  "pos": "bottom-full"},
}
```

### 合成代码

```python
from PIL import Image

def compose_preview(bg_path, person_nobg, title_nobg, promo_nobg, product_nobg, benefit_path, output_path):
    bg = Image.open(bg_path).convert("RGBA")
    cw, ch = bg.size

    def fit(img, w_ratio, center=True):
        w = int(cw * w_ratio)
        s = w / img.width
        r = img.resize((w, int(img.height * s)), Image.LANCZOS)
        x = (cw - w) // 2 if center else cw - w
        return r, x

    def fit_full(img):
        s = cw / img.width
        return img.resize((cw, int(img.height * s)), Image.LANCZOS)

    def zoom_crop(img, zoom):
        w = int(cw * zoom)
        s = w / img.width
        h = int(img.height * s)
        r = img.resize((w, h), Image.LANCZOS)
        cx = (w - cw) // 2
        return r.crop((cx, 0, cx + cw, h))

    title = Image.open(title_nobg).convert("RGBA")
    person = Image.open(person_nobg).convert("RGBA")
    promo = Image.open(promo_nobg).convert("RGBA")
    product = Image.open(product_nobg).convert("RGBA")
    benefit = Image.open(benefit_path).convert("RGBA")

    tr, tx = fit(title, 0.95); ty = int(ch * 0.07)
    prr, prx = fit(promo, 0.40, center=False); prx = int(cw * 0.55); pry = int(ch * 0.22)
    per, perx = fit(person, 0.70); perx = int(cw * 0.15); pery = int(ch * 0.14)
    pdr = zoom_crop(product, 1.2); pdy = ch - fit_full(benefit).height - pdr.height
    bfr = fit_full(benefit); bfy = ch - bfr.height

    # 图层顺序：背景 → 促销竖卡 → 人物 → 桌面商品贴 → 标题横卡 → 权益下贴
    # 若需标题在人物下层，将 tr 的 paste 调到 per 之前即可
    # 示例（标题在人物下方）：canvas.paste(prr,...); canvas.paste(tr,...); canvas.paste(per,...)
    canvas = bg.copy()
    canvas.paste(prr, (prx, pry), prr)
    canvas.paste(per, (perx, pery), per)
    canvas.paste(pdr, (0, pdy), pdr)
    canvas.paste(tr, (tx, ty), tr)
    canvas.paste(bfr, (0, bfy), bfr)

    canvas.convert("RGB").save(output_path, "JPEG", quality=95)
```

### 后处理：人物提亮

合成前对人物图层单独提亮，避免合成后人物偏暗：

```python
from PIL import ImageEnhance

# 在合成前对人物图层提亮17%
person_bright = ImageEnhance.Brightness(person).enhance(1.17)
# 后续合成使用 person_bright 代替 person
```

> ⚠️ 只提亮人物图层（17%），不动其他图层。最终交付的人物.png 也使用提亮后的版本。

## 九、打包交付

### 交付文件（固定7个）

| 文件名 | 格式 | 说明 |
|--------|------|------|
| 背景.png | PNG 1440×2560 | 全铺 |
| 标题横卡.png | PNG 1440×2560 透明 | 内容在预览位置 |
| 人物.png | PNG 1440×2560 透明 | 已提亮处理（不标注"提亮"） |
| 促销竖卡.png | PNG 1440×2560 透明 | 内容在预览位置 |
| 桌面商品贴.png | PNG 1440×2560 透明 | 内容在预览位置 |
| 权益下贴.png | PNG 1440×2560 透明 | 内容在预览位置 |
| 预览.jpg | JPG 1440×2560 | 合成预览效果 |

若提供了用户商品图，该商品图会合成到桌面商品贴的中心区域，不单独输出。

### 交付方式（二选一，自动判断）

**方式一：对话内直接发送（当通道支持文件发送时）**
1. 先发送预览图（`预览.jpg`）到对话
2. 再发送压缩包（命名为「{品牌名}直播间_全套贴图.zip」，内含上述7个文件）

```bash
cd output/
zip -j "../{品牌名}直播间_全套贴图.zip" 背景.png 标题横卡.png 人物.png 促销竖卡.png 桌面商品贴.png 权益下贴.png 预览.jpg
```

**方式二：桌面文件夹（当通道不支持文件发送时）**
1. 在用户桌面创建文件夹，命名为「{品牌名}直播间贴片」
2. 文件夹内只放上述7个文件，不包含中间文件、不包含压缩包
3. 用 `open` 命令直接打开预览图，让用户看到效果
4. 用 `open` 命令直接打开文件夹，让用户浏览文件

> ⚠️ 注意：webchat（Control UI）当前不支持文件发送，走方式二。飞书、微信等走方式一。

## 十、完整工作流

```
1. 收集需求（品牌、促销活动、可选：用户商品图）
2. 分析品牌风格 → 确定色调
3. 为人物设计造型（幼态脸+水润眼+果冻唇+服装+发型发色+配饰）
4. 自动生成缺失文案
5. 编写 6 个组件的 prompt（人物用 v2 模板，不用手持商品）
   - 若有用户商品图：桌面商品贴 prompt 中心区留白
6. 通用组件调用 doubao-seedream-4-5-251128，人物组件调用 doubao-seedream-5-0-260128
7. 对组件 2/3/4/5 执行绿幕抠图
8. 对人物图层提亮17%（ImageEnhance.Brightness 1.17）
9. [可选] 对用户商品图执行去背景（白底/浅色背景用HSV阈值）
10. 合成预览图（使用提亮后的人物图层，用户商品图叠加在桌面产品区中央）
11. 打包交付
```




path: SKILL_V2_CN_MODIFIED.md
content: ---
name: ecommerce-livestream-overlay-generator
description: >
  电商直播贴片生成器 / 电商直播视觉包装工具。
  适用于淘宝直播、抖音直播带货、拼多多直播、快手直播等电商直播场景。
  输入品牌、产品、促销信息或产品照片，自动生成完整电商直播视觉包装：
  背景、标题栏、主播形象、价格卡、产品货架、福利条、促销贴片。
  支持绿幕抠图、自动合成预览、打包交付。
  E-commerce livestream overlay generator for Taobao, Douyin, PDD, Kuaishou streaming.
  Generate background, title banner, host persona, pricing card, product shelf, benefits bar.
  Supports green screen removal, auto-composite preview, and packaged delivery.
homepage: https://github.com/gaoyuji12138/e-commerce-livestream-overlay-skill
user-invocable: true
metadata: '{"openclaw":{"emoji":"🎨","primaryEnv":"VOLCENGINE_ARK_API_KEY","requires":{"env":["VOLCENGINE_ARK_API_KEY"],"bins":["python3","pip3"]}}}'
---

# 直播间装修贴片生成 Skill

## 一、前置条件

### 依赖
- Python 3 + Pillow + opencv-python-headless + numpy
- 火山方舟 API Key

### API Key 获取

1. 前往 [火山引擎控制台](https://console.volcengine.com/ark) 注册并登录
2. 在「模型推理」页面开通豆包视觉模型
3. 在控制台凭证页面创建 API Key

> **每个用户需要自己的 API Key**：使用时从环境变量 `VOLCENGINE_ARK_API_KEY` 读取。

### 安装依赖
```bash
pip3 install Pillow==12.2.0 opencv-python-headless==4.13.0 numpy==2.3.2
```

## 二、数据隐私与透明度

### 数据流向

| 数据类型 | 发送目标 | 用途 | 是否持久化 |
|----------|----------|------|-----------|
| 文本 Prompt（品牌/促销文案等） | 火山引擎 API | 图像生成请求 | ❌ 仅传输，不存储 |
| 用户产品照片 | 火山引擎 API | 作为图像生成参考输入 | ❌ 仅传输，不存储 |
| 生成的图片 | 本地磁盘 | 交付给用户 | ✅ 保存到本地输出目录 |

> **AI 内置视觉能力**：当用户仅提供产品照片未附文字说明时，由 AI Agent 内置视觉能力识别图中商品信息（本地运行），无需额外 API 调用。

**本 Skill 不会做的事：**
- ❌ 在本地或远程存储、记录或缓存用户输入数据（文本 Prompt、产品照片）
- ❌ 将数据转发到火山引擎以外的任何第三方
- ❌ 进行任何购买、支付或金融操作
- ❌ 进行任何加密货币或区块链操作

> ⚠️ 用户产品照片和文本 Prompt 会发送至火山引擎 API。上传敏感或专有产品图片前，请阅读[火山引擎隐私政策](https://www.volcengine.com/docs/6369/71845)。API 返回的生成图片会保存到本地输出目录。

## 三、需求确认（正式生成前必须执行）

> ⚠️ 收到用户生成请求后，不要立即开始生成图片。先确认以下信息，确保一次性出图到位。

### 2.1 必须确认的信息

| 信息 | 说明 | 必填 |
|------|------|------|
| 品牌 | 如 戴森、茅台、三只松鼠等 | ✅ |
| 主推商品 | 具体品名和型号 | ✅ |
| 促销活动 | 满减、买赠、积分兑换等具体内容 | ✅ |
| 风格偏好 | 如有特殊要求（颜色、氛围、调性） | ❌ |

### 2.2 确认流程

1. **用户已提供完整信息** → 列出理解的需求摘要，请用户确认后直接开始
2. **用户信息不完整** → 只追问缺失的必要信息，其他自动推导
3. **用户只发了商品图片没文字** → 识别图中商品，推测品牌和品类，列出理解的需求摘要请用户确认
4. **用户说"按案例来"/"照着做"** → 直接用下方案例的需求生成

### 2.3 需求确认示例回复

```
我确认一下需求：

📋 **品牌**：戴森
📋 **主推商品**：戴森Supersonic HD16吹风机 + Airwrap多功能美发棒
📋 **促销活动**：满3000减300
📋 **买赠**：买吹风机送两支造型风嘴
📋 **包装**：直播间限定礼盒包装
📋 **风格**：科技奢华风（根据戴森品牌推导）

文案我这样设计：
- 主标题：「Dyson·沙龙级造型」
- 副标题：「限定礼盒·奢宠体验」
- 促销竖卡：「满3000立减300 / 买吹风机送造型风嘴 / 直播间限定礼盒」
- 权益：「两年质保无忧 / 顺丰包邮到家 / 专属礼盒包装」

确认OK的话我就开始生成了，有想调整的随时说 👇
```

### 2.4 需求描述案例（首次触发时主动展示）

> 收到用户的生成请求后，主动展示以下案例，让用户可以照着描述或直接要求按案例生成。

**示例需求描述**：
> 做一套戴森吹风机直播间贴片，主品是戴森Supersonic HD16吹风机和Airwrap多功能美发棒，买吹风机送两支造型风嘴，满3000减300，直播间限定礼盒包装

**首次回复模板**：
```
你可以直接告诉我你的品牌和促销信息，比如：

> 做一套戴森吹风机直播间贴片，主品是戴森Supersonic HD16吹风机和Airwrap多功能美发棒，买吹风机送两支造型风嘴，满3000减300，直播间限定礼盒包装

也可以直接说「按戴森案例来」，我就直接用这个需求生成。

你的需求是什么？
```

**最低限度只需提供**：品牌 + 主推商品 + 促销活动（三个核心信息）
**文案、风格色调、人物造型、权益**均由 AI 自动推导生成，用户可选择性修改。

## 四、文案自动生成规则

### 3.1 主标题
- 必须含品牌名并具有氛围感
- **禁用**"官方""旗舰"等字样
- 不能直接写商品名，要有宣传感和下单欲望

### 3.2 副标题
- 核心利益点（福利/功效/场景）或正在进行的活动
- 简洁有力

### 3.3 促销竖卡
- 根据促销活动拆分为 2-3 层
- 每层包含：金额/权益 + 使用条件

### 3.4 权益文案
- 通常 3 个：赠品相关 + 正品保障 + 物流/售后
- ⚠️ 避免使用"正品""保障"等触发审核的词，替换为"品质""保证"

## 五、组件清单与尺寸

> ⚠️ 尺寸已根据 `doubao-seedream-4-5-251128` 的最低像素限制调整

| # | 组件 | 尺寸 | 绿幕 | 说明 |
|---|------|------|------|------|
| 1 | 背景图 | **1440×2560** | ❌ | C4D 场景 |
| 2 | 标题横卡 | **3328×1109** | ✅ | 异形贴纸 |
| 3 | 人物 | **1440×2560** | ✅ | 素颜+幼态脸+精致造型（不用手持商品） |
| 4 | 促销竖卡 | **1920×1920** | ✅ | 正方形异形贴纸 |
| 5 | 桌面商品贴 | **3328×1109** | ✅ | 40+单品密集排列 |
| 6 | 权益下贴 | **3328×1109** | ❌ | 铺满底部 |

## 六、Prompt 写法标准

### 核心原则
- 所有组件使用统一风格前缀确保色调一致
- 必须包含反向约束条件
- 背景图使用"纯色均匀绿色背景"（不是#00FF00）

### 5.1 背景图 Prompt
**约束**：无文字、无人物、无产品。

**模板**：
```
这是一幅融合[风格描述]的C4D商业空间场景。空间以[主色调]为主色调，搭配[辅助色]作为辅助色，点缀以[点缀色]的细节元素，整体被[中性色]所平衡。空间结构呈现出[结构描述]，营造出[氛围]的氛围。灯光设计[灯光描述]，突显出空间的质感与层次。材质上运用了[材质]，展现出[风格]的魅力。布局上，模块化的抽象展示元素散落其中，如[元素1]、[元素2]和[元素3]，共同营造出一种[整体感受]的空间体验。
```

### 5.2 标题横卡 Prompt
**模板**：
```
纯色均匀绿色背景#00FF00。画面正中是一个[颜色]渐变的异形横条卡片，卡片有[边框质感]，四边是不规则的艺术形状。卡片内部左侧[文字区域底色]，大字「[主标题]」用[字体描述]，下方「[副标题]」用[字体描述]。卡片右侧是[产品插画描述]。整个卡片颜色浓郁厚重，绝对没有白色底色区域，不要任何绿色青色蓝绿色。卡片是一个完整的实体贴纸，边界清晰。
```

### 5.3 人物 Prompt

> ⚠️ 核心规则（v2 更新）：
> 1. **人物模型用 `doubao-seedream-5-0-260128`**（其他组件仍用 `doubao-seedream-4-5-251128`）
> 2. **完全不化妆的素颜**（不是"清透裸妆"）
> 3. **不手持商品**，双手自然下垂微曲（v2 取消了手持商品）
> 4. **网红幼态脸短中庭**，眼部轮廓深邃有水润感，唇部有果冻感水润饱满
> 5. **服装必须提前设计好**，prompt 中完整描述上衣+下装（不含鞋子）+ 配饰
> 6. **发色尽量黑色**，发质柔顺有光泽，发型精致可加配饰，符合品牌调性
> 7. 背景用"纯色均匀绿色"（不是#00FF00）

**模板**：
```
纯色均匀绿色背景，颜色绝对均匀纯净无渐变无纹理无阴影无光斑无杂色。竖版人像，人物站立面对镜头，取景从头顶到大腿中段，人物位于画面中央且占据画面大部分面积，头顶距画面顶部很近。25岁年轻漂亮女主播，完全不化妆的素颜，冷白皮白皙通透肌肤，网红幼态脸短中庭，{眼型描述}，眼部轮廓深邃有水润感，{眼周描述}，唇部{唇型描述}有果冻感水润{唇色描述}，{气质描述}。完全不化妆素颜出镜，面部没有任何妆容，没有任何眼影眼线睫毛膏腮红口红粉底，完全素净的面容。身穿{上衣描述}，下身穿{下装描述}，{配饰描述}。{发型发色描述}，{发型配饰描述}。正面柔和均匀灯光。人物自然站立，双手自然下垂微曲，姿态放松优雅。
```

**面孔差异化（必须每次指定以下维度）**：

| 维度 | 说明 | 示例 |
|------|------|------|
| 脸型 | 网红幼态脸短中庭（固定） | 心形脸/鹅蛋脸/瓜子脸/方圆脸 |
| 眼型 | 圆眼/丹凤眼/杏眼/桃花眼 | 需描述"微微下垂显无辜感"或"细长微微上挑"等 |
| 眼部水润感 | 固定要求 | "眼部轮廓深邃有水润感，眼周皮肤细腻透亮" |
| 唇部果冻感 | 固定要求 | "饱满嘟嘟唇有果冻感水润透亮" / "薄唇自然淡粉色有果冻感" |
| 气质 | 甜美亲和/清冷高级/知性优雅/元气活泼/自信从容 | 每个品牌不同 |
| 服装 | 必须提前设计，上衣+下装+配饰 | 不含鞋子 |
| 发型 | 必须提前设计，黑色为主+配饰 | 柔顺有光泽，精致有设计感 |

**人物造型设计示例（v2 版）**：

兰蔻菁纯：
```
网红幼态脸短中庭，眼型圆眼微微下垂显无辜感，眼部轮廓深邃有水润感，眼周皮肤细腻透亮，唇部饱满嘟嘟唇有果冻感水润透亮，五官精致甜美亲和。身穿白色细针织短款开衫，内搭米白色蕾丝吊带，下身穿高腰浅粉色百褶缎面半裙，胸前戴一条玫瑰金细锁骨链，左手腕戴一只玫瑰金细手镯，右手戴一枚简约珍珠戒指。黑色长直发柔顺有光泽披落至锁骨下方，头顶偏右侧夹一个珍珠小发夹，几缕碎发自然垂落在脸颊两侧修饰脸型。
```

赫莲娜黑绷带：
```
网红幼态脸短中庭，丹凤眼细长微微上挑，眼部轮廓深邃有水润感，眼尾自带清冷高级感，唇部薄唇自然淡粉色有果冻感水润，五官偏清冷高级感。身穿黑色高领修身真丝衬衫，袖口挽至手肘处露出纤细手腕，下身穿黑色高腰阔腿西装裤，左侧耳垂戴一颗两克拉钻石耳钉，右手腕戴一条极细银色手链。黑色长直发柔顺有光泽中分后自然垂落至背部中央，右侧太阳穴旁别一枚黑色极细发簪造型简约利落。
```

海蓝之谜：
```
网红幼态脸短中庭，杏眼明亮圆大，眼部轮廓深邃有水润感，眼神温柔灵动有灵气，唇部标准唇有果冻感自然粉润水润饱满，五官柔和清透。身穿珍珠白色丝缎面宽松衬衫，领口微微解开一颗扣子露出精致锁骨，袖口蓬松泡泡袖设计，下身穿香槟色高腰缎面阔腿长裤，颈间戴一条极细香槟金项链配一颗小珍珠吊坠，左手腕戴一只白玉细手镯。黑色长卷发柔顺有光泽自然大波浪卷披落至肩胛骨，头顶编一个松散的精致法式麻花辫从左侧垂落，发间点缀几颗极小的珍珠发扣。
```

### 5.4 促销竖卡 Prompt
> ⚠️ 尺寸从 896×1344 改为 **1920×1920**（正方形）

**模板**：
```
纯色均匀绿色背景#00FF00。画面正中是一个紧凑的竖向异形标签贴纸，整体为[深色系]实心底色，没有任何白色区域、没有任何浅色区域、没有任何渐变到白色的部分，不要任何绿色青色蓝绿色。贴纸形状为圆角矩形加顶部弧形装饰。顶部有[装饰元素]。大字「[大标题]」用[字体描述]；下方分三层：「[内容1]」「[内容2]」「[内容3]」。整个贴纸颜色浓郁深实，边界清晰锐利，是一个实心异形贴纸。贴纸占据画面约40%面积，紧凑不松散。
```

### 5.5 桌面商品贴 Prompt（⚠️ 与原始 skill 完全不同）

> ⚠️ 关键区别：
> 1. **白色哑光大理石展示桌面**（不是纯绿底+白平面）
> 2. **分层聚核+左右镜像+前后递进**布局逻辑
> 3. **商品总数至少40个以上单品**（不是"丰富一些"）
> 4. 中层核心区分左中右三块，中心区视觉焦点

**模板**：
```
背景为纯色均匀绿色背景。画面正下方是一张正面平放的白色高级展示桌面（白色哑光大理石质感），桌面完全水平不倾斜，桌面宽阔占满画面底部40%高度。桌面上产品按分层聚核加左右镜像加前后递进逻辑摆放，商品总数至少40个以上单品，密集排列覆盖绝大部分桌面面积：【中层核心展示区分左中右三块】中心区视觉焦点：放置{产品布局描述}【整体布局要求】所有产品竖立放置正面朝向观众。高度差控制形成阶梯状层次。左右区与中心区之间各留适当空白间距保证呼吸感。桌面产品密集饱满，商品总数至少40个以上单品。除了商品和白色哑光金属陈列架外不要出现任何其他内容，绝对不要出现人的手、手指、手臂、人体任何部位，不要出现人和手。光线均匀自然。这是一个纯静物产品陈列照片，没有任何人参与。
```

> ⚠️ prod_layout 里**不能出现"最前方留手持位"**——手持商品是人物图的事，桌面商品贴是纯产品陈列

### 5.7 用户商品图（可选）

当用户提供真实商品照片时：

**a) 去背景**：根据商品图的背景类型选择策略

| 商品背景 | 去背景方法 |
|---------|-----------|
| 白色/浅色纯色背景 | HSV 阈值去除白色区域 |
| 深色纯色背景 | HSV 阈值去除对应深色 |
| 复杂场景背景 | GrabCut 或 Rembg |

```python
import cv2
import numpy as np

def remove_white_bg(img_path, output_path):
    """去除白色/浅色背景"""
    img = cv2.imread(img_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask_w = cv2.inRange(hsv, np.array([0, 0, 200]), np.array([180, 30, 255]))
    mask_g = cv2.inRange(hsv, np.array([0, 0, 160]), np.array([180, 50, 240]))
    mask = cv2.bitwise_or(mask_w, mask_g)
    k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k, iterations=5)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, k, iterations=3)
    mask = cv2.GaussianBlur(mask, (5, 5), 0)
    mask = (mask > 200).astype(np.uint8) * 255
    b, g, r = cv2.split(img)
    cv2.imwrite(output_path, cv2.merge([b, g, r, 255 - mask]))
```

**b) 桌面商品贴 Prompt 调整**：中心区留白，供用户商品图叠加

```
在原有的桌面商品贴 prompt 中，将中心区描述改为：
"中心区域留出足够的空白空间用于放置主推商品（大约占中心30%面积保持干净），
周边按分层聚核加左右镜像加前后递进逻辑摆放配套产品"
```

**c) 合成时叠加**：用户商品图缩放后放在产品区域中心偏上

```python
# 用户商品图：缩放到画面宽度25%，放在产品区域中心
up_target_w = int(cw * 0.25)
ups = up_target_w / user_product.width
up_resized = user_product.resize((int(user_product.width * ups), int(user_product.height * ups)), Image.LANCZOS)
upx = (cw - up_resized.width) // 2
upy = pdy + int(pdr.height * 0.05)  # 略高于产品区域顶部

# 在 paste 顺序中，用户商品图在桌面商品贴之后、标题横卡之前
canvas.paste(pdr, (0, pdy), pdr)
canvas.paste(up_resized, (upx, upy), up_resized)  # ← 用户商品图
canvas.paste(tr, (tx, ty), tr)
```

**d) 新增交付物**：

| 文件名 | 说明 |
|--------|------|
| 用户商品图.png | 去背景后的用户商品图，已定位到画布坐标 |

### 5.6 权益下贴 Prompt
**模板**：
```
左右对称构图，平视视角。核心元素呈现在上半部分：三个简单权益图标，下方对应文字「[权益1] / [权益2] / [权益3]」。背景[背景描述]。风格：平面，光影简约。色彩：[主色]，简洁大方。
```

## 七、生图 API

| 项目 | 内容 |
|------|------|
| 地址 | `https://ark.cn-beijing.volces.com/api/v3/images/generations` |
| 方式 | POST |
| Content-Type | application/json |
| **通用模型** | **`doubao-seedream-4-5-251128`** |
| **人物模型** | **`doubao-seedream-5-0-260128`**（仅人物组件用此模型） |

### 请求参数
```json
{
  "model": "doubao-seedream-4-5-251128",
  "stream": false,
  "watermark": false,
  "sequential_image_generation": "disabled",
  "prompt": "<中文prompt>",
  "size": "<宽>x<高>"
}
```

### 请求示例
```bash
curl -s "https://ark.cn-beijing.volces.com/api/v3/images/generations" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <API_KEY>" \
  -d '{
    "model": "doubao-seedream-4-5-251128",
    "stream": false,
    "watermark": false,
    "sequential_image_generation": "disabled",
    "prompt": "prompt内容",
    "size": "1440x2560"
  }'
```

## 八、绿幕抠图

对组件 2（标题横卡）、3（人物）、4（促销竖卡）、5（桌面商品贴）执行绿幕去除。

```python
import cv2
import numpy as np

def remove_green(img_path, output_path):
    img = cv2.imread(img_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    mask1 = cv2.inRange(hsv, np.array([35, 80, 80]), np.array([85, 255, 255]))
    mask2 = cv2.inRange(hsv, np.array([30, 40, 120]), np.array([90, 255, 255]))
    mask = cv2.bitwise_or(mask1, mask2)
    k = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k, iterations=3)
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, k, iterations=2)
    mask = cv2.GaussianBlur(mask, (3, 3), 0)
    mask = (mask > 127).astype(np.uint8) * 255
    b, g, r = cv2.split(img)
    rgba = cv2.merge([b, g, r, 255 - mask])
    cv2.imwrite(output_path, rgba)
```

## 九、合成预览

> ⚠️ 布局参数与原始 skill 完全不同

### 布局参数

```python
layout = {
    "title":   {"scale": 0.95, "pos": "center-top", "y_pct": 0.07},
    "person":  {"scale": 0.70, "pos": "left", "x_pct": 0.15, "y_pct": 0.14},
    "promo":   {"scale": 0.40, "pos": "right", "x_pct": 0.55, "y_pct": 0.22},
    "product": {"zoom": 1.2,  "pos": "bottom-full", "above": "benefit"},
    "benefit": {"scale": 1.0,  "pos": "bottom-full"},
}
```

### 合成代码

```python
from PIL import Image

def compose_preview(bg_path, person_nobg, title_nobg, promo_nobg, product_nobg, benefit_path, output_path):
    bg = Image.open(bg_path).convert("RGBA")
    cw, ch = bg.size

    def fit(img, w_ratio, center=True):
        w = int(cw * w_ratio)
        s = w / img.width
        r = img.resize((w, int(img.height * s)), Image.LANCZOS)
        x = (cw - w) // 2 if center else cw - w
        return r, x

    def fit_full(img):
        s = cw / img.width
        return img.resize((cw, int(img.height * s)), Image.LANCZOS)

    def zoom_crop(img, zoom):
        w = int(cw * zoom)
        s = w / img.width
        h = int(img.height * s)
        r = img.resize((w, h), Image.LANCZOS)
        cx = (w - cw) // 2
        return r.crop((cx, 0, cx + cw, h))

    title = Image.open(title_nobg).convert("RGBA")
    person = Image.open(person_nobg).convert("RGBA")
    promo = Image.open(promo_nobg).convert("RGBA")
    product = Image.open(product_nobg).convert("RGBA")
    benefit = Image.open(benefit_path).convert("RGBA")

    tr, tx = fit(title, 0.95); ty = int(ch * 0.07)
    prr, prx = fit(promo, 0.40, center=False); prx = int(cw * 0.55); pry = int(ch * 0.22)
    per, perx = fit(person, 0.70); perx = int(cw * 0.15); pery = int(ch * 0.14)
    pdr = zoom_crop(product, 1.2); pdy = ch - fit_full(benefit).height - pdr.height
    bfr = fit_full(benefit); bfy = ch - bfr.height

    # 图层顺序：背景 → 促销竖卡 → 人物 → 桌面商品贴 → 标题横卡 → 权益下贴
    # 若需标题在人物下层，将 tr 的 paste 调到 per 之前即可
    # 示例（标题在人物下方）：canvas.paste(prr,...); canvas.paste(tr,...); canvas.paste(per,...)
    canvas = bg.copy()
    canvas.paste(prr, (prx, pry), prr)
    canvas.paste(per, (perx, pery), per)
    canvas.paste(pdr, (0, pdy), pdr)
    canvas.paste(tr, (tx, ty), tr)
    canvas.paste(bfr, (0, bfy), bfr)

    canvas.convert("RGB").save(output_path, "JPEG", quality=95)
```

### 后处理：人物提亮

合成前对人物图层单独提亮，避免合成后人物偏暗：

```python
from PIL import ImageEnhance

# 在合成前对人物图层提亮17%
person_bright = ImageEnhance.Brightness(person).enhance(1.17)
# 后续合成使用 person_bright 代替 person
```

> ⚠️ 只提亮人物图层（17%），不动其他图层。最终交付的人物.png 也使用提亮后的版本。

## 十、打包交付

### 交付文件（固定7个）

| 文件名 | 格式 | 说明 |
|--------|------|------|
| 背景.png | PNG 1440×2560 | 全铺 |
| 标题横卡.png | PNG 1440×2560 透明 | 内容在预览位置 |
| 人物.png | PNG 1440×2560 透明 | 已提亮处理（不标注"提亮"） |
| 促销竖卡.png | PNG 1440×2560 透明 | 内容在预览位置 |
| 桌面商品贴.png | PNG 1440×2560 透明 | 内容在预览位置 |
| 权益下贴.png | PNG 1440×2560 透明 | 内容在预览位置 |
| 预览.jpg | JPG 1440×2560 | 合成预览效果 |

若提供了用户商品图，该商品图会合成到桌面商品贴的中心区域，不单独输出。

### 交付方式（二选一，自动判断）

**方式一：对话内直接发送（当通道支持文件发送时）**
1. 先发送预览图（`预览.jpg`）到对话
2. 再发送压缩包（命名为「{品牌名}直播间_全套贴图.zip」，内含上述7个文件）

```bash
cd output/
zip -j "../{品牌名}直播间_全套贴图.zip" 背景.png 标题横卡.png 人物.png 促销竖卡.png 桌面商品贴.png 权益下贴.png 预览.jpg
```

**方式二：桌面文件夹（当通道不支持文件发送时）**
1. 在用户桌面创建文件夹，命名为「{品牌名}直播间贴片」
2. 文件夹内只放上述7个文件，不包含中间文件、不包含压缩包
3. 用 `open` 命令直接打开预览图，让用户看到效果
4. 用 `open` 命令直接打开文件夹，让用户浏览文件

> ⚠️ 注意：webchat（Control UI）当前不支持文件发送，走方式二。飞书、微信等走方式一。

## 十、完整工作流

```
1. 收集需求（品牌、促销活动、可选：用户商品图）
2. 分析品牌风格 → 确定色调
3. 为人物设计造型（幼态脸+水润眼+果冻唇+服装+发型发色+配饰）
4. 自动生成缺失文案
5. 编写 6 个组件的 prompt（人物用 v2 模板，不用手持商品）
   - 若有用户商品图：桌面商品贴 prompt 中心区留白
6. 通用组件调用 doubao-seedream-4-5-251128，人物组件调用 doubao-seedream-5-0-260128
7. 对组件 2/3/4/5 执行绿幕抠图
8. 对人物图层提亮17%（ImageEnhance.Brightness 1.17）
9. [可选] 对用户商品图执行去背景（白底/浅色背景用HSV阈值）
10. 合成预览图（使用提亮后的人物图层，用户商品图叠加在桌面产品区中央）
11. 打包交付
```




path: diff_cn.txt
content: 2c2
< name: 生成电商带货直播间全套贴片
---
> name: ecommerce-livestream-overlay-generator
4,6c4,7
<   直播间装修贴片全自动生成。
<   根据品牌、商品和活动信息，或直接根据商品图片，自动生成完整直播间视觉套装：
<   背景图、标题横卡、人物、促销竖卡、桌面商品贴、权益下贴。
---
>   电商直播贴片生成器 / 电商直播视觉包装工具。
>   适用于淘宝直播、抖音直播带货、拼多多直播、快手直播等电商直播场景。
>   输入品牌、产品、促销信息或产品照片，自动生成完整电商直播视觉包装：
>   背景、标题栏、主播形象、价格卡、产品货架、福利条、促销贴片。
7a9,14
>   E-commerce livestream overlay generator for Taobao, Douyin, PDD, Kuaishou streaming.
>   Generate background, title banner, host persona, pricing card, product shelf, benefits bar.
>   Supports green screen removal, auto-composite preview, and packaged delivery.
> homepage: https://github.com/gaoyuji12138/e-commerce-livestream-overlay-skill
> user-invocable: true
> metadata: '{"openclaw":{"emoji":"🎨","primaryEnv":"VOLCENGINE_ARK_API_KEY","requires":{"env":["VOLCENGINE_ARK_API_KEY"],"bins":["python3","pip3"]}}}'
17a25,32
> ### API Key 获取
> 
> 1. 前往 [火山引擎控制台](https://console.volcengine.com/ark) 注册并登录
> 2. 在「模型推理」页面开通豆包视觉模型
> 3. 在控制台凭证页面创建 API Key
> 
> > **每个用户需要自己的 API Key**：使用时从环境变量 `VOLCENGINE_ARK_API_KEY` 读取。
> 
23c38
< ## 二、需求确认（正式生成前必须执行）
---
> ## 二、数据隐私与透明度
24a40,59
> ### 数据流向
> 
> | 数据类型 | 发送目标 | 用途 | 是否持久化 |
> |----------|----------|------|-----------|
> | 文本 Prompt（品牌/促销文案等） | 火山引擎 API | 图像生成请求 | ❌ 仅传输，不存储 |
> | 用户产品照片 | 火山引擎 API | 作为图像生成参考输入 | ❌ 仅传输，不存储 |
> | 生成的图片 | 本地磁盘 | 交付给用户 | ✅ 保存到本地输出目录 |
> 
> > **AI 内置视觉能力**：当用户仅提供产品照片未附文字说明时，由 AI Agent 内置视觉能力识别图中商品信息（本地运行），无需额外 API 调用。
> 
> **本 Skill 不会做的事：**
> - ❌ 在本地或远程存储、记录或缓存用户输入数据（文本 Prompt、产品照片）
> - ❌ 将数据转发到火山引擎以外的任何第三方
> - ❌ 进行任何购买、支付或金融操作
> - ❌ 进行任何加密货币或区块链操作
> 
> > ⚠️ 用户产品照片和文本 Prompt 会发送至火山引擎 API。上传敏感或专有产品图片前，请阅读[火山引擎隐私政策](https://www.volcengine.com/docs/6369/71845)。API 返回的生成图片会保存到本地输出目录。
> 
> ## 三、需求确认（正式生成前必须执行）
> 
85c120
< ## 三、文案自动生成规则
---
> ## 四、文案自动生成规则
104c139
< ## 四、组件清单与尺寸
---
> ## 五、组件清单与尺寸
117c152
< ## 五、Prompt 写法标准
---
> ## 六、Prompt 写法标准
274c309
< ## 六、生图 API
---
> ## 七、生图 API
311c346
< ## 七、绿幕抠图
---
> ## 八、绿幕抠图
335c370
< ## 八、合成预览
---
> ## 九、合成预览
418c453
< ## 九、打包交付
---
> ## 十、打包交付


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)