目录

Claude API基础专题(六):Claude Code与Computer Use

Claude API 基础专题(六):Claude Code 与 Computer Use

预计阅读时间:40 分钟 | 难度:⭐⭐⭐⭐


目标读者:希望让Claude真正操控计算机完成复杂任务的开发者 前置知识:已完成第一篇《API基础》、第二篇《提示词工程》、第三篇《工具调用》、第四篇《RAG系统》、第五篇《MCP协议》 学习提醒:Computer Use是Claude最强大的能力之一,但也是最需要谨慎使用的功能


章节导航

小节主题重要程度
6.1从工具调用到计算机控制⭐⭐⭐⭐⭐
6.2Computer Use 原理解析⭐⭐⭐⭐⭐
6.3Claude Code 架构与设计⭐⭐⭐⭐
6.4安全机制与沙箱环境⭐⭐⭐⭐⭐
6.5开发实战:构建自动化脚本⭐⭐⭐⭐
6.6推荐做法与注意事项⭐⭐⭐⭐⭐

6.1 从工具调用到计算机控制

从工具调用到计算机控制

在讨论Computer Use之前,先回答一个问题:为什么Claude要从"回答问题"演进到"操控计算机"?

回顾LLM的能力演进历程:

第一阶段:纯文本生成(2020年前)

这个阶段的LLM只能生成文本。用户输入问题,模型输出答案,就这么简单。

问题:模型的知识是静态的,无法获取最新信息,无法执行实际操作。

第二阶段:工具调用(2022-2023)

LLM开始能够调用外部工具——搜索网页、查询数据库、执行代码。

用户:帮我查一下今天北京的天气
LLM:调用get_weather工具
工具:返回"北京今天晴,25度"
LLM:根据工具返回结果回答用户

进步:模型能够获取实时信息并执行具体操作。

局限:工具是预先定义好的,能力边界固定。模型无法应对未曾预料的情况。

第三阶段:Computer Use(2024-至今)

Claude获得了直接操控计算机的能力——操作鼠标、键盘,打开应用程序,浏览网页。

用户:帮我填一下这个表格
LLM:
  1. 先截图看一下表格长什么样
  2. 分析表格结构
  3. 操作鼠标点击第一个输入框
  4. 从文件中读取数据
  5. 用键盘输入数据
  6. 点击提交按钮

为什么需要这种演进?

因为任务的复杂性要求越来越强

任务类型工具调用能否完成?Computer Use能否完成?
查天气
填表格
自动化测试
写代码并调试部分
跨应用数据迁移

当任务需要多步骤、多工具协调、实时视觉反馈时,传统工具调用就力不从心了。

什么是Computer Use?

Computer Use(计算机使用)是Anthropic在2024年推出的一项突破性能力。它让Claude能够:

  1. 查看屏幕内容 - 截取屏幕截图,理解UI布局
  2. 操作鼠标 - 点击、拖拽、悬停
  3. 操作键盘 - 输入文本、按下快捷键
  4. 打开关闭应用 - 启动程序、关闭窗口
  5. 浏览网页 - 导航、点击链接、填写表单

什么?

意味着 Claude 从一个"能对话的程序",变成了一个能直接操控屏幕、键盘和鼠标的程序


6.2 Computer Use 原理解析

整体工作流程

Computer Use 的核心是一个观察-决策-执行循环

┌─────────────────────────────────────────────────────────────────┐
│                      Computer Use 循环                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   ┌──────────────┐                                               │
│   │  1. 观察     │  ← Claude截取屏幕截图,理解当前状态            │
│   └──────┬───────┘                                               │
│          │                                                       │
│          ▼                                                       │
│   ┌──────────────┐                                               │
│   │  2. 决策     │  ← 基于观察结果,决定下一步行动                 │
│   └──────┬───────┘                                               │
│          │                                                       │
│          ▼                                                       │
│   ┌──────────────┐                                               │
│   │  3. 执行     │  ← 执行鼠标/键盘操作                          │
│   └──────┬───────┘                                               │
│          │                                                       │
│          └───────────────────────────────────────┐               │
│                                                  │               │
│                     循环直到任务完成              │               │
│                                                  │               │
└──────────────────────────────────────────────────────────────────┘

为什么需要"观察-决策-执行"循环?

答案:LLM 无法直接"看到"计算机状态

传统的工具调用是确定性的

