MusePi

原生 computer 使用

English 中文

computer 捕获并控制运行 musepi 的桌面。它使用原生屏幕捕获与输入 API;不启动 Chromium、不使用 Puppeteer,也不暴露 DOM。

将其用于可见的桌面应用:IDE、终端、原生 app、浏览器窗口、菜单和系统对话框。当你需要 headless/CDP 浏览器标签页、DOM 或 ARIA 检查、选择器、JavaScript 求值或确定性页面自动化时,请改用 browser

[!WARNING] 启用 computer 会让 model 获得对你真实桌面的鼠标与键盘访问。请关闭无关的敏感应用,可行时使用专用 OS 账户或虚拟机,并在启用前配置审批策略。

启用与配置

该 tool 默认禁用。将其添加到 ~/.musepi/agent/config.yml、项目的 .musepi/config.yml,或一次性 --config overlay:

computer:
  enabled: true
  backend: auto
  display: all
  maxWidth: 1920
  maxHeight: 1200

tools:
  approvalMode: write

tools.approvalMode: write 自动允许仅观察的批次,并在键盘或指针输入前发出提示。若要在每次 computer 调用(包括截图)时都提示:

tools:
  approval:
    computer: prompt

要在不修改 computer.enabled 的情况下阻止该 tool:

tools:
  approval:
    computer: deny

你也可以从 CLI 全局启用:

musepi config set computer.enabled true
musepi config get computer.enabled

在运行中的 session 内,/computer 斜杠命令(/computer/computer on|off|status)仅对该 session 切换此 tool;它从不写入设置文件。/computer status 报告生效的 enabled/active 状态、backend、display 与捕获限制、活动 model,以及该 model 接收的是原生还是 function 暴露。显式启用和 desktop controller 在 model 切换之间保持活跃;暴露会为新 model 重新计算,跨越坐标安全尺寸边界的切换会重建 controller 并重新快照 backend/display/image-size 设置。仅改配置不会;设置变更后请开新 session。

设置

默认值 含义
computer.enabled false 注册必需的 computer tool。
computer.backend auto autonative。两者都需要原生 backend;两者都不会回退到浏览器或软件自动化。
computer.display all 合成每个活动的显示,或选择一个数值型原生 display ID。
computer.maxWidth 1920 最大合成截图宽度(像素)。无法保留原始细节的图像传输(包括 GitHub Copilot Responses 与 xAI OAuth)会将有效宽度上限设为 1280;Claude 系列 model 使用同样的上限作为兼容性回退。
computer.maxHeight 1200 最大合成截图高度(像素)。那些坐标安全传输会将有效高度上限设为 896;其他 model 保留配置的限制。

第一个成功结果会列出每个 display ID、名称、逻辑矩形、截图像素矩形、缩放与主状态。当你想使用单个显示时,用这些 ID 之一作为字符串:

computer:
  display: "2"

断开或已更改的 ID 会以 DESKTOP_INVALID_OPTIONS 失败;切换到 all,捕获一次,然后从结果中选一个活动的 ID。

Model 与 provider 能力

具有原生 OpenAI GA computer-use 支持的 model 会收到 wire 声明 { "type": "computer" }。其他每个 function-calling model 都会收到 computer 作为普通 function tool,其 JSON schema 描述同一套 GA action 集。两条路径都通过同一个原生 desktop backend、审批策略和安全规则执行。

当以下任一条件成立时,OMP 将某个 model 标记为原生支持:

Codex 订阅端点以及自定义或代理路由不会从 model ID 推断原生支持。除非 catalog metadata 明确选择加入 GA 契约,否则它们会收到普通的 computer function tool。显式的 supportsComputerUse: false 也会禁用自动推导。

原生支持的 OpenAI Responses 路由可能会收到强制的 { "type": "computer" } 选择。Function-tool 回退强制是 provider 特定的:OpenAI/Ollama 使用具名 function,Anthropic/Bedrock 使用具名 tool,Google 使用 required-tool 模式,而没有强制形式的适配器保持 provider 默认选择。Responses Lite 将 tools 移入 additional_tools;对于显式强制的 computer 声明,它只发送该声明并使用 tool_choice: "required",从而在不引用已移除顶层 tool 的无效对象选择的情况下同时保留选择与强制。

