Update gen-image skill catalog entry
This commit is contained in:
@@ -6,10 +6,10 @@ gen_image.py — 通过大模型中转站调用 OpenAI 图片接口生图(文
|
||||
|
||||
用法:
|
||||
# 文生图
|
||||
python3 gen_image.py "一只戴墨镜的柴犬,赛博朋克霓虹背景" --size 1k-square --n 1
|
||||
python3 gen_image.py "一只戴墨镜的柴犬,赛博朋克霓虹背景" --size 1024x1024 --n 1
|
||||
|
||||
# 图生图 / 编辑(可选 --mask 做局部重绘)
|
||||
python3 gen_image.py "把背景换成雪山" --edit input.png --mask mask.png --size 2k-landscape
|
||||
python3 gen_image.py "把背景换成雪山" --edit input.png --mask mask.png
|
||||
|
||||
环境变量(也可写进 .env):
|
||||
IMAGE_API_BASE_URL 中转站基址,如 https://your-relay.com (会自动补 /v1/images/...)
|
||||
@@ -29,41 +29,6 @@ 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)
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 配置加载
|
||||
# ---------------------------------------------------------------------------
|
||||
@@ -88,9 +53,9 @@ def get_config():
|
||||
key = os.environ.get("IMAGE_API_KEY", "")
|
||||
model = os.environ.get("IMAGE_MODEL", "gpt-image-2")
|
||||
if not base:
|
||||
die("缺少 IMAGE_API_BASE_URL(中转站基址)。请在 .env 中配置,参考 .env.example。")
|
||||
die("缺少 IMAGE_API_BASE_URL(中转站基址)。请在工具箱「中转」里勾选用于生图,或在 .env 中配置。")
|
||||
if not key:
|
||||
die("缺少 IMAGE_API_KEY。请在 .env 中配置,参考 .env.example。")
|
||||
die("缺少 IMAGE_API_KEY。请在工具箱「中转」里勾选用于生图,或在 .env 中配置。")
|
||||
# 允许用户直接填到 /v1,做个兼容归一
|
||||
if base.endswith("/v1"):
|
||||
base = base[: -len("/v1")]
|
||||
@@ -200,24 +165,13 @@ def save_images(resp, out_dir, prefix):
|
||||
# ---------------------------------------------------------------------------
|
||||
def main():
|
||||
load_dotenv()
|
||||
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 = argparse.ArgumentParser(description="通过中转站调用 OpenAI 图片接口生图")
|
||||
p.add_argument("prompt", help="生图提示词")
|
||||
p.add_argument("--model", default=None, help="覆盖默认模型")
|
||||
p.add_argument("--size", default="1024x1024", help="尺寸或别名,如 1024x1024 / 1k-square / 2k-landscape / 4k-wide / auto")
|
||||
p.add_argument("--size", default="1024x1024", help="尺寸,如 1024x1024 / 1536x1024 / 1024x1536 / 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/)")
|
||||
@@ -225,39 +179,34 @@ 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": size}
|
||||
fields = {"model": model, "prompt": args.prompt, "n": str(args.n), "size": args.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={size}")
|
||||
print(f"[gen_image] 图生图 · model={model} · {len(args.edit)} 张输入 · size={args.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": size}
|
||||
payload = {"model": model, "prompt": args.prompt, "n": args.n, "size": args.size}
|
||||
if args.quality:
|
||||
payload["quality"] = args.quality
|
||||
if args.background:
|
||||
payload["background"] = args.background
|
||||
if args.style:
|
||||
payload["style"] = args.style
|
||||
print(f"[gen_image] 文生图 · model={model} · n={args.n} · size={size}")
|
||||
print(f"[gen_image] 文生图 · model={model} · n={args.n} · size={args.size}")
|
||||
resp = post_json(url, key, payload)
|
||||
prefix = "img"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user