From 963dc99b48bac0e7e8f9878397ac0f15925d5c85 Mon Sep 17 00:00:00 2001 From: leroy Date: Tue, 6 Oct 2026 22:31:58 +0800 Subject: [PATCH] =?UTF-8?q?le-gpt-image=20v1.2=EF=BC=9A=E6=94=B9=E5=9B=BE?= =?UTF-8?q?=E9=93=BE=E8=B7=AF=E4=BF=AE=E5=A4=8D=E2=80=94=E2=80=94native=20?= =?UTF-8?q?edits=20=E5=AF=B9=E3=80=8C=E8=BF=87=E8=AE=A4=E8=AF=81+=E5=A4=A7?= =?UTF-8?q?=E5=9B=BE=E4=B8=8A=E4=BC=A0=E3=80=8D=E4=BC=9A=E8=A2=AB=20RST?= =?UTF-8?q?=EF=BC=88edit=20=E6=94=B9=E8=B5=B0=20responses=20=E5=85=9C?= =?UTF-8?q?=E5=BA=95=EF=BC=89=EF=BC=9Bresponses=20=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E8=AF=BB=20config.toml=20=E6=A8=A1=E5=9E=8B=EF=BC=88gpt-6.1-so?= =?UTF-8?q?l=20=E5=B8=A6=E5=9B=BE=E5=83=8F=E5=B7=A5=E5=85=B7=20500?= =?UTF-8?q?=EF=BC=8C=E5=9B=BA=E5=AE=9A=E9=BB=98=E8=AE=A4=20gpt-5.5?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=20--model=20=E8=A6=86=E7=9B=96=EF=BC=89?= =?UTF-8?q?=EF=BC=9B=E5=AE=9E=E6=B5=8B=E4=B9=9D=E9=B1=BC=E8=81=9A=E8=B4=A2?= =?UTF-8?q?=E6=B0=B4=E5=A2=A8=E7=94=BB=E8=A1=A5=E9=B1=BC=E6=88=90=E5=8A=9F?= =?UTF-8?q?=EF=BC=88=E8=A7=86=E8=A7=89=E5=A4=8D=E6=A0=B8=208=E2=86=929=20?= =?UTF-8?q?=E6=9D=A1=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skills/le-gpt-image/README.md | 1 + skills/le-gpt-image/SKILL.md | 4 +++- skills/le-gpt-image/scripts/gpt_image.py | 16 ++-------------- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/skills/le-gpt-image/README.md b/skills/le-gpt-image/README.md index b34b295..84e7c21 100644 --- a/skills/le-gpt-image/README.md +++ b/skills/le-gpt-image/README.md @@ -46,6 +46,7 @@ python3 scripts/gpt_image.py edit --image content.png --style-image ink.png --ou | edit 单图 low | 45.4s 成功,主体保持、背景按指令替换 | | 海报实测(约 1 小时后) | urllib 传输被 Cloudflare 质询(403 `cf-mitigated: challenge` / 连接被掐)——同网络下浏览器与 Codex App 正常,锁定 **TLS 指纹**风控 | | 装 curl_cffi 后重测 | Chrome 指纹 + 真 token 完整生图 200;「功夫女足」海报 61.5s 成功(1024x1536,书法标题渲染准确) | +| 「九鱼聚财」水墨画 | generate 72.2s 成功但只画了 8 条鱼(模型数数弱项,视觉复核抓出);edit 走 native 被 RST(过认证+大图上传触发深层风控),切 `--backend responses` + 显式 `--model gpt-5.5`(config 里的 gpt-6.1-sol 带 image 工具会 500)后 194.9s 成功补齐第 9 条 | ## 限制 diff --git a/skills/le-gpt-image/SKILL.md b/skills/le-gpt-image/SKILL.md index f582703..fb11aea 100644 --- a/skills/le-gpt-image/SKILL.md +++ b/skills/le-gpt-image/SKILL.md @@ -93,7 +93,9 @@ SKILL/scripts/gpt_image.py edit \ | HTTP 429 | 脚本自动退避重试;重试仍失败则告知用户订阅图像额度已到限,建议稍后再试或降 quality/尺寸 | | 尺寸不符警告 | 属正常(服务端建议值行为),按实际尺寸交付 | | 网络请求失败 | 先定位出口:`curl --noproxy '*' https://api.ipify.org` 与 `curl -x http://127.0.0.1:7890 ...` 对比出口 IP。macOS 上 Python urllib 会自动读系统代理设置(即使只开 TUN 模式也会被显式代理入口接管);TUN 与 7890 通常同核同出口 | -| `Remote end closed connection` / 403 含 `cf-mitigated: challenge` / curl 56 连接被掐 | **TLS 指纹被 Cloudflare 质询**:python-urllib/curl 的握手特征会被 chatgpt.com 域名级风控识别(浏览器与 Codex/ChatGPT.app 不受影响,所以「用户那边正常」)。解法:`pip install --user curl_cffi`(PEP 668 环境加 `--break-system-packages`),CLI 检测到即自动用 Chrome 指纹传输。装后仍被掐 → 检查是否覆盖了 Chrome UA(curl_cffi 路径下不要发 codex UA,矛盾组合会被掐)。换代理节点通常无效——同出口下浏览器指纹本来就能过 | +| native 通道被掐 / 403 含 `cf-mitigated: challenge` / curl 56 连接被掐 | **TLS 指纹被 Cloudflare 质询**:python-urllib/curl 的握手特征会被 chatgpt.com 域名级风控识别(浏览器与 Codex/ChatGPT.app 不受影响,所以「用户那边正常」)。解法:`pip install --user curl_cffi`(PEP 668 环境加 `--break-system-packages`),CLI 检测到即自动用 Chrome 指纹传输。装后仍被掐 → 检查是否覆盖了 Chrome UA(curl_cffi 路径下不要发 codex UA,矛盾组合会被掐)。换代理节点通常无效——同出口下浏览器指纹本来就能过 | +| **edit 走 native 被掐(generate 正常)** | 更深一层风控:「过认证 + 携带大 base64 图上传」打到 `/images/edits` 会被 RST(假 token 反而能穿到 401)。**解法:edit 改走 `--backend responses`**(不同端点,不吃这套;实测穿透)。responses 耗时更长(~3 分钟) | +| responses 通道报通用 500「An error occurred…」 | 大概率是推理模型名不可用:`_reasoning_model` 默认会读 `~/.codex/config.toml` 的 `model` 字段(本机是 `gpt-6.1-sol`,带图像工具会 500)。**解法:`--model gpt-5.5` 显式指定**。仍 500 可再加 `--input-max-edge 768` 缩小请求体 | | native 通道 404/失效 | 内部接口无稳定性契约;切 `--backend responses` 试试,并在交付时说明 | ## 安全边界 diff --git a/skills/le-gpt-image/scripts/gpt_image.py b/skills/le-gpt-image/scripts/gpt_image.py index 52d487b..4dc3dd1 100755 --- a/skills/le-gpt-image/scripts/gpt_image.py +++ b/skills/le-gpt-image/scripts/gpt_image.py @@ -37,11 +37,6 @@ try: except ImportError: # Windows:无 flock,退化为无锁刷新 fcntl = None # type: ignore[assignment] -try: - import tomllib -except ImportError: # Python < 3.11 - tomllib = None # type: ignore[assignment] - # 可选传输层:curl_cffi 以 Chrome TLS 指纹发请求。 # chatgpt.com 的 Cloudflare 会质询 python-urllib/curl 的握手指纹(403 cf-mitigated: challenge), # Chrome 指纹(及 Codex/ChatGPT.app 的网络栈)不受影响。未安装时回退 urllib。 @@ -447,15 +442,8 @@ def _reasoning_model(args: argparse.Namespace) -> str: return args.model if os.environ.get("CODEX_IMAGEGEN_MODEL"): return os.environ["CODEX_IMAGEGEN_MODEL"] - config_file = _codex_home(args) / "config.toml" - if tomllib is not None and config_file.exists(): - try: - config = tomllib.loads(config_file.read_text(encoding="utf-8")) - model = config.get("model") - if isinstance(model, str) and model.strip(): - return model - except (OSError, UnicodeError, Exception): - pass + # 注意:读 Codex config 的 model 字段曾踩坑——本机 config 里是 gpt-6.1-sol, + # 它在内部 responses 端点带图像工具会 500。没显式指定时用实测可用的默认值。 return DEFAULT_REASONING_MODEL