保持上下文稳定
截图循环每一步都发送一张 1080p 图像(约 2.4K token),并丢弃旧图像。每次丢弃都会改动 Prompt 前缀,导致 Prompt 缓存失效。在只追加的智能体框架内,早先几轮的内容一直留在缓存里。
面向通用智能体的程序化、语义与视觉统一接口
1Microsoft Research2复旦大学3清华大学
提升幅度均相对 CUA Driver 计算,模型、智能体框架和任务相同。
Computer Use 智能体如今执行的任务涵盖日常桌面工作和长链路专业流程。多数智能体接口使用截图加鼠标和键盘输入。受这一设计限制,模型每一步都得解读像素,而计算机的语义接口和程序化接口却被藏了起来。
我们提出 Hybrid Computer Use(HCU)。HCU 把三个通道合进一个接口:代码与命令行工具、无障碍接口(AX)和 GUI。HCU 是一个提供 AX 和 GUI 两个工具的 MCP 服务器,与智能体自带的 shell 和文件工具配合运行。HCU 返回带短 ref(aN → wN → rN)的精简 AX 工作树,执行含调用内等待的批量动作,返回动作后的 AX diff,并在发送任何桌面输入前检查实时状态。
在 OSWorld 2.0、OSWorld 1.0(5 个前沿模型、4 个智能体框架)、WeaveBench、MacAgentBench 和 Windows Agent Arena 上,HCU 提高了任务得分,并降低了成本。
评测基准里的智能体通常跑一个独立的截图循环。Codex 和 Claude Code 等生产级智能体已经具备代码工具、缓存和 Skill。HCU 把计算机接入现有智能体,而不是另起一个新循环。
截图循环每一步都发送一张 1080p 图像(约 2.4K token),并丢弃旧图像。每次丢弃都会改动 Prompt 前缀,导致 Prompt 缓存失效。在只追加的智能体框架内,早先几轮的内容一直留在缓存里。
AT-SPI、AXUIElement 和 UI Automation 把每个窗口描述成一棵控件树,包含角色、值、状态和动作。现有产品已经通过这棵树执行动作,但操作系统基准的基线方法大多只用它来观察。
为人机共用桌面设计的驱动程序只能在后台执行动作。后台执行会拒绝许多动作,且每次调用只允许一个动作。专用计算机让接口得以优先保证速度和可靠性。
桌面产品、Web 智能体和 OS 基线都已经能读取无障碍树。HCU 在此基础上增加了绑定 ref 的动作,以及会返回 diff 的批量动作。
| 系统 | 通过 AX 观察 | 通过 AX 操作 | 带 diff 的批次 |
|---|---|---|---|
| 桌面产品(Codex Computer Use、CUA Driver) | 是 | 是,后台运行 | 每次调用 1 个动作 |
| Web 智能体(WebArena、Playwright MCP) | 是 | 是,按 ref | 每次调用 1 个动作 |
| OS 基线(OSWorld a11y tree、Set-of-Marks) | 是 | 映射回像素 | 否 |
| Hybrid Computer Use | 精简工作树 | 绑定 ref(rN、wN) | 最多 64 个动作,带 diff |
HCU 在智能体自带的代码工具旁增加 AX 和 GUI 两个 MCP 工具。三个通道改动同一个桌面,所以 HCU 在每次输入前都会检查实时状态。
直接编辑文件、查询数据库、运行 CLI 工具。这个通道就是智能体原生的 shell,HCU 不做封装。
bashpythonfile edit共享状态。代码所做的改动,对下一次 AX 或 GUI 调用直接可见。
读取精简控件树,查找元素,并按短 ref 批量执行最多 64 个动作,调用内可等待。每个批次都会返回 diff。
appsobservefindact目标校验。输入前,HCU 会对照实时树和所属窗口重新解析每个 ref。
以 1366 × 768 查看完整桌面,放大小字,并在一个批次里点击、拖拽、滚动和输入。对画布、图像以及 AX 无法读取的控件使用 GUI。
screenshotzoomactions[]布局校验。坐标对应上一张截图。如果坐标下的窗口已移动、关闭或被遮挡,HCU 不发送输入,而是返回一张新截图。
在典型的 AX 动作调用中,模型发送一个批次。HCU 在同一趟往返里解析 ref、派发动作、等待并报告变更。
HCU 读取无障碍树(Chrome 设置有 169 个节点),向模型展示 73 行视图,保留模型可操作的每个控件。
window: "Settings - Site settings" [ref=w1] - textbox "Search settings" [ref=r15] - link "Location" [ref=r37] - link "Camera" [ref=r38]
模型发送带调用内等待的一个批次,而不是每轮只发一个动作。
AX(mode="act", actions=[
{"type":"click","ref":"r15"},
{"type":"type","ref":"r15",
"text":"camera"},
{"type":"keypress","keys":["ENTER"]},
{"type":"wait","settle":true}])
每一步之前,HCU 对照实时无障碍树及所属窗口解析 ref,发送原生动作,并等待页面停止变化。
r15 textbox in w1 ok click · type · keypress sent settle: changed, then quiet 4 / 4 steps in 1 call
HCU 返回一行状态、在每个目标上的效果,以及相对于该批次前无障碍树的 diff。
{"ok":true,"input_emitted":true,
"completed":4,"requested":4}
effect: r15 textbox "Search settings"
value=""→"camera"
ax_diff:
- <removed> link "Location"
- <changed> link "Camera" [ref=r38]
absent_refs: [r37]
示意场景。截图之后,一个 AX 动作改变了窗口,按旧截图计划的点击会落到另一个按钮上。
采自 9 个应用的真实 AX 数据。把鼠标悬停在截图的方框或 AX 树的行上。两者指向同一个控件和同一个 ref。
截图点击、单步 AX 动作和 HCU 从同一时刻出发,做出同样的修改。
每组对比固定模型、智能体框架、任务和步数预算,只改变 Computer Use 接口。
每个模型使用 HCU 后得分都更高,但各自在通道间的分工不同。几乎全部提升都来自 HCU 至少发出一次 AX 或 GUI 请求的任务。
GPT-5.4 把 80% 的桌面请求发往 AX。Claude Opus 5.5 把 94% 发往 GUI,且 58% 的动作请求包含两个或更多动作。在 GPT-5.4、Gemini 3.8 Flash 或 Grok 4.7 使用 GUI 的任务中,有 29% 到 31% 的任务 GUI 请求全是截图,所有动作都通过 AX 执行。
仅用 shell 的任务,得分变化在正负 1 个百分点以内。
使用 HCU 后,每个模型都在更多任务中使用 AX 或 GUI。
computer-use 用 Go 把接口约定只实现一次。每个操作系统有各自负责无障碍接口、截图和输入的平台后端进程。智能体、脚本和 Python 代码从同一个核心获得一致的结果。
gui--attach 接入。点击 Save,然后等待对话框关闭。
通用智能体可以在同一台主机上启动多个子智能体。每个子智能体有自己的虚拟显示器和 HCU 实例。各子智能体通过文件系统共享结果。
以下截图来自一次录制的发版评审:4 个子智能体在同一台 Linux 主机上同时工作。




GUI 和 AX 控制都从模型每轮只发一个动作演进到批量执行。下一步是把两条路线合进同一个程序。
模型每轮点击一次。每次点击后,向模型返回一张新截图。
click(812, 455) # new screenshot截图智能体
一次调用包含指针与按键动作,结束时返回一张截图。
GUI(actions=[ click, type, keypress]) # one screenshot at the endOpenAI 与 Anthropic 计算机工具、HCU GUI 工具
GUI、AX 与普通代码写在同一个程序里。AX 状态变成变量,可以直接用来循环和分支。pyautogui 截的图留在程序里,只有结果返回给模型。
import pyautogui as gui
from pytesseract import image_to_string as ocr
def receipt_total(row): # reused per row
# GUI: the pixels stay in the program
gui.doubleClick(row.thumb.center)
img = gui.screenshot(region=ax.bounds("w2"))
gui.press("esc")
return money(ocr(img))
for row in ax.rows("w1", status="Pending"):
claimed = money(row.text) # AX: text
match = receipt_total(row) == claimed
name = "Approve" if match else "Flag"
ax.click(row.button(name)) # AX: by ref
assert not ax.rows("w1", status="Pending")
print(ax.diff("w1")) # 11 approved, 3 flagged
OpenAI 建议 GPT-6 Astra 使用代码执行;HCU Python SDK 是下一步
每次调用执行一个 AX 动作,然后智能体重新读取窗口。
press("#12")
# read the window again
CUA Driver、Codex Computer Use
短 ref、带等待的有序批次,返回 diff 而不是整棵新树。
AX(mode="act", actions=[
{"type":"click","ref":"r19"},
{"type":"wait","window":"Save",
"gone":true}])
# only a diff comes back
HCU AX 工具
~50 轮
~50 张整屏截图 · ~6 分钟~16 轮
14 张收据裁图 · ~2 分钟1 轮
0 张图片,只读一行输出 · ~7 秒@article{wang2026hcu,
title = {Hybrid Computer Use: A Unified Programmatic, Semantic, and Visual Interface for General Agents},
author = {Haoqing Wang and Xiaoyi Zhang and Sicheng Fan and Zhexin Zhang and Xinjie Zhang and Jiahao Li and Bin Li and Yan Lu},
journal = {arXiv preprint},
year = {2026}
}