diff --git a/gen-image/.env.example b/gen-image/.env.example index 18abd65..244ed36 100644 --- a/gen-image/.env.example +++ b/gen-image/.env.example @@ -1,11 +1,13 @@ # 大模型中转站 · OpenAI 图片接口生图配置 -# 复制本文件为 .env 并填入你的真实值。不要提交 .env 到 git。 +# +# 推荐:TD工具箱「中转」里勾选一个分组「用于 Codex 生图」,会自动写入本目录 .env。 +# 手动:复制本文件为 .env 并填入你自己的真实值。不要提交含真实 Key 的文件到 git。 -# 中转站基址(不要带 /v1/images/... 后缀,脚本会自动补全) +# 你自己的中转站基址(不要带 /v1/images/... 后缀,脚本会自动补全) # 例:https://api.your-relay.com IMAGE_API_BASE_URL=https://your-relay.com -# 中转站分配的 API Key +# 你自己的中转站 API Key IMAGE_API_KEY=sk-your-key-here # 默认生图模型(可用 --model 临时覆盖) diff --git a/gen-image/.gitignore b/gen-image/.gitignore index d44022e..2d4e7c6 100644 --- a/gen-image/.gitignore +++ b/gen-image/.gitignore @@ -7,3 +7,6 @@ output/ # Python __pycache__/ *.pyc + +# macOS +.DS_Store diff --git a/gen-image/AGENTS.md b/gen-image/AGENTS.md index 7397084..f779424 100644 --- a/gen-image/AGENTS.md +++ b/gen-image/AGENTS.md @@ -3,32 +3,29 @@ 本目录是一个「生图」工具:通过大模型中转站调用 OpenAI 图片接口,生成位图图像。 当用户表达以下意图时,**应主动调用本工具**,而不是自己画 SVG/HTML 或拒绝: -- 「生成一张图 / 画一张 / AI 出图 / 做个头像·海报·插画·封面·图标·壁纸」 -- 「文生图 / image generation」 +- 「生成一张图 / 画一张 / AI 出图 / 做个头像·海报·封面·视频封面·标题图·插画·图标·壁纸」 +- 「文生图 / image generation / 做封面」 - 给了一张图并说「基于它改 / 换背景 / 局部重绘」→ 图生图 ## 如何调用 -统一入口是本目录下的 `gen.sh`(无论当前工作目录在哪,都用绝对/相对路径定位到它): +统一入口是**所加载技能目录**下的 `gen.sh`。先根据 `SKILL.md` 的所在目录解析 ``,执行 `/gen.sh`;不要在用户工作区用 `./gen.sh` 猜测路径,否则可能读到另一份 `.env`。 ```bash # 文生图(默认 1024x1024) -./gen.sh "a fluffy orange cat on a windowsill, soft morning light, highly detailed" +"/gen.sh" "a fluffy orange cat on a windowsill, soft morning light, highly detailed" -# 指定尺寸 / 画质 / 张数(支持 1K / 2K / 4K 规格别名) -./gen.sh "cyberpunk city poster" --size 2k-landscape --quality high --n 2 +# 指定尺寸 / 画质 / 张数 +"/gen.sh" "cyberpunk city poster" --size 1536x1024 --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" "a minimalist mountain logo, flat vector" --background transparent # 图生图 / 编辑(用户提供了输入图) -./gen.sh "把背景换成雪山日落" --edit /path/to/input.png --size 1k-square +"/gen.sh" "把背景换成雪山日落" --edit /path/to/input.png # 局部重绘(mask PNG 中透明处 = 要重绘的区域) -./gen.sh "戴上一顶红帽子" --edit input.png --mask mask.png +"/gen.sh" "戴上一顶红帽子" --edit input.png --mask mask.png ``` 生成的图片保存在本目录 `output/`,命令会打印完整路径。把该路径告诉用户。 @@ -37,20 +34,11 @@ | 需求 | 参数 | |------|------| -| 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` | +| 方图(头像/图标) | `--size 1024x1024` | +| 横图(海报/封面) | `--size 1536x1024` | +| 竖图(壁纸/人像) | `--size 1024x1536` | | 透明背景 | `--background transparent` | | 画质 | `--quality low\|medium\|high\|auto` | -| 风格字段 | `--style natural` / `--style vivid` / `--style anime` / `--style photorealistic`(看上游支持情况) | | 多张挑选 | `--n 4` | | 换模型 | `--model dall-e-3` | | 图生图 | `--edit 图片路径`(可多次) | @@ -58,15 +46,27 @@ ## 使用要点 -1. **先打磨提示词**:用户描述通常很短,先扩写成信息充分的提示词(主体、风格、光线、构图、色调、画质词)再调用。除非用户要求逐字使用。风格优先写进 prompt,`--style` 只在目标模型/中转明确支持时使用。 -2. **凭证**:脚本自动读本目录 `.env`(含中转站地址与 API Key),无需在命令里传 key。**不要把 key 打印到对话里,也不要提交 `.env`。** +1. **提示词原样直传(最高优先级)**:被触发后,把用户这段话**原样**作为提示词——不改写、不扩写、不翻译、不加风格/光线/构图/画质词,尤其标题/文字一个字都别动。你只判断一件事:用户**是不是要生图**;是,就转发原话。图像模型自己懂自然语言,不需要你替它加工;多一次加工只会改坏用户要保留的内容(尤其标题)。唯一例外:用户**明确**说"帮我润色/扩写提示词"时才加工。 +2. **凭证(每人用自己的号)**:首次使用前若本目录无 `.env`,引导用户去 TD工具箱「中转」,给一个支持 OpenAI 图片接口的分组勾选「☑ 在 Codex 中用于生图」并保存——工具箱会自动把该分组的 base_url+密钥写进本技能 `.env`。无工具箱时改用 `cp .env.example .env` 手动填。之后脚本自动读取,无需在命令里传 key。**不要把 key 打印到对话里,也不要提交到 git。** 3. **报错处理**: - 401/403 → key 无效或额度不足(403 error 1010 是 WAF 拦截,脚本已带浏览器 UA 规避)。 - 404 → base_url 或接口路径不对。 - 400 model 相关 → 中转站不认该模型,换 `--model dall-e-3` 或问用户支持的模型名。 4. 不适用:HTML 原型、幻灯片、矢量图标、图表可视化——那些应直接写代码,不要用本工具。 +## ⚠️ 带文字的封面 / 视频封面 / 海报(重点) + +「做个 B站/抖音视频封面」「带标题的海报」**整个任务就是一次生图调用**——不要拆成「生个背景图 + 自己用 SVG/HTML 画文字」两步,也不要自作主张补风格词。这是最常见的跑偏。 + +正确做法:把**标题和用户原话原样**写进提示词,用横图尺寸,一次性出成品: +```bash +"/gen.sh" "B站视频封面图,标题是《从零搭建个人知识库》" --size 1536x1024 --quality high +``` +- 不要在生图之后再用代码叠标题文字。 +- 不要给用户提示词擅自加 "neural network background / high contrast" 等用户没说的词。 +- 中文标题图像渲染常有错字/乱码,交付时如实告知用户;若标题出错,用图生图 `--edit` + `--mask` 局部重绘标题区,或建议用户缩短标题再试。 + ## 前置条件 - 需要 `python3`(macOS 自带,零第三方依赖)。 -- 首次使用需存在 `.env`(从 `.env.example` 复制并填入 `IMAGE_API_BASE_URL`、`IMAGE_API_KEY`)。 +- 首次使用需配置自己的中转站:在工具箱「中转」勾选一个分组「用于 Codex 生图」(自动写入本目录 `.env`),或手动 `cp .env.example .env` 填写。 diff --git a/gen-image/README.md b/gen-image/README.md index fbc8500..6c4ab4e 100644 --- a/gen-image/README.md +++ b/gen-image/README.md @@ -1,55 +1,44 @@ # gen-image · 生图 Skill -通过大模型中转站,直接调用 OpenAI 图片接口生图。文生图 / 图生图 / 局部重绘 / 透明背景 / 1K-4K 常用尺寸 / 可选 style 风格参数,零第三方依赖。 +通过大模型中转站,直接调用 OpenAI 图片接口生图。文生图 / 图生图 / 局部重绘 / 透明背景,零第三方依赖。 ## 快速开始 ```bash -# 1. 配置凭证 -cp .env.example .env -# 编辑 .env,填入 IMAGE_API_BASE_URL、IMAGE_API_KEY +# 1. 文生图 +./gen.sh "a cozy cabin in snowy mountains, golden hour, cinematic" \ + --size 1536x1024 --quality high -# 2. 文生图 -python3 scripts/gen_image.py "a cozy cabin in snowy mountains, golden hour, cinematic" \ - --size 2k-landscape --quality high +# 2. 图生图 / 编辑 +./gen.sh "把背景换成星空" --edit input.png -# 3. 图生图 / 编辑 -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 +# 3. 局部重绘(mask 透明处为重绘区域) +./gen.sh "戴上一顶红帽子" --edit input.png --mask mask.png ``` 图片保存到 `output/`,脚本打印完整路径。 -## 配置项(.env) +## 配置(每人用自己的中转站账号) + +**TD工具箱用户(推荐):** 在工具箱「中转」里,给一个支持 OpenAI 图片接口的中转分组勾选 **☑ 在 Codex 中用于生图** 并保存——工具箱自动把该分组的 base_url+密钥写进本技能的 `.env`,无需手动配置。重装技能后工具箱会自动重写。 + +**手动方式(无工具箱):** `cp .env.example .env`,填三项: | 变量 | 说明 | |------|------| -| `IMAGE_API_BASE_URL` | 中转站基址,如 `https://your-relay.com`(自动补 `/v1/images/...`) | -| `IMAGE_API_KEY` | 中转站 API Key | +| `IMAGE_API_BASE_URL` | 你的中转站基址,如 `https://api.xxx.com`(自动补 `/v1/images/...`) | +| `IMAGE_API_KEY` | 你的中转站 API Key | | `IMAGE_MODEL` | 默认模型,默认 `gpt-image-2`,可用 `--model` 覆盖 | +读取优先级:**环境变量 > skill 目录 `.env`**。CI/临时场景可直接 `export IMAGE_API_KEY=...`。 + ## 参数 -`--size` `--n` `--quality` `--background transparent` `--style` `--edit`(可多次) `--mask` `--model` `--output` +`--size` `--n` `--quality` `--background transparent` `--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 写进代码或对话。 +- 凭证存在本技能目录的 `.env`(工具箱写入时权限 600),已被 `.gitignore` 忽略,不进 git。 +- 分发包只含 `.env.example` 模板,绝不含真实 Key。 +- 切勿把 API Key 写进代码、日志或对话。 diff --git a/gen-image/SKILL.md b/gen-image/SKILL.md index c151ad3..1e1253e 100644 --- a/gen-image/SKILL.md +++ b/gen-image/SKILL.md @@ -1,14 +1,17 @@ --- name: gen-image -description: 调用大模型中转站的 OpenAI 图片接口生图(文生图、图生图/编辑、局部重绘、透明背景)。支持 1K/2K/4K 常用尺寸规格、横竖方比例、质量、背景和可选 style 风格参数。触发词:生图、生成图片、画一张、AI 画图、文生图、图生图、生成插画/头像/海报/封面/壁纸/图标、image generation、根据这张图改。需要外部 API 生成位图图像时使用;纯 HTML/SVG/矢量设计不适用。 +description: 调用大模型中转站的 OpenAI 图片接口生图(文生图、图生图/编辑、局部重绘、透明背景)。触发词:生图、生成图片、画一张、AI 画图、文生图、图生图、生成插画/头像/海报/封面/视频封面/标题图/图标、image generation、根据这张图改、做封面。需要外部 API 生成位图图像时使用;纯 HTML/SVG/矢量设计不适用。 --- # gen-image · 生图 -通过大模型中转站,直接调用 OpenAI 图片接口生成位图图像。支持**文生图**、**图生图/编辑**、**局部重绘(mask)**、**透明背景**、**1K/2K/4K 常用尺寸**和**可选 style 风格参数**。 +通过大模型中转站,直接调用 OpenAI 图片接口生成位图图像。支持**文生图**、**图生图/编辑**、**局部重绘(mask)**、**透明背景**。 核心是零依赖脚本 `scripts/gen_image.py`(纯 Python 标准库,无需 pip install)。 +> **核心原则 · 原话直传(最高优先级,覆盖下方一切"打磨/扩写"措辞)。** 被触发后,把用户这段话**原样**作为提示词传给脚本——不改写、不扩写、不翻译、不加风格/构图/画质关键词。你只需要判断一件事:用户**是不是要生图**;是,就转发原话。用户没说的风格,不要替他编;用户给的标题/文字,一个字都不要动。只有当用户**明确**说"帮我润色/扩写提示词"时才加工。理由:图像模型本身懂自然语言,外面这层多一次"加工"只会改坏用户要保留的内容(尤其标题)、并让产出不可控。 + + ## 何时用 / 不用 - ✅ 用户要「生成一张图 / 画一张 / AI 出图 / 做个头像/海报/插画/图标」 @@ -16,35 +19,60 @@ description: 调用大模型中转站的 OpenAI 图片接口生图(文生图 - ❌ 用户要 HTML 原型、幻灯片、矢量图标、CSS 效果 → 用 `huashu-design` 或直接写代码 - ❌ 用户要图表/数据可视化 → 用 `dataviz` -## 首次使用:配置凭证 +## ⚠️ 带文字的封面 / 海报 / 标题图(重点) -生图需要中转站的 API Key。检查 skill 根目录是否有 `.env`: +用户说「做个 **B站/抖音/视频封面**」「**带标题的海报**」「封面 + 标题是 XXX」时,**整个任务就是一次生图调用**——不要拆成「生个背景图 + 我自己用 SVG/HTML 把文字画上去」两步。正确做法是一条命令把标题写进提示词、整张图让模型一起生成。 + +**正确流程:** +1. 把用户给的**标题原文原样**写进提示词,连同用户说的其它要求一起原话直传——不要自己补风格/背景词。 +2. 尺寸默认用横图 `--size 1536x1024`(视频封面标配);用户指定了其它比例则照用户的。 +3. 一次性运行所加载技能目录的 `gen.sh`,如 `"/gen.sh" "原话提示词" --size 1536x1024 --quality high` 出成品。**不要**在用户工作区用 `./gen.sh` 猜测路径,也不要后续用代码去叠文字。 +4. 中文标题风险**如实告诉用户**再交付:图像模型渲染中文常有错字/乱码,建议用户验收后若文字有误,用「图生图 + 局部重绘」把标题区域 mask 掉重画,或改用极短标题。 + +**示例:** 用户说「帮我生成一个 B 站视频封面图,标题是《从零搭建个人知识库》」。 +✅ 正确(原话直传,用户没说的不编): +```bash +"/gen.sh" "B站视频封面图,标题是《从零搭建个人知识库》" --size 1536x1024 --quality high +``` +❌ 错误(不要自己补词,更不要拆成两步):给用户的提示词擅自加上 "neural network background / high contrast / eye-catching" 等用户没说的风格词;或者先 `./gen.sh "某背景"` 生成背景图、再用 SVG/HTML 自己去拼中文标题——这两种都是 agent 自行发挥,必须避免。 + +> 反面案例:曾出现「用户要 B 站封面,agent 却只生成一张背景图、标题自己画」「agent 擅自给用户提示词加一堆风格词」两种跑偏,根因都是 agent 多做了"加工"。记住:**被触发即原话直传**。 + +## 首次使用:配置凭证(每个用户用自己的中转站账号) + +生图需要**用户自己的**中转站地址和 API Key(各自的号、各付各费)。这个技能**不内置任何 key**。 + +第一次生图前,检查是否已配置: ```bash -ls "$(dirname SKILL.md)/.env" 2>/dev/null || echo "未配置" +test -f "$(dirname "$0")/.env" && echo "已配置" || echo "未配置" ``` -若无,从模板创建并让用户填写(**不要把 key 写进对话或提交到 git**): +**推荐方式(TD工具箱用户):** 在工具箱「中转」里,给一个支持 OpenAI 图片接口的中转分组,勾选 **☑ 在 Codex 中用于生图** 并保存——工具箱会自动把该分组的 `base_url` + 密钥写进本技能的 `.env`。用户全程不碰配置文件。若用户还没勾,就引导他去「中转」勾一下。 + +**手动方式(无工具箱时):** 从模板建 `.env` 并让用户填自己的中转信息(**不要把 key 写进对话或提交 git**): ```bash cp .env.example .env -# 然后引导用户编辑 .env,填入 IMAGE_API_BASE_URL 和 IMAGE_API_KEY +# 编辑 .env,填 IMAGE_API_BASE_URL 和 IMAGE_API_KEY ``` -`.env` 需要三项: -- `IMAGE_API_BASE_URL` — 中转站基址,如 `https://your-relay.com`(脚本自动补 `/v1/images/...`) -- `IMAGE_API_KEY` — API Key +`.env` 三项: +- `IMAGE_API_BASE_URL` — 用户自己的中转站基址,如 `https://api.xxx.com`(脚本自动补 `/v1/images/...`) +- `IMAGE_API_KEY` — 用户中转站的 API Key - `IMAGE_MODEL` — 默认模型,默认 `gpt-image-2` +读取优先级:**环境变量 > skill 目录 `.env`**。CI/临时场景可直接 `export IMAGE_API_KEY=...`。 +注意:工具箱重装本技能会清空目录,但装完会**按「中转」里勾选的分组自动重写 `.env`**,无需手动恢复。 + ## 标准流程 -**1. 打磨提示词。** 用户给的描述往往简短,先在心里扩写成一句信息充分的英文或中文提示词——主体、风格、光线、构图、色调、画质关键词。除非用户明确要求逐字使用,否则主动增强。生图模型对细节敏感,「一只猫」远不如「a fluffy orange tabby cat sitting on a windowsill, soft morning light, shallow depth of field, cozy warm tones」。 +**1. 提示词原样直传。** 用户这段描述**原封不动**作为提示词。不要扩写、不要翻译、不要加风格/光线/构图/画质词——尤其用户给的标题或文字,一个字都不要改。你只做一件翻译判断:用户**是否在要生图**;要,就转发原话。图像模型自己懂自然语言,不需要你替它"加工"。(唯一例外:用户**明确**要求"帮我润色/扩写提示词"时才加工。) **2. 选参数:** -- `--size`:支持直接传像素值或别名。默认 `1024x1024`;常用别名见「尺寸规格速查」。 +- `--size`:`1024x1024`(方,头像/图标)、`1536x1024`(横,海报/封面)、`1024x1536`(竖,手机壁纸/人像)、`auto` - `--quality`:`low`/`medium`/`high`/`auto`(gpt-image 系支持;越高越慢越贵) - `--background transparent`:要透明底的图标/贴纸时加 -- `--style`:部分模型/中转支持的独立风格参数,如 `vivid`、`natural`、`anime`、`photorealistic`。若上游不支持,把风格写进 prompt。 - `--n`:一次出几张(默认 1;多给几张让用户挑时用 `--n 2` 或 `4`) **3. 执行(文生图):** @@ -52,7 +80,7 @@ cp .env.example .env ```bash cd "" && python3 scripts/gen_image.py \ "a fluffy orange tabby cat on a windowsill, soft morning light, cozy tones, highly detailed" \ - --size 1k-square --quality high + --size 1024x1024 --quality high ``` 图片存到 `output/img-<时间戳>-<序号>.png`,脚本会打印完整路径。 @@ -60,54 +88,30 @@ cd "" && python3 scripts/gen_image.py \ **4. 图生图 / 编辑**(用户给了输入图): ```bash -python3 scripts/gen_image.py "把背景换成雪山日落" --edit /path/to/input.png --size 1k-square +python3 scripts/gen_image.py "把背景换成雪山日落" --edit /path/to/input.png --size 1024x1024 ``` 多图参考:多次 `--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 1k-square` 或 `--size 1024x1024` | -| 海报/封面(横) | `--size 1k-landscape` / `2k-landscape` / `4k-wide` | -| 手机壁纸/人像(竖) | `--size 1k-portrait` / `2k-portrait` / `4k-tall` | -| 4K 壁纸 | `--size 4k-uhd` | +| 头像/图标(方图) | `--size 1024x1024` | +| 海报/封面(横) | `--size 1536x1024` | +| 手机壁纸/人像(竖) | `--size 1024x1536` | | 透明背景贴纸 | `--background transparent` | | 多出几张挑选 | `--n 4` | | 高画质 | `--quality high` | -| 独立风格字段 | `--style natural` 或 `--style vivid`(看上游支持情况) | | 换模型 | `--model dall-e-3` | | 基于图改 | `--edit input.png` | | 局部重绘 | `--edit input.png --mask mask.png` | ## 排错 -- **缺 IMAGE_API_BASE_URL / IMAGE_API_KEY** → `.env` 没配好,回到「配置凭证」。 +- **缺 IMAGE_API_BASE_URL / IMAGE_API_KEY** → 还没配置。让用户去工具箱「中转」勾选一个分组「用于 Codex 生图」并保存;无工具箱则 `cp .env.example .env` 手动填。 - **HTTP 401/403** → key 无效或额度不足,让用户核对中转站账户。 - **HTTP 404** → base_url 写错,或该中转站不支持 `/v1/images/generations`;确认接口路径。 - **HTTP 400 model 相关** → 该中转站不认 `gpt-image-2`,换 `--model dall-e-3` 或问用户支持的模型名。 diff --git a/gen-image/gen.sh b/gen-image/gen.sh index a8588f9..900d9c3 100755 --- a/gen-image/gen.sh +++ b/gen-image/gen.sh @@ -1,14 +1,13 @@ #!/usr/bin/env bash # gen.sh — 生图快捷入口。用法: # ./gen.sh "提示词" # 文生图,默认 1024x1024 -# ./gen.sh "提示词" --size 2k-landscape # 透传任意 gen_image.py 参数 -# ./gen.sh "提示词" --style natural # 部分模型/中转支持独立风格参数 +# ./gen.sh "提示词" --size 1536x1024 # 透传任意 gen_image.py 参数 # ./gen.sh "换成雪山背景" --edit in.png # 图生图 # 无论从哪个目录调用都能正确定位脚本与 .env。 set -euo pipefail DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ "$#" -eq 0 ]; then - echo "用法: ./gen.sh \"提示词\" [--size 1k-square|2k-landscape|4k-wide] [--quality high] [--style natural] [--edit 图.png] ..." >&2 + echo "用法: ./gen.sh \"提示词\" [--size 1024x1024] [--quality high] [--edit 图.png] ..." >&2 exit 1 fi exec python3 "$DIR/scripts/gen_image.py" "$@" diff --git a/gen-image/scripts/gen_image.py b/gen-image/scripts/gen_image.py index e8a433f..932f576 100644 --- a/gen-image/scripts/gen_image.py +++ b/gen-image/scripts/gen_image.py @@ -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" diff --git a/renderer/catalog.json b/renderer/catalog.json index 3555fa3..a50439f 100644 --- a/renderer/catalog.json +++ b/renderer/catalog.json @@ -139,8 +139,8 @@ "icon": "🎨", "name": "gen-image 生图", "author": "backup-bot", - "subtitle": "中转直调 GPT 生图 · 文生图/图生图", - "brief": "通过大模型中转站调用 OpenAI 图片接口生成图像,支持文生图、图生图/编辑、局部重绘、透明背景、1K/2K/4K 常用尺寸和可选风格参数。纯标准库零依赖,凭证走 .env,一条命令出图,图片落地本机。", + "subtitle": "中转直调 GPT 生图 · 原话直传/图生图", + "brief": "通过大模型中转站调用 OpenAI 图片接口生成图像,支持文生图、图生图/编辑、局部重绘与透明背景。提示词原样直传;在 TD 工具箱勾选生图分组后自动写入凭证,零第三方依赖。", "category": "图片生成", "cnTags": [ "图片生成",