# 工具调用:输入确定,输出确定
result = get_weather(city="北京")
# 要么成功返回天气,要么抛出异常

但计算机操作是非确定性的

场景:点击"提交"按钮
问题:
- 按钮真的在那个位置吗?
- 按钮是否被其他窗口遮挡?
- 点击后会发生什么?
- 如果按钮不存在怎么办?

所以 Claude 需要:

  1. 先观察 - 截图看看当前屏幕状态
  2. 再决策 - 基于观察决定操作
  3. 后执行 - 执行操作
  4. 再观察 - 验证操作效果

这种循环让 Claude 能够应对各种意外情况,就像人类操作计算机一样——先看看,再操作,再看看效果。

核心技术组件

Computer Use 由以下几个核心组件构成:

class ComputerUseConfig:
    """
    Computer Use 的核心配置

    为什么要这些配置?
    每个配置都对应着一个现实问题
    """

    display_size: tuple = (1920, 1080)
    # 问题:Claude如何知道屏幕有多大?
    # 答案:通过display_size指定屏幕分辨率

    available_terminals: list = ["bash", "zsh", "powershell"]
    # 问题:Claude能在哪些环境中执行命令?
    # 答案:通过available_terminals指定可用的终端

    max_actions_per_turn: int = 10
    # 问题:一次循环中最多执行多少操作?
    # 答案:限制max_actions_per_turn防止失控

    screenshot_delay_ms: int = 100
    # 问题:执行操作后需要等多久才能截图?
    # 答案:等待UI更新完成后再截图

6.3 Claude Code架构与设计

Claude Code是什么?

Claude Code是Anthropic官方推出的命令行工具,让开发者能够在终端中与Claude交互。它不仅仅是另一个CLI工具——它是Computer Use能力的官方载体

为什么Claude要推出自己的CLI工具?

这里有一个深层次的原因:工具调用的局限性

当开发者想让Claude帮助写代码时,工具调用面临以下问题:

问题描述后果
上下文丢失新会话无法保留之前的决策Claude反复问相同问题
工具碎片化每个IDE插件各自实现体验不一致
安全边界模糊难以控制Claude能做什么风险不可控

Claude Code通过深度集成解决了这些问题:

# Claude Code的核心理念
principles = {
    "continuous_context": "整个开发会话的上下文持久保持",
    "unified_tools": "统一的文件操作、Git、终端工具",
    "explicit_consent": "敏感操作需要用户确认",
    "transparent_actions": "所有操作都记录日志"
}

Claude Code的核心功能

1. 智能代码生成

# 在终端中启动Claude Code
claude

# 简单的代码生成请求
claude "写一个快速排序算法"

# 复杂的项目级请求
claude "帮我重构这个React项目,使用TypeScript"

2. Git操作集成

# 让Claude帮你写commit message
claude "commit current changes"

# 让Claude帮你分析PR
claude "review this pull request"

# 让Claude帮你处理merge conflict
claude "resolve the merge conflict in src/app.tsx"

3. 终端命令执行

# Claude可以执行终端命令
claude "run the tests and fix any failures"

# Claude可以安装依赖
claude "install the required npm packages"

4. 多文件编辑

# Claude可以同时修改多个文件
claude """
创建以下文件:
- src/api/users.ts - 用户API模块
- src/api/posts.ts - 文章API模块
- src/types/index.ts - 类型定义
"""

Claude Code vs 传统IDE插件

特性传统IDE插件Claude Code
上下文保持差(每次都是新会话)强(整个会话持久)
工具一致性差(各插件实现不同)强(统一工具集)
安全控制强(明确授权机制)
跨项目能力强(能跨项目工作)
学习曲线各插件不同统一体验

6.4 安全机制与沙箱环境

为什么要这么强调安全?

Computer Use 能力的危险性很容易理解:如果 LLM 能像人一样操作计算机,它就能执行任何操作——包括删除文件、发送邮件、甚至泄露数据。

这就引出了一个根本问题:

我们如何让 Claude 变得有用,同时又不让它变得危险?

Anthropic 的安全策略

Anthropic 采用了多层防御策略

第一层:明确授权(Explicit Consent)

