Claude 3.7 SonnetとClaude 3.5 Sonnet(新)は、コンピュータのデスクトップ環境を操作できるツールを使用することができます。Claude 3.7 Sonnetでは、追加のツールが導入され、思考プロセスを有効にすることで、モデルの推論プロセスについてより深い洞察を得ることができます。

コンピュータの使用はベータ機能です。コンピュータの使用は、標準的なAPIの機能やチャットインターフェースとは異なる固有のリスクをもたらすことにご注意ください。これらのリスクは、インターネットとの対話に使用する場合に特に高まります。リスクを最小限に抑えるために、以下のような予防措置を検討してください:

  1. システムへの直接的な攻撃や事故を防ぐため、最小限の権限を持つ専用の仮想マシンまたはコンテナを使用する。
  2. 情報の盗難を防ぐため、アカウントのログイン情報などの機密データへのアクセスをモデルに与えない。
  3. 悪意のあるコンテンツへの露出を減らすため、インターネットアクセスを許可リストのドメインに制限する。
  4. クッキーの承認、金融取引の実行、利用規約への同意など、実世界で重要な結果をもたらす可能性のある決定や、積極的な同意を必要とするタスクについては、人間に確認を求める。

場合によっては、Claudeはユーザーの指示と矛盾する場合でも、コンテンツ内の命令に従うことがあります。例えば、ウェブページや画像に含まれるClaude向けの指示が、指示を上書きしたり、Claudeにミスを引き起こさせたりする可能性があります。プロンプトインジェクションに関連するリスクを避けるため、Claudeを機密データやアクションから隔離することをお勧めします。

モデルにプロンプトインジェクションへの耐性を持たせるよう訓練し、さらなる防御層を追加しました。コンピュータ使用ツールを使用する場合、プロンプトに対して自動的にクラシファイアを実行し、プロンプトインジェクションの可能性がある事例を検出します。これらのクラシファイアがスクリーンショット内でプロンプトインジェクションの可能性を特定した場合、次のアクションに進む前にユーザーの確認を求めるようモデルを自動的に誘導します。この追加の保護がすべてのユースケース(例えば、人間が介在しないユースケース)に理想的ではないことは認識しており、オプトアウトしてオフにしたい場合は、お問い合わせください

それでもなお、プロンプトインジェクションに関連するリスクを避けるため、Claudeを機密データやアクションから隔離する予防措置を取ることをお勧めします。

最後に、自社製品でコンピュータ使用を有効にする前に、関連するリスクについてエンドユーザーに通知し、同意を得てください。

コンピュータ使用のリファレンス実装

Webインターフェース、Dockerコンテナ、ツール実装の例、エージェントループを含むコンピュータ使用のリファレンス実装で、すぐに始めることができます。

注意: この実装はClaude 3.7 Sonnet用の新しいツールを含むように更新されています。これらの新機能にアクセスするには、リポジトリの最新バージョンを取得してください。

モデルの応答の品質、API自体、またはドキュメントの品質についてフィードバックを提供するには、このフォームをご利用ください - 皆様からのご意見をお待ちしています!

以下は、Messages APIを使用してClaudeにコンピュータ使用ツールを提供する方法の例です:

curl https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: computer-use-2025-01-24" \
  -d '{
    "model": "claude-3-7-sonnet-20250219",
    "max_tokens": 1024,
    "tools": [
      {
        "type": "computer_20250124",
        "name": "computer",
        "display_width_px": 1024,
        "display_height_px": 768,
        "display_number": 1
      },
      {
        "type": "text_editor_20241022",
        "name": "str_replace_editor"
      },
      {
        "type": "bash_20241022",
        "name": "bash"
      }
    ],
    "messages": [
      {
        "role": "user",
        "content": "Save a picture of a cat to my desktop."
      }
    ],
    "thinking": {
      "type": "enabled",
      "budget_tokens": 1024
    }
  }'

コンピュータ使用の仕組み

1. Claudeにコンピュータ使用ツールとユーザープロンプトを提供する

  • Anthropicが定義したコンピュータ使用ツールをAPIリクエストに追加する。
  • これらのツールを必要とする可能性のあるユーザープロンプト(例:「デスクトップに猫の写真を保存して」)を含める。

2. Claudeがツールの使用を決定する

  • Claudeは保存されたコンピュータ使用ツールの定義を読み込み、ユーザーのクエリに役立つツールがあるかどうかを評価する。
  • ある場合、Claudeは適切にフォーマットされたツール使用リクエストを構築する。
  • APIレスポンスのstop_reasontool_useとなり、Claudeの意図を示す。

3. ツール入力を抽出し、コンピュータ上でツールを評価し、結果を返す

  • あなたの側で、Claudeのリクエストからツール名と入力を抽出する。
  • コンテナまたは仮想マシン上でツールを使用する。
  • tool_resultコンテンツブロックを含む新しいuserメッセージで会話を継続する。

4. Claudeはタスクが完了するまでコンピュータ使用ツールの呼び出しを続ける

  • Claudeはツール結果を分析し、さらにツールの使用が必要か、タスクが完了したかを判断する。
  • Claudeが別のツールが必要だと判断した場合、別のtool_use stop_reasonで応答し、ステップ3に戻る必要がある。
  • それ以外の場合は、ユーザーへのテキスト応答を作成する。

