Hybrid Computer Use

面向通用智能体的程序化、语义与视觉统一接口

Haoqing Wang1*Xiaoyi Zhang1†Sicheng Fan2Zhexin Zhang3Xinjie Zhang1Jiahao Li1Bin Li1Yan Lu1

1Microsoft Research2复旦大学3清华大学

* 在 Microsoft Research 实习期间完成。† 项目负责人。

智能体通过三个通道操作计算机:语义 AX、视觉 GUI,以及程序化的代码或 CLI。

提升幅度均相对 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 提高了任务得分,并降低了成本。

Computer Use 应内嵌于通用智能体

评测基准里的智能体通常跑一个独立的截图循环。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 调用直接可见。

语义

AX

读取精简控件树,查找元素,并按短 ref 批量执行最多 64 个动作,调用内可等待。每个批次都会返回 diff。

appsobservefindact

目标校验。输入前,HCU 会对照实时树和所属窗口重新解析每个 ref。

视觉

GUI

以 1366 × 768 查看完整桌面,放大小字,并在一个批次里点击、拖拽、滚动和输入。对画布、图像以及 AX 无法读取的控件使用 GUI。

screenshotzoomactions[]

布局校验。坐标对应上一张截图。如果坐标下的窗口已移动、关闭或被遮挡,HCU 不发送输入,而是返回一张新截图。

一次 AX 调用,从树到 diff

在典型的 AX 动作调用中,模型发送一个批次。HCU 在同一趟往返里解析 ref、派发动作、等待并报告变更。

1精简无障碍树

HCU 读取无障碍树(Chrome 设置有 169 个节点),向模型展示 73 行视图,保留模型可操作的每个控件。

window: "Settings - Site settings" [ref=w1]
 - textbox "Search settings" [ref=r15]
 - link "Location" [ref=r37]
 - link "Camera" [ref=r38]

2发送一个批次

模型发送带调用内等待的一个批次,而不是每轮只发一个动作。

AX(mode="act", actions=[
  {"type":"click","ref":"r15"},
  {"type":"type","ref":"r15",
   "text":"camera"},
  {"type":"keypress","keys":["ENTER"]},
  {"type":"wait","settle":true}])

3校验并派发

每一步之前,HCU 对照实时无障碍树及所属窗口解析 ref,发送原生动作,并等待页面停止变化。

r15 textbox in w1      ok
click · type · keypress  sent
settle: changed, then quiet
4 / 4 steps in 1 call

4返回 diff

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。

Chrome 网站设置
悬停在控件上

同一任务,三种接口,同一时钟

截图点击、单步 AX 动作和 HCU 从同一时刻出发,做出同样的修改。

    0 s
    查看调用基于真实 AX 采集的示意回放,按每轮约 7 秒、每张 1080p 截图约 2.4K token 计时。
    所选轮次
    
    
    调用
    
    

    在每个平台上得分更高、成本更低

    每组对比固定模型、智能体框架、任务和步数预算,只改变 Computer Use 接口。

    提升从哪里来

    每个模型使用 HCU 后得分都更高,但各自在通道间的分工不同。几乎全部提升都来自 HCU 至少发出一次 AX 或 GUI 请求的任务。

    各模型如何使用 HCU

    桌面请求占比,OSWorld 1.0
    AX 观察AX 动作GUI 截图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 执行。

    得分提升的来源

    使用 AX 或 GUI 的任务带来的提升

    仅用 shell 的任务,得分变化在正负 1 个百分点以内。

    使用桌面工具的任务

    CUA Driver HCU

    使用 HCU 后,每个模型都在更多任务中使用 AX 或 GUI。

    一个 Go 核心,三个原生平台后端

    computer-use 用 Go 把接口约定只实现一次。每个操作系统有各自负责无障碍接口、截图和输入的平台后端进程。智能体、脚本和 Python 代码从同一个核心获得一致的结果。

    调用方
    编程智能体Codex、Claude Code、Gemini CLI、Grok Build
    Shell 脚本任何运行命令的程序
    Python 代码在实时状态上循环
    入口
    MCP 服务器stdio,进程内
    CLI简写命令与 gui
    Python SDK同步、异步、PTC
    每个桌面一个守护进程,为 CLI 和 SDK 提供共享 ref 与单一输入锁。MCP 通过 --attach 接入。
    核心单一 Go 二进制文件
    接口约定Schema、强类型错误
    状态ref 与 GUI 帧
    校验目标检查与布局检查
    AX 引擎批次、等待、效果
    GUI 引擎截图、放大、输入
    平台后端每个操作系统构建一个
    LinuxAT-SPI2, X11, XTest · Python
    macOSAXUIElement, CoreGraphics, ScreenCaptureKit · Swift
    WindowsUIA3, Win32 · C#
    桌面
    智能体专属计算机上的应用与窗口

    跟踪一次调用

    点击 Save,然后等待对话框关闭。

      一台计算机,多个显示器

      通用智能体可以在同一台主机上启动多个子智能体。每个子智能体有自己的虚拟显示器和 HCU 实例。各子智能体通过文件系统共享结果。

      以下截图来自一次录制的发版评审:4 个子智能体在同一台 Linux 主机上同时工作。

      子智能体在 LibreOffice Impress 中检查幻灯片
      营销演示稿Impress
      子智能体在 LibreOffice Calc 中分析收入表格
      收入模型Calc
      子智能体在 LibreOffice Writer 中起草备忘录
      上线决策备忘录Writer
      子智能体在 Chrome 中检查发布微站
      发布微站Chrome

      从单步动作到代码执行

      GUI 和 AX 控制都从模型每轮只发一个动作演进到批量执行。下一步是把两条路线合进同一个程序。

      1单步动作
      2批量动作当前 HCU
      3代码执行展望
      GUI

      模型每轮点击一次。每次点击后,向模型返回一张新截图。

      click(812, 455)
      # new screenshot
      截图智能体

      一次调用包含指针与按键动作,结束时返回一张截图。

      GUI(actions=[
        click, type, keypress])
      # one screenshot at the end
      OpenAI 与 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

      每次调用执行一个 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 工具
      开销
      同一个报销审核任务。时间只计等待模型的部分,按每轮约 7 秒估算。

      ~50 轮

      ~50 张整屏截图 · ~6 分钟

      ~16 轮

      14 张收据裁图 · ~2 分钟

      1 轮

      0 张图片,只读一行输出 · ~7 秒

      BibTeX

      @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}
      }