☰
25.9k Star!cua:给 AI Agent 装上“手和眼“的开源桌面操作系统基础设施
2026/10/15 13:37:19 网站建设 项目流程

1. 为什么你的 Agent 还是不会“用电脑”

先说一个我观察到的现象:过去一年,大模型在“脑力活”上的进步肉眼可见,写代码、做表格分析、调 API、生成文档,几乎样样都能接。但只要你把任务换成“帮我打开浏览器,登录后台,把这张表填进去,再截个图发我”,再强的模型也会瞬间卡住。不是它不够聪明,而是它没有“手和眼”——它看不见屏幕,也点不了鼠标。

这就是 cua 想解决的问题。cua 是 Computer Use Agent 的缩写,定位是开源桌面操作系统基础设施,一句话概括:给 AI Agent 一台它们真正能用的电脑。它不是一个简单的鼠标连点器,而是一整套让 Agent 安全地“看见屏幕、操作电脑”的底座,包含虚拟机隔离、桌面驱动、基准测试三层。项目在 GitHub 上已经拿到 25.9k Star,MIT 协议,支持 macOS / Windows / Linux。

它适合谁?如果你在做 AI Agent、GUI 自动化测试、新一代 RPA,或者想搭一个能跑桌面任务的实验环境,cua 基本是当前最省事的选择。它最聪明的地方是解耦:Agent 和大模型你自己带,cua 只负责提供“电脑”和“自动化工具”,不绑定任何模型厂商。这意味着你可以用任意模型接入,包括通过统一的 API 通道来调用。

这篇我会按“先跑通本地沙箱 → 再接入 Agent → 最后验证模型调用”的顺序写,每一步都给可复制的命令和配置。你跟着做,十分钟内能拿到第一张 Agent 截下来的屏幕图。

2. cua 前置准备:虚拟机沙箱与 TaoToken 统一 Key 配置

在动手之前,先把两件事理清楚:cua 的沙箱怎么起,模型调用通道怎么配。很多人卡在第二步——Agent 能操作桌面了,但模型调用散落在各家平台,Key 管理混乱,换模型要改一堆代码。我的做法是用 TaoToken 做统一通道,一个 Key 走所有模型,cua 侧只认一个 Base URL。

先说 cua 的沙箱层。本地场景用 Lume,它基于 Apple Virtualization.Framework,在 Apple Silicon 上一键拉起 macOS / Linux 虚拟机。云端场景用 Cua Fleets,维护一个隔离的云桌面资源池,代码从池里“认领”一台桌面,用完即毁。本地和云端共用同一套 Sandbox SDK,本地调通后可以无缝搬到云端规模化。

然后是模型通道。cua 本身不绑定模型,Agent 的“大脑”需要你自己接。我建议用 TaoToken 的 API 通道,原因是它把模型调用统一成 OpenAI 兼容格式,cua 的 Agent 侧只需要配 Base URL、Key、Model ID 三件套,换模型不用改代码。官网入口在 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。

这里有个关键点:cua 的桌面驱动层支持 MCP(Model Context Protocol),Claude Code、Cursor、Codex 这类工具可以即插即用。如果你用的是 Claude Code 接入,配置要写全三件套,缺一个都会报错。下面我会分别给 Lume 沙箱和模型通道的配置。

注意:cua 的沙箱是虚拟机级隔离,Agent 的所有操作都被关在 VM 里,宿主机始终安全。这一点在跑自主 Agent 时非常重要,别图省事直接让 Agent 操作你的真实桌面。

3. 可复制配置:Lume 沙箱 + TaoToken 模型通道

这一节是核心,我给的都是可以直接复制粘贴的配置。分三块:Lume 虚拟机创建、cua Driver 安装、模型通道配置。

3.1 Lume 创建本地沙箱虚拟机

先装 Lume。官方提供一键安装脚本,macOS 上直接跑:

# 安装 Lume(Apple Silicon) curl -fsSL https://raw.githubusercontent.com/trycua/cua/main/scripts/install.sh | bash # 验证安装 lume --version

装好后从 Apple 官方恢复镜像拉起一台全新的 macOS 虚拟机。这一步会下载镜像,第一次跑需要点时间:

# 创建一台 macOS Tahoe 虚拟机 lume create my-agent-vm --os macos --ipsw latest # 启动虚拟机 lume start my-agent-vm # 查看虚拟机状态,拿到 IP lume ls

启动后直接 SSH 连进去,你就得到了一台干净的、和宿主机隔离的桌面环境:

ssh user@<vm-ip> # 进去后验证一下 uname -a

