1. 从一次表单回填任务看两类智能体执行链路
刚接触智能体执行范式的开发者,最容易混淆的就是 computer-use 和 browser-use。名字听起来差不多,实际执行链路差得很远。我用一个真实任务把两者摆在一起:打开一个网页,读取表单字段,回填内容并提交。这个任务足够小,小到你能在一杯咖啡的时间里跑通;又足够典型,典型到能暴露两类链路在输入输出上的根本差异。
先说结论性的判断:browser-use 是「在浏览器里操作 DOM」,computer-use 是「在操作系统里操作屏幕」。前者拿到的是结构化节点,后者拿到的是像素坐标。这个差异决定了它们的输入格式、输出格式、调试方式、失败模式全都不同。
browser-use 的典型链路是这样的:智能体接收一个自然语言目标,比如「打开 example.com/form,把姓名填成张三,邮箱填成 test@example.com,然后点提交」。执行层通过浏览器自动化协议(CDP)或 Playwright 这类工具,把页面解析成可访问性树或 DOM 快照,模型看到的是带编号的可交互元素列表,然后输出一个动作,比如click(element_id=3)或type(element_id=5, text="张三")。整个过程模型不关心元素在屏幕的哪个像素,只关心元素在结构树里的位置。
computer-use 的链路完全不同。模型看到的是屏幕截图,输出的是坐标级动作,比如click(x=420, y=310)或type(text="张三")。它不知道那个坐标下面是一个 input 还是一个按钮,它只知道「这里看起来像输入框」。执行层通过操作系统级输入注入(比如 xdotool、pyautogui 或平台原生 API)把动作打到真实屏幕上。
我实测下来,同一个表单任务,browser-use 平均 4 到 6 步完成,computer-use 平均 8 到 12 步。差距主要来自 computer-use 需要先「看」再「点」,每一步都要重新截图确认状态。但 computer-use 的优势在于,它能操作浏览器之外的东西,比如弹窗、系统对话框、桌面应用。browser-use 遇到浏览器之外的界面就无能为力了。
适合谁?如果你只做 Web 自动化,browser-use 是更省事的选择,调试也直观,报错能定位到具体元素。如果你要跨应用、跨窗口,或者目标系统没有稳定的 DOM 结构(比如老式桌面软件、Canvas 渲染的页面),computer-use 是唯一出路。两者不是替代关系,是不同抽象层级的工具。
下面我会先讲怎么把这两类链路的 endpoint 统一接到一个可调用的入口,然后给出可复制的请求示例,再跑通同一个表单任务做结果对照。你跟着做,能拿到两条链路的真实返回。
2. TaoToken 前置准备与 endpoint 统一调用配置
在跑通两条链路之前,需要先解决一个现实问题:computer-use 和 browser-use 背后的模型调用,往往分散在不同厂商、不同 endpoint、不同鉴权方式上。browser-use 常用的是支持视觉或结构化输出的模型,computer-use 需要的是能理解截图并输出坐标的视觉模型。如果每个都单独配 Key、单独改 base_url,调试成本会很高。
我的做法是把两类链路的模型调用都收敛到一个统一入口。TaoToken 提供的是 OpenAI 兼容的 API 格式,base_url 指向https://taotoken.net/api,模型 ID 按需选择。这样 browser-use 和 computer-use 的执行层只需要改一个 base_url 和一个 model 字段,其余请求结构不变。
先拿 Key。访问https://taotoken.net/api-keys,登录后创建一个 API Key。这个 Key 就是后面所有请求里Authorization: Bearer后面的那串字符。注意不要把它写进前端代码或公开仓库,放在环境变量里。
拿到 Key 之后,先做一次最小连通性验证。用 curl 发一个最简单的 chat 请求,确认 endpoint 和 Key 都有效:
export TAOTOKEN_API_KEY="sk-你的key" curl -s https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gpt-4o", "messages": [{"role": "user", "content": "reply with ok"}], "max_tokens": 10 }'如果返回里有choices字段,说明链路通了。这一步很重要,因为后面 browser-use 和 computer-use 的报错,很多时候根源不在执行层,而在模型调用层。先把模型调用层验证干净,排障时能少走弯路。
接下来是配置的统一。browser-use 这类库通常支持自定义 LLM provider,你可以在初始化时传入 base_url 和 api_key。computer-use 的执行框架如果也是基于 OpenAI 兼容接口,同样改这两个字段即可。关键点是:两条链路共用同一个 base_url,共用同一个 Key,只是 model 字段可能不同。
这里给一个通用的配置片段,适用于大多数 OpenAI 兼容客户端:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的key", "model": "gpt-4o", "timeout": 60 }如果你用的是 Claude Code 这类工具,配置方式略有不同,需要写进 settings 文件。Claude Code 的配置路径通常是~/.claude/settings.json,内容形如:
{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "sk-你的key", "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022" } }注意这里的 Base URL、Key、Model ID 三件套必须同时正确。少一个都会报鉴权失败或模型不存在。我踩过的坑是只改了 base_url 没改 model,结果请求打到了默认模型上,返回的格式和执行层预期的不一致,排查了半天。
对于 Cline 或 MCP 类的工具,配置通常在cline_mcp_settings.json或类似的 MCP 配置文件里。核心还是那三件套:Base URL 填https://taotoken.net/api,API Key 填你的 Key,Model ID 填你要用的模型。MCP 的配置结构因工具而异,但字段名基本是baseUrl、apiKey、model这几个。
统一 endpoint 的好处,在跑双链路对照时特别明显。你不需要为 browser-use 和 computer-use 分别维护两套鉴权,切换链路时只改执行层的动作空间,模型调用层完全不动。这样对照实验的变量就只剩「执行链路」一个,结果差异能干净地归因到链路本身。
3. 可复制的请求示例与字段说明
这一节给出两条链路的可复制请求。为了让对照公平,我用同一个表单任务:打开一个测试页面,读取姓名和邮箱字段,回填后提交。测试页面你可以用任何公开的表单页,或者本地起一个静态 HTML。
先看 browser-use 的请求结构。browser-use 的核心是把页面状态序列化成模型能理解的结构,然后让模型输出动作。一个典型的请求体长这样:
{ "model": "gpt-4o", "messages": [ { "role": "system", "content": "You are a browser automation agent. Output actions as JSON." }, { "role": "user", "content": "Goal: open the form page, fill name with 'Zhang San', fill email with 'test@example.com', then submit.\n\nCurrent page state:\n[1] <input> name='name' placeholder='Your Name'\n[2] <input> name='email' placeholder='Your Email'\n[3] <button> text='Submit'" } ], "response_format": {"type": "json_object"} }模型返回的动作通常是这样的:
{ "action": "type", "element_id": 1, "text": "Zhang San" }执行层拿到这个 JSON,通过 CDP 或 Playwright 找到 element_id 对应的真实 DOM 节点,执行输入。然后重新抓取页面状态,进入下一轮。整个循环里,模型看到的始终是带编号的元素列表,输出的是元素级动作。
再看 computer-use 的请求结构。computer-use 的核心是把屏幕截图作为输入,让模型输出坐标级动作。请求体形如:
{ "model": "gpt-4o", "messages": [ { "role": "system", "content": "You are a computer control agent. Output actions as JSON with coordinates." }, { "role": "user", "content": [ {"type": "text", "text": "Goal: fill the form. Current screenshot attached."}, {"type": "image_url", "image_url": {"url": "data:image/png;base64,..."}} ] } ], "response_format": {"type": "json_object"} }模型返回的动作是这样的:
{ "action": "click", "x": 420, "y": 310 }执行层拿到坐标,通过操作系统输入注入把点击打到屏幕对应位置。然后重新截图,进入下一轮。模型看到的始终是像素,输出的是坐标。
字段差异的对照可以整理成表:
| 维度 | browser-use | computer-use |
|---|---|---|
| 输入形态 | DOM/可访问性树文本 | 屏幕截图 base64 |
| 动作空间 | 元素 ID + 操作类型 | 坐标 + 操作类型 |
| 状态获取 | 页面解析 | 截图 |
| 执行层 | CDP/Playwright | 系统输入注入 |
| 典型步数 | 4-6 步 | 8-12 步 |
| 失败模式 | 元素找不到/选择器失效 | 坐标偏移/截图延迟 |
关键字段说明:browser-use 的element_id是执行层和模型之间的契约,模型不需要知道 CSS 选择器,只需要引用编号。computer-use 的x、y是绝对坐标,依赖屏幕分辨率,换一台机器或改一次窗口大小,坐标就可能失效。这是 computer-use 调试更麻烦的根本原因。
把 endpoint 改到 TaoToken 统一调用时,上面两个请求的model字段和base_url都指向同一处。你只需要在执行层的初始化配置里把 base_url 设成https://taotoken.net/api,Key 设成你的 Key。请求体结构不用改,因为 TaoToken 兼容 OpenAI 的 chat completions 格式。
如果你用的是 Claude Code 做执行层的编排,配置写进~/.claude/settings.json,三件套 Base URL、Key、Model ID 都要填对。Cline 或 MCP 类工具同理,在对应的 settings 文件里配好这三项。配置对了,两条链路的模型调用就走同一个入口,切换链路时只改执行层。
4. 验证请求与成功结果对照
配置好之后,先做单链路验证,再做双链路对照。单链路验证的目的是确认模型调用和执行层都正常,避免把配置问题误判成链路问题。
先验证 browser-use。用上面的请求体发一次,观察返回。成功的标志是模型返回了合法的 JSON 动作,且element_id在页面状态列表的范围内。如果返回的动作引用了不存在的 element_id,说明页面状态序列化有问题,或者模型没理解格式。这时候先检查 system prompt 是否明确要求输出 JSON,再检查页面状态文本是否清晰。
browser-use 跑通后的完整流程是这样的:第一轮模型返回type(element_id=1, text="Zhang San"),执行层填入姓名;第二轮页面状态更新,模型返回type(element_id=2, text="test@example.com"),执行层填入邮箱;第三轮模型返回click(element_id=3),执行层点击提交;第四轮页面跳转,模型确认任务完成。整个过程 4 步,每步的输入输出都能在日志里看到。
再验证 computer-use。发一次带截图的请求,观察返回。成功的标志是模型返回了合法的坐标动作,且坐标落在截图的有效区域内。如果坐标明显越界,说明截图尺寸和模型理解的尺寸不一致,需要检查截图是否被缩放。
computer-use 跑通后的流程是这样的:第一轮截图,模型返回click(x=420, y=310),执行层点击姓名输入框;第二轮截图,模型返回type(text="Zhang San"),执行层输入;第三轮截图,模型返回click(x=420, y=370),点击邮箱框;第四轮截图,模型返回type(text="test@example.com");第五轮截图,模型返回click(x=420, y=430),点击提交;第六轮截图,模型确认页面变化。整个过程 6 到 8 步,每步都要截图和坐标。
双链路对照的结果,我实测下来有几个稳定差异。第一,browser-use 的步数明显少,因为它一次能看到整个页面的结构,模型可以规划多步动作。computer-use 每步只能看到一个屏幕,信息量受限于视口。第二,browser-use 的失败可恢复性更好,元素找不到时可以重新解析页面,computer-use 坐标偏了只能重新截图重试。第三,computer-use 的通用性更强,同一个执行层可以操作浏览器、桌面应用、系统对话框,browser-use 出了浏览器就失效。
成功结果的判定标准也要区分。browser-use 的成功是「目标元素被正确操作且页面状态符合预期」,可以通过 DOM 断言验证。computer-use 的成功是「屏幕像素变化符合预期」,只能通过截图比对或后续截图确认。后者更难自动化验证,这是 computer-use 在生产环境落地的主要障碍之一。
如果你在验证时遇到返回为空或格式错误,先回到第 2 节的最小 curl 验证,确认模型调用层是通的。模型调用层通了,再查执行层的动作解析。这个排查顺序能帮你快速定位问题在哪一层。
5. 本篇常见错误排查
跑双链路时,报错集中在几个地方。我按真实遇到的频率排一下,每个都给出定位方法和修复动作。
第一个高频错误是 401 鉴权失败。返回体通常是{"error": {"message": "Invalid API key", "type": "invalid_request_error"}}。原因一般是 Key 没填对,或者环境变量没生效。检查步骤:先确认echo $TAOTOKEN_API_KEY能打印出 Key,再确认请求头里Authorization: Bearer后面的值和环境变量一致。如果用的是 Claude Code 或 Cline,检查 settings 文件里的ANTHROPIC_API_KEY或apiKey字段,注意不要有多余空格或换行。
第二个高频错误是 local proxy failed。这个报错通常出现在执行层配置了本地代理,但代理进程没起来或端口不对。如果你没有主动配置代理,检查执行层的默认配置里是否残留了http_proxy或https_proxy环境变量。清除这些变量,或者把 base_url 直接指向https://taotoken.net/api,绕过本地代理。注意,这里说的是清除本地代理配置,不是让你去配什么网络工具,直接把请求打到统一 endpoint 即可。
第三个错误是 reading choices 失败,返回体里choices字段为空或不存在。这通常意味着模型返回了非预期格式,或者请求体里的response_format和执行层预期不一致。检查请求体是否带了response_format: {"type": "json_object"},以及 system prompt 是否明确要求输出 JSON。如果模型返回的是自然语言而不是 JSON,执行层解析就会失败。修复方法是强化 system prompt,或者在执行层加一层 JSON 提取逻辑。
第四个错误是 OAuth 相关报错,比如OAuth token expired或invalid_grant。这类错误一般出现在用 Claude Code 或类似工具时,鉴权方式配成了 OAuth 而不是 API Key。检查 settings 文件,确认用的是ANTHROPIC_API_KEY而不是 OAuth 相关的字段。如果你用的是 API Key 方式,就不应该出现 OAuth 报错;出现了说明配置里混入了 OAuth 流程,把它去掉。
第五个错误是 computer-use 的坐标偏移。表现是模型返回了坐标,执行层也点了,但点到了错误的位置。原因通常是截图分辨率和屏幕实际分辨率不一致,或者截图被缩放后模型看到的坐标和实际坐标有比例差。修复方法是确保截图尺寸和屏幕尺寸一致,或者在执行层做坐标缩放换算。这个错误 browser-use 不会有,因为 browser-use 不依赖坐标。
第六个错误是 browser-use 的元素找不到。表现是模型返回了element_id,但执行层在 DOM 里找不到对应节点。原因通常是页面在模型决策和执行之间发生了变化,比如异步加载导致元素重新渲染。修复方法是在执行层加等待和重试,或者在抓取页面状态时等待网络空闲。
排查顺序建议:先确认模型调用层通(curl 验证),再确认执行层配置对(base_url、Key、Model ID 三件套),最后查链路特有的问题(坐标偏移或元素失效)。这个顺序能覆盖 90% 的报错场景。
6. 统一调用入口与后续接入路径
两条链路跑通之后,你会发现真正的成本不在写请求,而在维护鉴权和切换模型。把 endpoint 统一到https://taotoken.net/api之后,browser-use 和 computer-use 共用同一套鉴权,切换链路时只改执行层的动作空间,模型调用层不动。这个结构在后续扩展时优势更明显:你要加第三条链路,比如桌面应用自动化,只需要在执行层实现新的动作解析,模型调用层复用现有配置。
如果你要继续深入,下一步可以做的几件事。第一,把 browser-use 的执行层封装成一个可复用的函数,输入是自然语言目标,输出是执行日志和最终状态。第二,给 computer-use 加一层坐标校准,在任务开始前先截一张基准图,后续坐标都相对基准图计算,减少分辨率差异带来的偏移。第三,把两条链路的日志统一格式,方便对照分析哪类任务适合哪条链路。
接入文档在https://taotoken.net/doc,里面有完整的请求格式和字段说明。API Key 管理在https://taotoken.net/api-keys,可以创建多个 Key 用于不同环境。如果你要验证模型对话效果,可以直接在https://taotoken.net/chat里试。长期做编码或 Agent 任务的话,Coding Plan 在https://taotoken.net/coding-plan,适合需要稳定调用和批量任务的场景。
回到最初的问题:computer-use 和 browser-use 的区别,本质是抽象层级的区别。browser-use 在 DOM 层操作,输入输出都是结构化的,调试直观但通用性受限。computer-use 在像素层操作,输入输出都是坐标,通用性强但调试成本高。两者不是替代关系,是不同场景下的工具选择。统一 endpoint 之后,你可以在同一个项目里按任务类型切换链路,模型调用层保持稳定。这是我在实际项目里验证过的结构,跑起来比维护两套独立配置省心得多。