Skip to main content
Glama

ChatGPT Web Images 0.7.27

0.7.27 调用前一眼可判断能否出图:status 新增 can_generate、serving(codex / web)、next_action 与 advice,logins 里列出 Codex 车道;Codex 优先时网页车道卡验证不再被当成阻塞(human_action_blocks_generation=false)。起因(2026-09-30):一个 agent 只看到网页车道全是 browser_challenge,就停下来让用户去点验证,没有提交任务,而 Codex 车道当时空闲。Codex 出图改为干净启动(不加载本机 config.toml 里的 MCP、插件与规则,也不写入 Codex 会话历史),实测每张图输入 token 从 9.4 万–21.1 万降到 3.6 万–8.5 万,约减半。排队中由 Codex 接手的任务 provider 也显示 codex-imagegen。

0.7.26 Codex 按张并行:一个要 N 张图的任务拆成 N 路同时画(每路一个 Codex 进程,只画 1 张,并被告知"这是第 i 个方案,请用不同构图"),parallel 改为全局同时运行的 Codex 进程数,所有任务共用;新任务只在有空位时领取。每画完一张就写回任务,轮询能看到张数逐步增加;部分失败时交付已画好的图并标注数量不足。实测(2026-09-30):2 个任务各 4 张、8 路并行,8/8 成功,约 3.3 分钟全部完成,未触发限流;此前一次画完多张要 4–12 分钟。"fanout": false 可恢复一次对话画完全部。修改 parallel 后需重启降级车道(队列目录建 stop-codex,心跳消失后删除,下一次调用会自动拉起)。

0.7.25 可把 Codex 设为首选(codex-fallback.json 里加 "prefer": "codex",本机已开启):新任务立即交给 Codex 订阅生成(默认最多 4 个并行),网页车道只处理调用方明确指定账号的任务和 Codex 交回的任务。Codex 失败时交给网页重试一次,网页再失败就如实报错,不来回转;交回的任务若没有网页车道接手,按 Codex 的原因报失败,不无限等待。Codex 车道没在运行时网页照常接手全部任务。Codex 生成的图也能 continue_from 续改,上一轮的图作为参考图。返回结果只有文字和文件路径(路径、宽高、字节数、校验值),不含图片数据,也不含 Codex 内部记录。

0.7.24 新增 Codex 订阅降级车道:网页车道仍是首选,但网页走不通时自动改由 Codex CLI 内置的 image_gen 工具生成,不经过浏览器,所以不受 Cloudflare 验证、页面卡死或 ChatGPT 网页事故影响(2026-09-30 实测:网页正处于官方故障期间,Codex 仍 132 秒出图)。触发条件:任务排队超过 queue_wait_seconds(默认 90 秒)还没有网页车道接手;网页在准备阶段失败(尚未提交);网页任务卡住要被挂起、且还没保存任何图片。多个降级任务并行(默认 3 个)。结果标注 provider=codex-imagegen 和 fallback_from。只用订阅:Codex 目录必须是 ChatGPT 订阅登录(auth_mode=chatgpt),否则拒绝运行;调用时环境里所有 API Key 变量都被移除。配置写在队列目录的 codex-fallback.json:{"enabled": true, "codex_home": "<Codex 订阅登录目录>", "parallel": 3, "queue_wait_seconds": 90};没有这个文件或 "enabled": false 就不启用(这是唯一开关,所有进程读同一个文件);关闭时已转交、还在排队的任务自动退回网页队列。续图任务降级时,会把该对话最近一次的图片作为参考图交给 Codex。

0.7.23 按业界做法(OpenAI Operator 接管模式、Cloudflare Browser Run 与 Browserless 的 human-in-the-loop)重做人机验证处理,只停、只交给人,不绕过:

  • 车道一遇到验证页立刻离开(切到 about:blank)。验证页每约 85 秒自己重试,每次失败都会累积 Cloudflare 的失败计数(cf_chl_rc_*),2026-09-29 实测累积到一定程度后连人手动都会无限循环。

  • 同一登录的其他车道不再领取任务,不去撞同一个验证。

  • 跑在 AI Hub 共享浏览器里的车道,image_open 改为「人工接管」:Hub 暂停并断开所有网页自动化(生图、中转站、网页圆桌),清掉该站点的验证状态 cookie(不碰登录 cookie),在屏幕上开一个没有调试连接的正常窗口;人关掉窗口或调用 image_account_check 即恢复,最长 15 分钟自动结束。需要 AI Hub 带 core/web-risk-guard.js 的版本;旧版 Hub 下保持原行为。

  • 接管期间 worker 不派发、不轮询,也不把等待算作失败。

  • 识别中文的 Cloudflare 标题(「请稍候」)。