当 session 从原生支持的 API 路由切换到订阅或代理路由时,先前的原生 computer 历史会转换为目标接受的表示。Codex 订阅请求将其重放为具名 computer function 调用与结果,然后将下一个 computer 调用声明为同一个具名 function。其他非原生 OpenAI Responses 系列目标可以使用稳定的 assistant 文本备注;其他 provider 适配器使用其普通 tool 格式。

当 tool 处于活动状态时,system prompt 即使是紧凑的原生 tool 清单也会明确 host-desktop 路由:桌面请求必须使用 computer,并且每次成功动作后都必须在下一个动作前检查其最新截图。这不会自动启用该 tool、绕过审批,也不会在 computer 出错后阻止用户请求的替代方案。

输入默认使用 delivery: "background",这避免改变用户的焦点、指针或窗口顺序。如果 OS 或应用无法安全地定位该事件,调用会抛出 BackgroundUnavailable。在 macOS 上,使用 AX 或显式重试 delivery: "foreground",这会短暂激活目标并在之后恢复焦点。Wayland 合成器只接受当前聚焦 surface 的原生输入,且不允许 musepi 激活任意窗口,因此逐窗口原生输入与 raise() 不可用;改用 AX 动作,或自行聚焦目标后使用桌面输入。

如果该 tool 从不出现:

  1. 确认生效配置中 computer.enabled 为 true,或使用 /computer 切换。
  2. 修改设置文件后开新 session;/computer 切换会立即生效。

动作

provider 可以发送一个 GA 动作,或有序的 actions 批次。OMP 会归一化两种形式并串行执行该批次。成功的调用会在整个批次之后返回正好一张新 PNG。screenshot 标记会被推迟:它们不产生输入、不产生中间图像,也不会重新定位同一批次中后续坐标。

动作 必填字段 行为
click button, x, y 点击一次。按钮:left, right, wheel, back, forward。可选 keys 携带修饰键。
double_click x, y 双击左键。原生 GA 调用以数组或 null 提供 keys;function 调用可以省略它。
drag path 在第一个点按住左键,经过其余点,在最后一点释放。至少两个点。可选修饰键 keys
keypress keys 按下一个键或和弦。数组必须包含至少一个非空键。
move x, y 移动指针。可选修饰键 keys
screenshot 请求批次在无输入情况下的最终捕获。
scroll x, y, scroll_x, scroll_y 移动到该点,然后水平和/或垂直滚动。可选修饰键 keys。增量转换为原生滚轮步长。
type text 通过原生输入后端输入 Unicode 文本。
wait 继续前等待两秒。

坐标与拖拽点必须是大于等于 0 的截图像素。鼠标 keys 只能包含唯一的修饰键:Control、Shift、Alt/Option 或 Meta/Command/Super/Windows。键名大小写不敏感;常见名称包括 ENTERESCAPETABSPACEBACKSPACEDELETE、方向键、导航键和 F1F24。一个 keypress 条目可以包含 +,例如 CTRL+SHIFT+P。也接受单个 Unicode 字符。macOS 没有原生 PRINTSCREENF21F24 映射。

仅包含 screenshotwait 的批次是仅观察的。任何 click、move、drag、scroll、keypress 或 type 动作都会让整个调用具备输入能力。

截图坐标与图像映射

始终从当前 desktop controller 返回的、紧邻的前一次成功 computer 结果中选择坐标。同一批次中的每个坐标动作都通过同一先前帧映射。跨越坐标安全尺寸边界的 model 切换会重建 controller 并使先前帧失效,因此在下一次坐标动作前先截一张新截图。不要使用 OS 逻辑坐标、CSS 像素、终端单元格位置、从另一张截图复制的坐标,或捕获后调整过大小的图像。

对于每次捕获,OMP:

  1. 枚举选中的原生显示及其全局逻辑矩形。
  2. 以原生像素密度捕获每个选中的显示。
  3. 构建一个逻辑边界矩形,包括负的显示器原点。
  4. 选择一种保持桌面布局且位于配置的 maxWidthmaxHeight 限制内的渲染缩放。无法保留原始细节的图像传输(包括 GitHub Copilot Responses 与 xAI OAuth)会额外将有效帧上限设为 1280×896;Claude 系列 model 使用同样的上限作为兼容性回退,其他 provider 保留配置的限制。
  5. 将每个缩放后的显示图像放入合成图并返回 PNG。

