返回资讯中心
外部精选
软件工程
#开发者实时流

开发者打造Parallax工具,用ChatGPT网页版充当编码代理大脑

来源标题:ChatGPT Web as an Agent Runtime

开发者构建了实验性编码工具Parallax,不调用API,而是通过Chrome扩展打开chatgpt.com标签页输入任务,将ChatGPT生成的命令在本地执行后回传结果,循环直至任务完成。该工具由桌面应用和Chrome扩展两部分组成,ChatGPT网站本身对此毫不知情。开发者表示Parallax不向公众开放,也不建议他人仿制。

Hacker News 最新akshithio2026/11/3 · 4 天前30 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

Parallax 是我过去几个月一直在做的一个实验性编码框架,它的“大脑”是 ChatGPT 网站。当你在 Parallax 桌面应用里输入任务时,它不像普通框架那样向 API 发送请求,而是打开一个 chatgpt.com 标签页,把你的请求输入进去,拿到 ChatGPT 生成的命令,在你的电脑上执行,再把结果发回 ChatGPT 标签页。这个循环会一直重复,直到任务完成。在这篇笔记里,我会带你了解这套机制的核心技术细节,然后解释为什么 Parallax 不向公众开放,以及为什么你不应该尝试构建类似的东西。不过先说这么多,下面是一段 Parallax 实际运行的视频:1:58

核心架构

Parallax 由两部分组成:一个桌面应用和一个 Chrome 扩展。桌面应用在你的电脑上执行实际命令,Chrome 扩展则负责运行 ChatGPT 标签页,但它碰不到你电脑上的任何东西。ChatGPT 网站本身对 Parallax 一无所知,它只看到有人在发消息。桌面应用有两个进程:负责显示 UI 的渲染进程,以及负责执行 shell 命令的主进程。Chrome 扩展有一个持续在后台运行的脚本,叫做 service worker,它通过 WebSocket 连接桌面应用,并记住桌面应用里的哪个线程对应浏览器里的哪个标签页。

如果你不熟悉 WebSocket,可以把普通的网络流量想象成寄信:你的浏览器发出一个请求(比如“把这个页面给我”),服务器返回一个响应(这个页面),一次交互就结束了。在这种模式下,服务器永远不能主动发起对话,只能回复。WebSocket 更像打电话:一方拨号,另一方接听,然后线路一直保持畅通。任何一方都可以随时说话,想说多少次就说多少次,直到其中一方挂断。每条消息是一小段文本,具体到 Parallax,每一段始终是一个带 type 属性的 JSON 对象。

Parallax 需要 WebSocket,是因为扩展需要每秒多次把模型的响应持续不断地流式传给桌面应用,同时桌面应用也需要告诉扩展把用户的消息发给 ChatGPT。这是一场双向的持续对话(全双工),而这正是 WebSocket 的用武之地。桌面应用的主进程在 localhost:8765 上开启一个 WebSocket 服务器,扩展的 service worker 连接到 ws://localhost:8765。这样双方就能像这样交换消息:

desktop → extension { "type": "send_message", ... } 把这句输入到该线程的标签页里 extension → desktop { "type": "stream_update", ... } 这是目前为止的答案 extension → desktop { "type": "response", ... } 答案已完成 extension → desktop { "type": "turn_status", ... } 哪些轮次仍在运行

为了防止 Chrome 在扩展的后台脚本空闲时将其关闭,桌面应用每 10 秒向扩展发一次 ping,同时一个计时器每 30 秒唤醒扩展的 service worker,以便在连接断开时重新连接。除了 service worker,这个扩展基本上可以归结为两个 .ts 文件:一个是内容脚本 content.ts,负责读取和点击页面;另一个是页面脚本 inject.ts,它被注入到页面自身的 JavaScript 中,像 ChatGPT 自己的代码一样运行,这让扩展能够做一些事情,比如原生地编辑文本编辑器、读取标签页的网络流量。为此,内容脚本会在页面里放入一个 <script> 标签,把页面脚本 inject.ts 加载进标签页自身的 JavaScript 环境。然后,内容脚本和页面脚本可以通过 window.postMessage 互相通信,这让内容脚本能够输入特定的文本,并在模型响应流式返回网站的过程中接收它。

对大多数扩展来说,Chrome 会确保扩展代码与网站代码完全隔离。这使它们运行在一个封闭空间里,能看到并点击页面上的一切,但碰不到页面自身的 JavaScript。然而,Parallax 需要做两件只有修改页面自身 JS 才能完成的事:

其中一些内容我在“驱动 ChatGPT 标签页”一节里有更详细的说明。

要让 Parallax 工作,它需要能够以编程方式、稳定地向 ChatGPT 的输入栏输入内容。像直接把文本粘贴到输入栏这种简单做法行不通,因为当文本太长时,网站会把它变成一个附件,于是发送的是文件而不是提示词。我试过的另一种做法是设置 textContent DOM 属性,但这只改变了屏幕上的文字,输入组件的内部状态实际上没有变,也就是说 ChatGPT 根本看不到这条消息。要解决这个问题,需要让扩展以 ChatGPT 自身代码的同样方式,原生地编辑输入栏。输入栏把内容保存在一个叫 EditorView 的对象里,每一次变更(比如有人打字)都会经过这个对象的 dispatch 函数。所以,如果扩展能定位到 EditorView 组件及其 dispatch 函数,它就能自己替换内容,而 ChatGPT 会把它当作普通用户编辑一样对待。

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →