实战 SOP
实战 SOP

搭建 Computer Use Agent 实战 SOP:从沙箱到安全护栏的完整流程

搭建 Computer Use Agent 实战 SOP:沙箱准备 -> 接 Anthropic Computer Use API -> 主循环(截图-决策-执行)-> 安全护栏 -> 调优,五步。含可跑 Python 代码(ast.parse 验证)、5 个踩坑、5 FAQ。能操作电脑等于能闯祸,强调沙箱隔离 + 操作白名单 + 敏感操作人工确认。

发布于 2026年8月11日8 分钟阅读
<!-- computer-use-agent-build-sop | sop | 搭建 Computer Use Agent 实战 SOP:从沙箱到安全护栏的完整流程 -->

传统 agent 靠调 API 干活--你得先给它开好工具接口。Computer Use 走的是另一条路:模型截屏「看」当前画面,输出鼠标坐标和键盘指令,直接点按钮、填表单、切窗口,像人一样操作图形界面。理论上,任何你能用的网页和桌面软件,agent 都能用。

这条路线 2025 年 10 月由 Anthropic 的 Computer Use 能力推开,大半年过去已不是一家独苗(详见同站 Computer Use 时代热点)。但「能用」和「敢用」之间隔着一条鸿沟:能操作电脑等于能闯祸。这篇 SOP 给你一个可复制的搭建流程:沙箱准备 -> 接 Computer Use API -> 主循环 -> 安全护栏 -> 调优,五步。代码基于 Anthropic 官方文档与 trycua/cua 官方仓库核实,截至 2026-08-11,API 以官方为准。与同批的 Computer Use Agent 横评(选哪个方案)、cua 开源项目解析(沙箱原理深入)互补:那两篇解决「选什么、为什么」,这篇解决「怎么动手搭」。


一、Computer Use 不是工具调用

先把一个常见混淆理清。同站的 工具调用 SOP 讲的是 function calling / tool use--模型产出结构化 JSON(调哪个函数、传什么参数),你的代码执行后回填结果。那条路线的前提是:软件为你开了接口。

Computer Use 不需要接口。模型直接「看」屏幕截图,理解界面状态,然后输出动作:鼠标移到坐标 (x, y)、左键点击、输入文本、按快捷键。执行后截一张新图,模型再看、再决策,循环往复。这叫 GUI 操控(GUI grounding),不是 API 调用。

两者的核心差异:

维度工具调用(function calling)Computer Use(GUI 操控)
前提软件有 API/工具接口不需要接口,看屏幕就能用
输入结构化 JSON 参数屏幕截图(图像)
输出函数名 + 参数鼠标坐标 + 键盘指令
延迟低(一次 API 往返)高(截图 + 视觉推理 + 执行)
成本高(每步都要传截图)
适用你能控制的系统没接口的老旧系统/任意网页

一句话:工具调用是「软件为你开路」,Computer Use 是「没路我自己蹚」。后者更通用,但更慢更贵更难控。选哪条路取决于目标系统有没有接口。


二、SOP 五步流程

Step 1:环境与沙箱准备

第一原则:永远不要让 computer-use agent 直接操作你的生产机器。能操作电脑 = 能闯祸。用沙箱隔离。

trycua/cua 提供开箱即用的沙箱,支持 Linux/macOS/Windows,本地 QEMU 或云端均可:

bash
pip install cua  # 需 Python 3.11+
python
from cua import Sandbox, Image

# 创建一次性 Linux 沙箱(用完即弃,与宿主机隔离)
async with Sandbox.ephemeral(Image.linux()) as sb:  # 也可 .macos() .windows()
    await sb.shell.run("echo hello")       # 跑命令
    shot = await sb.screenshot()            # 截图
    await sb.mouse.click(100, 200)          # 点击坐标
    await sb.keyboard.type("Hello!")        # 输入文本

也可以用 Docker 起一个带 VNC 的 Linux 桌面容器,或用 cua 的 Lume 组件跑 macOS 虚拟机(基于 Apple Virtualization.Framework)。核心要求:沙箱有图形桌面、能截图、能模拟鼠标键盘,且与你的真实环境物理隔离。

Step 2:接 Computer Use API

Anthropic 的 computer use 走 beta 通道。工具定义、beta 标记、模型选择三件套:

python
import anthropic

client = anthropic.Anthropic()  # ANTHROPIC_API_KEY 走环境变量

# 工具定义:告诉模型「你有一台 1024x768 的电脑可操控」
tools = [{
    "type": "computer_20250124",       # 工具类型(版本化的)
    "name": "computer",
    "display_width_px": 1024,          # 屏幕宽(建议 <=1024,大了贵且慢)
    "display_height_px": 768,
}]
BETAS = ["computer-use-2025-01-24"]    # beta 标记