每个结果的 displays metadata 同时映射两个空间:

输入动作使用返回的 PNG 空间。backend 定位包含该截图像素的显示,在该显示矩形内缩放,然后加上该显示的全局逻辑原点。捕获 metadata 支持位于主显示器左侧或上方的显示;Quartz 与 Win32 接受这些负原点,而 Linux 输入按下文所述失败关闭。

合成图将显示器矩形之间的间隙保留为黑色像素。间隙中的点不可点击,并会以 DESKTOP_COORDINATE_OUT_OF_BOUNDS 失败。位于 PNG 右侧/底部边缘或之外的、负的点,以及所有显示之外的点,也会失败关闭。

如果在参考帧与坐标动作之间显示器成员资格、矩形或缩放发生变化,OMP 会清除该帧并返回 DESKTOP_LAYOUT_CHANGED。重试前重新捕获。移动显示器、更改分辨率/缩放、插拔显示器、接入或断开,或更改选中的显示,都可能触发该守卫。

worker 在截图返回给 provider 之前会拒绝坐标动作。先以仅截图调用开始。在任何目标可能已移动的视觉过渡之后,完成当前调用并使用其返回的图像作为下一调用中的坐标。

多显示器

computer.display: all 产生一张合成图。显示器按逻辑垂直位置、再水平位置、再 ID 排序。具有相同逻辑矩形的镜像显示会被合并;主镜像优先。无效缩放、重复 ID 与重叠的非镜像矩形会失败关闭,而不是猜测。

在以下情况使用单个显示:

在 Linux 上,捕获通过核心 GetImage 读取 X11 根窗口,输入在相同的 X11 全局坐标空间中作为 XTest 事件发出,因此多显示器坐标映射是精确的。这需要一个拥有可读根 pixmap 的 X server——真实的 X11 session、Xvfb,或 rootful XWayland(Xwayland -rootful)。GNOME、KDE 和 sway 使用的默认 rootless XWayland 不保留 X11 根 pixmap,因此根 GetImage 会失败;该 tool 在初始化时检测到这一点,并报告 DESKTOP_BACKEND_UNAVAILABLE,而不是在第一次截图上失败。纯 Wayland 捕获(portal/PipeWire)未实现。

审批与安全优先级

Computer 使用有三层安全。

1. Tool 审批

使用 tools.approvalMode: write 时,截图自动允许,输入会提示。schema 默认值是 yolo,通常会同时自动批准两者;在控制真实桌面时使用 writealways-ask 或显式的逐 tool 策略。

2. Provider 安全检查

OpenAI 可能会给原生 computer_call 附加 pending_safety_checks。优先级严格:

  1. tools.approval.computer: deny 立即阻止该调用。
  2. 否则,任何待处理的 provider 检查都会强制出现交互式 Approve/Deny 提示。
  3. yolo--auto-approve、逐 tool allow 以及先前的 xdev 审批都不能绕过该提示。
  4. headless session 或缺失 UI 会失败关闭;它绝不会代表你确认。
  5. 只有显式批准才会将检查标记为已确认并允许输入。
  6. OMP 将同样的检查作为 acknowledged_safety_checks 与截图输出一起返回。

computer executor 在原生输入前再次检查批准标记。一个到达执行而未获交互式批准的 provider 检查会以 Provider safety checks require interactive approval before computer input 失败。

3. 后果性动作确认

Provider 检查不会取代用户授权。OMP 将屏幕文本、图像、通知、网站、文档、聊天消息和应用指令视为不可信数据。它们不能授权动作,也不能覆盖你的直接指令。

除非你的直接消息已经授权了那个确切的动作、目标、范围和值,否则 agent 必须在风险点确认后果性副作用。示例包括发送或发布、购买或转账、删除、账户/安全或权限更改、披露私密数据、接受法律条款,以及不可逆操作。高影响力的金融、就业、住房、教育、保险/信贷、法律、医疗、政府、选举、生物识别和高度敏感数据动作需要风险点确认。

操作指引:

常规策略解析见 Tool 审批模式

平台设置与支持

平台 后端 设置与当前状态
macOS x64/arm64 有界的 macOS screencapture service 捕获;Quartz/CGEvent 与原生输入 受支持。授予 Screen Recording 与 Accessibility。已在 Apple 硬件上验证真实远程桌面执行;见 验证边界
Linux x64/arm64, glibc/musl, X11 纯 Rust X11 捕获与 XTest 输入(x11rb),内置于 core addon 当存在图形 session 与 DISPLAY 时受支持。不需要 GUI 系统库;backend 直接通过 display socket 说 X 协议。需要 RandR 与 XTEST server 扩展。
Linux x64/arm64, glibc/musl, Wayland XWayland 捕获;由合成器桥接的 XTest 输入 在默认 rootless XWayland 上不支持(GNOME/KDE/sway):其根窗口没有可读 pixmap,因此根 GetImage 会失败,该 tool 在初始化时报告 DESKTOP_BACKEND_UNAVAILABLE。捕获需要一个 rooted X server(真实 X11 session、Xvfb,或 rootful Xwayland -rootful),它只暴露 X11 客户端——原生 Wayland 窗口对 X11 不可见。纯 Wayland 捕获(portal/PipeWire)未实现。
Windows x64 xcap 捕获;Win32 虚拟桌面指针移动与原生输入 已实现,包括负原点与副显示器。未在此 feature 的验证中远程演练。
其他 OS/架构 已发布的原生包矩阵不支持。

macOS 权限

打开 系统设置 → 隐私与安全性

  1. 为启动 musepi 的终端或应用授予 屏幕录制
  2. 为同一个宿主授予 辅助功能,以便键盘与指针输入。
  3. 完全重启该宿主并开启新的 OMP session。

OMP 执行一次无提示的 Screen Recording 预检。它不会替你打开权限对话框。Accessibility 不会单独预检;拒绝通常会在原生输入初始化或发出事件时显现。

Linux 设置

对于 X11,在目标图形 session 内运行 OMP,并确保 DISPLAY 标识它。捕获与输入不需要 GUI 系统库:backend 直接说 X 协议,并通过 XTEST 扩展发出输入。

对于 Wayland:

desktop backend 总是内置于每个已发布 Linux 目标(x64/arm64, glibc/musl)的 core pi-natives addon。在该 tool 运行前它不会打开 display 连接,因此 headless 宿主不受影响;如果没有可到达的 X server,该 tool 报告 DESKTOP_BACKEND_UNAVAILABLE

Session 与 worker 生命周期

该 tool 是排他的:computer 调用不会并发运行。其生命周期为:

computer tool
  → ComputerSupervisor (lazy, serialized queue)
  → dedicated Bun worker
  → native DesktopSession
  → dedicated native desktop worker thread
  → capture/input APIs

Bun worker 在第一次 computer 调用时启动,而不是在 OMP 启动时。启动有 10 秒期限。desktop session 与最后一张截图几何在两调用之间保持存活,因此后续坐标可以对照前一张帧检查。每个成功的有序动作批次都以一次新捕获结束。

关闭 agent/eval 拥有者会关闭所有拥有的 controller。正常关闭要求 Bun worker 关闭,等待最多 1.5 秒,然后在需要时终止它。原生关闭是幂等且有界的。中止一个调用会终止该 worker 并拒绝待处理请求;后续调用可以启动一个新 worker,并且必须建立新的截图帧。

OpenAI 截图引用与 Files

OMP 精确保留 GA wire 契约:

原生 OMP 执行将 PNG 以内联 data:image/png;base64,... image_url 返回。它将捕获上传到 OpenAI Files API,也不生成 file_id

如果 OpenAI 兼容网关或恢复的 Responses 历史提供了 file_id,OMP 会保留并重放那个确切的引用作为 provider metadata。它不会下载、校验、刷新或删除 provider 文件。文件可用性、保留、授权与过期仍是 provider/client 的责任。image_urlfile_id 历史都会为有能力的 model 保留;向非原生 OpenAI Responses 系列 model 重放时会将原生条目转换为文本备注。

故障排除

Computer backend 错误以稳定代码开头:

错误 含义与响应
DESKTOP_INVALID_OPTIONS 无效 backend、零图像限制、畸形 display 值或非活动 display ID。修正配置并开新 session。
DESKTOP_INVALID_ACTION 未知 action/button/key、缺失或意外字段、负点、短拖拽路径或无效/重复修饰键。仅在修正动作后重新捕获。
DESKTOP_BACKEND_UNAVAILABLE 没有图形 session/backend、缺失 XWayland DISPLAY、缺失 RandR/XTEST server 扩展、负原点或超出 XTest 范围的 Linux 布局,或原生输入初始化失败。遵循平台部分。
DESKTOP_PERMISSION_DENIED 屏幕捕获或输入权限被拒。授予 OS 权限并重启宿主/session。
DESKTOP_CAPTURE_FAILED 显示捕获、缩放、分配或 PNG 编码失败。减小 maxWidth/maxHeight,确认显示处于活动状态,然后重新捕获。
DESKTOP_INPUT_FAILED 原生输入初始化/事件失败。检查该 session 的 macOS Accessibility 权限或 X server 访问。
DESKTOP_LAYOUT_CHANGED 参考截图后 display 拓扑发生了变化。在输入前捕获新帧。
DESKTOP_COORDINATE_OUT_OF_BOUNDS 点位于 PNG 之外、合成图间隙中,或所有显示器之外。在列出的 pixel* 矩形内选择一点。
DESKTOP_DEADLINE_EXCEEDED 60 秒原生批次期限已过;剩余动作未执行。将批次拆成更小的调用并重新捕获截图。
DESKTOP_SESSION_CLOSED 原生 session 已关闭。开启新的 OMP session。
DESKTOP_WORKER_FAILED 原生 worker 启动、通信、超时或关闭失败。开新 session;若持续存在,请验证原生 addon 安装。

常见确切失败:

原生合成图安全上限为 268,435,456 像素。正常默认值远低于此。非常大或稀疏的显示器排列应该使用更小的最大尺寸或选中的单个 display。

已验证的限制

平台支持矩阵

平台 当前后端
macOS x64/arm64 ScreenCapture/Quartz 加原生 AX 与输入。为捕获授予 Screen Recording,为输入/AX 授予 Accessibility,然后重启启动宿主。
Linux X11 x64/arm64 X11 捕获/输入与 AT-SPI accessibility。需要一个可读 display 加 RandR/XTEST。
Linux Wayland x64/arm64 RemoteDesktop portal 或 LIBEI_SOCKET 输入与 AT-SPI accessibility。ScreenCast portal/PipeWire 捕获仅在用 wayland-pipewire Cargo feature 编译的构建中提供;发布的二进制省略它,因此 capabilities() 在那里报告 capture: false。RemoteDesktop 权限在首次原生输入时惰性请求,不持久化,随 desktop session 关闭;只读窗口/AX 检查不请求它。合成器限制适用;后台逐窗口原生输入不可用。
Windows x64 原生显示/窗口捕获、Win32 输入与 UI Automation accessibility。
其他已发布目标 除非原生 addon 报告 capabilities,否则不支持。

检查 desktop.capabilities() 而不是假定捕获、输入、AX 或权限状态。在 Wayland 上,输入在首次原生输入前报告 prompt-or-granted,而不打开 RemoteDesktop session。发布的构建省略 wayland-pipewire feature,因此 capabilities() 报告 capture: false;在存在该 feature 的地方,缺失的 portal/PipeWire feature 或被拒的 RemoteDesktop portal 会作为捕获/输入/权限失败报告,而不是回退到 X11。

真实宿主验证在真实 macOS 宿主上使用了 ComputerSupervisor worker 路径,而不是 mock backend。在授予 macOS Screen Recording 与 Accessibility 后,它用全局热键、双击、点击、输入和截图捕获控制了 TextEdit。返回的 Quartz 帧为 1920×1080。

这证明了穿过 worker 与 desktop session 的原生 macOS 宿主路径。它不是一次实时的 OpenAI 原生 computer_callcomputer_call_output 往返。OpenAI GA 传输、批处理、安全确认以及 image_url/file_id 重放由本地契约测试覆盖;Windows backend 已实现但未远程演练。

有关实现层面的输入、输出、生命周期与错误面,见 docs/tools/computer.md