chatgpt-web-images
by TianLin0509
README.md
# ChatGPT Web Images 0.7.42
0.7.42:发送前核对提示词、图片模式和按钮状态;点击一次后等待同一条消息与会话地址确认,不因确认延迟重复发送。菜单选择可识别已开启状态并有界恢复。记录各准备步骤耗时,连续浏览器故障按 3/6/12/24/30 秒退避,工作进程空闲退出时关闭自己的标签页。配套 Hub 浏览器修复隔离单车道超时、回收空闲空白页,并只串行短暂的输入/菜单操作,生图仍并发。大批图片的原图资源地址由有界观察器保存,避免浏览器资源记录满后漏掉后面的图片。
0.7.41:兼容新版生图菜单按钮,避免侧栏同名「Create image」历史聊天被误选。扩展车道共用账号 Tab 的普通 Chrome 登录态,每条车道独占一个自动化标签页;同一任务 count=N 在一个对话一次请求多张图,continue_from 在原对话继续修改。独立任务使用不同网页对话,并发数由启用的车道数决定,超出后排队。
0.7.40:`image_open` 默认只打开同一账号普通 Chrome 的独立个人标签页,查看后可以立即自动生图,不暂停其他网页工具、不改变登录健康状态。需要本人登录或验证时使用 `image_open(for_login=true)`(CLI:`open --for-login`),完成后 `image_account_check` 立即接续。人工接管期间状态明确返回 `automation_pause` 的原因、时间与接续动作,不再把暂停的车道报成网页可用。
0.7.37 增加普通浏览器扩展通道:生图与账号 Tab 使用同一个普通 Chrome、同一份登录。通过微软官方 Playwright 扩展连接,只控制本工具自己新建的标签页组,不接管已有聊天。启动时不加调试端口,不隐藏用户窗口;原有队列、参考图、续图与订阅兜底接口保持兼容。
自动检查最多在原页面等待 12 秒,让网站自行检查结束;不刷新、不点击验证码、不修改 cookie。仍要求真人处理时断开自动化,再由 `image_open(for_login=true)` 打开同一个普通浏览器,完成后 `image_account_check` 接上,不必关闭 Chrome。真实网页通道已完成一次约 35 秒的原图保存验收;网站未来仍可能要求真人验证。
扩展运输为显式配置,不自动改用另一份浏览器资料。生图入口 binding 保持原 `root` 用于 Hub 元数据识别,增加 `transport: "extension"`、`browserRoot`(账号 Tab 普通浏览器目录)和 `tokenFile`(Windows 当前用户 DPAPI 加密配对记录)。配对记录绑定浏览器目录与主/副号身份,不导出登录 cookie,不写入代码仓库。使用固定 Playwright runtime 与官方扩展协议 2;缺少配对时提示 `extension_pairing_required`,停止后台复检。`scripts/pair_extension.cjs` 仅用于已经授权的首次设置连接,不会自动重启 Chrome 开调试端口。
0.7.33 网页优先、Codex 兜底:默认先交 ChatGPT 网页;没有任何网页车道能接活(全部停用、等人处理或冷却中)时,新任务立即交 Codex,不再白等 90 秒。卡在人工关卡的网页登录不再永久停摆:AI Hub 确认该账号已登录、或人工接管结束后,自动对该登录的车道各检查一次;(0.7.34 起取消定时自动复检:自动访问会再次触发 Cloudflare、累积验证失败计数。)Hub 暂停该站点或有人正在操作浏览器时不访问;全部车道停用的登录不碰。`codex-fallback.json` 的 `"prefer": "codex"` 仍可切回 Codex 优先。
0.7.31:支持 Hub 的失败后验证检测。网页导航或脚本超时后先检查是否出现真人验证,确认后离开并暂停站点,不重复执行原操作。需要 Hub 提供 `web-risk-guard.runProtected`;旧 Hub 保留原行为。普通对话的标题不再单独触发 Cloudflare 判断,必须同时有验证脚本或可见验证框。此版本为本地待验收候选,尚未发布。
0.7.30 Codex 车道自己补代理:车道运行在拉起它的进程的环境里,而 Codex 启动 MCP 服务时不传代理变量。2026-09-30 一个 Codex 会话拉起车道后,所有出图都报「workspace routing discovery timed out」(本机直连 chatgpt.com 不通)。现在环境里没有代理时,依次采用 AI Hub 配置的代理、Windows 系统代理;`codex-fallback.json` 的 `"proxy"` 可显式指定。连不上 chatgpt.com 报 `codex_network`,不再混在 `codex_no_image` 里。
0.7.29 网页车道只连自己的标签页:AI Hub 提供单标签连接(`core/scoped-cdp.js`)时,常驻标签页守护进程为每条车道单独建一条只看得见自己页面的连接,不再长期挂着整浏览器连接(以前它会附着到你的窗口、其他工具的标签页和页面里的 Cloudflare 验证框)。清理孤儿标签页改用不附着页面的浏览器级查询;有人接管浏览器时所有车道连接立即断开。旧版 Hub 下行为不变。
0.7.28 Codex 账号跟随 AI Hub:`codex-fallback.json` 加 `"follow_hub": true` 后,生图使用 AI Hub 当前默认的 Codex 订阅账号(Hub 配置 `providers.codex.subscription_profile`),每 2 秒重读一次,在 Hub 里切换账号后下一轮即生效。Hub 改用 API Key、配置读不到或账号不存在时,Codex 车道停用,交给网页,不会猜测账号;非订阅登录照旧拒绝。`image_status.codex_fallback.account` 显示当前用的是哪个账号。`codex_home` 仍保留一个真实目录,供仍在运行的旧版本进程读取。
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。
## 窗口无感(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 仍然看得见之前的图,所以"保持版式、配色调深一点"这种说法能直接用。
```jsonc
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` 会让车道空转,这是批量变慢的主因。
新增与改动的工具:
```jsonc
// 一次排入整批不同提示词
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 持久队列。每条车道有独立后台进程与任务数据,同时执行一个任务。普通 Chrome 扩展通道共用原账号登录态,每条车道独占一个标签页;旧浏览器通道使用独立 Profile。多个 agent 可同时提交,空闲车道领取,其余排队。后台自主检查生成、下载和收尾,客户端断开不会终止任务。
**并发上限等于车道数,不等于账号数。** 扩展车道是一张独立自动化标签页,一次只做一个任务。多个车道可以共用同一普通 Chrome 登录态,无需复制 Cookie。想提高并发,给已登录账号加车道:
```powershell
# 每个账号 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 或提供远程服务。两个账号的实际速度、额度和网页可用性仍由服务决定。
## 安装与初始化
在项目独立目录安装:
```powershell
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。
```powershell
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 复制。
```powershell
# 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=<job_id> 在原对话里追问 |
| image_generate_batch | 一次排入整批不同提示词,立刻占满所有空闲车道;整体校验、按 request_id 幂等 |
| image_poll | 读取/等待自己的任务;传 job_ids 一次等待整批,return_when=any 可提前取回 |
| image_status | 缓存健康、后台存活、任务状态数量和账号操作结果 |
| image_open | 默认打开账号浏览器供查看,不暂停自动化;for_login=true 才进入人工登录接管 |
| 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-<account_id> 文件,等其退出;删除该精确文件后下次调用恢复。不要终止其他浏览器或生产 Hub。
每个 worker 启动时清除其他 CHATGPT_WEB_IMAGES_* 环境覆盖,再设置自己的配置、数据和共享队列。登录态只保存在本机专属 Profile。队列含提示词、文件路径和任务记录,按本机私有数据管理,不提交到仓库。
## 验证
```powershell
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
```
模拟测试覆盖多客户端、双进程、去重、断开继续执行、故障隔离、取消与恢复,不代表真实账号生成成功。真实验收单独验证登录与原图下载。内部图片模型未核实,不宣称精确型号,不绕过网页校验或额度。
This server cannot be deployed
Maintenance
ActivityActive
ResponsivenessNo issues