ユーザー入力なしでステップ3と4を繰り返すことを「エージェントループ」と呼びます - つまり、Claudeがツール使用リクエストで応答し、アプリケーションがそのリクエストの評価結果でClaudeに応答することです。

コンピューティング環境

コンピュータの使用には、Claudeがアプリケーションとウェブを安全に操作できるサンドボックス化されたコンピューティング環境が必要です。この環境には以下が含まれます:

  1. 仮想ディスプレイ: Claudeがスクリーンショットを通して見て、マウス/キーボードのアクションで制御できるデスクトップインターフェースをレンダリングする仮想X11ディスプレイサーバー(Xvfbを使用)。

  2. デスクトップ環境: Linuxで動作する、ウィンドウマネージャー(Mutter)とパネル(Tint2)を備えた軽量なUI。Claudeが操作できる一貫したグラフィカルインターフェースを提供します。

  3. アプリケーション: Firefox、LibreOffice、テキストエディタ、ファイルマネージャーなど、Claudeがタスクを完了するために使用できる事前インストールされたLinuxアプリケーション。

  4. ツール実装: Claudeの抽象的なツールリクエスト(「マウスを移動」や「スクリーンショットを撮る」など)を仮想環境での実際の操作に変換する統合コード。

  5. エージェントループ: Claudeと環境の間の通信を処理し、Claudeのアクションを環境に送信し、結果(スクリーンショット、コマンド出力)をClaudeに返すプログラム。

コンピュータ使用時、Claudeはこの環境に直接接続しません。代わりに、あなたのアプリケーションが:

  1. Claudeのツール使用リクエストを受け取る
  2. それらをコンピューティング環境でのアクションに変換する
  3. 結果(スクリーンショット、コマンド出力など)をキャプチャする
  4. これらの結果をClaudeに返す

セキュリティと分離のため、リファレンス実装では、これらすべてを適切なポートマッピングを持つDockerコンテナ内で実行し、環境の表示と操作を可能にしています。


コンピュータ使用の実装方法

リファレンス実装から始める

コンピュータ使用をすぐに始めるために必要なものをすべて含むリファレンス実装を構築しました:

マルチエージェントループの理解

コンピュータ使用の核心は「エージェントループ」です - Claudeがツールアクションをリクエストし、アプリケーションがそれらを実行し、結果をClaudeに返すサイクルです。以下は簡略化された例です:

async def sampling_loop(
    *,
    model: str,
    messages: list[dict],
    api_key: str,
    max_tokens: int = 4096,
    tool_version: str,
    thinking_budget: int | None = None,
    max_iterations: int = 10,  # 無限ループを防ぐためにイテレーション制限を追加
):
    """
    Claudeのコンピュータ使用対話のためのシンプルなエージェントループ。

    この関数は以下のやり取りを処理します:
    1. ユーザーメッセージをClaudeに送信
    2. Claudeがツールの使用をリクエスト
    3. アプリがそれらのツールを実行
    4. ツール結果をClaudeに送信
    """
    # ツールとAPIパラメータのセットアップ
    client = Anthropic(api_key=api_key)
    beta_flag = "computer-use-2025-01-24" if "20250124" in tool_version else "computer-use-2024-10-22"

    # ツールの設定 - これらは他の場所で既に初期化されているはずです
    tools = [
        {"type": f"computer_{tool_version}", "name": "computer", "display_width_px": 1024, "display_height_px": 768},
        {"type": f"text_editor_{tool_version}", "name": "str_replace_editor"},
        {"type": f"bash_{tool_version}", "name": "bash"}
    ]

    # メインエージェントループ(APIコストの暴走を防ぐためのイテレーション制限付き)
    iterations = 0
    while True and iterations < max_iterations:
        iterations += 1
        # オプションの思考パラメータのセットアップ(Claude 3.7 Sonnet用)
        thinking = None
        if thinking_budget:
            thinking = {"type": "enabled", "budget_tokens": thinking_budget}

        # Claude APIの呼び出し
        response = client.beta.messages.create(
            model=model,
            max_tokens=max_tokens,
            messages=messages,
            tools=tools,
            betas=[beta_flag],
            thinking=thinking
        )

        # Claudeの応答を会話履歴に追加
        response_content = response.content
        messages.append({"role": "assistant", "content": response_content})

        # Claudeがツールを使用したかどうかをチェック
        tool_results = []
        for block in response_content:
            if block.type == "tool_use":
                # 実際のアプリでは、ここでツールを実行します
                # 例:result = run_tool(block.name, block.input)
                result = {"result": "Tool executed successfully"}

                # 結果をClaude用にフォーマット
                tool_results.append({
                    "type": "tool_result",
                    "tool_use_id": block.id,
                    "content": result
                })

        # ツールが使用されなかった場合、Claudeは完了 - 最終メッセージを返す
        if not tool_results:
            return messages

        # 次のClaudeとのイテレーション用にツール結果をメッセージに追加
        messages.append({"role": "user", "content": tool_results})

ループは、Claudeがツールをリクエストせずに応答する(タスク完了)か、最大イテレーション制限に達するまで続きます。このセーフガードは、予期せぬAPIコストにつながる可能性のある無限ループを防ぎます。

ツールの各バージョンについて、APIリクエストで対応するベータフラグを使用する必要があります:

このドキュメントの残りを読む前に、リファレンス実装を試してみることをお勧めします。

プロンプトを使用してモデルのパフォーマン