class ConsentManager:
    """
    consent_level决定了Claude能做什么

    为什么需要分层?
    不同任务需要不同的信任级别
    """

    levels = {
        "read_only": {
            "description": "只读模式",
            "allowed": ["read_file", "search", "browse"],
            "denied": ["write_file", "execute", "delete"]
        },
        "read_write": {
            "description": "读写模式",
            "allowed": ["read_file", "write_file", "search", "browse"],
            "denied": ["execute", "delete", "send_email"]
        },
        "full_access": {
            "description": "完全访问",
            "allowed": ["*"],  # 所有操作
            "requires_confirmation": ["delete", "send_email", "execute"]
        }
    }

第二层:沙箱环境(Sandbox)

class SandboxConfig:
    """
    沙箱配置

    为什么需要沙箱?
    即使Claude出错,也只会影响沙箱内的模拟环境
    """

    sandbox_type = "docker"  # Docker容器隔离
    network_isolation = True   # 网络隔离
    filesystem_boundary = "/workspace/sandbox"  # 文件系统边界
    cpu_limit = "2 cores"     # CPU限制
    memory_limit = "4GB"      # 内存限制

第三层:操作日志(Audit Log)

class AuditLogger:
    """
    操作日志

    为什么需要日志?
    1. 问题追溯:如果出了问题,能知道发生了什么
    2. 信任建立:用户可以看到Claude在做什么
    3. 合规要求:某些行业必须保留操作记录
    """

    def log_action(self, action: dict):
        entry = {
            "timestamp": datetime.now().isoformat(),
            "action_type": action["type"],
            "target": action["target"],
            "parameters": action.get("params", {}),
            "result": action.get("result", "pending"),
            "consent_level": self.current_consent_level
        }
        self.log_file.write(json.dumps(entry) + "\n")

第四层:实时监控(Human-in-the-Loop)

class HumanOversight:
    """
    人工监督机制

    核心思想:关键操作需要人工确认
    """

    HIGH_RISK_ACTIONS = [
        "delete_files",
        "send_emails",
        "make_purchases",
        "push_to_production",
        "modify_security_settings"
    ]

    def requires_confirmation(self, action: dict) -> bool:
        """
        判断操作是否需要确认
        """
        return action["type"] in self.HIGH_RISK_ACTIONS

    async def request_confirmation(self, action: dict) -> bool:
        """
        请求用户确认
        返回True表示用户批准,False表示拒绝
        """
        print(f"⚠️ Claude想要执行高风险操作:{action['type']}")
        print(f"目标:{action.get('target', 'N/A')}")
        response = input("是否允许?(y/n): ")
        return response.lower() == 'y'

开发者的安全实践

作为开发者,我们应该如何安全地使用 Computer Use?

class SafeComputerUse:
    """
    安全使用Computer Use的推荐做法
    """

    @staticmethod
    def create_limited_session(config: dict) -> dict:
        """
        创建受限会话

        推荐做法1:最小权限原则
        只给Claude它需要的权限,不要给多了
        """
        return {
            "consent_level": "read_only",  # 除非必要,不用更高权限
            "allowed_paths": ["/workspace/project"],  # 只允许访问项目目录
            "denied_paths": [
                "/etc",           # 系统配置
                "/home/*/.ssh",   # SSH密钥
                "/var/secrets"    # 敏感信息
            ],
            "max_actions_per_turn": 5,  # 限制单次操作数
            "enable_audit_log": True     # 开启日志
        }

    @staticmethod
    def validate_target(target: str, allowed_paths: list) -> bool:
        """
        验证操作目标是否在允许范围内

        推荐做法2:路径验证
        在执行任何文件操作前,验证路径是否安全
        """
        import os
        real_path = os.path.realpath(target)

        for allowed in allowed_paths:
            allowed_real = os.path.realpath(allowed)
            if real_path.startswith(allowed_real):
                return True

        return False

6.5 开发实战:构建自动化脚本

场景:自动填表机器人

让我们通过一个实际例子来学习如何构建基于Computer Use的自动化脚本。

场景描述:我们需要让Claude帮助填写一个网页表单。

import asyncio
from anthropic import Anthropic
from computer_use import ComputerUse