0.7.22 空闲车道不再动"有人在用"的页面:账号待人工验证/登录时,或 30 分钟内刚被 image_open 打开过,worker 不会把它的标签页切到 about:blank。2026-09-29 实测:重启 worker 时把正在做 Cloudflare 验证和登录的副号页面切走了。

0.7.21 修复安装包:wheel 漏打包 chatgpt_interaction 模块(自 0.7.10 起),pip 安装后命令一启动就报 ModuleNotFoundError。源码目录运行(插件部署方式)不受影响。CI 增加从已安装 wheel 导入的检查。

0.7.20 需要人处理时主动告诉你。某个登录卡在 Cloudflare 真人验证、登录失效、要输密码或选账号时,按登录身份只弹一条 Windows 通知(不抢焦点;未处理 2 小时后再提醒一次),并记下当时 chatgpt.com 看到的出口 IP。image_status 新增 human_action(谁要处理、怎么处理、出口 IP 是否比上次正常时变了)和 egress_last_ok。出口 IP 走系统代理测量,与 Chrome 同一路径,每小时最多一次,只访问 Cloudflare 的 /cdn-cgi/trace,不碰车道页面。设 CHATGPT_WEB_IMAGES_NOTIFY=0 可关闭通知。瞬时的数据库忙(SQLITE_BUSY)不再把车道标成 worker_error,也不再覆盖"待人工验证"状态:2026-09-29 实测一次瞬时忙让 8 条车道同时下线、并行能力归零,副号的验证状态也被抹掉。本工具不绕过验证,验证仍由你在专属浏览器里完成。

0.7.11 冷却后只放行一个原任务验证恢复;首页正常不再代表会话接口恢复。真实任务仍返回 429 时保留并升级退避,任务编号、已提交内容和恢复次数不受影响。新任务在自己的空白输入页验证,不被车道遗留的旧会话加载失败卡住。

0.7.8 修复后台隐藏窗口的图库延迟加载:只加载当前任务已经生成的图片,避免一直等在“生成中”。窗口继续保持后台,不靠唤醒整个浏览器来加载图片。

0.7.7 区分侧栏历史列表限流与真正阻断生图的限流:当前会话已经加载时,继续核对原提示词并下载原图;会话未加载或生成接口返回 429 时仍退避。Hub 连接器同步使用 noDefaults: true,避免每次连接都模拟所有标签页获得焦点,引起整批后台刷新。

0.7.6 从浏览器已有网络记录识别 ChatGPT 的 HTTP 429,无需新增探测请求。同一登录的所有车道共享 5 / 15 / 30 分钟退避,冷却期间不访问网页;到期只允许一条车道尝试恢复。任务保留原账号、原提示词和原会话,状态提供 retry_at 与 wait_for_account_cooldown。明确要求打开浏览器的人工操作仍保留。停放任务的批量结果不会再误提示“交付图片”。

0.7.5 进一步区分“页面尚未加载”和“明确退出登录”。实际任务或显式账号检查遇到卡住的空壳页面时,只刷新当前专属页面一次;仍未加载则返回 page_not_ready,不会把它说成账号失效,也不会重发提示词。新版头像菜单和输入框无需依赖 Hub 的选择器适配。

新旧页面兼容与低开销恢复(0.7.4)

支持新版 ChatGPT 回合与多图画廊,同时保留旧版页面。用完整提示词核对任务身份,以回复 ID 与图片序号去重;页面重新加载后仍能接着保存,参考图和前一回合的图片不会混入结果。

新版画廊的原图从当前登录页面获取,校验图片字节哈希后保存,保留原分辨率。匹配结果在单个页面内缓存,避免多图反复扫描和下载;图片二进制只在浏览器与本机保存进程之间传输,MCP 仍只返回文字、文件路径和进度。

