Skill: luis1213899/xingxiaolu-jimeng (version 1.0.2)

--- name: jimeng-ai description: 即梦AI生图与视频生成工具。通过火山引擎API调用即梦AI，支持文生图、图片生成、视频生成。内置50+提示词模板覆盖电商、社交、商业设计、视频等场景。 metadata: openclaw: emoji: "🎨" requires: bins: ["python"] --- # 即梦AI (Jimeng AI) 通过火山引擎 API 调用即梦AI，支持**文生图**、**图生视频**。 ## 凭证 使用 `token-manager` 中保存的 `jimeng` 密钥： - key: `jimeng` - 内容: `AccessKeyId` + `SecretAccessKey` ## 快速使用 ### 文生图（推荐） ```bash # 生图并保存到文件 python skills/jimeng-ai/scripts/generate.py --prompt "描述" --output image.png # 生图输出 MEDIA_URL（用于 OpenClaw 内联显示） python skills/jimeng-ai/scripts/generate.py --prompt "描述" ``` ### 查询任务 ```bash python skills/jimeng-ai/scripts/query.py <task_id> [req_key] ``` ### 视频生成 ```bash python skills/jimeng-ai/scripts/video.py "描述" --duration 5 ``` ## 提示词模板库 内置50+即梦提示词模板，详见： 📋 **`references/prompts-templates.md`** | 分类 | 模板数 | 场景 | |------|--------|------| | 🛒 电商促销海报 | 15个 | 双11/618/春节/520/3C数码/美妆/运动等 | | 📱 社交媒体图文 | 10个 | 小红书/朋友圈/知识科普/美食/健身/职场 | | 🎨 商业设计 | 8个 | Logo/IP形象/UI图标/VI系统 | | 🎬 视频生成 | 10个 | Vlog/品牌广告/国潮/创意短片 | ### 万能公式 ``` 主体 + 动作/状态 + 场景环境 + 风格美学 + 光影氛围 + 镜头视角 + 画质参数 ``` **示例：** - ❌ "一只猫在沙发上。" - ✅ "一只橘色的胖猫慵懒地躺在棕色的真皮沙发上，午后阳光从落地窗斜射进来，空气中有细小的灰尘颗粒在舞动，电影质感，浅景深，8K超高清。" ## 参数说明 ### 文生图 (req_key: jimeng_t2i_v40) | 参数 | 说明 | |------|------| | `--prompt, -p` | 图像描述（必填） | | `--aspect` | 宽高比: `1:1`(默认), `3:4`, `4:3`, `16:9`, `9:16` | | `--seed` | 随机种子，-1 表示随机 | | `--output, -o` | 保存路径（不填则输出 MEDIA_URL） | ### 文生视频 (req_key: jimeng_i2v_first_v30_1080) | 参数 | 说明 | |------|------| | `--prompt` | 视频描述（必填） | | `--duration` | 时长(秒): 5-10（默认5） | | `--seed` | 随机种子 | ## 输出格式 ``` Task submitted: <task_id> IMAGE_SAVED: /path/to/image.png # --output 模式 MEDIA_URL: https://... # 无 --output 模式 ``` ## 进阶技巧 1. **角色定位** — 提示词开头加"你是一位资深电商平面设计师" 2. **锁定元素** — 引号标出必出内容，如"标题为'盛夏狂欢节'" 3. **风格先行** — 越早写"风格"效果越好 4. **分阶段生成** — 先简短提示词验证构图，满意后再加细节 5. **参考图** — 支持参考图+提示词双保险 ## 注意事项 1. 生图任务通常 5-10 秒完成，视频任务 30-60 秒 2. 免费账户每日有积分限制（约66次生图） 3. 轮询间隔建议 3-5 秒，避免频繁请求 4. 图片通过 `binary_data_base64` 返回，无需处理过期URL

path: references/prompts-templates.md
content: # 即梦AI提示词模板库

> 来源：https://www.tahou.com/article/203607417559502853  
> 收录时间：2026-04-26

---

## 万能公式

```
主体 + 动作/状态 + 场景环境 + 风格美学 + 光影氛围 + 镜头视角 + 画质参数
```

**示例对比：**
- ❌ 错误："一只猫在沙发上。"
- ✅ 正确："一只橘色的胖猫慵懒地躺在棕色的真皮沙发上，午后阳光从落地窗斜射进来，空气中有细小的灰尘颗粒在舞动，电影质感，浅景深，8K超高清。"

---

## 一、电商促销海报（15个模板）

### 1. 双11通用狂欢海报
```
电商平台双11全球狂欢节宣传海报，以红色、金色为主色调，画面中心是巨大的'11.11'立体发光数字，周围环绕闪烁的霓虹灯和礼花，背景有购物车、快递盒、打折标签（'5折起''限时秒杀'），前景是消费者兴奋购物的剪影，动感十足，光影绚丽，8K超高清。
```

### 2. 双11倒计时直播间风格
```
黑色背景，金色'0点开抢'大字，光效粒子环绕悬浮。左侧设计商品矩阵轮播轨道，右侧预留实时在线人数计数器位，底部固定'关注领券'常驻栏，整体光效模拟直播间LED屏眩光感。
```

### 3. 双11暗黑鎏金高端版
```
暗黑鎏金渐变背景，顶部爆炸光效艺术字'双11全球狂欢节'，中央立体字'11.11'带破碎飞散效果。三组爆品并列：左侧iPhone直降标识，中间美妆品牌买赠活动，右侧高端白酒限时放量，底部设预售和尾款进度条。
```

### 4. 618大促海报
```
618年中大促促销海报，主色调为橙色和白色，充满活力与购物狂欢氛围。主体用巨大的'618'数字作为视觉中心，采用金属质感立体字，周围环绕热气球、购物车、打折标签，背景为阳光明媚的夏日购物场景，超高清画质。
```

### 5. 双12年终盛典
```
双12年终盛典海报，以紫色和金色为主色调，营造年终豪华盛宴感。中央是3D立体'12.12'发光字，四周悬浮各种礼品盒和星星装饰，背景为繁华的都市夜景，灯光璀璨，节日氛围浓厚，超清8K。
```

### 6. 春节年货节
```
春节年货节喜庆海报，红色与金色为主色调，充满浓郁的中国年味。主体是巨大的'年货节'书法字体，配有灯笼、红包、鞭炮、生肖元素。背景是热闹的集市或家庭团圆场景，采用国潮插画风格，超高清细节，适合电商平台Banner。
```

### 7. 女神节/三八节
```
38女神节浪漫海报，粉色与玫瑰金为主色调，体现女性柔美。主体是'3.8女王节'的艺术字，周围环绕鲜花、口红、包包、高跟鞋等女性喜爱的商品剪影，采用水彩晕染或光影质感，温馨甜蜜，适合美妆或服饰促销。
```

### 8. 父亲节/母亲节
```
父亲节温情海报，深蓝与棕色为主色调，沉稳内敛。画面中心是一个成年男人拉着小男孩的背影，采用剪影效果，背景是夕阳下的海滩或草地。搭配'父爱如山'标题，整体风格温暖质朴，超高清。
```

### 9. 开学季/学生用品
```
开学季促销海报，蓝色与绿色为主色调，清新充满活力。视觉中心是'开学啦'立体字，配有书包、铅笔、书本、电脑等学生用品围绕。背景采用手绘校园风，阳光明媚，鼓励学生开启新学期，超清。
```

### 10. 520表白/情人节
```
520网络情人节浪漫海报，粉紫渐变为主色调，充满梦幻气息。主体是一对情侣剪影在烟花下拥吻，配以'520心动日'发光标题。背景点缀心形气球和玫瑰花，采用星空夜景，柔焦镜头，超高清。
```

### 11. 3C数码产品专场
```
科技感3C数码产品海报，深蓝色与霓虹蓝为主色调，冷峻高级。主体是某最新款智能手机或笔记本，以微距特写展示金属材质和屏幕细节。背景是抽象的数据流和科技线条，采用科幻电影风格，超清。
```

### 12. 美妆护肤专场
```
高级感美妆护肤海报，米色与香槟金为主色调，优雅奢华。主体是一个精致的口红或面霜瓶，瓶身折射出细腻光泽。背景采用渐变纯色，搭配大理石纹理或丝绸质感。整体风格极简高级，适合高端品牌，超高清。
```

### 13. 运动户外专场
```
动感运动装备海报，亮橙与荧光绿为主色调，激情四射。主体是运动鞋或健身器材，展示橡胶材质和汗水飞溅的瞬间。背景是健身房或户外跑道的模糊动态场景，采用抓拍风格，充满力量感。
```

### 14. 家电家居专场
```
温馨家居生活海报，暖黄与奶油白为主色调，舒适治愈。主体是扫地机器人或空气炸锅置于客厅或厨房一角，搭配绿植、毛毯、抱枕等软装。背景是阳光洒满的卧室或客厅，采用日系极简风，超高清。
```

### 15. 线下超市促销海报
```
超市大促海报，采用红黄配色醒目抢眼，主体是'限时特价'爆炸贴和购物车堆积如山。背景是干净明亮的货架通道，采用仰拍视角增强压迫感和抢购氛围，适合纸质派发或店内张贴。
```

---

## 二、社交媒体爆款图文（10个模板）

### 16. 知识科普卡片（熵增定律）
```
熵增定律是什么？用一张画风可爱的知识卡片解读熵增定律，画面上半部分是一个整洁的房间慢慢变乱的趣味漫画，下半部分用简洁的黑体字总结定律核心。整体风格卡通治愈，适合自媒体传播。
```

### 17. 养生赛道科普图（茯苓）
```
生成一组关于'茯苓'的养生科普图文。第一张封面：一个卡通瓷碗装着茯苓块和红枣，标题用可爱字体写'祛湿神器·茯苓'。第二张内页：用插画对比'湿气重的人'和'祛湿后的人'，搭配简短的干货文字。风格清新中式，适合小红书发布。
```

### 18. 朋友圈九宫格美图（旅行）
```
一组9张夏季旅行朋友圈配图，主题为'海边度假'。每张图展示不同的海边元素：沙滩上的脚印、夕阳下的椰子、手拿冰淇淋的特写、海浪拍打礁石、海鸥飞翔、露营帐篷、篝火晚会、日出海面和航拍海岸线。风格采用富士胶片模拟滤镜，高饱和度，适合拼图发朋友圈。
```

### 19. 穿搭OOTD日常
```
OOTD今日穿搭分享图，一个年轻女性穿着白色亚麻衬衫和牛仔短裤，站在街角的咖啡店门口。一只手端着冰美式，另一只手自然垂在身侧。背景有斑驳的阳光透过树叶洒落，采用俯拍15度视角，韩系ins风，低饱和高级灰调。
```

### 20. 美食探店打卡图
```
美食探店打卡图，一张铺满整张桌子的美食俯拍。C位是一碗铺满肥牛的日式拉面，周围围着炸鸡块、章鱼小丸子、抹茶大福和一杯波子汽水。采用45度俯拍，暖黄色灯光，背景有日式灯笼和木质吧台，充满烟火气，8K超清。
```

### 21. 母婴育儿内容
```
母婴育儿内容配图，一个一岁左右的宝宝坐在木地板上，胖乎乎的小手正在抓一个彩虹色的布艺积木。阳光从左侧窗户照进来，在地板上投下长长的人影。采用平视视角抓拍，自然温馨的家庭纪实风格，色调偏暖。
```

### 22. 读书笔记配图
```
读书笔记配图，一本翻开的精装书摊在原木书桌上，书页间夹着一支铅笔和一朵压干的绣球花。背景是一杯冒着热气的红茶和一副复古圆框眼镜。采用俯拍视角，莫兰迪色系，安静文艺，适合知识类博主。
```

### 23. 健身打卡
```
健身打卡配图，一个穿着运动背心的年轻女性正在瑜伽垫上做平板支撑，汗水打湿了鬓角，表情专注。背景是简约的居家健身房，有哑铃、弹力带和水壶。采用低角度仰拍，黑白胶片质感，突出肌肉线条和专注神情。
```

### 24. 职场干货分享
```
职场干货分享配图，一个笔记本电脑屏幕上显示着漂亮的PPT图表，旁边放着一杯美式咖啡和一支Lamy钢笔。背景是干净的办公桌，有便利贴和绿植点缀。采用俯拍视角，明亮清晰的商务风格，字体采用无衬线体，专业干练。
```

### 25. 手账拼贴风
```
手账拼贴风格素材图，背景为米色网格纸或牛皮纸。画面中散落着复古邮票、和纸胶带、拍立得照片、干花标本和手写英文花体字。采用平铺俯拍视角，光影自然柔和，略带胶片颗粒感，适合做手账分享或封面图。
```

---

## 三、商业设计场景（8个模板）

### 26. 品牌文字Logo设计
```
餐饮品牌Logo设计，矢量可缩放图形。汉字'品牌名'采用文字图形化处理，融入瓷器或食物元素，单色线稿，线条流畅无断裂，图形与字体自然融合，适合用作门头和包装。
```

### 27. 日系漫画风Logo
```
标志设计，文字'品牌名'，日系漫画风夸张字体。笔画边缘有高速线特效，仿佛极速出炉。字体表面布满闪闪发光的高光和光斑，动态感爆炸。
```

### 28. 人像圆形徽章Logo
```
餐饮品牌Logo，圆形徽章底图，中央是主理人侧脸剪影。色彩采用黑金搭配，给人熟人开店、值得信赖的亲切感。外圈环绕品牌中文全称，适合餐饮小店使用。
```

### 29. Q版卡通IP形象
```
将真实人物转化为Q版卡通风格IP形象。头部比例放大至身体的2倍，采用黑色线条描边，大大的眼睛，微笑表情。身体穿着休闲卫衣和牛仔裤，色彩鲜艳明亮，适合做品牌吉祥物和周边。
```

### 30. 3D潮玩IP形象
```
潮玩IP形象设计，OC渲染风格数字艺术作品。核心形象是椰子壳摇滚鸡：一只戴着墨镜的酷炫公鸡，但身体被掏空的椰子壳取代，椰子壳表面有天然纹路加喷绘的闪电音符图案。头顶保留鲜艳鸡冠但变形为火焰造型，脖子上挂着贝壳项链。一爪握电吉他，另一爪抓着一个打开的绿色椰子，站在圆形舞台上，背景有聚光灯。
```

### 31. 3D科技风图标
```
提示词模板：主体描述（'盾牌''文件夹''AI云'等图形），风格质感采用3D风格加未来科技感，色彩方案为主色调蓝色搭配白色，视角构图等轴测视角，背景设置纯白色，材质细节毛玻璃加半透明玻璃材质加柔和光影，工具渲染使用C4D加Blender建模加OC渲染器加光线追踪，输出参数为8K分辨率加高保真，参考风格为Dribbble风格。
```

### 32. 企业VI视觉系统
```
品牌视觉识别系统设计，品牌名称'GREEN'。包含包装袋、帽子、纸盒、卡片、手环、挂绳等六件套。绿色为主色调，趣味简约现代风格。所有产品统一采用同款Logo和辅助图形，排列在一张白底展示板上，等距平铺视图。
```

### 33. 极简主义App图标
```
极简主义App图标设计，一个太阳和月亮的抽象结合体，采用渐变金色描绘，线条极简流畅。背景为纯黑色，无边框无阴影。采用扁平化设计风格，高辨识度，适合做手机主题图标。
```

---

## 四、视频生成场景（10个模板）

### 34. 生活治愈系Vlog
```
10秒竖屏视频，比例9:16，无字幕，治愈系风格。一个年轻女孩坐在窗边，手捧热咖啡，安静地看着窗外秋天的落叶缓缓飘落。动作舒缓，背景有温暖的落日余晖，画面柔和，采用中景固定镜头。
```

### 35. 感人家庭短片
```
15秒横屏视频，比例16:9，电影感写实风格。一个30岁男性穿着商务装，下班后疲惫地推门回家。女儿从客厅飞奔过来扑进怀里，宠物狗也兴奋地围着转圈。客厅暖光，表情从疲惫慢慢转为温柔的笑容。
```

### 36. 电商包包展示
```
15秒竖屏视频，比例9:16，有字幕，高清质感。30岁都市女性模特，优雅展示一款红色名牌包包。多角度切换细节：侧面看车缝线、正面看Logo、打开看内衬。动作优雅自信，背景简约高级，字幕配合'简约百搭，通勤必备'。
```

### 37. 科技感产品演示
```
15秒竖屏视频，比例9:16，科技感风格。展示一款智能运动手表：先是特写屏幕亮起，演示心率监测数据跳动，再切换到运动模式记录轨迹，最后回到表盘显示时间。人物穿着运动服充满活力，背景有数据流特效和半透明全息投影。
```

### 38. 国潮文化宣传片
```
20秒横屏视频，比例16:9，无字幕，国潮水墨风格。太极大师在竹林深处表演功夫，黑白配色，动作行云流水。背景有水墨晕染特效随动作散开，慢动作展现拳法和衣袂翻飞，适合传统文化品牌宣传。
```

### 39. 品牌治愈系广告（无印良品风格）
```
极简主义生活方式广告片。一个年轻女子在阳光充足的清晨醒来，拉开亚麻窗帘，整理棉麻床单。切水果时刀落案板的清脆声与水流声交织。全程无旁白，仅保留环境原声。镜头采用缓慢的横移和固定的中景，色调低饱和暖灰，每2-3秒切换场景。
```

### 40. 雨夜文艺片氛围
```
王家卫90年代香港文艺片风格，雨夜电话亭场景。一个穿红风衣的女人撑着伞站在街角电话亭里，霓虹灯光在潮湿的路面上倒映出模糊光斑。雨丝如帘，镜头缓慢推近她的侧脸，眼神中带着犹豫和期待。胶片颗粒质感，色彩浓郁，情绪张力拉满。
```

### 41. 产品对比式广告
```
15秒产品对比广告片。镜头右摇，画面左侧是一位优雅做饭的女士，厨房干净整洁，油烟机安静工作。镜头摇到右侧，是一位满头大汗被浓烟呛得咳嗽的男人，厨房烟雾缭绕。最后镜头推向油烟机，展示强大的吸烟效果。对比冲击力强。
```

### 42. 搞笑Meme短视频
```
15秒伪纪录片风格搞笑视频，比例9:16。一只巨大的橘猫像哥斯拉一样卡在城市两栋高楼之间，尾巴扫过街道，猫脸懵逼地看着下方堵塞的交通。路人们抬头惊讶地指指点点。采用晃动的手持镜头感，增加真实性。
```

### 43. 动漫角色打斗
```
10秒动漫风格打斗视频，哪吒与敖丙在冰与火交织的战场上交锋。火焰特效与冰晶碎片激烈碰撞，粒子效果丰富。哪吒挥舞混天绫，敖丙舞动冰锤，两者在慢动作中对撞，冲击波扩散。高频动作保持角色面部特征一致性。
```

---

## 五、进阶实用技巧

1. **先定身份，再说需求** — 开头加角色定位，如"你是一位资深电商平面设计师"
2. **用括号锁定必出元素** — 引号标出关键Logo/文案，如"标题为'盛夏狂欢节'"
3. **风格先行** — 越早写"风格"效果越好，如"电影质感""国潮插画风格"
4. **参考图+提示词双保险** — 上传参考图配提示词，参考强度可调
5. **分阶段生成** — 先简短提示词验证构图，满意后再逐步加细节
6. **积累提示词库** — 按行业/风格分类存档，改关键信息复用
7. **善用DeepSeek辅助** — 用即梦内置DeepSeek帮你把零散关键词结构化

---

## 六、避坑指南

| 坑 | 解决方案 |
|---|---------|
| 画面失真/主体变形 | 分阶段生成，低分辨率验证再细化 |
| 风格跑偏 | 参考图+风格关键词双保险 |
| 细节糊成一团 | 加"区域增强指令"，如"重点强化人物手部细节，增强系数1.5" |
| 文字生成不准 | 引号锁定文字 + 网格系统布局规范 |
| 一次性塞太多信息 | 分步完成：主体→场景→风格→文字 |
| 视频镜头混乱 | 具体描述镜头运动，如"镜头小幅度拉远并跟随女主移动" |


---

# 附录：即梦4.0官方提示词手册

> 来源：即梦图片4.0模型 提示词手册（官方）
> 说明：以下为官方手册中的核心编辑指南与风格词库

---

## 模型亮点（5大核心能力）

| 亮点 | 说明 |
|------|------|
| 精准指令编辑 | 大白话描述即可完成增删/修改/替换/参考 |
| 高度特征保持 | 角色特征还原、画面无损编辑 |
| 深度意图理解 | 专家级知识、模糊到具象、天马行空变现实 |
| 多图输入输出 | 最多9图组图、组合/迁移/替换/衍生复合编辑 |
| 超高速超高清 | 2K生图<1.8s，最高支持4K分辨率 |

---

## 编辑撰写指南

### 编辑公式
```
变化动作 + 变化对象 + 变化特征
```
示例：`将骑士的头盔变为金色`

### 组图触发
使用"一系列""组图""帮我生成几张图"等提示词触发组图，最多支持生成9张。

### 参考图使用
- 有明确需保持的角色/产品/风格时，输入图像作为参考
- 多张参考图时，明确指出不同图片的参考/编辑元素
  - 示例：`将图1中的角色放入图2的背景中，参考图3的风格进行生成`

---

## 生图撰写指南

### 核心原则
- 用**连贯自然语言**描述画面内容（主体+行为+环境）
- 用**短词语**描述画面美学（风格/色彩/光影/构图）

### 好与坏的对比
- ❌ `一个女孩，撑伞，林荫街道，油画般的细腻笔触使画面生动美好`
- ✅ `一个女孩穿着华丽的服装，撑着遮阳伞走在林荫道上，莫奈油画风格`

### 文字准确率提升
把想要生成的文字内容插入`""`引号中。
- 示例：`生成一张海报，标题为"Seedream V4.0"`

### 专业词汇
使用词源语言（英文），效果更准确。

---

## 问题自查清单

| 问题 | 错误示例 | 正确改进 |
|------|---------|---------|
| 指代不明 | `不要这人` | `去除背景里的路人` |
| 变化指向不明确 | `让它更好看` | `提高对比度，让天空更蓝，并锐化图像` |
| 缺少保持类描述 | `改成"V4.0"` | `将"V3.0"替换为"V4.0"，同时保持字体样式与颜色不变` |
| 描述相互矛盾 | `改成油画风格，真实摄影实拍` | `改成油画风格，笔触真实自然` |
| 编辑对象不精确 | `将相框改为金属材质` | `将图片右上角，花瓶上方的相框由木质改为金属材质` |
| 美感不够 | `生成一个油画女孩` | `生成一张莫奈油画风格，绿色调，低对比度，微仰视视角，一个撑着伞穿着华丽米白色衣服的少女微笑表情，背景是绿树和蓝天的图片` |

---

## 热门风格词库

### 1. 热门风格
古早风、民国、虚幻引擎5、克苏鲁、新艺术

### 2. 美学相关
暖色调、过度曝光、侧光、侧逆光、backlighting、暖光源、top lighting、窗光、soft lighting、发丝光、self-illumination、火光、底光、轮廓光、stage lighting、高饱和、high-angle shot、丁达尔光

### 3. 摄影风格
微距镜头(Macro lens shot)、城市摄影、纪实摄影、轻胶感、野生动物摄影、构成主义、抽象主义、电影质感、定格动画、古早风、CCD、柯达拍摄、胶片、人文摄影、户外摄影、富士拍摄、单色摄影、小清新、写真摄影、fashion photograph、街头摄影、老照片、汽车摄影、夜景摄影、风景摄影

### 4. 潮流风格
Riso、皮影、盲盒、故障风、分格漫画、Q版、美式复古、蒸汽朋克、波西米亚、千禧、黑暗恐怖、国风、中世纪、魂系游戏、超级英雄、蜡笔画、90年代游戏、港风、赛博朋克

### 5. 艺术风格
山水画、皴法、花鸟画、仕女图、绢本画、工笔风、浮世绘、文艺复兴、巴洛克风格、新古典主义、古典主义、象征主义、洛可可风格、浮雕、大师素描、速写、雕塑、肖像画、印象派、拼贴艺术、大师版画、超写实主义、立体主义、孟菲斯

### 6. 材质词库
| 材质分类 | 词汇 |
|---------|------|
| 纤维 | sisal、亚麻绳、灯芯绒、亚麻布、wicker、竹编、棉花、草编、牛仔布、沙子、毛绒、颗粒纹理 |
| 自然 | 木头、植绒、羽毛、皮革、velvet、火山熔岩 |
| 人工 | 树脂、gel、超轻粘土、粘土、泡沫、felt |
| 表面 | 磨砂、薄纱、海绵、lace、羊毛、塑料 |
| 硬质 | 石膏、大理石、陶瓷、亚克力、透明、玻璃、水泥、石头、砖块、混凝土、金属、沥青 |

---

## 景别与视角词库

### 景别
近景、中景、远景、深景深、full body shot、动态模糊、浅景深

### 视角
斜侧视角、正面光、back view、侧面视角、四分之三侧面、极端特写、特写、鸟瞰、enclosed composition、居中构图、低角度视角、强光、双性照明、dark-toned

### 光影
弱光、冷色调、高饱和、high-contrast、硬光、闪光灯、high-angle shot

---

## 典型编辑案例（官方示例）

| 类型 | 输入 | 输出 |
|------|------|------|
| 主体修改 | `生成狗狗趴在草地上的近景画面` | → 生成结果 |
| 视角修改 | `将平视视角改为俯视视角，将近景改为中景，并把画面比例改为16:9` | → |
| 风格迁移 | `参考图片内容，将3D转为平面` | → |
| 材质替换 | `图中形象变成羊毛毡，下面有个小支架使得它仍然维持这个姿势，放在深色书桌上` | → |
| 产品生成 | `用图中的形象生成帆布包` | → |
| 人像精修 | `优化图中男人的面部肤质，使面部肤质更细腻平滑且自然，保留毛孔以及纹理细节` | → |
| 产品摄影 | `精修一下，修复褶皱，调整光影，高清商业产品摄影` | → |
| 文字修改 | `把图片文字换成创意字体` | → |
| 草图生成 | `送货机器人草图` | → |
| 绘本创作 | `手账风格，出一个冰激凌制作步骤教程图，步骤说明要中文` | → |
| 角色转换 | `转化为真人形象，帅气神秘` | → |
| 参考生成 | `参考线稿图，生成一台老式电视机` | → |
| 动作保持 | `根据草稿中的人物姿势，生成对应动作的手办` | → |

---

## 应用场景分类（官方）

### 商业设计
海报设计、品牌设计、服饰设计、包装设计、电商设计、家居设计

### 艺术创作
漫画分镜、电影分镜、绘本创作、周边创作、三视图、线稿上色、人像写真

### 娱乐玩法
表情包、盲盒玩具、风格转绘、换脸、灵魂画手、拍立得、证件照生成、拟人化


path: scripts/generate.py
content: #!/usr/bin/env python3
# /// script
# requires-python = ">=3.10"
# dependencies = []
# ///
"""
即梦AI 文生图 - 集成 OpenClaw 图片工具链
用法:
    python generate.py --prompt "描述" [--aspect 16:9] [--output path]
    
输出格式:
    - 有 output 时: 保存图片到本地
    - 无 output 时: 输出 MEDIA_URL: <url>
"""
import argparse, os, sys, json, base64, time, hashlib, hmac, urllib.request

# === 凭证 ===
SECRETS_FILE = os.path.expanduser("~/.openclaw/workspace/secrets.json")

def get_credentials():
    try:
        with open(SECRETS_FILE, encoding="utf-8") as f:
            data = json.load(f)
        entry = data.get("entries", {}).get("jimeng", {})
        fields = entry.get("fields", {})
        return fields.get("AccessKeyId"), fields.get("SecretAccessKey")
    except Exception:
        return None, None

# === Volcengine 签名 ===
BASE_URL = "https://visual.volcengineapi.com"
REGION = "cn-beijing"; SERVICE = "cv"

def hmac_sha256(key, data):
    return hmac.new(key, data.encode('utf-8'), hashlib.sha256).digest()

def sign(method, path, query, body, date_short, date_full, access_key, secret_key):
    body_hash = hashlib.sha256(body.encode('utf-8')).hexdigest()
    signed_headers = "content-type;host;x-date;x-content-sha256"
    canonical = f"{method}\n{path}\n{query}\ncontent-type:application/json\nhost:{BASE_URL.replace('https://', '')}\nx-date:{date_full}\nx-content-sha256:{body_hash}\n\n{signed_headers}\n{body_hash}"
    hashed_canonical = hashlib.sha256(canonical.encode('utf-8')).hexdigest()
    credential_scope = f"{date_short}/{REGION}/{SERVICE}/request"
    string_to_sign = f"HMAC-SHA256\n{date_full}\n{credential_scope}\n{hashed_canonical}"
    k_date = hmac_sha256(secret_key.encode('utf-8'), date_short)
    k_region = hmac_sha256(k_date, REGION)
    k_service = hmac_sha256(k_region, SERVICE)
    k_signing = hmac_sha256(k_service, "request")
    signature = hmac.new(k_signing, string_to_sign.encode('utf-8'), hashlib.sha256).digest()
    authorization = f"HMAC-SHA256 Credential={access_key}/{credential_scope}, SignedHeaders={signed_headers}, Signature={signature.hex()}"
    return authorization, body_hash

def call_api(action, body_dict, access_key, secret_key):
    path = "/api/v1"
    body = json.dumps(body_dict)
    query = f"Action={action}&Version=2024-06-06"
    date_full = time.strftime("%Y%m%dT%H%M%SZ", time.gmtime())
    date_short = time.strftime("%Y%m%d", time.gmtime())
    authorization, body_hash = sign("POST", path, query, body, date_short, date_full, access_key, secret_key)
    headers = {"Content-Type": "application/json", "Host": BASE_URL.replace("https://", ""), "X-Date": date_full, "X-Content-Sha256": body_hash, "Authorization": authorization}
    url = f"{BASE_URL}{path}?{query}"
    req = urllib.request.Request(url, data=body.encode(), headers=headers, method="POST")
    with urllib.request.urlopen(req, timeout=60) as resp:
        return json.loads(resp.read().decode())

def wait_and_get_image(task_id, access_key, secret_key, max_wait=60, interval=3):
    for _ in range(max_wait // interval):
        time.sleep(interval)
        result = call_api("JimengT2IV40GetResult", {"req_key": "jimeng_t2i_v40", "task_id": task_id}, access_key, secret_key)
        data = result.get("Result", {}).get("data", {})
        status = data.get("status", "unknown")
        if status == "done":
            # 优先用 image_urls
            urls = data.get("image_urls") or []
            if urls:
                return urls[0], None
            # 其次用 base64
            b64_list = data.get("binary_data_base64") or []
            if b64_list:
                img_data = base64.b64decode(b64_list[0])
                return None, img_data
            return None, None
        elif status == "failed":
            raise Exception(f"Task failed: {result}")
    raise TimeoutError(f"Timeout waiting for task {task_id}")

def main():
    parser = argparse.ArgumentParser(description="即梦AI 文生图")
    parser.add_argument("--prompt", "-p", required=True, help="图像描述")
    parser.add_argument("--aspect", default="1:1", help="宽高比: 1:1, 3:4, 4:3, 16:9, 9:16")
    parser.add_argument("--output", "-o", help="输出文件路径 (不指定则输出 MEDIA_URL)")
    parser.add_argument("--seed", type=int, default=-1, help="随机种子")
    args = parser.parse_args()

    access_key, secret_key = get_credentials()
    if not access_key:
        print("ERROR: No jimeng credentials found in secrets.json", file=sys.stderr)
        sys.exit(1)

    # 提交任务
    result = call_api("JimengT2IV40SubmitTask", {
        "req_key": "jimeng_t2i_v40",
        "prompt": args.prompt,
        "aspect_ratio": args.aspect,
        "seed": args.seed
    }, access_key, secret_key)

    if result.get("Result", {}).get("code") != 10000:
        print(f"ERROR: {result}", file=sys.stderr)
        sys.exit(1)

    task_id = result["Result"]["data"]["task_id"]
    print(f"Task submitted: {task_id}", file=sys.stderr)

    # 等待完成
    url, img_data = wait_and_get_image(task_id, access_key, secret_key)

    if args.output:
        if img_data:
            with open(args.output, "wb") as f:
                f.write(img_data)
            print(f"IMAGE_SAVED: {args.output}")
        else:
            # 下载 URL 图片
            with urllib.request.urlopen(url, timeout=30) as resp:
                data = resp.read()
            with open(args.output, "wb") as f:
                f.write(data)
            print(f"IMAGE_SAVED: {args.output}")
    else:
        if url:
            print(f"MEDIA_URL: {url}")
        else:
            # 保存临时文件输出
            tmp = os.path.join(os.path.dirname(__file__), "..", "temp_output.png")
            if img_data:
                with open(tmp, "wb") as f:
                    f.write(img_data)
                print(f"MEDIA_URL: file://{os.path.abspath(tmp)}")
            else:
                print("ERROR: No image data returned", file=sys.stderr)
                sys.exit(1)

if __name__ == "__main__":
    main()


path: scripts/image.py
content: #!/usr/bin/env python3
"""即梦AI 文生图"""
import sys, os, argparse
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _jimeng import call_api, get_credentials

def main():
    parser = argparse.ArgumentParser(description="即梦AI 文生图")
    parser.add_argument("prompt", help="图像描述")
    parser.add_argument("--aspect", default="1:1", help="宽高比: 1:1, 3:4, 4:3, 16:9, 9:16 (默认 1:1)")
    parser.add_argument("--seed", type=int, default=-1, help="随机种子 (-1随机)")
    args = parser.parse_args()

    access_key, secret_key = get_credentials()
    if not access_key:
        print("Error: No credentials found. Add jimeng key first.")
        sys.exit(1)

    body = {
        "req_key": "jimeng_t2i_v40",
        "prompt": args.prompt,
        "aspect_ratio": args.aspect,
        "seed": args.seed
    }

    print(f"Generating image...")
    print(f"Prompt: {args.prompt}")
    result = call_api("JimengT2IV40SubmitTask", body, access_key, secret_key)

    if result.get("Result", {}).get("code") == 10000:
        task_id = result["Result"]["data"]["task_id"]
        print(f"\nTask submitted successfully!")
        print(f"Task ID: {task_id}")
        print(f"\nQuery with: python query.py {task_id}")
        return task_id
    else:
        print(f"\nError: {result}")
        sys.exit(1)

if __name__ == "__main__":
    main()


path: scripts/query.py
content: #!/usr/bin/env python3
"""即梦AI 任务查询"""
import sys, os, time, base64, argparse, json
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _jimeng import call_api, get_credentials

def query_task(task_id, req_key="jimeng_t2i_v40"):
    access_key, secret_key = get_credentials()
    if not access_key:
        print("Error: No credentials found. Add jimeng key first.")
        sys.exit(1)

    result = call_api("JimengT2IV40GetResult", {
        "req_key": req_key,
        "task_id": task_id
    }, access_key, secret_key)

    return result

def main():
    parser = argparse.ArgumentParser(description="即梦AI 任务查询")
    parser.add_argument("task_id", help="任务ID")
    parser.add_argument("req_key", nargs="?", default="jimeng_t2i_v40", help="req_key (默认 jimeng_t2i_v40)")
    parser.add_argument("--wait", action="store_true", help="等待完成")
    parser.add_argument("--interval", type=int, default=3, help="轮询间隔(秒)")
    args = parser.parse_args()

    if args.wait:
        print(f"Waiting for task {args.task_id} to complete... (Ctrl+C to stop)")
        for i in range(60):  # max 3 min
            result = query_task(args.task_id, args.req_key)
            status = result.get("Result", {}).get("data", {}).get("status", "unknown")
            print(f"[{i+1}] Status: {status}")
            if status == "done":
                data = result["Result"]["data"]
                if data.get("image_urls"):
                    print("\nImage URLs:")
                    for url in data["image_urls"]:
                        print(f"  {url}")
                if data.get("video_url"):
                    print(f"\nVideo URL: {data['video_url']}")
                if data.get("binary_data_base64"):
                    b64_list = data["binary_data_base64"]
                    print(f"\nBase64 images: {len(b64_list)}")
                    # Save first image
                    if b64_list and args.req_key.startswith("jimeng_t2i"):
                        img_data = base64.b64decode(b64_list[0])
                        out_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "output.png")
                        with open(out_path, "wb") as f:
                            f.write(img_data)
                        print(f"Image saved to: {out_path}")
                return
            elif status == "failed":
                print(f"\nTask failed: {result}")
                return
            time.sleep(args.interval)
        print("Timeout waiting for task")
    else:
        result = query_task(args.task_id, args.req_key)
        status = result.get("Result", {}).get("data", {}).get("status", "unknown")
        print(f"Status: {status}")
        if status == "done":
            data = result["Result"]["data"]
            if data.get("image_urls"):
                print("\nImage URLs:")
                for url in data["image_urls"]:
                    print(f"  {url}")
            if data.get("video_url"):
                print(f"\nVideo URL: {data['video_url']}")
        else:
            print(json.dumps(result, ensure_ascii=False, indent=2))