class FormFillingBot:
    """
    自动填表机器人

    为什么需要这个类?
    封装常见操作,提供高级API
    """

    def __init__(self, consent_level: str = "read_write"):
        self.client = Anthropic()
        self.computer = ComputerUse(consent_level=consent_level)
        self.task_history = []  # 记录操作历史

    async def fill_form(self, form_url: str, form_data: dict):
        """
        填写表单的主要流程

        为什么分步骤?
        1. 便于调试 - 出问题能快速定位
        2. 便于重试 - 失败的操作可以单独重试
        3. 便于日志 - 详细记录每一步
        """
        try:
            # 步骤1:打开表单页面
            await self._navigate_to_form(form_url)

            # 步骤2:分析表单结构
            form_structure = await self._analyze_form()

            # 步骤3:逐个填写字段
            for field_name, value in form_data.items():
                await self._fill_field(field_name, value)

            # 步骤4:提交表单
            await self._submit_form()

            return {"success": True, "steps_completed": len(self.task_history)}

        except Exception as e:
            return {
                "success": False,
                "error": str(e),
                "steps_completed": self.task_history
            }

    async def _navigate_to_form(self, url: str):
        """导航到表单页面"""
        # 1. 先截一张图确认当前位置
        screenshot = await self.computer.screenshot()

        # 2. 打开新标签页(Ctrl+T)
        await self.computer.keyboard.press("ctrl+t")

        # 3. 输入URL
        await self.computer.keyboard.type(url)

        # 4. 按回车
        await self.computer.keyboard.press("enter")

        # 5. 等待页面加载
        await asyncio.sleep(2)

        # 6. 再次截图确认页面已加载
        await self.computer.screenshot()

        self.task_history.append({
            "step": "navigate",
            "url": url
        })

    async def _analyze_form(self) -> dict:
        """分析表单结构"""
        # 截取当前屏幕
        screenshot = await self.computer.screenshot()

        # 让Claude分析截图中的表单字段
        analysis_prompt = """
        请分析这个截图中的表单结构。
        返回JSON格式,包含:
        - fields: 字段列表,每个字段包含name、type、position
        - submit_button: 提交按钮的位置
        """

        response = self.client.messages.create(
            model="claude-opus-4-20241120",
            max_tokens=1024,
            messages=[{
                "role": "user",
                "content": [
                    {"type": "image", "source": screenshot},
                    {"type": "text", "text": analysis_prompt}
                ]
            }]
        )

        return self._parse_form_analysis(response.content[0].text)

    async def _fill_field(self, field_name: str, value: str):
        """填写单个字段"""
        # 1. 点击字段位置
        # (实际实现中需要根据_analyze_form的结果确定位置)
        await self.computer.mouse.click(x=field_name["x"], y=field_name["y"])

        # 2. 输入内容
        await self.computer.keyboard.type(value)

        # 3. 按Tab跳到下一个字段
        await self.computer.keyboard.press("tab")

        self.task_history.append({
            "step": "fill_field",
            "field": field_name,
            "value": value
        })

    async def _submit_form(self):
        """提交表单"""
        # 点击提交按钮
        # (实际实现中需要根据_analyze_form的结果确定位置)
        await self.computer.mouse.click(x="submit_x", y="submit_y")

        # 等待提交完成
        await asyncio.sleep(3)

        # 截图确认提交结果
        result_screenshot = await self.computer.screenshot()

        self.task_history.append({
            "step": "submit",
            "screenshot": result_screenshot
        })

场景:自动化测试助手

class TestingAssistant:
    """
    自动化测试助手

    使用Computer Use执行UI测试
    """

    def __init__(self, app_url: str):
        self.app_url = app_url
        self.computer = ComputerUse()
        self.test_results = []

    async def run_ui_test(self, test_case: dict) -> dict:
        """
        执行UI测试

        测试流程:
        1. 打开应用
        2. 执行测试操作
        3. 验证结果
        4. 记录测试报告
        """
        test_id = test_case["id"]
        steps = test_case["steps"]
        expected = test_case["expected"]

        try:
            # 打开应用
            await self._open_application()

            # 执行测试步骤
            for step in steps:
                await self._execute_step(step)

            # 验证结果
            actual = await self._capture_result()

            # 比对结果
            passed = self._compare_results(expected, actual)

            result = {
                "test_id": test_id,
                "status": "passed" if passed else "failed",
                "expected": expected,
                "actual": actual,
                "screenshots": self.test_results
            }

            self.test_results.append(result)
            return result

        except Exception as e:
            return {
                "test_id": test_id,
                "status": "error",
                "error": str(e)
            }

    async def _open_application(self):
        """打开测试应用"""
        await self.computer.browser.open(self.app_url)
        await asyncio.sleep(2)  # 等待页面加载

    async def _execute_step(self, step: dict):
        """执行单个测试步骤"""
        action = step["action"]

        if action == "click":
            await self.computer.mouse.click(x=step["x"], y=step["y"])
        elif action == "type":
            await self.computer.keyboard.type(step["text"])
        elif action == "select":
            await self.computer.mouse.click(x=step["x"], y=step["y"])
            await self.computer.keyboard.press("down")
            await self.computer.keyboard.press("enter")

        await asyncio.sleep(step.get("delay", 1))

        # 每步都截图记录
        await self.computer.screenshot()

    async def _capture_result(self) -> dict:
        """捕获测试结果"""
        screenshot = await self.computer.screenshot()

        # 让Claude分析截图中的关键信息
        return {"screenshot": screenshot}

    def _compare_results(self, expected: dict, actual: dict) -> bool:
        """比对测试结果"""
        # 实际实现中需要根据具体测试类型比对
        return True

6.6 推荐做法与注意事项

推荐做法

1. 从简单任务开始

# 好:先从简单操作开始
simple_tasks = [
    "打开浏览器访问 example.com",
    "截取当前屏幕",
    "在文本框输入 Hello World"
]

# 差:一开始就尝试复杂流程
complex_tasks = [
    "自动登录邮箱,查找特定邮件,提取附件,上传到云存储"
]

原因:简单任务容易验证和调试,能帮你快速理解 Claude 的行为模式。

2. 总是验证操作结果

async def safe_click(x, y):
    """
    安全点击

    为什么需要验证?
    确保点击生效了
    """
    # 点击前截图
    before = await computer.screenshot()

    # 执行点击
    await computer.mouse.click(x, y)

    # 等待UI更新
    await asyncio.sleep(0.5)

    # 点击后截图
    after = await computer.screenshot()

    # 验证发生了变化
    if before == after:
        raise Exception("点击似乎没有生效,请检查")

    return after

3. 实现超时和重试机制

async def execute_with_retry(action, max_retries=3, timeout=10):
    """
    带重试的操作执行

    为什么需要重试?
    1. 网络可能不稳定
    2. UI响应可能延迟
    3. 临时性的环境问题
    """
    for attempt in range(max_retries):
        try:
            return await asyncio.wait_for(action(), timeout=timeout)
        except TimeoutError:
            if attempt == max_retries - 1:
                raise
            await asyncio.sleep(1)  # 重试前等待

常见错误与解决方案

错误原因解决方案
截图是空白的页面还在加载增加等待时间
点击位置不对分辨率不匹配使用相对坐标或百分比
操作超时应用无响应添加超时检测
循环无法结束缺乏终止条件设置明确的结束标志

适用场景判断

适合使用 Computer Use 的场景

场景原因
跨应用自动化没有 API,只能操作 UI
遗留系统测试老系统无法接入现代工具
动态 UI 交互UI 是动态生成的,无法预先定义
复杂表单填写表单结构复杂,需要实时理解

不适合使用 Computer Use 的场景

场景替代方案
纯数据处理使用 API 或脚本
定期批量任务使用 Cron + 脚本
高精度操作使用专用 API
敏感操作人工执行

本章总结

核心知识点

知识点掌握程度关键点
演进路径⭐⭐⭐⭐⭐为什么需要Computer Use
工作原理⭐⭐⭐⭐⭐观察-决策-执行循环
Claude Code⭐⭐⭐⭐官方CLI工具的能力
安全机制⭐⭐⭐⭐⭐多层防御保护
开发实战⭐⭐⭐⭐填表机器人、测试助手
推荐做法⭐⭐⭐⭐⭐安全、验证、重试

关键设计思想

设计思想为什么重要
观察-决策-执行循环非确定性环境需要反馈机制
多层安全防御能力与风险同步增长
最小权限原则只给必要的权限
人工监督关键操作需要人工确认

下一步

  • 继续阅读:Agent架构专题(七)- 了解多Agent协作系统
  • 实践项目:用Computer Use构建一个自动化测试工具
  • 参考资料:Anthropic Computer Use文档

文档元信息 难度:⭐⭐⭐⭐ | 类型:专家设计 | 更新日期:2026-03-25 | 预计阅读时间:50 分钟 | 字数:约 6000 字