site logo

Marico's space

让 ChatGPT agent 在独立计算机上自主运行。用 OpenAI Responses API 构建相同功能

AI技术与应用 2026-10-05 11:29:27 8

最近折腾了用大模型控制远程计算机这事儿,踩了几个坑,这篇把问题说清楚。

去年 OpenAI 给 ChatGPT 上线了 Agent 功能,可以自己操作浏览器和终端。底层逻辑其实挺清晰的:给 Agent 一台独立云电脑、用户能实时观看还能随时接管、高风险操作必须确认。这套模式现在可以用 OpenAI Responses API 配合第三方云电脑服务复现出来,下面细说。

ChatGPT Agent 做了什么

OpenAI 在 2025 年 7 月 17 日开始向 Pro、Plus 和 Team 用户推送 ChatGPT Agent。它把 Operator 的网页点击能力和深度研究能力整合到一起,还加入了终端操作。

它的计算机使用方式是这样的:

  • 运行在隔离环境中,配备可视化浏览器、文本浏览器和终端。
  • 遇到需要密码的网站时,用户切换到接管模式,自己输入密码。
  • 执行购买、发送邮件等高风险操作前会请求许可。用户也可以开启观察模式实时监督。

2026 年 9 月 29 日,OpenAI 又上线了 Dots 功能:面向 Pro 和 Business Premium 用户的常驻 Agent。每个 Dot 都有自己的云电脑,用户可以随时查看它的操作状态。用户可以设定规则,决定 Dot 能自主完成什么、什么需要自己审批。

核心模式

说白了就是三件事:给每个用户分配一台独立机器、让用户能看能接管、在 Agent 执行流程里加上审批环节。

密码永远不过模型——登录操作由用户自己在屏幕上完成。高风险步骤必须用户明确确认。要把这个模式做进产品里,你需要:每用户一台机器、用户能观能管的界面、Agent 执行链路上的审批节点。

用 Responses API 和 Burrowbox 构建

Burrowbox 和 OpenAI 没有合作关系,只是它提供的云电脑自带 MCP(模型上下文协议)端点,而 OpenAI Responses API 能直接调用远程 MCP 服务器,所以模型可以直接驱动机器,你这边不需要额外部署 MCP 客户端。

1. 创建机器

curl -X POST https://burrowbox.dev/api/machines \ -H "Authorization: Bearer $BURROWBOX_KEY" -H "Content-Type: application/json" \ -d '{"name": "sam", "size": "tiny", "externalId": "user_42", "ttlMinutes": 60}'
# → { "id": "2f6aeedcd3", "mcpUrl": "https://burrowbox.dev/api/machines/2f6aeedcd3/mcp", "mcpToken": "tmm_…", … }

2. 把模型指向机器的 MCP 端点

读操作(截图、快照)直接执行,不需要问。其他操作(点击、表单填写、终端命令)统一走审批流程。

import OpenAI from "openai";
const openai = new OpenAI(); const machineTool = { type: "mcp", server_label: "burrowbox", server_url: process.env.MCP_URL, // the machine's mcpUrl authorization: process.env.MCP_TOKEN, // the machine's mcpToken require_approval: { never: { tool_names: ["browser_navigate", "browser_snapshot", "browser_screenshot", "screenshot"] } },
}; let resp = await openai.responses.create({ model: "gpt-6-astra", tools: [machineTool], input: "Find a table for two on Friday at 7pm on example-bookings.com and get it ready to confirm.",
});

3. 执行前请求用户确认

for (const item of resp.output.filter((o) => o.type === "mcp_approval_request")) { const ok = await askUser(`Allow ${item.name}(${item.arguments})?`); // your UI resp = await openai.responses.create({ model: "gpt-6-astra", tools: [machineTool], previous_response_id: resp.id, input: [{ type: "mcp_approval_response", approve: ok, approval_request_id: item.id }], });
}
console.log(resp.output_text);

这里只处理了一轮确认。实际使用时需要循环处理,直到没有待审批的请求。

4. 登录时接管

当 Agent 遇到登录页面时,创建一条交互式实时预览链接展示给用户。用户直接在机器的浏览器里输入密码,这些内容永远不会流经模型。机器停止时 Cookie 会被保留,所以通常只需要登录一次。

curl -X POST https://burrowbox.dev/api/machines/$MACHINE_ID/live-view \ -H "Authorization: Bearer $BURROWBOX_KEY" -H "Content-Type: application/json" \ -d '{"mode": "browser", "interactive": true, "ttlSeconds": 600, "allowedOrigins": ["https://app.example.com"]}'
# → { "url": "https://burrowbox.dev/embed/2f6aeedcd3?t=…", "iframe": "<iframe …>" }

如果要做观察模式,把 "interactive": false 即可。这样输入会被阻止在机器本身,而不只是页面里。如果不想走接管流程,也可以把登录凭证存进机器的 vault(密钥保管库),Agent 就能直接用 browser_login 调用,完全看不到密码。

5. 常驻模式(类似 Dots)

设置 "ttlMinutes": null(调用 PATCH /api/machines/{id})可以让机器保持运行。也可以用定时任务配合 wakeIfStopped 和 stopAfter,让它只在有任务时才启动和计费。tiny 规格的机器运行费用是每小时 0.07 美元。

去注册账号就能上手试试。