空闲车道只读本地队列,不再导航网页刷新健康状态。需要重新登录或人工验证时停止自动检查;有待处理任务的临时浏览器错误仍按 60 / 300 / 900 秒有限恢复。读取不到会话时单独提示 read_conversation,60 秒后暂停;不会误称正在生图,也不自动重发提示词。下载阶段显示 download_originals,每张图片保存后更新数量。

Claude 和 Codex 使用同一标准 stdio MCP、同一持久队列。双账号、批量、参考图、续图、取消及断点恢复接口保持兼容。升级时只在当前操作结束后重启插件 worker,保留浏览器、登录和任务;无需重启 AI Hub。

Related MCP server: Image Generation MCP Server

窗口无感(0.7.2)

车道用的是有头浏览器 + 窗口生在屏幕外,不是无头。实测(2026-09-21,隔离 profile 播种真实登录态):去掉 --headed 后 ChatGPT 直接返回 Cloudflare 的 Just a moment...,auth_state=browser_challenge,进不去应用。所以不要改成无头,有守卫钉着。

关键在于时机:隐藏只能在窗口已经存在之后做,而走到那一步要起两个子进程(open,再加一次给页面改标题的脚本),所以冷启动的车道会先在屏幕上闪几秒;四条车道同时冷启动就是四个窗口。现在窗口由 Chrome 在 --window-position=-32000,-32000 直接创建,一出生就在屏幕外。

实测对比(0.5 秒采样、150 秒冷启动 + 生成):

屏幕上的车道窗口

只靠隐藏

最多 4 个

生在屏幕外

0 个

另外用 --hide-crash-restore-bubble 等开关掐掉 Chrome 自己的窗口:非正常退出后它会弹标题为 Restore pages? 的气泡,那个标题不是我们设的,找窗口匹配不到,于是永远藏不掉。

隐藏动作仍然保留(让车道也不出现在任务栏),失败只记 window_hidden=False,不影响任务。唯一会把窗口挪回屏幕的是 image_open——那是给你登录用的,check 之后会重新收起来。

对话连续性与出错可调整(0.7.0)

改图不用重头说。 continue_from=<job_id> 把追问发进那个任务自己的对话里,ChatGPT 仍然看得见之前的图,所以"保持版式、配色调深一点"这种说法能直接用。

image_generate({prompt: "保持版式,配色调深一点,标题换成深红", continue_from: "20260919-xxxx"})

实测确认的三条机制:

  1. 对话属于账号,不属于浏览器 Profile。 同一登录的任意空闲车道都能接续同一个对话,不用等原车道空出来。

  2. 同一对话同时只允许一个写入者,避免两条追问在一个会话里交错;不相关的任务照常用其它车道。

  3. 追问自动钉到拥有该对话的登录账号;指定了别的账号会明确报 continue_wrong_account。

新开对话仍是默认行为,换个不相关的图就别用 continue_from。

出错要让 agent 能立刻调整(0.7.0)

  • 答完但没出图 → 立刻失败,不再干等 15 分钟。判据取自真实 DOM:一个回合只有完成后才长出操作栏,copy-turn-action-button 是图片回合与文本回合的共同信号。明确回绝报 generation_failed,其它情况报 no_image_in_reply,两者都带回 ChatGPT 的原话(800 字符)。

  • 错误按"谁能处理"分类,结果里的 error.actionable_by:

    值

    含义

    例子

    agent

    改提示词重投

    no_image_in_reply、generation_failed、数量不符

    retry

    等一下重试即可

    browser_timeout、busy、观察超时

    human

    需要人处理

    login_required、browser_challenge、conversation_changed

    未知错误码一律归 human,绝不谎称 agent 能自行解决。

最大化并行:MCP 说明直接把规则讲出来(0.6.0)

MCP 的 server instructions 和工具描述现在显式写明四条,agent 不读 skill 也能拿到:

  1. 并发 = 车道数,不是账号数;image_status 给出每个登录的车道与负载。

  2. 同一提示词的多张备选 → 一个 image_generate(count=N),一次网页请求出全部 N 张。

  3. 多个不同提示词 → 一次 image_generate_batch,一次调用排满所有空闲车道。

  4. 绝不串行:先把已知的活全部提交,再统一轮询;submit → 等 → submit 会让车道空转,这是批量变慢的主因。

新增与改动的工具:

// 一次排入整批不同提示词
image_generate_batch({
  requests: [{prompt_file: "...p1.txt", name: "p1", request_id: "20260919-deck-p1"},
             {prompt_file: "...p2.txt", name: "p2", request_id: "20260919-deck-p2"}],
  output_dir: "C:/.../out"
})

// 一次等待整批,而不是一个一个 poll
image_poll({job_ids: [...], wait_seconds: 20, return_when: "all"})   // "any" 可提前取回先完成的

批量提交先整体校验再统一入队,不会留下"半个批次";同 request_id 重发幂等。批量轮询里的未知 job_id 只在结果里标出来,不会让整批失败或空等。CLI 用重复的 --job-id 达到同样效果。

请求形状:一次多张 vs 多个任务(0.5.1)

count=N 让一次网页请求产出 N 张独立图片,早已支持(N=1..20),并非本轮新增。

判据很简单:

  • 同一提示词要多张备选(一页 PPT 的若干方案)→ 一个 count=N 请求。只占一条车道、只消耗账号一次请求额度,提交与导航的固定开销也只付一次。

  • 提示词确实不同(不同页、不同主题)→ 各自独立任务,这样能并行跑在多条车道上,也能各自成败。

同一个 output_dir 下 15 分钟内同时在途 3 个以上 count=1 任务时,提交结果会带 hint.code=consider_one_multi_image_request。它只是提醒,不改变行为;只统计在途任务,所以失败后的重投不会被误判成批量。

合并的代价要知道:N 张在一个任务里,少交付就整体记 partial,不像拆开时能各自成败。

并行度与账号均衡(0.5.0)

  • 并发等于车道数,不等于账号数。一条车道 = 一个独立浏览器 Profile,一次一个任务。

  • account-scale --account-id primary --lanes 4 一次把某个已登录账号扩到 4 条车道;减少数量时只停用不删除 Profile。

  • auto 任务按登录账号均衡派发:某个账号已经在跑的任务更多时,它的空闲车道让另一个账号先拿。显式指定账号名仍然优先,并且可以落到该账号的任意一条车道。

  • 空闲车道 5 分钟后主动关闭浏览器交还内存,下次有活从持久 Profile 重开,不需要重新登录。实测一条车道常驻约 0.6 GB,16 条就是约 10 GB,这条回收是大车道池可用的前提。

  • 车道总数上限 16,限制来自本机内存,不是 ChatGPT。status 里 logins 给出每个账号的车道数、可用车道和在跑任务数。

吞吐与卡死修复(0.4.0)

  • 暂停的任务不再长期占用它的账号。超过 120 秒无人处理就 parked:交回浏览器,保留同一账号、同一会话和已下载文件,排队任务立即继续。parked 不是失败,也不重发提示词。

  • parked 任务按 60/300/900 秒退避自动回到原会话重新观察,最多三次;仍不成功才等人处理,此时 next_action 为 inspect_account_then_resume。resume 只是让它重新排上队,不抢占正在跑的任务。

  • 身份校验失败先强制重载记录在案的会话再判断,最多两次。此前刷新写在校验之后,恢复路径在真正需要它时永远走不到,resume 必然再次失败。

  • 浏览器故障后的账号按 60/300/900 秒自动重检,最多三次;此前 browser_unhealthy 永不自检,一次抖动就让整条车道静默下线直到人工 account_check。

  • account-clone 为同一个已登录账号增加独立 Profile 车道。并发上限来自「一个账号一个浏览器页面」,不是 ChatGPT 的限制。

  • 生成期间无新图时后台轮询放慢到 10 秒,减少浏览器子进程启动;出现图片后恢复 3 秒节奏。

并发与故障恢复修复

  • 相同账号的待执行 open/check/select 操作合并;控制操作与任务交替执行,避免多个 agent 的检查请求挤占生成和下载。

  • MCP 等待使用异步休眠,不占用线程池等待名额。后台启动采用跨进程门锁与 20 秒启动预约;stop 标记阻止新版本客户端反复拉起后台。

  • 浏览器准备或生成失败后,账号进入 browser_unhealthy,停止领取新单;检查浏览器并显式 account_check 成功后恢复。已有失败任务不自动重发。

  • queued 结果包含 blocking_accounts;status 包含 worker_version 和 worker_stalled。心跳存在但一次操作超过 300 秒会标记停滞,不强杀浏览器或重发请求。

  • resume 保留原账号、任务和会话,重新给予 15 分钟观察时间,并在确认提示词身份后刷新原会话一次。它不会重新发送提示词。

  • 活动任务期间禁止切换账号;取消连续失败三次后暂停,保留错误,不无限重复操作。

  • 默认返回精简文件信息;detail=true 查看完整记录。后台日志仅记任务阶段、账号别名及错误码,不记提示词、Cookie 或网页正文。

升级后后台 worker 需要在操作间隙重启以加载代码;已有 MCP 客户端需要重新加载或新会话才能获得新的异步等待行为。不要重启生产 AI Hub 或手动删除任务记录。

使用自己的 ChatGPT 网页账号生图,下载网页原图,只返回本地文件路径与文字元数据。非官方 Windows 本地自动化工具,需要 Python 3.11+、Node.js 18+、Chrome 和可生图账号。

多 agent 与多账号

所有 stdio MCP 客户端共用 SQLite 持久队列。每账号一个独立后台进程、独立 Profile,同时执行一个任务。多个 agent 可同时提交,空闲账号领取,其余排队。后台自主检查生成、下载和收尾,客户端断开不会终止任务。

并发上限等于车道数,不等于账号数。 一条车道是一个浏览器 Profile,一次只做一个任务;单个任务从提交到下载完通常要几分钟。想提高并发,给已登录账号加车道:

# 每个账号 4 条车道,合计 8 路并发
chatgpt-web-images account-scale --account-id primary --lanes 4
chatgpt-web-images account-scale --account-id secondary --lanes 4
# 每条新车道各做一次登录检查
chatgpt-web-images check --account-id primary-2

扩容会新建独立 Profile 并复制该账号已保存的登录态,源账号必须先 check 过一次;缩容只停用车道,不删除 Profile。账号重新登录后,用 account-reseed --account-id primary-2 把新登录态同步给空闲车道。

auto 任务在登录账号之间均衡:正在跑得多的账号会让空闲车道先给另一个账号,这正是把压力摊到两个账号、少碰官方限流的手段。指定 account_id=primary 仍然可以钉死到某个账号,并落在它的任意车道上。

代价说清楚:ChatGPT 侧会看到同一账号的多个并发会话,与手工多开多个窗口等价;额度、限流和网页可用性仍由服务决定。加车道只让更多张图同时跑,不会让单张图更快。一条车道常驻约 0.6 GB 内存,空闲 5 分钟自动关闭回收。

支持本机的标准 stdio MCP 客户端,不等于认证所有 agent 或提供远程服务。两个账号的实际速度、额度和网页可用性仍由服务决定。

安装与初始化

在项目独立目录安装:

python -m venv .venv
& .\.venv\Scripts\python.exe -m pip install .
& .\.venv\Scripts\chatgpt-web-images.exe setup

setup 安装固定 Playwright CLI 0.1.19。每账号独立配置目录,settings.json 至少含绝对 data_dir、现有 cli_entry 和绝对 output_dir。第二个账号不能复制第一个的 auth_file 或登录状态。

所有客户端设置相同的 CHATGPT_WEB_IMAGES_POOL 绝对路径,建议在 C:\VibeData 下。未设置时优先读配置 pool_dir,回退到浏览器数据目录旁的 ChatGPTWebImagesPool。

chatgpt-web-images account-add --account-id primary --data-dir $primaryData --config-dir $primaryConfig
chatgpt-web-images account-add --account-id secondary --data-dir $secondaryData --config-dir $secondaryConfig
chatgpt-web-images open --account-id secondary
# 用户完成登录后:
chatgpt-web-images check --account-id secondary
chatgpt-web-images status

open/check/select-account 异步执行;查看 accounts[].last_control 确认结果。account-enable --account-id secondary --disabled 停止领取新任务,不取消正在执行的任务;去掉 --disabled 恢复领取。

Claude、Codex 与其他客户端

客户端启动同一 Python 入口并指定同一队列。工具描述已内含排队和恢复规则,不依赖某个 agent 的私有 skill。无需 API key 或 Cookie 复制。

