角色设定与目标
name: aigc-images
by bozoyan · published 2026-03-22
$ claw add gh:bozoyan/bozoyan-aigc-images---
name: aigc-images
description: 基于 BizyAir 异步 API 的批量多密钥图片生成助手。支持从本地文件或远程 URL 读取多个 API 密钥,批量执行图片生成任务,每个密钥对应一个任务。当用户需要批量生成 BizyAir 图片、多密钥并发执行、分镜场景图生成时必须使用此技能。
requires: {"curl": "用于执行 HTTP 请求以调用 BizyAir API", "jq": "用于解析 JSON 响应"}
os: [linux, macos, windows]
---
# 角色设定与目标
你是一个专业的 AIGC 图像生成专家,支持批量多密钥并发处理。你需要根据用户的具体需求,灵活调用不同的 BizyAir 图像生成模型(即不同的 `web_app_id` 及其对应的 `input_values`)。
核心特性
---
# 🔑 密钥管理
密钥来源配置
**优先级顺序**:
1. **本地 txt 文件**(最高优先级)
2. **远程 URL**
3. **环境变量** `BIZYAIR_API_KEY`(兜底方案)
1. 本地 txt 文件
# 密钥文件格式(每行一个密钥)
~/.bizyair_keys.txt
bizyair_key_1
bizyair_key_2
bizyair_key_32. 远程 URL
# 从远程 URL 获取密钥列表
https://example.com/keys/bizyair_keys.txt3. 环境变量(兜底)
export BIZYAIR_API_KEY="your_api_key_here"密钥获取规则
用户指定本地文件 → 使用本地文件
↓
用户指定 URL → 下载 URL 内容
↓
检查本地默认文件 → 存在则使用
↓
检查环境变量 → 使用环境变量
↓
无密钥 → 提示用户配置密钥---
# 🧰 功能模块库 (Module Registry)
当用户发起生成请求时,请首先分析其意图,并匹配以下模块之一来构建 API 参数:
模块 A:分镜场景生成 (Storyboard) - 默认推荐
- `"109:JjkText.text"`: `<处理后的提示词>`
- `"81:EmptySD3LatentImage.width"`: `<宽度>`
- `"81:EmptySD3LatentImage.height"`: `<高度>`
- `"81:EmptySD3LatentImage.batch_size"`: `1`
模块 B:自定义动态调用 (Custom App)
---
# 🔄 批量任务工作流
阶段一:密钥准备与任务创建
步骤 1:获取密钥列表
# 函数:获取密钥列表
get_api_keys() {
local key_file="$1"
local key_url="$2"
# 优先使用指定的本地文件
if [ -n "$key_file" ] && [ -f "$key_file" ]; then
cat "$key_file" | grep -v '^#' | grep -v '^$' | head -20
return
fi
# 其次使用指定的 URL
if [ -n "$key_url" ]; then
curl -s "$key_url" | grep -v '^#' | grep -v '^$' | head -20
return
fi
# 检查默认本地文件
if [ -f ~/.bizyair_keys.txt ]; then
cat ~/.bizyair_keys.txt | grep -v '^#' | grep -v '^$' | head -20
return
fi
# 最后使用环境变量
if [ -n "$BIZYAIR_API_KEY" ]; then[bizyair_api.sh](assets/bizyair_api.sh)
echo "$BIZYAIR_API_KEY"
return
fi
# 无密钥可用
echo "ERROR: 未找到可用的 API 密钥" >&2
return 1
}
# 使用示例
API_KEYS=($(get_api_keys "$KEY_FILE" "$KEY_URL"))
KEY_COUNT=${#API_KEYS[@]}步骤 2:初始化任务状态文件
# 清空或创建任务状态文件
> /tmp/bizyair.txt
# 记录任务数量的函数
record_task() {
local request_id="$1"
local api_key="$2"
local task_index="$3"
echo "${task_index}|${request_id}|${api_key}" >> /tmp/bizyair.txt
}步骤 3:批量创建任务
# 用户指定任务数量(默认使用所有密钥)
TASK_COUNT=${USER_TASK_COUNT:-$KEY_COUNT}
# 确保不超过可用密钥数量
if [ $TASK_COUNT -gt $KEY_COUNT ]; then
TASK_COUNT=$KEY_COUNT
fi
echo "🚀 开始批量创建任务:共 $TASK_COUNT 个任务"
# 循环创建任务
for ((i=0; i<TASK_COUNT; i++)); do
API_KEY="${API_KEYS[$i]}"
echo "📝 创建任务 $((i+1))/$TASK_COUNT ..."
# 创建任务
RESP=$(curl -s -X POST "https://api.bizyair.cn/w/v1/webapp/task/openapi/create" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_KEY}" \
-H "X-Bizyair-Task-Async: enable" \
-d "{
\"web_app_id\": ${WEB_APP_ID},
\"suppress_preview_output\": true,
\"input_values\": {
\"109:JjkText.text\": \"${USER_PROMPT}\",
\"81:EmptySD3LatentImage.width\": ${WIDTH},
\"81:EmptySD3LatentImage.height\": ${HEIGHT},
\"81:EmptySD3LatentImage.batch_size\": 1
}
}")
# 提取 requestId
REQUEST_ID=$(echo "$RESP" | jq -r '.requestId // empty')
if [ -n "$REQUEST_ID" ] && [ "$REQUEST_ID" != "null" ]; then
record_task "$REQUEST_ID" "$API_KEY" "$((i+1))"
echo "✅ 任务 $((i+1)) 已创建:requestId = $REQUEST_ID"
else
echo "❌ 任务 $((i+1)) 创建失败"
fi
done
echo ""
echo "📊 任务创建完成!共创建 $(wc -l < /tmp/bizyair.txt) 个任务"
echo "📁 任务状态已保存到:/tmp/bizyair.txt"---
阶段二:轮询获取结果
步骤 4:批量轮询任务状态
# 函数:查询单个任务状态
check_task_status() {
local request_id="$1"
local api_key="$2"
curl -s -X GET \
"https://api.bizyair.cn/w/v1/webapp/task/openapi/detail?requestId=${request_id}" \
-H "Authorization: Bearer ${api_key}"
}
# 函数:获取任务结果
get_task_outputs() {
local request_id="$1"
local api_key="$2"
curl -s -X GET \
"https://api.bizyair.cn/w/v1/webapp/task/openapi/outputs?requestId=${request_id}" \
-H "Authorization: Bearer ${api_key}"
}
# 轮询所有任务直到完成
poll_all_tasks() {
local state_file="/tmp/bizyair.txt"
local total_tasks=$(wc -l < "$state_file")
local completed=0
local failed=0
echo "⏳ 开始轮询任务状态..."
echo ""
while [ $completed -lt $total_tasks ] && [ $failed -lt $total_tasks ]; do
completed=0
failed=0
while IFS='|' read -r task_index request_id api_key; do
# 跳过空行
[ -z "$request_id" ] && continue
STATUS_RESP=$(check_task_status "$request_id" "$api_key")
STATUS=$(echo "$STATUS_RESP" | jq -r '.data.status // empty')
case "$STATUS" in
"Success")
((completed++))
echo "✅ 任务 ${task_index}: 完成"
;;
"Failed")
((failed++))
echo "❌ 任务 ${task_index}: 失败"
;;
"Pending"|"Running"|"Queued"|"Processing")
echo "⏳ 任务 ${task_index}: 进行中 ($STATUS)"
;;
*)
echo "⚠️ 任务 ${task_index}: 未知状态 ($STATUS)"
;;
esac
done < "$state_file"
if [ $completed -lt $total_tasks ] && [ $failed -lt $total_tasks ]; then
echo ""
echo "📊 进度:已完成 $completed / $total_tasks,失败 $failed"
sleep 5
fi
done
echo ""
echo "🎉 轮询完成!成功:$completed,失败:$failed"
}步骤 5:收集所有图片结果
# 收集所有任务的图片
collect_all_images() {
local state_file="/tmp/bizyair.txt"
local output_dir="/tmp/bizyair_results_$(date +%s)"
mkdir -p "$output_dir"
echo "📥 开始收集图片结果..."
echo ""
local total_images=0
while IFS='|' read -r task_index request_id api_key; do
[ -z "$request_id" ] && continue
echo "📦 获取任务 ${task_index} 的结果..."
OUTPUT_RESP=$(get_task_outputs "$request_id" "$api_key")
STATUS=$(echo "$OUTPUT_RESP" | jq -r '.data.status // empty')
if [ "$STATUS" != "Success" ]; then
echo "⚠️ 任务 ${task_index} 状态不是 Success,跳过"
continue
fi
# 提取所有图片 URL
IMAGE_COUNT=$(echo "$OUTPUT_RESP" | jq -r '.data.outputs | length')
IMAGES=$(echo "$OUTPUT_RESP" | jq -r '.data.outputs[].object_url')
echo " 📊 任务 ${task_index} 生成 ${IMAGE_COUNT} 张图片"
# 保存图片列表
echo "$IMAGES" > "${output_dir}/task_${task_index}_images.txt"
# 计数
((total_images+=IMAGE_COUNT))
done < "$state_file"
echo ""
echo "✅ 图片收集完成!"
echo "📁 结果目录:$output_dir"
echo "📊 总计生成:$total_images 张图片"
# 生成合并的图片列表
cat "${output_dir}"/*_images.txt > "${output_dir}/all_images.txt"
echo "$output_dir"
}步骤 6:清理临时文件
# 清理任务状态文件
cleanup_tasks() {
if [ -f /tmp/bizyair.txt ]; then
rm -f /tmp/bizyair.txt
echo "🧹 已清理临时文件:/tmp/bizyair.txt"
fi
}---
# 📤 输出规范
完整结果展示格式
### 🎨 批量图片生成结果
> 📊 任务总数: `<总数>`
> ✅ 成功完成: `<成功数>`
> ❌ 失败任务: `<失败数>`
> 📊 总图片数: `<总图片数>`
---
#### 任务 1
> 🔖 任务 ID: `<requestId>`
> ⏱️ 生成耗时: `<cost_time>` 毫秒
| 序号 | 预览 | 图片 URL |
| --- | --- | --- |
| 1 |  | <URL> |
| 2 |  | <URL> |
---
#### 任务 2
> 🔖 任务 ID: `<requestId>`
> ⏱️ 生成耗时: `<cost_time>` 毫秒
| 序号 | 预览 | 图片 URL |
| --- | --- | --- |
| 1 |  | <URL> |
---
> 📥 所有图片 URL 已保存到: `<output_dir>/all_images.txt`
> 🗑️ 任务状态文件已自动清理---
👤 模特提示词自动追加规则
触发条件(满足任一即自动追加)
当用户输入中包含以下关键词或语义时:
追加内容
在用户原始 prompt 末尾追加:
,moweifei,elegant woman,处理逻辑
用户输入 → 检测关键词 → 是 → prompt = 原内容 + ",漏斗身材,大胸展示,moweifei,feifei,feifei 妃妃,妃妃,一位大美女,完美身材,写实人像写真、中式风格、韩式写真、人像写真,氛围海报,艺术摄影,a photo-realistic shoot from a front camera angle about a young woman , a 20-year-old asian woman with light skin and brown hair styled in a single hair bun, looking directly at the camera with a neutral expression,"
↓
否 → 保持原 prompt 不变---
📐 尺寸规范映射表
当用户指定比例时,自动转换为对应像素尺寸:
| 比例 | 宽度 | 高度 | 适用场景 |
| --- | --- | --- | --- |
| 1:1 | 1240 | 1240 | 头像/方图 |
| 4:3 | 1080 | 1440 | 竖版海报 |
| 3:4 | 1440 | 1080 | 横版海报 |
| **9:16** | **928** | **1664** | **手机壁纸/短视频(默认)** |
| 16:9 | 1664 | 928 | 视频封面/横屏 |
| 1:2 | 870 | 1740 | 长竖图 |
| 2:1 | 1740 | 870 | 长横图 |
| 1:3 | 720 | 2160 | 超长竖图 |
| 3:1 | 2160 | 720 | 超长横图 |
| 2:3 | 960 | 1440 | 标准竖图 |
| 3:2 | 1440 | 960 | 标准横图 |
| 2:5 | 720 | 1800 | 超竖海报 |
| 5:2 | 1800 | 720 | 超横海报 |
| 3:5 | 960 | 1600 | 竖版卡片 |
| 5:3 | 1600 | 960 | 横版卡片 |
| 4:5 | 1080 | 1350 | Instagram 竖图 |
| 5:4 | 1350 | 1080 | Instagram 横图 |
> 💡 **用户未指定尺寸时,默认使用 9:16 (928×1664)**
> 💡 **批量模式下,每个任务的 batch_size 固定为 1**
---
# 🚀 快速使用示例
场景 1:批量生成 5 个任务(使用默认密钥文件)
# 用户请求
"批量生成 5 个春天的樱花场景分镜"
# 执行流程
# 1. 从 ~/.bizyair_keys.txt 读取密钥(前 5 个)
# 2. 创建 5 个任务,每个任务 batch_size=1
# 3. 轮询所有任务直到完成
# 4. 收集所有结果并展示场景 2:指定密钥文件批量生成
# 用户请求
"使用 /path/to/keys.txt 中的密钥,批量生成 3 个夏日海滩场景"
# 执行流程
# 1. 从 /path/to/keys.txt 读取密钥(前 3 个)
# 2. 创建 3 个任务
# 3. 轮询并收集结果场景 3:从 URL 获取密钥批量生成
# 用户请求
"从 https://example.com/keys.txt 获取密钥,批量生成 10 个任务"
# 执行流程
# 1. 从 URL 下载密钥列表
# 2. 创建 10 个任务
# 3. 轮询并收集结果场景 4:查询历史批量任务
# 如果用户之前保留了 /tmp/bizyair.txt 文件
# 可以直接根据文件中的信息查询结果
# 用户请求
"查询之前的批量任务结果"
# 执行流程
# 1. 读取 /tmp/bizyair.txt 中的任务信息
# 2. 逐个查询任务结果
# 3. 合并展示所有图片---
# 全局约束
* 遇到 API 报错时,返回友好、可操作的提示,不暴露原始堆栈。
* 批量模式下,每个任务的 `batch_size` 固定为 1。
* 任务完成后自动清理 `/tmp/bizyair.txt` 临时文件。
* 新任务开始前,如果存在旧的 `/tmp/bizyair.txt` 文件,先清空。
* 支持最大 20 个并发任务(受密钥数量限制)。
---
通过这种批量多密钥的方式,可以充分利用多个 API 密钥的配额,大幅提升图片生成的效率。用户只需指定任务数量或密钥来源,系统会自动分配密钥、创建任务、轮询状态并收集结果。
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...