---
name: chatgpt-web-bridge
description: |
  通过 chatgpt-web 桥（MCP / REST）把本地 agent 接入 ChatGPT 网页版：网页端当大脑，本地只做传输与执行。
  触发：「推进/继续网页端会话」「让网页端设计、本地执行」「对等模式/让两边辩一下/协作评审」「用网页端的资料/只读拉取」「把网页版接进 harness」「conversation_id 续接」「网页版比较聪明所以用它」。
  不适用：让网页端直接执行本地 shell/文件操作——桥只承载文本，网页端永远没有本地工具。
---

# ChatGPT Web Bridge

## 快速使用（自然语言即模式）

| 你说 | 模式 | 本地做什么 |
|---|---|---|
| 「推进网页端 XXX 项目/会话」 | A 推进 | 发「继续」式最小提示往前推；纠偏算在内（只给事实不给方案）；判断何时真结束，没结束就不停 |
| 「让网页端 GPT 指挥现在这个项目」 | B 指挥循环 | 它出指令 → 本地执行 → 回帖事实到同一 conv → 直到它说完成 |
| 「和网页端 GPT 协作/对等讨论这个项目」 | C 对等 | 盲答 → 逐条交锋 → 收敛或分歧报告 |
| 「用网页端 XXX 的资料/看它怎么说的」 | D 只读 | 只拉取不发送：会话记录、项目文件、记忆——零写操作 |

**会话定位**：指明 conversation_id/标题就精确命中；没指明 → 按项目名归类（`list_conversations` + `list_projects` 匹配）；仍不确定 → **先问用户再发**，不猜。首轮新会话：用户说了项目就带 `project_id`（名字即可），没说 = 独立会话。

## 核心原则：谁思考

**网页端是大脑，本地是手和邮差。**

- 网页端持有完整上下文（会话历史 + Project 指令 + Memory）——它的判断依赖这些，不需要在消息里复述给它。
- 本地侧只做三件事：把文字送进正确的 conversation_id、把回文拿回来、（指挥模式下）忠实执行网页端给出的任务。
- **不要替它写执行步骤。** 发「继续」式最小提示，让它自己决定下一步。消息写得越细，网页端思考得越少。

## 适用边界与安全

**触发**：推进/继续已有网页端会话、网页端设计本地执行的回合制循环、conversation_id 专线续接。

**不适用**：

- 让网页端直接执行本地命令或读写文件——桥是文本桥，网页端永远没有本地工具
- 高频自动轮询——这是低频人工节奏
- Chrome 专用 profile 未登录 ChatGPT——先登录再调用，别让请求悬死

**安全与验证**：所有写操作（新建会话、删除会话）都是真实网页操作；删除类工具需服务端显式 `W2A_ENABLE_DESTRUCTIVE=1`。本地侧只验证 conversation_id 续接正确、tab 复用正确，不替网页端校验其输出内容的正确性——那是它自己的责任。

## 循环纪律：本地侧是唯一的发动机

网页端永远不会主动发起下一轮——**本地收到回帖不等于回合结束**。每轮拿到回文后，先对照本模式的终止条件判断；不满足就继续发下一轮，直到终止条件命中或用户叫停。「它回完了」不是停止理由，「终止条件命中」才是。

## 四种用法

### A. 推进模式（默认，低频）

把已有网页任务往前推一格：

- 最小提示：`继续` / `按你的结论推进` / `下一步`
- 纠偏只给判断不给方案：`这条线判断错了，事实是 X` —— 让它自己想修法
- 每轮必须带 conversation_id；不知道就先 `list_conversations` 找目标
- 网页端产出长报告时，本地只保存/转发原文，不做二次「翻译」
- **终止条件**（满足其一才停）：网页端书面宣布本阶段完成且没有它自己的下一步；它提出需要用户/外部世界才能回答的问题（权限、要买的数据、要你拍板的方向）；用户叫停。**它写完一轮报告不是终止。**

### B. 指挥循环（网页端指挥本地）

网页端设计 → 本地执行 → 回帖 → 网页端继续设计：

1. 首轮 `chat_completion`（可带 `project_id` 让会话落进项目），存下返回的 `conversation_id` 作为专线
2. 每轮本地回帖只写事实：**结果摘要 + 关键证据 + 阻塞项**，不夹带自己的分析
3. 网页端输出的指令照做，做完把结果发回同一 conversation_id
4. 循环频率低是正常的——这是回合制协作，不是轮询系统
5. **继续义务**：回帖后必须读它的下一条指令并执行——一轮就停等于循环没建起来
6. **终止条件**（满足其一才停）：网页端宣布任务完成/无下一轮指令；连续两轮它只复述已有结论不产生新指令；它的指令越权（要本地没有的能力）且澄清后仍无法执行；用户叫停

### C. 对等协作模式（手动触发，标签 PEER）

本地模型与网页端同等身份共同推进，没有谁指挥谁。适用前提：**token 不缺、本地智力被认可、两边互有知识盲区**——网页端看得见它的搜索/项目/Memory，本地看得见文件系统/执行结果/实时状态。任何其他场景回到 A/B。

**触发**：只在用户明确要求时启用（如「对等模式」「让两边辩一下」「协作评审」）。不自动进入。

**协议（防坍缩结构，顺序不可省）**：