几个关键字段:type 必须是版本化的工具类型(computer_20250124 或更新版本);display_width_px / display_height_px 定义模型的坐标空间,模型输出的坐标基于这个尺寸;官方建议分辨率不超过 XGA(1024x768)或 WXGA(1280x800),越高每步截图的 token 成本越大。模型通过 client.beta.messages.create() 调用,带上 betas 参数。需选用支持 computer use 的模型版本,以官方文档为准。

Step 3:主循环(截图-决策-执行)

这是整个 agent 的心脏。模型截屏 -> 看图决策 -> 输出动作 -> 你执行 -> 截新屏 -> 再看再决策,循环直到任务完成或触发护栏。

模型输出的动作(tool_use block 的 input 字段)包含 action 和配套参数。computer_20250124 支持的 action:screenshot(截图)、mouse_move(移动到坐标)、left_click / right_click / double_click / triple_click(点击)、left_click_drag(拖拽,需起止坐标)、type(输入文本)、key(按键组合如 ctrl+c)、scroll(滚动)、wait(等待)、cursor_position(查光标位置)。

循环逻辑:调 API -> 检查 stop_reason,若不是 "tool_use" 说明模型认为任务完成 -> 否则遍历 tool_use block 执行动作 -> 把结果回填为 tool_result -> 再调 API。完整代码见第三节。

Step 4:安全护栏(白名单 + 人工确认)

能操作电脑的 agent 必须加护栏,这是红线不是建议。三道防线:

第一道:操作白名单。 只允许 agent 执行预定义的安全动作集合。比如限定只能在一个特定网页上操作、只能填表不能提交、只能读不能写。在执行层(你的代码)拦截,不依赖模型自觉。

第二道:敏感操作人工确认。 定义一组敏感关键词(deletermdrop支付转账提交订单),当模型输出的动作参数命中关键词时,暂停循环弹窗让人确认。agent 不应该在你不知情的情况下删文件、花钱、提交表单。

第三道:沙箱隔离。 agent 只在沙箱里活动,沙箱与生产环境物理隔离。就算 agent 失控,最坏也只是搞坏一个一次性沙箱,不会碰到你的真实系统。别碰生产环境,别碰真实账号,别碰真金白银。

Step 5:调优

跑通之后优化三件事:

截图成本。 每步都要传一张截图给模型,是 token 消费大户。优化手段:控制分辨率(1024x768 够用)、截屏后压缩、只保留最近 N 张截图(老截图截掉减少上下文)。社区参考量级:一次完整任务可能跑 10-50 步,每步截图加推理约消耗数千到上万 token,单次任务成本在几美分到几美元量级(以实际 API 计费为准)。

坐标精度。 模型有时会把按钮坐标算偏几个像素。优化手段:给 system prompt 写清屏幕分辨率和缩放比、让模型先 screenshot 再操作而非盲点、对关键点击加容错(点偏了再截屏重试)。

死循环检测。 模型可能陷入「点 A -> 截图 -> 发现没变 -> 再点 A」的死循环。优化手段:记录最近 N 步的动作序列,检测到重复模式就强制中断或换策略。


三、最小可跑示例

下面这段 Python 把五步串起来:cua 沙箱 + Anthropic Computer Use API + 安全护栏 + 主循环。已通过 ast.parse 语法验证。

python
import anthropic
from cua import Sandbox, Image

client = anthropic.Anthropic()  # ANTHROPIC_API_KEY 走环境变量

tools = [{
    "type": "computer_20250124",
    "name": "computer",
    "display_width_px": 1024,
    "display_height_px": 768,
}]
BETAS = ["computer-use-2025-01-24"]
MAX_STEPS = 15
SENSITIVE = ["delete", "rm ", "drop", "支付", "转账", "提交订单"]


def is_sensitive(inp: dict) -> bool:
    text = str(inp).lower()
    return any(k in text for k in SENSITIVE)


async def execute_action(sb, inp: dict) -> str:
    """把模型输出的动作映射到 cua sandbox 执行,返回结果文本"""
    action = inp.get("action", "")
    if action == "screenshot":
        await sb.screenshot()
        return "screenshot taken"
    coord = inp.get("coordinate")
    if action == "mouse_move" and coord:
        return f"moved to {coord}"
    if action in ("left_click", "right_click", "double_click") and coord:
        await sb.mouse.click(coord[0], coord[1])
        return f"{action} at {coord}"
    if action == "type":
        await sb.keyboard.type(inp.get("text", ""))
        return f"typed: {inp.get('text', '')[:80]}"
    if action == "key":
        return f"key pressed: {inp.get('text', '')}"
    return f"action {action} executed"


async def run_agent(task: str):
    async with Sandbox.ephemeral(Image.linux()) as sb:
        messages = [{"role": "user", "content": task}]
        for step in range(MAX_STEPS):
            resp = client.beta.messages.create(
                model="claude-sonnet-4-20250514",
                max_tokens=4096,
                tools=tools,
                messages=messages,
                betas=BETAS,
            )
            # stop_reason 不是 tool_use = 模型认为任务完成
            if resp.stop_reason != "tool_use":
                print(f"第 {step} 步:任务完成")
                return resp.content
            messages.append({"role": "assistant", "content": resp.content})
            for block in resp.content:
                if block.type != "tool_use":
                    continue
                # 安全护栏:敏感操作需人工确认
                if is_sensitive(block.input):
                    ok = input(f"敏感操作 {block.input.get('action')},确认?(y/n): ")
                    if ok.lower() != "y":
                        result = "用户拒绝执行"
                    else:
                        result = await execute_action(sb, block.input)
                else:
                    result = await execute_action(sb, block.input)
                # 回填工具结果,tool_use_id 必须与 block.id 对应
                messages.append({
                    "role": "user",
                    "content": [{"type": "tool_result",
                                 "tool_use_id": block.id,
                                 "content": result}],
                })
        print(f"达到最大步数 {MAX_STEPS},强制停止")

几个要点:resp.stop_reason != "tool_use" 是任务完成的信号(模型不再请求工具,转为输出最终文本);block.input 是模型输出的动作参数(dict,含 actioncoordinatetext 等);tool_result 回填时 tool_use_id 必须与 block.id 对应,否则 API 报错。截图实际应返回 base64 图像数据给模型(此处简化为文本,完整实现需把 sb.screenshot() 的返回转 base64,作为 image block 填入 tool_resultcontent 字段)。


四、五个踩坑

坑 1:截图太大,token 账单爆炸 每步都要传一张截图,高分辨率截图一张就几千 token。跑 30 步任务,光截图就烧掉数万 token。社区有人反馈早期测试「十分钟烧掉十美元」。修法:分辨率压到 1024x768、截图后压缩质量、只保留最近 3-5 张截图截掉历史。设 MAX_STEPS 封顶,别让 agent 无限跑。

坑 2:坐标精度漂移,点错按钮 模型把按钮坐标算偏几像素,点到了隔壁的删除按钮而不是编辑按钮。这是所有 CUA 的通病。修法:让模型操作前先 screenshot 看清画面;system prompt 里写清屏幕分辨率;关键操作后截图验证结果(比如点击后检查 URL 是否变化、页面是否出现预期文本)。

坑 3:死循环,agent 反复点同一个地方 模型陷入「点击 -> 截图发现没变 -> 再点」的循环,token 和时间双双浪费。修法:记录最近 N 步的动作序列,检测到连续重复动作就强制中断;给 system prompt 写「如果同一操作连续两次没有效果,换一种方法或向用户报告」。

坑 4:敏感操作无确认,agent 直接闯祸 agent 自作主张删了文件、提交了订单、点了「确认支付」。能操作电脑 = 能闯祸,没有人工确认的 CUA 就是定时炸弹。修法:执行层加敏感关键词检测,命中就暂停等人工确认。别指望 system prompt 里的「请不要删除文件」能拦住模型--那是建议不是约束,必须在代码层强制。

坑 5:沙箱没隔离好,agent 逃逸到宿主机 沙箱配置不当,agent 通过共享目录、网络接口或剪贴板访问到宿主机的真实文件系统。修法:沙箱不挂载宿主机的敏感目录、网络默认隔离或走代理、用完即弃的 ephemeral 沙箱(cua 的 Sandbox.ephemeral() 即此设计)。别在沙箱里放任何真实凭证。


五、常见问题

Q1:Computer Use 和 RPA(按键精灵)有什么区别? RPA 录制鼠标轨迹和键盘输入然后回放,是脚本,屏幕布局一变就失效。Computer Use 基于视觉模型,像人一样看屏幕理解界面状态再决策,不需要预设坐标,按钮挪了位置也能找到。RPA 精确但脆弱,Computer Use 灵活但慢且贵。

Q2:能不能不用沙箱直接在我电脑上跑? 技术上能,但强烈不建议。agent 能操作电脑就能闯祸--误删文件、乱发邮件、点到不该点的按钮。沙箱的成本(多一个虚拟机/容器)远低于一次误操作的代价。最低限度也要用 Docker 容器隔离,别让 agent 直接碰宿主机。

Q3:除了 Anthropic 还有哪些 Computer Use 方案? OpenAI Operator(云端浏览器)、Google Project Mariner、智谱 AutoGLM(手机端)、微软 Copilot Studio Computer Use(Windows 桌面)、字节 UI-TARS(开源)等。各家定位和成熟度不同,详见同批 Computer Use Agent 横评

Q4:一次任务大概要花多少钱? 取决于步数和截图分辨率。社区参考量级:一个 10-30 步的任务,每步截图加推理约数千 token,总成本在几美分到几美元量级。复杂任务可能更多。建议开发阶段用低分辨率 + MAX_STEPS 封顶控制成本,生产环境监控每任务实际 token 消耗。具体以 API 计费为准。

Q5:Computer Use 能完全替代工具调用吗? 不能,两者互补。有 API 接口的系统用工具调用更快更便宜更可靠;没有接口的老旧系统或任意网页才用 Computer Use。一个成熟的 agent 通常两者都用:能调 API 的调 API,调不了的才去操作图形界面。详见同站 工具调用 SOP


参考来源

本文由 AI 辅助生成,经人工审核编辑。最后更新:2026-08-11

常见问题

Computer Use 和 RPA(按键精灵)有什么区别?
RPA 录制鼠标轨迹和键盘输入然后回放,是脚本,屏幕布局一变就失效。Computer Use 基于视觉模型,像人一样看屏幕理解界面状态再决策,不需要预设坐标,按钮挪了位置也能找到。RPA 精确但脆弱,Computer Use 灵活但慢且贵。
能不能不用沙箱直接在我电脑上跑?
技术上能,但强烈不建议。agent 能操作电脑就能闯祸--误删文件、乱发邮件、点到不该点的按钮。沙箱的成本(多一个虚拟机/容器)远低于一次误操作的代价。最低限度也要用 Docker 容器隔离,别让 agent 直接碰宿主机。
除了 Anthropic 还有哪些 Computer Use 方案?
OpenAI Operator(云端浏览器)、Google Project Mariner、智谱 AutoGLM(手机端)、微软 Copilot Studio Computer Use(Windows 桌面)、字节 UI-TARS(开源)等。各家定位和成熟度不同,详见同批 [Computer Use Agent 横评](/zh/ai-computer-use-agents-comparison-review)。
一次任务大概要花多少钱?
取决于步数和截图分辨率。社区参考量级:一个 10-30 步的任务,每步截图加推理约数千 token,总成本在几美分到几美元量级。复杂任务可能更多。建议开发阶段用低分辨率 + `MAX_STEPS` 封顶控制成本,生产环境监控每任务实际 token 消耗。具体以 API 计费为准。
Computer Use 能完全替代工具调用吗?
不能,两者互补。有 API 接口的系统用工具调用更快更便宜更可靠;没有接口的老旧系统或任意网页才用 Computer Use。一个成熟的 agent 通常两者都用:能调 API 的调 API,调不了的才去操作图形界面。详见同站 [工具调用 SOP](/zh/ai-agent-tool-calling-sop)。

相关文章

实战 SOP

AI agent 工具调用实战 SOP:让大模型学会调工具

function calling / tool use 是 AI agent 的核心能力。本 SOP 给开发者一个可复制的工具调用实现模板:定义工具 schema -> 模型决策调哪个工具 -> 应用执行 -> 回填结果进下一轮。对照 OpenAI(function calling / Responses API vs Chat Completions、strict 模式)与 Anthropic tool use 当前官方 API,含五条踩坑(schema 不严谨/参数幻觉/不处理调用失败/无超时/安全沙箱)与五个 FAQ。API 以官方为准。

2026年8月9日12 分钟阅读
实战 SOP

LLaDA-Image 本地部署 SOP:五步跑通 6B 生图模型

把蚂蚁开源 6B 生图模型 LLaDA-Image 跑起来的五步 SOP:①环境准备(依赖与国内镜像加速下载);②四档权重怎么选(Base 50 步 / Turbo 4 步 × BF16 / FP8,国内走 ModelScope);③跑通第一张图(Base 与 Turbo 最小可用命令);④进阶(参考图编辑、文字渲染、ComfyUI 接入、显存不足时的降级策略);⑤生产化(批量队列、并发容量规划、成本监控、结果入库与故障降级)。含 6 条踩坑与 10 项上线自检清单,命令逐字取自官方 README;仓库 license 为 null,商用前须确权。

2026年9月9日11 分钟阅读
实战 SOP

自建 OpenMAIC 课堂 SOP:从取码到接 Agent 工作台

从零把 OpenMAIC 跑起来的完整 SOP:①零部署路线(open.maic.chat 取访问码即用);②本地标准部署(pnpm >= 10,clone → pnpm install → .env → pnpm dev);③生产化(pnpm build && pnpm start、Vercel 一键、docker compose up --build);④进阶(Postgres 持久化 profile、ACCESS_CODE 访问码、MP4 导出 profile、Lemonade/FunASR 本地化);⑤接进 agent 工作台(clawhub install openmaic 或导入 skills/openmaic/,从飞书/Slack 发消息生成课堂)。含 6 条踩坑与 10 项上线自检清单,全部命令逐字取自官方 README。

2026年9月8日11 分钟阅读