if __name__ == "__main__":
    main()


path: scripts/video.py
content: #!/usr/bin/env python3
"""即梦AI 文生视频"""
import sys, os, argparse
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from _jimeng import call_api, get_credentials

def main():
    parser = argparse.ArgumentParser(description="即梦AI 文生视频")
    parser.add_argument("prompt", help="视频描述")
    parser.add_argument("--duration", type=int, default=5, help="视频时长(秒): 5-10")
    parser.add_argument("--seed", type=int, default=-1, help="随机种子 (-1随机)")
    args = parser.parse_args()

    access_key, secret_key = get_credentials()
    if not access_key:
        print("Error: No credentials found. Add jimeng key first.")
        sys.exit(1)

    body = {
        "req_key": "jimeng_i2v_first_v30_1080",
        "prompt": args.prompt,
        "duration": args.duration,
        "seed": args.seed
    }

    print(f"Generating video...")
    print(f"Prompt: {args.prompt}")
    result = call_api("JimengTI2VV301080SubmitTask", body, access_key, secret_key)

    if result.get("Result", {}).get("code") == 10000:
        task_id = result["Result"]["data"]["task_id"]
        print(f"\nTask submitted successfully!")
        print(f"Task ID: {task_id}")
        print(f"\nQuery with: python query.py {task_id} jimeng_i2v_first_v30_1080")
        return task_id
    else:
        print(f"\nError: {result}")
        sys.exit(1)

if __name__ == "__main__":
    main()


path: scripts/_jimeng.py
content: #!/usr/bin/env python3
"""即梦AI 共享库 - Volcengine 签名 & API调用"""
import json, hashlib, hmac, time, urllib.request, sys, os

BASE_URL = "https://visual.volcengineapi.com"
REGION = "cn-beijing"
SERVICE = "cv"

def get_credentials():
    """从 secrets.json 获取凭证"""
    secrets_file = os.path.expanduser("~/.openclaw/workspace/secrets.json")
    try:
        with open(secrets_file, encoding="utf-8") as f:
            data = json.load(f)
        entry = data.get("entries", {}).get("jimeng", {})
        fields = entry.get("fields", {})
        return fields.get("AccessKeyId"), fields.get("SecretAccessKey")
    except Exception as e:
        print(f"Error loading credentials: {e}", file=sys.stderr)
        return None, None

def hmac_sha256(key, data):
    return hmac.new(key, data.encode('utf-8'), hashlib.sha256).digest()

def sign(method, path, query, body, date_short, date_full, access_key, secret_key):
    body_hash = hashlib.sha256(body.encode('utf-8')).hexdigest()
    signed_headers = "content-type;host;x-date;x-content-sha256"
    canonical = f"{method}\n{path}\n{query}\ncontent-type:application/json\nhost:{BASE_URL.replace('https://', '')}\nx-date:{date_full}\nx-content-sha256:{body_hash}\n\n{signed_headers}\n{body_hash}"
    hashed_canonical = hashlib.sha256(canonical.encode('utf-8')).hexdigest()
    credential_scope = f"{date_short}/{REGION}/{SERVICE}/request"
    string_to_sign = f"HMAC-SHA256\n{date_full}\n{credential_scope}\n{hashed_canonical}"
    k_date = hmac_sha256(secret_key.encode('utf-8'), date_short)
    k_region = hmac_sha256(k_date, REGION)
    k_service = hmac_sha256(k_region, SERVICE)
    k_signing = hmac_sha256(k_service, "request")
    signature = hmac.new(k_signing, string_to_sign.encode('utf-8'), hashlib.sha256).digest()
    authorization = f"HMAC-SHA256 Credential={access_key}/{credential_scope}, SignedHeaders={signed_headers}, Signature={signature.hex()}"
    return authorization, body_hash

def call_api(action, body_dict, access_key, secret_key):
    path = "/api/v1"
    body = json.dumps(body_dict)
    query = f"Action={action}&Version=2024-06-06"
    date_full = time.strftime("%Y%m%dT%H%M%SZ", time.gmtime())
    date_short = time.strftime("%Y%m%d", time.gmtime())
    authorization, body_hash = sign("POST", path, query, body, date_short, date_full, access_key, secret_key)
    headers = {
        "Content-Type": "application/json",
        "Host": BASE_URL.replace("https://", ""),
        "X-Date": date_full,
        "X-Content-Sha256": body_hash,
        "Authorization": authorization
    }
    url = f"{BASE_URL}{path}?{query}"
    req = urllib.request.Request(url, data=body.encode(), headers=headers, method="POST")
    try:
        with urllib.request.urlopen(req, timeout=60) as resp:
            return json.loads(resp.read().decode())
    except urllib.error.HTTPError as e:
        return json.loads(e.read().decode())
    except Exception as e:
        return {"error": str(e)}


path: _meta.json
content: ownerId: local
slug: jimeng-ai
version: 1.0.1
publishedAt: 1745664000000

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