1. **R0 盲答**：同一问题两侧独立作答——网页端**不许看**本地已写好的答案，本地也别先发自己的立场去锚它。各自交卷后才交换。
2. **对齐盲区**：首轮双方各自声明「我看不见什么」。之后把问题路由给看得见的那侧：网页端要本地数据就问，本地要网页端搜/读项目就问。
3. **逐条交锋**：每个议题独立走状态机 `proposed → accepted / rejected / deferred / escalated`。反驳先 steelman（复述对方论点的最强版本），再给证据反驳；**只有新证据能翻案，自信语气不算证据**。
4. **轮次封顶**：默认 5 轮或议题清零。到顶仍分歧 → 产出**分歧报告**（各自立场 + 关键证据 + 僵持点）交给用户裁决。禁止假装共识。
5. **谄媚自检**：连续两轮没有任何实质异议是危险信号不是成功信号——此时主动要求对方「指出我立场里最弱的一点」。

**信封格式**（每轮本地发给网页端的消息）：

```text
[PEER R{n}] {议题}
我的立场: …
依据: …
对你上轮的反驳: （先复述你的最强版本）…
我可能盲的地方: …
需要你侧的数据: …
待裁决: …（无则省）
```

**终止**：双方书面确认收敛，或分歧报告交付用户，或用户喊停。**只交换一轮不是对等协作——议题未达终态前本地侧必须继续发下一轮。**

### D. 只读模式（用网页端的资料，不发送）

用途：把网页端已积累的东西当本地输入——会话历史、项目文件、Memory、它的既有结论。零发送、零新会话、零 Memory 写入。

- 通道：`list_conversations` / `get_conversation` / `list_projects` / `get_project_files` / `get_memories`（MCP 走共享 utility 槽，不占会话 tab）
- 单次请求即结束——只读没有循环，拿到资料就地交付
- 拿到长资料本地只做筛选/引用，不改写它的结论
- 触发词：「用网页端 XXX 的资料」「看看它/项目里怎么说的」「把 XXX 会话的结论拉下来」

## 硬规则

- **一对一专线**：一个本地会话只绑定一个网页端 conversation_id。禁止为多路并行/A-B 盲测/分身评审开多个网页会话——需要隔离执行时用本地子代理（各自独立上下文，天然盲），不需要隔离的活本地自己做。
- **执行永远本地**：凡是要产出/执行/跑实验的活都在本地完成（含子代理）；网页端只承担依赖它自身上下文与判断的角色（推理、评审、用它项目知识的分析），不是并行生成器。「我做不了干净的盲」不成立——本地起个子代理就是干净的盲。
- **转述中立**：把用户任务发给网页端时逐字或中性改写，不自行加预设方向（如「哪里弱/哪里是自我安慰」这类措辞等于替它定了批判结论）。

1. 专线靠 `conversation_id` 续接；首轮创建后可省略（同 session 自动续），跨 session 必须显式带
2. 永不发「记住/以后都/remember」措辞——会污染 ChatGPT Memory
3. 临时上下文塞在 message / system_prompt 里，不落 Memory
4. 同一会话永远落在同一个浏览器 tab（conv-affinity 内置）；别手动挪桥用 tab
5. 要项目上下文就显式传 `project_id`（gizmo id 或精确项目名，桥会校验，传错直接报错而不是落错项目）；不传 = 独立会话，别指望项目记忆
6. 首轮一次带对 project_id；发现发错会话/项目时**不要立刻重发**——先确认前一条是否已落地，否则产生重复会话
7. 只读任务在消息里声明「只读测试」；删除类工具需服务端 `W2A_ENABLE_DESTRUCTIVE=1`
8. 生成很慢（联网搜索 + 长报告）：客户端超时 ≥15 分钟，中途绝不重发
9. 桥内置账号级跨进程节流（send ≥30s、backend 读 ≥8s、命中限流全体冷却 300s，配置 `request_pace_*`/`W2A_PACE_*`）——别写循环猛发绕过它，限流会连累所有通道

## 通道选择

| 场景 | 通道 | 说明 |
|---|---|---|
| 串行推进会话 | REST `POST /v1/chat/completions` + `conversation_id` | daemon 复用会话 tab |
| agent 工具态 | MCP `chatgpt-web` → `http://127.0.0.1:8090/sse` | `chat_completion` + 读工具 |
| 读会话/列项目 | MCP `get_conversation` / `list_*` | 走共享 utility 槽，不占会话 tab |

## 运维（本机实例）

- 启动：`C:\Desktop\chatgpt-web2api\start.ps1`（Chrome 独立进程 + REST :8080 + MCP :8090）
- Chrome 与 daemon 生命周期解耦：重启 daemon 不动浏览器，反之亦然
- 登录态掉了：在专用 profile 的 Chrome 里登录，daemon 自动恢复
- 排查 tab 绑定：`http://127.0.0.1:9222/json/list`
- 其它设备安装：见 `examples/install-other-devices.md`（桥已 vendored 在 `mcp/chatgpt-web-bridge/`，随本仓库同步）

## 反模式

- 消息里写好全套执行步骤让网页端照做——等于你在思考
- 每轮不带 conversation_id——每轮一个新会话，上下文全断
- 给网页端发「执行这条 shell 命令」——它没有也不该有本地工具
- 客户端默认 60s 超时——正常生成要数分钟
- 对等模式下让网页端先看你答案再「评审」——锚定的同意不是共识
- 对等模式分歧到顶继续磨——出分歧报告交用户，不伪造收敛
- 收到一轮回帖就当任务结束——终止看条件不看「它这轮说完了」
- 把「干净 A/B」拆给两个网页会话——盲隔离用本地子代理做，不是多开专线
- 以「我无法盲自己」为由把执行外包——本地子代理的隔离上下文就是盲
