Skill: bozoyan/bozo-aigc (version 2.0.0)

--- name: bozo-aigc description: 文生图与图生图 AI 图片生成工具。使用 BizyAir GPT_IMAGE_2 API 进行文本转图片和多图参考生成。当用户需要生成图片、创建配图、文生图、文本转图片、AI 绘画、图生图、参考图片生成、多图融合、设置图片尺寸比例、生成横版/竖版图片时触发此技能。即使用户只说"帮我画一张"、"生成图片"、"根据这些图片生成"也应触发。 --- # BOZO AIGC - 文生图与图生图工具 基于 BizyAir GPT_IMAGE_2 API 的 AI 图片生成工具，支持两种模式：**文生图（T2I）** 和 **图生图（I2I）**。 ## 功能特点 - **文生图**：将文本描述转换为高质量图片 - **图生图**：根据 1-8 张参考图片生成新图片 - 自动保存到 `pic` 文件夹，按时间戳命名 - 支持多种图片尺寸比例 ## 前置要求 需要设置 BizyAir API 密钥环境变量： ```bash export BIZYAIR_API_KEY='你的API密钥' ``` ## 重要：API 响应时间说明 BizyAir GPT_IMAGE_2 是远程推理服务，生成图片需要较长的等待时间： | 场景 | 预计耗时 | |------|----------| | 最快（简单提示词） | ~90 秒 | | 一般情况 | 2-5 分钟 | | 最慢（复杂提示词 / 多图） | 5-10 分钟 | 脚本已内置超时保护： - **API 请求超时**：600 秒（10 分钟），覆盖最慢情况 - **连接超时**：30 秒，防止网络不通时无限等待 - **图片下载超时**：120 秒 调用脚本前应告知用户"图片生成需要几分钟，请耐心等待"。 ## 模式一：文生图（Text-to-Image） 当用户只有文本描述、没有参考图片时使用此模式。 ### API 参数 | 参数 | 值 | |------|-----| | 端点 | `https://api.bizyair.cn/w/v1/webapp/task/openapi/create` | | web_app_id | `52416` | | 模型 | BizyAir_GPT_IMAGE_2_T2I_API | | 提示词键 | `4:BizyAir_GPT_IMAGE_2_T2I_API.prompt` | | 比例键 | `4:BizyAir_GPT_IMAGE_2_T2I_API.aspect_ratio` | ### 使用方式 调用脚本 `scripts/text-to-image.sh`： ```bash ./scripts/text-to-image.sh "提示词内容" [比例] ``` 示例： - `./scripts/text-to-image.sh "一只可爱的猫咪"` — 使用默认比例 9:16 - `./scripts/text-to-image.sh "风景画" 16:9` — 指定横版比例 ## 模式二：图生图（Image-to-Image） 当用户提供参考图片 URL 时使用此模式，支持 1-8 张参考图片。 ### API 参数 根据参考图片数量自动选择 web_app_id： | 图片数量 | web_app_id | LoadImage 节点 ID | |----------|------------|-------------------| | 1 | 52418 | 7 | | 2 | 52420 | 7, 8 | | 3 | 52423 | 7, 8, 9 | | 4 | 52343 | 7, 8, 9, 10 | | 5 | 52431 | 7, 8, 9, 10, 11 | | 6 | 52435 | 7, 8, 9, 10, 11, 12 | | 7 | 52437 | 7, 8, 9, 10, 11, 12, 18 | | 8 | 52442 | 7, 8, 9, 10, 11, 12, 18, 20 | - 模型：BizyAir_GPT_IMAGE_2_I2I_API - 提示词键：`6:BizyAir_GPT_IMAGE_2_I2I_API.prompt` - 比例键：`6:BizyAir_GPT_IMAGE_2_I2I_API.aspect_ratio` ### 使用方式 调用脚本 `scripts/image-to-image.sh`： ```bash ./scripts/image-to-image.sh "提示词" "图片URL1" ["图片URL2" ...] [比例] ``` 示例： - `./scripts/image-to-image.sh "将风格改为水彩画" "https://example.com/img.png"` - `./scripts/image-to-image.sh "融合这些风格" "url1" "url2" 16:9` ## 图片尺寸比例 支持以下比例，默认使用 **9:16**： | 比例 | 适用场景 | |------|----------| | 1:1 | 头像/方图 | | 2:3 | 标准竖图 | | 3:2 | 标准横图 | | 4:5 | Instagram 竖图 | | 5:4 | Instagram 横图 | | 3:4 | 竖版海报 | | 4:3 | 横版海报 | | **9:16** | **手机壁纸/短视频（默认）** | | 16:9 | 视频封面/横屏 | | 21:9 | 超宽屏/电影感 | ## 输出说明 - 图片保存到 `pic` 文件夹 - 文件名格式：`YYYYMMDD_HHMMSS.png`（或 `.jpg`） - macOS 系统自动在预览中打开图片 ## 工作流程 1. 根据用户请求判断使用文生图还是图生图模式 2. 解析用户输入：提取提示词、图片URL（如有）、比例参数 3. **告知用户图片生成需要 2-10 分钟，请耐心等待** 4. 调用对应的脚本（Bash 工具，timeout 建议 600000ms） 5. 等待 API 返回结果并下载图片 6. 告知用户图片保存路径

path: .claude/settings.local.json
content: {
  "permissions": {
    "allow": [
      "Bash(chmod +x *)"
    ]
  }
}


path: scripts/text-to-image.sh
content: #!/bin/bash

# ========================================
# BOZO AIGC - 文生图工具 (Text-to-Image)
# ========================================
# 使用 BizyAir GPT_IMAGE_2 T2I API 将文本描述转换为图片
# 用法: ./text-to-image.sh "提示词" [比例]
# 比例选项: 1:1 2:3 3:2 4:5 5:4 3:4 4:3 9:16 16:9 21:9
# ========================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 打印带颜色的消息
print_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

# ========================================
# 创建pic文件夹（如果不存在）
# ========================================
mkdir -p pic

# ========================================
# 从环境变量获取API密钥
# ========================================
[REDACTED_SECRET]"

# 检查API密钥是否设置
if [ -z "$API_KEY" ]; then
    print_error "环境变量 BIZYAIR_API_KEY 未设置或为空"
    echo ""
    echo "请按以下方式设置环境变量："
    echo ""
    echo "【Git Bash / WSL】"
    echo "  export BIZYAIR_API_KEY='你的API密钥'"
    echo ""
    echo "【macOS / Linux】"
    echo "  export BIZYAIR_API_KEY='你的API密钥'"
    echo "  # 永久设置：添加到 ~/.bashrc 或 ~/.zshrc"
    echo ""
    echo "【Windows 系统环境变量】（需重启终端生效）"
    echo "  setx BIZYAIR_API_KEY \"你的API密钥\""
    exit 1
fi

# 获取提示词参数
PROMPT="$1"

# 如果没有传入参数，使用默认提示词
if [ -z "$PROMPT" ]; then
    print_warning "未提供提示词，使用默认示例"
    PROMPT="一张美丽的风景画，蓝天白云，青山绿水"
fi

print_info "API密钥已读取: ${[REDACTED_SECRET]"
print_info "提示词: $PROMPT"

# ========================================
# 获取当前日期作为文件名
# ========================================
DATE=$(date +%Y%m%d_%H%M%S)
print_info "当前时间: $DATE"

# ========================================
# 第一步：创建任务
# ========================================
echo ""
print_info "正在创建生成任务..."
echo "========================================"

# 解析比例参数（第二个参数），默认 9:16
ASPECT_RATIO="${2:-9:16}"

# 验证比例是否合法
VALID_RATIOS="1:1 2:3 3:2 4:5 5:4 3:4 4:3 9:16 16:9 21:9"
if ! echo "$VALID_RATIOS" | grep -qw "$ASPECT_RATIO"; then
    print_warning "不支持的图片比例: $ASPECT_RATIO，使用默认 9:16"
    ASPECT_RATIO="9:16"
fi

print_info "图片比例: $ASPECT_RATIO"

# 构建JSON请求体 - 使用 BizyAir GPT_IMAGE_2 T2I API (web_app_id: 52416)
JSON_PAYLOAD=$(cat <<EOF
{
  "web_app_id": 52416,
  "suppress_preview_output": false,
  "input_values": {
    "4:BizyAir_GPT_IMAGE_2_T2I_API.prompt": "$PROMPT",
    "4:BizyAir_GPT_IMAGE_2_T2I_API.aspect_ratio": "$ASPECT_RATIO"
  }
}
EOF
)

# 发送API请求
# BizyAir GPT_IMAGE_2 为远程推理，生图耗时 90秒 ~ 10分钟不等
# --connect-timeout: 连接超时 30 秒
# --max-time: 总请求超时 600 秒（10 分钟），覆盖最慢情况
print_info "正在等待 API 响应（预计 90秒 ~ 10分钟）..."
RESPONSE=$(curl -s --connect-timeout 30 --max-time 600 -X POST "https://api.bizyair.cn/w/v1/webapp/task/openapi/create" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d "$JSON_PAYLOAD")

echo "API响应:"
echo "$RESPONSE" | jq '.' 2>/dev/null || echo "$RESPONSE"
echo ""

# 检查API状态
API_STATUS=$(echo "$RESPONSE" | grep -o '"status":"[^"]*"' | head -1 | cut -d'"' -f4)

if [ "$API_STATUS" != "Success" ]; then
    print_error "API调用失败，状态: $API_STATUS"
    ERROR_MSG=$(echo "$RESPONSE" | grep -o '"message":"[^"]*"' | head -1 | cut -d'"' -f4)
    if [ -n "$ERROR_MSG" ]; then
        print_error "错误信息: $ERROR_MSG"
    fi
    echo ""
    print_warning "请检查API密钥是否有效"
    exit 1
fi

print_info "API调用成功!"

# 从outputs数组提取图片URL和文件扩展名
IMAGE_URL=$(echo "$RESPONSE" | grep -o '"object_url":"[^"]*"' | head -1 | cut -d'"' -f4)
OUTPUT_EXT=$(echo "$RESPONSE" | grep -o '"output_ext":"[^"]*"' | head -1 | cut -d'"' -f4)

if [ -z "$IMAGE_URL" ]; then
    print_error "无法从outputs数组提取URL"
    exit 1
fi

print_info "获取到URL: $IMAGE_URL"

# ========================================
# 第二步：下载图片并保存到pic文件夹
# ========================================
echo ""
print_info "正在下载..."
echo "========================================"

# 确定文件扩展名，默认为.jpg
if [ -z "$OUTPUT_EXT" ]; then
    OUTPUT_EXT="jpg"
fi

OUTPUT_FILE="pic/${DATE}.${OUTPUT_EXT}"
# 图片下载超时：连接 30 秒，下载 120 秒
curl -s --connect-timeout 30 --max-time 120 -o "$OUTPUT_FILE" "$IMAGE_URL"

if [ -f "$OUTPUT_FILE" ]; then
    FILE_SIZE=$(stat -c%s "$OUTPUT_FILE" 2>/dev/null || stat -f%z "$OUTPUT_FILE" 2>/dev/null || wc -c < "$OUTPUT_FILE")
    echo ""
    echo "========================================"
    print_info "保存成功!"
    echo "========================================"
    echo "文件路径: $OUTPUT_FILE"
    echo "文件大小: $FILE_SIZE 字节"
    echo "完成时间: $(date '+%Y-%m-%d %H:%M:%S')"
    echo ""
    # 尝试在macOS上预览图片
    if [[ "$OSTYPE" == "darwin"* ]]; then
        print_info "正在打开图片预览..."
        open "$OUTPUT_FILE" 2>/dev/null &
    fi
else
    print_error "图片下载失败"
    exit 1
fi


path: scripts/image-to-image.sh
content: #!/bin/bash

# ========================================
# BOZO AIGC - 图生图工具 (Image-to-Image)
# ========================================
# 使用 BizyAir GPT_IMAGE_2 I2I API 根据参考图片生成新图片
# 支持 1-8 张参考图片输入
# 用法: ./image-to-image.sh "提示词" "图片URL1" ["图片URL2" ...] [比例]
# ========================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

print_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

print_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

print_warning() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

# ========================================
# 创建pic文件夹（如果不存在）
# ========================================
mkdir -p pic

# ========================================
# 从环境变量获取API密钥
# ========================================
[REDACTED_SECRET]"

if [ -z "$API_KEY" ]; then
    print_error "环境变量 BIZYAIR_API_KEY 未设置或为空"
    echo ""
    echo "请按以下方式设置环境变量："
    echo ""
    echo "  export BIZYAIR_API_KEY='你的API密钥'"
    echo "  # 永久设置：添加到 ~/.bashrc 或 ~/.zshrc"
    exit 1
fi

# ========================================
# 解析参数
# ========================================
# 参数格式: 提示词 图片URL1 [图片URL2...图片URL8] [比例]
# 最后一个参数如果匹配比例格式（如 16:9），则识别为比例

PROMPT="$1"
if [ -z "$PROMPT" ]; then
    print_error "缺少提示词参数"
    echo "用法: $0 \"提示词\" \"图片URL1\" [\"图片URL2\"...] [比例]"
    exit 1
fi

shift  # 移除提示词参数，剩余参数为图片URL和可能的比率

# 收集图片URL和比例
IMAGE_URLS=()
ASPECT_RATIO="9:16"  # 默认比例
VALID_RATIOS="1:1 2:3 3:2 4:5 5:4 3:4 4:3 9:16 16:9 21:9"

for arg in "$@"; do
    # 检查是否为比例参数
    if echo "$VALID_RATIOS" | grep -qw "$arg"; then
        ASPECT_RATIO="$arg"
    else
        IMAGE_URLS+=("$arg")
    fi
done

IMAGE_COUNT=${#IMAGE_URLS[@]}

if [ "$IMAGE_COUNT" -eq 0 ]; then
    print_error "缺少参考图片URL"
    echo "图生图需要至少提供 1 张参考图片 URL"
    echo "用法: $0 \"提示词\" \"图片URL1\" [\"图片URL2\"...] [比例]"
    exit 1
fi

if [ "$IMAGE_COUNT" -gt 8 ]; then
    print_error "最多支持 8 张参考图片，当前提供了 $IMAGE_COUNT 张"
    exit 1
fi

print_info "API密钥已读取: ${[REDACTED_SECRET]"
print_info "提示词: $PROMPT"
print_info "参考图片数量: $IMAGE_COUNT 张"
print_info "图片比例: $ASPECT_RATIO"

for i in "${!IMAGE_URLS[@]}"; do
    print_info "图片 $((i+1)): ${IMAGE_URLS[$i]:0:60}..."
done

# ========================================
# 根据图片数量确定 web_app_id 和图片节点 ID 映射
# ========================================
# 每个图片数量对应的 web_app_id 和 LoadImage 节点 ID 列表
# 节点ID顺序来源于 BizyAir API 文档
declare -A APP_IDS
APP_IDS=(
    [1]=52418
    [2]=52420
    [3]=52423
    [4]=52343
    [5]=52431
    [6]=52435
    [7]=52437
    [8]=52442
)

declare -A NODE_IDS_STR
NODE_IDS_STR=(
    [1]="7"
    [2]="7 8"
    [3]="7 8 9"
    [4]="7 8 9 10"
    [5]="7 8 9 10 11"
    [6]="7 8 9 10 11 12"
    [7]="7 8 9 10 11 12 18"
    [8]="7 8 9 10 11 12 18 20"
)

WEB_APP_ID="${APP_IDS[$IMAGE_COUNT]}"
NODE_IDS=(${NODE_IDS_STR[$IMAGE_COUNT]})

print_info "使用 web_app_id: $WEB_APP_ID (支持 ${IMAGE_COUNT} 张参考图)"

# ========================================
# 构建请求
# ========================================
DATE=$(date +%Y%m%d_%H%M%S)

echo ""
print_info "正在创建图生图任务..."
echo "========================================"

# 构建 input_values 的 JSON
# 先构建图片输入部分
INPUT_PARTS="\"6:BizyAir_GPT_IMAGE_2_I2I_API.prompt\": \"$PROMPT\",\n    \"6:BizyAir_GPT_IMAGE_2_I2I_API.aspect_ratio\": \"$ASPECT_RATIO\""

for i in "${!IMAGE_URLS[@]}"; do
    NODE_ID="${NODE_IDS[$i]}"
    URL="${IMAGE_URLS[$i]}"
    INPUT_PARTS="$INPUT_PARTS,\n    \"${NODE_ID}:LoadImage.image\": \"$URL\""
done

# 组装完整 JSON
JSON_PAYLOAD=$(printf "{
  \"web_app_id\": $WEB_APP_ID,
  \"suppress_preview_output\": false,
  \"input_values\": {
    %s
  }
}" "$INPUT_PARTS")

# 发送API请求
# BizyAir GPT_IMAGE_2 为远程推理，生图耗时 90秒 ~ 10分钟不等
# --connect-timeout: 连接超时 30 秒
# --max-time: 总请求超时 600 秒（10 分钟），覆盖最慢情况
print_info "正在等待 API 响应（预计 90秒 ~ 10分钟）..."
RESPONSE=$(curl -s --connect-timeout 30 --max-time 600 -X POST "https://api.bizyair.cn/w/v1/webapp/task/openapi/create" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d "$JSON_PAYLOAD")

echo "API响应:"
echo "$RESPONSE" | jq '.' 2>/dev/null || echo "$RESPONSE"
echo ""

# 检查API状态
API_STATUS=$(echo "$RESPONSE" | grep -o '"status":"[^"]*"' | head -1 | cut -d'"' -f4)

if [ "$API_STATUS" != "Success" ]; then
    print_error "API调用失败，状态: $API_STATUS"
    ERROR_MSG=$(echo "$RESPONSE" | grep -o '"message":"[^"]*"' | head -1 | cut -d'"' -f4)
    if [ -n "$ERROR_MSG" ]; then
        print_error "错误信息: $ERROR_MSG"
    fi
    exit 1
fi

print_info "API调用成功!"

# ========================================
# 下载图片
# ========================================
IMAGE_URL=$(echo "$RESPONSE" | grep -o '"object_url":"[^"]*"' | head -1 | cut -d'"' -f4)
OUTPUT_EXT=$(echo "$RESPONSE" | grep -o '"output_ext":"[^"]*"' | head -1 | cut -d'"' -f4)

if [ -z "$IMAGE_URL" ]; then
    print_error "无法从响应中提取图片URL"
    exit 1
fi

print_info "获取到URL: $IMAGE_URL"

echo ""
print_info "正在下载..."
echo "========================================"

if [ -z "$OUTPUT_EXT" ]; then
    OUTPUT_EXT="png"
fi

# 移除可能的点号前缀
OUTPUT_EXT="${OUTPUT_EXT#.}"

OUTPUT_FILE="pic/${DATE}.${OUTPUT_EXT}"
# 图片下载超时：连接 30 秒，下载 120 秒
curl -s --connect-timeout 30 --max-time 120 -o "$OUTPUT_FILE" "$IMAGE_URL"

if [ -f "$OUTPUT_FILE" ]; then
    FILE_SIZE=$(stat -c%s "$OUTPUT_FILE" 2>/dev/null || stat -f%z "$OUTPUT_FILE" 2>/dev/null || wc -c < "$OUTPUT_FILE")
    echo ""
    echo "========================================"
    print_info "保存成功!"
    echo "========================================"
    echo "文件路径: $OUTPUT_FILE"
    echo "文件大小: $FILE_SIZE 字节"
    echo "完成时间: $(date '+%Y-%m-%d %H:%M:%S')"
    echo ""
    # macOS 自动预览
    if [[ "$OSTYPE" == "darwin"* ]]; then
        print_info "正在打开图片预览..."
        open "$OUTPUT_FILE" 2>/dev/null &
    fi
else
    print_error "图片下载失败"
    exit 1
fi


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