如果你想要 Linux 桌面,把--os macos换成--os ubuntu即可。Linux 镜像更轻,适合批量跑任务。

3.2 cua Driver 安装与 MCP 接入

桌面驱动层是 Agent 的“眼睛”和“手”。它提供视觉感知(实时截屏)、键鼠操控(移动、点击、拖拽、输入)、系统交互(剪贴板、窗口管理、命令执行)。安装:

# 安装 cua Driver pip install cua-driver # 或者用 uv(推荐,官方示例都用 uv) uv pip install cua-driver

接入方式有三种:CLI、Python/TypeScript SDK、MCP。如果你用 Claude Code 或 Cursor,走 MCP 最省事。在 Claude Code 的配置里加上 cua 的 MCP server:

{ "mcpServers": { "cua-driver": { "command": "cua-driver", "args": ["mcp", "--sandbox", "my-agent-vm"], "env": { "CUA_SANDBOX_HOST": "<vm-ip>" } } } }

这段 JSON 放在 Claude Code 的 MCP 配置文件里(路径通常是~/.claude/mcp.json或项目级.mcp.json)。配好后 Claude Code 就能直接调用 cua 的截屏和键鼠能力。

3.3 TaoToken 模型通道配置(三件套)

Agent 的“大脑”走 TaoToken。核心是三件套:Base URL、Key、Model ID。先到控制台创建 API Key:

# 控制台入口(创建 Key) # https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

拿到 Key 后,配置环境变量。cua 的 Agent 侧读的是 OpenAI 兼容格式:

export OPENAI_BASE_URL="https://taotoken.net/api" export OPENAI_API_KEY="sk-你的Key" export OPENAI_MODEL="claude-sonnet-4-20250514"

如果你用 Codex,配置写在auth.json里,三件套一个都不能少:

{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的Key", "model": "claude-sonnet-4-20250514" }

auth.json的路径通常在~/.codex/auth.json。注意 Base URL 结尾不要带/v1,TaoToken 的 API 地址就是https://taotoken.net/api,多写路径会 404。

提示:Model ID 要和你实际调用的模型一致。TaoToken 支持多家模型,具体可用列表在接入文档里查:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=

4. 验证请求:让 Agent 截下第一张屏幕图

配置写完,必须验证。我分两步:先验证模型通道通不通,再验证 cua 的桌面操作能不能跑通。

4.1 验证 TaoToken 模型通道

先用一个最小请求确认 Key 和 Base URL 没问题:

curl https://taotoken.net/api/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复 OK"}], "max_tokens": 10 }'

返回里能看到choices数组和内容,就说明通道通了。如果返回 401,说明 Key 有问题;如果返回local proxy failed,说明 Base URL 写错了或者网络层有拦截。

4.2 验证 cua 桌面操作

模型通了,接下来让 Agent 真正“看”一眼屏幕。用 cua 的 Python SDK 写个最小脚本:

from cua import Sandbox, Driver # 连接本地沙箱 sandbox = Sandbox.connect("my-agent-vm") driver = Driver(sandbox) # 截一张屏幕 screenshot = driver.screenshot() screenshot.save("agent_view.png") print("截图已保存,尺寸:", screenshot.size) # 执行一条命令验证系统交互 result = driver.run_command("uname -a") print("系统信息:", result.stdout)

跑完你会得到一张agent_view.png,这就是 Agent 眼里的桌面。整个过程不到十分钟,从创建 VM 到拿到截图。

4.3 接入 Agent 跑一个完整任务

把模型和桌面操作串起来,让 Agent 自主完成一个任务。下面是一个简化示例,Agent 接收自然语言指令,通过模型决策,再调用 cua 执行:

import openai from cua import Sandbox, Driver client = openai.OpenAI( base_url="https://taotoken.net/api", api_key="sk-你的Key" ) sandbox = Sandbox.connect("my-agent-vm") driver = Driver(sandbox) task = "打开计算器,计算 123 乘以 456,把结果截图保存" # 截当前屏幕,交给模型决策 screen = driver.screenshot() response = client.chat.completions.create( model="claude-sonnet-4-20250514", messages=[ {"role": "system", "content": "你是一个桌面操作 Agent,根据屏幕内容决定下一步操作。"}, {"role": "user", "content": f"任务:{task}\n当前屏幕已截图。"} ] ) print("模型决策:", response.choices[0].message.content)

实测下来,模型会返回类似“点击计算器图标 → 输入 123 → 点击乘号 → 输入 456 → 点击等号 → 截图”的步骤序列,你再把这些步骤映射到 driver 的点击和输入方法上。cua 的后台交付能力在这里很关键:在平台支持时,Agent 可以在不移动你鼠标指针、不抢窗口焦点的情况下静默完成操作,人和 Agent 可以同机协作互不打扰。

5. 本篇常见错排查:401、local proxy failed、reading choices

这一节我按真实报错来写,都是我在配置过程中踩过的坑。

报错一:401 Unauthorized

{"error": {"message": "Invalid API key", "type": "invalid_request_error"}}

原因通常是 Key 没配对环境变量,或者 Key 复制时带了空格。检查echo $OPENAI_API_KEY是否和 TaoToken 控制台里的一致。另外注意,如果你在auth.json里配了 Key,但环境变量里也有一个旧的,程序可能读的是环境变量。统一用一个来源。

报错二:local proxy failed

Error: local proxy failed to connect to upstream

这个报错基本是 Base URL 写错。TaoToken 的 API 地址是https://taotoken.net/api,不要写成https://taotoken.net/api/v1,也不要带结尾斜杠。如果你在 cua 的 MCP 配置里写了CUA_SANDBOX_HOST但 VM 没启动,也会报类似的连接失败,先lume ls确认 VM 在跑。

报错三:reading choices 时 panic

panic: runtime error: index out of range [0] with length 0

这是模型返回体里choices为空导致的。常见原因有两个:一是 Model ID 写错了,TaoToken 找不到对应模型,返回了空数组;二是max_tokens设得太小,模型还没输出就被截断。先确认 Model ID 在接入文档的可用列表里,再把max_tokens调到 256 以上。

报错四:OAuth 相关错误

如果你用 Claude Code 接入,可能会遇到 OAuth token 过期或冲突。Claude Code 的配置里如果同时存在 OAuth 和 API Key,会优先走 OAuth。解决办法是在配置里显式指定用 API Key,或者清理掉旧的 OAuth 缓存。三件套(Base URL + Key + Model ID)写全,基本能避免这类问题。

报错五:MCP server 启动失败

MCP server cua-driver failed to start: command not found

说明cua-driver没装进 PATH。用which cua-driver确认,如果没有,检查 pip 安装路径是否在 PATH 里。用 uv 安装的话,路径通常在~/.local/bin,把它加到 PATH 即可。

注意:排障时优先看日志。cua 的 driver 日志在~/.cua/logs/,模型请求日志可以在 TaoToken 控制台看调用记录,两边对照能快速定位是桌面层还是模型层的问题。

6. 从实验到生产:cua 的规模化与模型调用统一

跑通单机实验后,下一步通常是规模化。cua 的云端方案是 Cua Fleets,它维护一个隔离的云桌面资源池,你的代码从池里“认领”一台桌面,在里面执行命令、截图、操作应用,用完即毁。本地沙箱和云沙箱共用同一套 Sandbox SDK,本地调试通过后,把Sandbox.connect("my-agent-vm")换成 Fleets 的认领接口就能无缝搬到云端。

规模化场景下,模型调用的统一通道就更重要了。假设你同时跑 50 个 Agent 实例,每个实例都要调模型,如果 Key 散落在各处,管理和计费会非常痛苦。用 TaoToken 统一通道,所有实例共用一套 Base URL 和 Key,换模型只改一个环境变量。对于长期跑编码和 Agent 任务的场景,Coding Plan 会更划算,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

还有一个容易被忽略的点:cua Bench 产出的操作轨迹可以直接用于训练专用小模型。官方开源的 CUA-S1 系列就是主打快速、有界的界面决策,首个研究方向是表单填写。这意味着你的实验数据不只是跑完就丢,还能反哺模型,形成“操作 → 评测 → 数据 → 模型”的循环。

如果你只是想先体验一下模型对话能力,不急着搭桌面环境,可以先用模型对话入口试试通道:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。确认模型调用没问题后,再回来配 cua 的沙箱。

最后给一个实用技巧:cua 的 Driver 支持多会话并行。官方演示里,两个 Driver 会话同时在 LibreOffice Calc 里选单元格、在 Inkscape 里选图形对象,而前台终端照常用。如果你要做 GUI 自动化测试,这个能力可以让你在一个 VM 里并行跑多个测试用例,效率比串行高很多。配置时给每个会话分配独立的session_id即可,具体参数在接入文档里有说明:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

整个流程走下来,从创建 VM 到 Agent 自主完成一个桌面任务,核心就是三件事:Lume 提供隔离的电脑,cua Driver 提供手和眼,TaoToken 提供统一的大脑通道。把这三块拼起来,你就有了一个可运行的桌面 Agent 实验环境。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询