实战 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 执行预定义的安全动作集合。比如限定只能在一个特定网页上操作、只能填表不能提交、只能读不能写。在执行层(你的代码)拦截,不依赖模型自觉。

第二道:敏感操作人工确认。 定义一组敏感关键词(delete、rm、drop、支付、转账、提交订单),当模型输出的动作参数命中关键词时,暂停循环弹窗让人确认。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,含 action、coordinate、text 等);tool_result 回填时 tool_use_id 必须与 block.id 对应,否则 API 报错。截图实际应返回 base64 图像数据给模型(此处简化为文本,完整实现需把 sb.screenshot() 的返回转 base64,作为 image block 填入 tool_result 的 content 字段)。


四、五个踩坑

坑 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

ChatGPT 操作浏览器:六步装好,敢给全站权限吗

ChatGPT 操作浏览器的落地 SOP,命令与界面路径均取自官方文档 learn.chatgpt.com。六步链路:一、前置条件(ChatGPT 付费档、桌面应用、五款支持的 Chromium 系浏览器 Chrome/Edge/Brave/Opera/Vivaldi,Firefox 与 Safari 不支持);二、安装(桌面应用 Settings > Computer Use > 选浏览器 > Install 跳扩展商店 > 审批权限 > 回头确认显示 Manage;macOS 的 Computer Use 需要屏幕录制与辅助功能权限);三、调用(@Chrome/@Edge 等提及式调用、右键 Ask ChatGPT、macOS Cmd+Shift+. 唤起侧边栏、把打开的标签页或选中文字带入对话、双 Command 的 Appshot 截窗口);四、三入口决策(任务需要现有登录态如 SSO 内网/CRM/邮箱选扩展,localhost 或预览页用 @Browser 内置浏览器,有专门插件的服务插件优先);五、权限收敛四级(Allow once 仅一次、Allow for this site 本站、Allow for all sites 全站、Decline 拒绝)加域名 allowlist/blocklist 管理,五款浏览器共享这些权限,官方文档自己点名 Allow for all sites 与浏览器历史记录访问是高风险项;六、安全习惯(把页面内容、选中文字、视频转录当不可信上下文,允许前先审页面,不给 agent 常驻权限)。附官方文档确认过的坑:Opera 无侧边聊天但支持桌面工作流、仅 Chromium 系、任务跑在 Chrome 标签组里。与热点栏同主题分工:热点讲 OpenAI 的产品动作,本篇讲自己怎么配、怎么把权限收到最小。

2026年10月18日10 分钟阅读
实战 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

开源语音模型五连发:蚂蚁 MIT 协议四卡起步

蚂蚁集团 inclusionAI 2026-10-19/20 以 MIT 协议开源 Ming-3.0 语音系列五款模型(多源确认,可自部署可微调可商用),覆盖语音合成、音频理解与对话、语音识别三方向:Ming-3.0-tts-0.5B(0.5B dense,最轻量四卡可部署)、Ming-3.0-tts-tiny(7.9B 总/1.3B 激活 MoE,长篇多说话人播客)、Ming-3.0-audio-flash(126B 总/6.5B 激活 MoE,音频理解与对话、可文字可语音作答)、Ming-3.0-audio-tiny(9.3B/2.7B,效率向)、Ming-3.0-asr-tiny(8.6B/2B,上下文感知转写)。能力:TTS 文字描述音色、导演模式自然语言控情绪/重音/节奏、声音克隆、七种语言+两种方言;音频理解长音频直接输入、结构化输出、保留情绪与说话人身份、工具调用生成;ASR 方言识别、热词注入、上下文感知。接入步骤(kie.ai 与 README 核实):TTS 路线 git clone github.com/inclusionAI/Ming-3.0-tts → conda 环境(0.5B:python 3.10 + pip install -r requirements.txt + conda install -c conda-forge pynini==2.1.6)→ 按 README 跑推理;tts-tiny 需独立环境 Python 3.10.15 + PyTorch/Torchaudio 2.7.1(cu118)+ Transformers 4.46.3;audio-flash 可下载权重或走 Ling Studio Chat(ling.tbox.cn),128K 上下文,语音输出走 Chat Completions 的 audio.voice 字段(modalities=["text","audio"])。硬件口径:官方主要在数据中心卡测试,推荐 NVIDIA H800(80GB)/H20(96GB),0.5B 四卡为最低门槛,消费级卡可行性未验证;day-0 生态 vLLM-Omni、SGLang-Omni 已适配。蚂蚁内部应用(官方稿口径):asr-tiny 用于阿福医生助手、支付宝搜索、蚁小保实时语音对话、安全核身。局限四条如实写:无量化文件(GGUF/AWQ/EXL2 均无)、流式存疑(SGLang-Omni 传 stream=true 仍返回整段波形,真实首音频延迟未确立)、控制模式互斥(Voice Design/情绪调制/方言选择不能单次推理组合)、训练语料未公布。榜单背书(二手口径):Artificial Analysis TTS 榜(Provider Voices)Ming-3.0-tts 1244 分居前列。与站内分工:voice-cloning-toolkit-comparison-review(2026-10-15)是横评栏选型文(五强怎么选),本篇是 SOP 栏接入实操(五款全栈怎么装怎么调),不同栏不同角度。

2026年10月21日9 分钟阅读