# Claude Code 用户级注册
claude mcp add --scope user --transport stdio chatgpt-web-images -e PYTHONIOENCODING=utf-8 -e "CHATGPT_WEB_IMAGES_POOL=$poolDir" -- $imagePython -m web_images mcp
# Codex:已用插件安装时不要重复注册
codex mcp add chatgpt-web-images --env PYTHONIOENCODING=utf-8 --env "CHATGPT_WEB_IMAGES_POOL=$poolDir" -- $imagePython -m web_images mcp

其他客户端使用标准 mcpServers JSON:command 为安装环境 Python 绝对路径;args 为 ["-m","web_images","mcp"];env 含 PYTHONIOENCODING=utf-8 与 CHATGPT_WEB_IMAGES_POOL。源码安装可把 -m web_images 换为 scripts/web_images.py 的绝对路径。

默认 poll 等待 20 秒,最大 45 秒;浏览器操作在独立后台,不延长等待预算。建议客户端超时至少 60 秒。新会话/重新加载 MCP 后获得新版工具;已运行的旧服务不会自动更新。

工具与状态

工具

行为

image_generate

持久入队,立即返回 job_id;account_id=auto 或指定账号;request_id 防重复;continue_from= 在原对话里追问

image_generate_batch

一次排入整批不同提示词,立刻占满所有空闲车道;整体校验、按 request_id 幂等

image_poll

读取/等待自己的任务;传 job_ids 一次等待整批,return_when=any 可提前取回

image_status

缓存健康、后台存活、任务状态数量和账号操作结果

image_open

异步打开指定账号专属浏览器

image_account_check

用户登录后检查账号状态

image_select_account

只选择用户授权的已记住账号,不处理密码或验证码

image_resume

接续 needs_attention 或 parked 原任务,保持同一账号和请求身份

image_cancel

按用户要求取消排队任务,或异步请求取消它自己的网页生成

prompt / UTF-8 prompt_file 二选一,参考图最多五个本地 PNG/JPEG/WebP,输出目录为绝对路径。count=1..20 是插件参数上限,不是网页额度保证。

状态为 queued → dispatching → running → complete;phase 是浏览器实际阶段。连续三次操作失败暂停;会话串线、参考文件改变、输出完整性异常也会停止继续操作。处理后显式 resume,不换账号重发。

needs_attention 仍暂停该账号,但只暂停 120 秒:之后转为 parked 交回车道,队列继续推进。parked 保留账号、会话和已存文件,按退避自动重新观察,结果里带 auto_retry_at 与 auto_retry_attempts_left;次数用完才需要人工检查后 resume。从未进入浏览器的任务 parked 后不自动重试,resume 会让它重新派发,start 通过持久请求索引保持幂等。

partial / count_mismatch / failed 明确返回,保留已有文件。完成结果再次读取会检查文件哈希,缺失或修改不能冒充成功。request_id 在整个队列中唯一,不自动过期;不同 agent 使用含日期和任务/席位的 ID。

旧任务与后台运维

旧活动任务保留所有权,不自动取消。import-legacy --account-id primary 把当前旧任务纳入后台观察,只接续查询、不重新提交。旧历史结果可用 poll --legacy --job-id ... 读取。

worker 退出后,下次 status/generate/poll 自动拉起。目前没有安装 Windows 开机自启;系统重启后第一次客户端调用恢复后台,磁盘队列保留。

运维停止某个 worker:在队列目录创建 stop- 文件,等其退出;删除该精确文件后下次调用恢复。不要终止其他浏览器或生产 Hub。

每个 worker 启动时清除其他 CHATGPT_WEB_IMAGES_* 环境覆盖,再设置自己的配置、数据和共享队列。登录态只保存在本机专属 Profile。队列含提示词、文件路径和任务记录,按本机私有数据管理,不提交到仓库。

验证

python scripts/test_web_images.py
python scripts/test_mcp_protocol.py
python scripts/test_image_pool.py
python scripts/test_pool_protocol.py
python scripts/test_account_contracts.py
python scripts/test_throughput.py
python scripts/test_account_browser.py

模拟测试覆盖多客户端、双进程、去重、断开继续执行、故障隔离、取消与恢复,不代表真实账号生成成功。真实验收单独验证登录与原图下载。内部图片模型未核实,不宣称精确型号,不绕过网页校验或额度。

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers