Update gen-image skill specs
This commit is contained in:
+20
-8
@@ -3,7 +3,7 @@
|
||||
本目录是一个「生图」工具:通过大模型中转站调用 OpenAI 图片接口,生成位图图像。
|
||||
当用户表达以下意图时,**应主动调用本工具**,而不是自己画 SVG/HTML 或拒绝:
|
||||
|
||||
- 「生成一张图 / 画一张 / AI 出图 / 做个头像·海报·插画·图标·壁纸」
|
||||
- 「生成一张图 / 画一张 / AI 出图 / 做个头像·海报·插画·封面·图标·壁纸」
|
||||
- 「文生图 / image generation」
|
||||
- 给了一张图并说「基于它改 / 换背景 / 局部重绘」→ 图生图
|
||||
|
||||
@@ -15,14 +15,17 @@
|
||||
# 文生图(默认 1024x1024)
|
||||
./gen.sh "a fluffy orange cat on a windowsill, soft morning light, highly detailed"
|
||||
|
||||
# 指定尺寸 / 画质 / 张数
|
||||
./gen.sh "cyberpunk city poster" --size 1536x1024 --quality high --n 2
|
||||
# 指定尺寸 / 画质 / 张数(支持 1K / 2K / 4K 规格别名)
|
||||
./gen.sh "cyberpunk city poster" --size 2k-landscape --quality high --n 2
|
||||
|
||||
# 透明背景(图标 / 贴纸)
|
||||
./gen.sh "a minimalist mountain logo, flat vector" --background transparent
|
||||
|
||||
# 传独立风格参数(仅部分模型/中转支持;通用做法仍是把风格写进 prompt)
|
||||
./gen.sh "a studio portrait, natural light" --style natural --size 1k-portrait
|
||||
|
||||
# 图生图 / 编辑(用户提供了输入图)
|
||||
./gen.sh "把背景换成雪山日落" --edit /path/to/input.png
|
||||
./gen.sh "把背景换成雪山日落" --edit /path/to/input.png --size 1k-square
|
||||
|
||||
# 局部重绘(mask PNG 中透明处 = 要重绘的区域)
|
||||
./gen.sh "戴上一顶红帽子" --edit input.png --mask mask.png
|
||||
@@ -34,11 +37,20 @@
|
||||
|
||||
| 需求 | 参数 |
|
||||
|------|------|
|
||||
| 方图(头像/图标) | `--size 1024x1024` |
|
||||
| 横图(海报/封面) | `--size 1536x1024` |
|
||||
| 竖图(壁纸/人像) | `--size 1024x1536` |
|
||||
| 1K 方图(头像/图标) | `--size 1k-square` 或 `--size 1024x1024` |
|
||||
| 1K 横图(海报/封面) | `--size 1k-landscape` 或 `--size 1536x1024` |
|
||||
| 1K 竖图(壁纸/人像) | `--size 1k-portrait` 或 `--size 1024x1536` |
|
||||
| 2K 方图 | `--size 2k-square` 或 `--size 2048x2048` |
|
||||
| 2K 横图 | `--size 2k-landscape` 或 `--size 2048x1536` |
|
||||
| 2K 竖图 | `--size 2k-portrait` 或 `--size 1536x2048` |
|
||||
| 2K 宽屏/竖屏 | `--size 2k-wide` / `--size 2k-tall` |
|
||||
| 4K 方图 | `--size 4k-square` 或 `--size 4096x4096` |
|
||||
| 4K 横图 | `--size 4k-landscape` 或 `--size 4096x3072` |
|
||||
| 4K 竖图 | `--size 4k-portrait` 或 `--size 3072x4096` |
|
||||
| 4K 宽屏/壁纸 | `--size 4k-wide` / `--size 4k-uhd` / `--size 4k-tall` / `--size 4k-uhd-portrait` |
|
||||
| 透明背景 | `--background transparent` |
|
||||
| 画质 | `--quality low\|medium\|high\|auto` |
|
||||
| 风格字段 | `--style natural` / `--style vivid` / `--style anime` / `--style photorealistic`(看上游支持情况) |
|
||||
| 多张挑选 | `--n 4` |
|
||||
| 换模型 | `--model dall-e-3` |
|
||||
| 图生图 | `--edit 图片路径`(可多次) |
|
||||
@@ -46,7 +58,7 @@
|
||||
|
||||
## 使用要点
|
||||
|
||||
1. **先打磨提示词**:用户描述通常很短,先扩写成信息充分的提示词(主体、风格、光线、构图、色调、画质词)再调用。除非用户要求逐字使用。
|
||||
1. **先打磨提示词**:用户描述通常很短,先扩写成信息充分的提示词(主体、风格、光线、构图、色调、画质词)再调用。除非用户要求逐字使用。风格优先写进 prompt,`--style` 只在目标模型/中转明确支持时使用。
|
||||
2. **凭证**:脚本自动读本目录 `.env`(含中转站地址与 API Key),无需在命令里传 key。**不要把 key 打印到对话里,也不要提交 `.env`。**
|
||||
3. **报错处理**:
|
||||
- 401/403 → key 无效或额度不足(403 error 1010 是 WAF 拦截,脚本已带浏览器 UA 规避)。
|
||||
|
||||
+19
-4
@@ -1,6 +1,6 @@
|
||||
# gen-image · 生图 Skill
|
||||
|
||||
通过大模型中转站,直接调用 OpenAI 图片接口生图。文生图 / 图生图 / 局部重绘 / 透明背景,零第三方依赖。
|
||||
通过大模型中转站,直接调用 OpenAI 图片接口生图。文生图 / 图生图 / 局部重绘 / 透明背景 / 1K-4K 常用尺寸 / 可选 style 风格参数,零第三方依赖。
|
||||
|
||||
## 快速开始
|
||||
|
||||
@@ -11,13 +11,16 @@ cp .env.example .env
|
||||
|
||||
# 2. 文生图
|
||||
python3 scripts/gen_image.py "a cozy cabin in snowy mountains, golden hour, cinematic" \
|
||||
--size 1536x1024 --quality high
|
||||
--size 2k-landscape --quality high
|
||||
|
||||
# 3. 图生图 / 编辑
|
||||
python3 scripts/gen_image.py "把背景换成星空" --edit input.png
|
||||
python3 scripts/gen_image.py "把背景换成星空" --edit input.png --size 1k-square
|
||||
|
||||
# 4. 局部重绘(mask 透明处为重绘区域)
|
||||
python3 scripts/gen_image.py "戴上一顶红帽子" --edit input.png --mask mask.png
|
||||
|
||||
# 5. 可选 style 参数(部分模型/中转支持)
|
||||
python3 scripts/gen_image.py "a studio portrait, natural light" --style natural --size 1k-portrait
|
||||
```
|
||||
|
||||
图片保存到 `output/`,脚本打印完整路径。
|
||||
@@ -32,9 +35,21 @@ python3 scripts/gen_image.py "戴上一顶红帽子" --edit input.png --mask mas
|
||||
|
||||
## 参数
|
||||
|
||||
`--size` `--n` `--quality` `--background transparent` `--edit`(可多次) `--mask` `--model` `--output`
|
||||
`--size` `--n` `--quality` `--background transparent` `--style` `--edit`(可多次) `--mask` `--model` `--output`
|
||||
详见 `python3 scripts/gen_image.py --help` 与 `SKILL.md`。
|
||||
|
||||
## 尺寸与风格
|
||||
|
||||
`--size` 支持直接传像素值,也支持别名:
|
||||
|
||||
| 规格 | 常用别名 |
|
||||
|------|----------|
|
||||
| 1K | `1k-square`、`1k-landscape`、`1k-portrait` |
|
||||
| 2K | `2k-square`、`2k-landscape`、`2k-portrait`、`2k-wide`、`2k-tall` |
|
||||
| 4K | `4k-square`、`4k-landscape`、`4k-portrait`、`4k-wide`、`4k-tall`、`4k-uhd`、`4k-uhd-portrait` |
|
||||
|
||||
风格优先写进 prompt;目标模型或中转明确支持独立风格字段时,可额外传 `--style natural`、`--style vivid`、`--style anime`、`--style photorealistic` 等。
|
||||
|
||||
## 安全
|
||||
|
||||
`.env` 与 `output/` 已在 `.gitignore` 中,不会提交。切勿把 API Key 写进代码或对话。
|
||||
|
||||
+33
-8
@@ -1,11 +1,11 @@
|
||||
---
|
||||
name: gen-image
|
||||
description: 调用大模型中转站的 OpenAI 图片接口生图(文生图、图生图/编辑、局部重绘、透明背景)。触发词:生图、生成图片、画一张、AI 画图、文生图、图生图、生成插画/头像/海报/图标、image generation、根据这张图改。需要外部 API 生成位图图像时使用;纯 HTML/SVG/矢量设计不适用。
|
||||
description: 调用大模型中转站的 OpenAI 图片接口生图(文生图、图生图/编辑、局部重绘、透明背景)。支持 1K/2K/4K 常用尺寸规格、横竖方比例、质量、背景和可选 style 风格参数。触发词:生图、生成图片、画一张、AI 画图、文生图、图生图、生成插画/头像/海报/封面/壁纸/图标、image generation、根据这张图改。需要外部 API 生成位图图像时使用;纯 HTML/SVG/矢量设计不适用。
|
||||
---
|
||||
|
||||
# gen-image · 生图
|
||||
|
||||
通过大模型中转站,直接调用 OpenAI 图片接口生成位图图像。支持**文生图**、**图生图/编辑**、**局部重绘(mask)**、**透明背景**。
|
||||
通过大模型中转站,直接调用 OpenAI 图片接口生成位图图像。支持**文生图**、**图生图/编辑**、**局部重绘(mask)**、**透明背景**、**1K/2K/4K 常用尺寸**和**可选 style 风格参数**。
|
||||
|
||||
核心是零依赖脚本 `scripts/gen_image.py`(纯 Python 标准库,无需 pip install)。
|
||||
|
||||
@@ -41,9 +41,10 @@ cp .env.example .env
|
||||
**1. 打磨提示词。** 用户给的描述往往简短,先在心里扩写成一句信息充分的英文或中文提示词——主体、风格、光线、构图、色调、画质关键词。除非用户明确要求逐字使用,否则主动增强。生图模型对细节敏感,「一只猫」远不如「a fluffy orange tabby cat sitting on a windowsill, soft morning light, shallow depth of field, cozy warm tones」。
|
||||
|
||||
**2. 选参数:**
|
||||
- `--size`:`1024x1024`(方,头像/图标)、`1536x1024`(横,海报/封面)、`1024x1536`(竖,手机壁纸/人像)、`auto`
|
||||
- `--size`:支持直接传像素值或别名。默认 `1024x1024`;常用别名见「尺寸规格速查」。
|
||||
- `--quality`:`low`/`medium`/`high`/`auto`(gpt-image 系支持;越高越慢越贵)
|
||||
- `--background transparent`:要透明底的图标/贴纸时加
|
||||
- `--style`:部分模型/中转支持的独立风格参数,如 `vivid`、`natural`、`anime`、`photorealistic`。若上游不支持,把风格写进 prompt。
|
||||
- `--n`:一次出几张(默认 1;多给几张让用户挑时用 `--n 2` 或 `4`)
|
||||
|
||||
**3. 执行(文生图):**
|
||||
@@ -51,7 +52,7 @@ cp .env.example .env
|
||||
```bash
|
||||
cd "<skill 根目录>" && python3 scripts/gen_image.py \
|
||||
"a fluffy orange tabby cat on a windowsill, soft morning light, cozy tones, highly detailed" \
|
||||
--size 1024x1024 --quality high
|
||||
--size 1k-square --quality high
|
||||
```
|
||||
|
||||
图片存到 `output/img-<时间戳>-<序号>.png`,脚本会打印完整路径。
|
||||
@@ -59,23 +60,47 @@ cd "<skill 根目录>" && python3 scripts/gen_image.py \
|
||||
**4. 图生图 / 编辑**(用户给了输入图):
|
||||
|
||||
```bash
|
||||
python3 scripts/gen_image.py "把背景换成雪山日落" --edit /path/to/input.png --size 1024x1024
|
||||
python3 scripts/gen_image.py "把背景换成雪山日落" --edit /path/to/input.png --size 1k-square
|
||||
```
|
||||
|
||||
多图参考:多次 `--edit a.png --edit b.png`。局部重绘:加 `--mask mask.png`(PNG 中**透明区域**为要重绘的部分,其余保留)。
|
||||
|
||||
**5. 交付。** 打印出保存路径后,简要告诉用户生成了什么、存在哪。图无法在终端直接显示,用户会自己打开;若在支持预览的环境可提示路径。
|
||||
|
||||
## 尺寸规格速查
|
||||
|
||||
脚本会把下列别名转换为实际像素;也可以直接传 `WIDTHxHEIGHT` 或 `auto`。部分中转/模型可能只开放其中一部分规格,遇到 400 时降低到 1K 或改用上游明确支持的尺寸。
|
||||
|
||||
| 规格 | 方图 | 横图 | 竖图 | 宽屏/超宽 | 典型用途 |
|
||||
|------|------|------|------|-----------|----------|
|
||||
| 1K | `1k-square` → `1024x1024` | `1k-landscape` → `1536x1024` | `1k-portrait` → `1024x1536` | - | 头像、图标、草图、普通配图 |
|
||||
| 2K | `2k-square` → `2048x2048` | `2k-landscape` → `2048x1536` | `2k-portrait` → `1536x2048` | `2k-wide` → `2048x1152` / `2k-tall` → `1152x2048` | 海报、封面、高清社媒图 |
|
||||
| 4K | `4k-square` → `4096x4096` | `4k-landscape` → `4096x3072` | `4k-portrait` → `3072x4096` | `4k-wide` → `4096x2304` / `4k-uhd` → `3840x2160` / `4k-tall` → `2304x4096` / `4k-uhd-portrait` → `2160x3840` | 大屏封面、展板、高清壁纸 |
|
||||
|
||||
## 风格参数速查
|
||||
|
||||
优先把风格写进 prompt,因为所有模型都能理解自然语言风格。仅当目标中转或模型明确支持独立风格字段时,再额外传 `--style`。
|
||||
|
||||
| 需求 | 推荐写法 |
|
||||
|------|---------|
|
||||
| 写实摄影 | prompt 写 `photorealistic, cinematic lighting, natural skin texture`,可加 `--style photorealistic` |
|
||||
| 插画 | prompt 写 `editorial illustration, clean shapes, rich color palette`,可加 `--style illustration` |
|
||||
| 动漫 | prompt 写 `anime style, expressive linework, cel shading`,可加 `--style anime` |
|
||||
| 自然风格 | prompt 写清现实光线和材质,可加 `--style natural` |
|
||||
| 鲜艳风格 | prompt 写高饱和、强对比,可加 `--style vivid` |
|
||||
|
||||
## 常见参数速查
|
||||
|
||||
| 需求 | 命令片段 |
|
||||
|------|---------|
|
||||
| 头像/图标(方图) | `--size 1024x1024` |
|
||||
| 海报/封面(横) | `--size 1536x1024` |
|
||||
| 手机壁纸/人像(竖) | `--size 1024x1536` |
|
||||
| 头像/图标(方图) | `--size 1k-square` 或 `--size 1024x1024` |
|
||||
| 海报/封面(横) | `--size 1k-landscape` / `2k-landscape` / `4k-wide` |
|
||||
| 手机壁纸/人像(竖) | `--size 1k-portrait` / `2k-portrait` / `4k-tall` |
|
||||
| 4K 壁纸 | `--size 4k-uhd` |
|
||||
| 透明背景贴纸 | `--background transparent` |
|
||||
| 多出几张挑选 | `--n 4` |
|
||||
| 高画质 | `--quality high` |
|
||||
| 独立风格字段 | `--style natural` 或 `--style vivid`(看上游支持情况) |
|
||||
| 换模型 | `--model dall-e-3` |
|
||||
| 基于图改 | `--edit input.png` |
|
||||
| 局部重绘 | `--edit input.png --mask mask.png` |
|
||||
|
||||
+3
-2
@@ -1,13 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# gen.sh — 生图快捷入口。用法:
|
||||
# ./gen.sh "提示词" # 文生图,默认 1024x1024
|
||||
# ./gen.sh "提示词" --size 1536x1024 # 透传任意 gen_image.py 参数
|
||||
# ./gen.sh "提示词" --size 2k-landscape # 透传任意 gen_image.py 参数
|
||||
# ./gen.sh "提示词" --style natural # 部分模型/中转支持独立风格参数
|
||||
# ./gen.sh "换成雪山背景" --edit in.png # 图生图
|
||||
# 无论从哪个目录调用都能正确定位脚本与 .env。
|
||||
set -euo pipefail
|
||||
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
if [ "$#" -eq 0 ]; then
|
||||
echo "用法: ./gen.sh \"提示词\" [--size 1024x1024] [--quality high] [--edit 图.png] ..." >&2
|
||||
echo "用法: ./gen.sh \"提示词\" [--size 1k-square|2k-landscape|4k-wide] [--quality high] [--style natural] [--edit 图.png] ..." >&2
|
||||
exit 1
|
||||
fi
|
||||
exec python3 "$DIR/scripts/gen_image.py" "$@"
|
||||
|
||||
@@ -6,10 +6,10 @@ gen_image.py — 通过大模型中转站调用 OpenAI 图片接口生图(文
|
||||
|
||||
用法:
|
||||
# 文生图
|
||||
python3 gen_image.py "一只戴墨镜的柴犬,赛博朋克霓虹背景" --size 1024x1024 --n 1
|
||||
python3 gen_image.py "一只戴墨镜的柴犬,赛博朋克霓虹背景" --size 1k-square --n 1
|
||||
|
||||
# 图生图 / 编辑(可选 --mask 做局部重绘)
|
||||
python3 gen_image.py "把背景换成雪山" --edit input.png --mask mask.png
|
||||
python3 gen_image.py "把背景换成雪山" --edit input.png --mask mask.png --size 2k-landscape
|
||||
|
||||
环境变量(也可写进 .env):
|
||||
IMAGE_API_BASE_URL 中转站基址,如 https://your-relay.com (会自动补 /v1/images/...)
|
||||
@@ -29,6 +29,41 @@ import urllib.request
|
||||
import uuid
|
||||
|
||||
|
||||
SIZE_ALIASES = {
|
||||
# 1K / gpt-image 常用尺寸
|
||||
"1k": "1024x1024",
|
||||
"1k-square": "1024x1024",
|
||||
"1k-landscape": "1536x1024",
|
||||
"1k-portrait": "1024x1536",
|
||||
"square": "1024x1024",
|
||||
"landscape": "1536x1024",
|
||||
"portrait": "1024x1536",
|
||||
# 2K 常用尺寸
|
||||
"2k": "2048x2048",
|
||||
"2k-square": "2048x2048",
|
||||
"2k-landscape": "2048x1536",
|
||||
"2k-portrait": "1536x2048",
|
||||
"2k-wide": "2048x1152",
|
||||
"2k-tall": "1152x2048",
|
||||
# 4K 常用尺寸
|
||||
"4k": "4096x4096",
|
||||
"4k-square": "4096x4096",
|
||||
"4k-landscape": "4096x3072",
|
||||
"4k-portrait": "3072x4096",
|
||||
"4k-wide": "4096x2304",
|
||||
"4k-tall": "2304x4096",
|
||||
"4k-uhd": "3840x2160",
|
||||
"4k-uhd-portrait": "2160x3840",
|
||||
}
|
||||
|
||||
|
||||
def normalize_size(size):
|
||||
"""把 1k/2k/4k 语义别名转成接口常见的 WIDTHxHEIGHT;未知值原样透传。"""
|
||||
if not size:
|
||||
return "1024x1024"
|
||||
return SIZE_ALIASES.get(size.strip().lower(), size)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 配置加载
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -165,13 +200,24 @@ def save_images(resp, out_dir, prefix):
|
||||
# ---------------------------------------------------------------------------
|
||||
def main():
|
||||
load_dotenv()
|
||||
p = argparse.ArgumentParser(description="通过中转站调用 OpenAI 图片接口生图")
|
||||
p = argparse.ArgumentParser(
|
||||
description="通过中转站调用 OpenAI 图片接口生图",
|
||||
formatter_class=argparse.RawDescriptionHelpFormatter,
|
||||
epilog=(
|
||||
"常用尺寸别名:\n"
|
||||
" 1k-square=1024x1024, 1k-landscape=1536x1024, 1k-portrait=1024x1536\n"
|
||||
" 2k-square=2048x2048, 2k-landscape=2048x1536, 2k-portrait=1536x2048, 2k-wide=2048x1152\n"
|
||||
" 4k-square=4096x4096, 4k-landscape=4096x3072, 4k-portrait=3072x4096, 4k-wide=4096x2304, 4k-uhd=3840x2160\n"
|
||||
"也可以直接传 1024x1024、2048x1152、4096x2304 或 auto。\n"
|
||||
),
|
||||
)
|
||||
p.add_argument("prompt", help="生图提示词")
|
||||
p.add_argument("--model", default=None, help="覆盖默认模型")
|
||||
p.add_argument("--size", default="1024x1024", help="尺寸,如 1024x1024 / 1536x1024 / 1024x1536 / auto")
|
||||
p.add_argument("--size", default="1024x1024", help="尺寸或别名,如 1024x1024 / 1k-square / 2k-landscape / 4k-wide / auto")
|
||||
p.add_argument("--n", type=int, default=1, help="生成张数")
|
||||
p.add_argument("--quality", default=None, help="质量: low/medium/high/auto(gpt-image 系)")
|
||||
p.add_argument("--background", default=None, help="transparent/opaque/auto(gpt-image 系,透明背景)")
|
||||
p.add_argument("--style", default=None, help="风格参数,部分模型/中转支持,如 vivid/natural/anime/photorealistic;不支持时把风格写进 prompt")
|
||||
p.add_argument("--edit", action="append", default=[], help="图生图/编辑的输入图(可多次传入多图)")
|
||||
p.add_argument("--mask", default=None, help="局部重绘蒙版 PNG(透明处为要重绘的区域)")
|
||||
p.add_argument("--output", default=None, help="输出目录(默认 skill 根下 output/)")
|
||||
@@ -179,34 +225,39 @@ def main():
|
||||
|
||||
base, key, default_model = get_config()
|
||||
model = args.model or default_model
|
||||
size = normalize_size(args.size)
|
||||
skill_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
out_dir = args.output or os.path.join(skill_root, "output")
|
||||
|
||||
if args.edit:
|
||||
# 图生图 / 编辑:multipart 到 /v1/images/edits
|
||||
url = f"{base}/v1/images/edits"
|
||||
fields = {"model": model, "prompt": args.prompt, "n": str(args.n), "size": args.size}
|
||||
fields = {"model": model, "prompt": args.prompt, "n": str(args.n), "size": size}
|
||||
if args.quality:
|
||||
fields["quality"] = args.quality
|
||||
if args.background:
|
||||
fields["background"] = args.background
|
||||
if args.style:
|
||||
fields["style"] = args.style
|
||||
files = [("image[]", pth) for pth in args.edit] # 多图统一用 image[]
|
||||
if len(args.edit) == 1:
|
||||
files = [("image", args.edit[0])] # 单图用 image,兼容 dall-e-2 风格
|
||||
if args.mask:
|
||||
files.append(("mask", args.mask))
|
||||
print(f"[gen_image] 图生图 · model={model} · {len(args.edit)} 张输入 · size={args.size}")
|
||||
print(f"[gen_image] 图生图 · model={model} · {len(args.edit)} 张输入 · size={size}")
|
||||
resp = post_multipart(url, key, fields, files)
|
||||
prefix = "edit"
|
||||
else:
|
||||
# 文生图:JSON 到 /v1/images/generations
|
||||
url = f"{base}/v1/images/generations"
|
||||
payload = {"model": model, "prompt": args.prompt, "n": args.n, "size": args.size}
|
||||
payload = {"model": model, "prompt": args.prompt, "n": args.n, "size": size}
|
||||
if args.quality:
|
||||
payload["quality"] = args.quality
|
||||
if args.background:
|
||||
payload["background"] = args.background
|
||||
print(f"[gen_image] 文生图 · model={model} · n={args.n} · size={args.size}")
|
||||
if args.style:
|
||||
payload["style"] = args.style
|
||||
print(f"[gen_image] 文生图 · model={model} · n={args.n} · size={size}")
|
||||
resp = post_json(url, key, payload)
|
||||
prefix = "img"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user