0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GPT-5.4 Computer Use APIで「画面を見て操作する」AIエージェントを作る実践ガイド【2026年3月最新】

0
Posted at

GPT-5.4 Computer Use APIで「画面を見て操作する」AIエージェントを作る実践ガイド【2026年3月最新】

はじめに — AIが「目と手」を持った日のこと

2026年3月、ちょっと見逃せない出来事がありました。

OpenAIが GPT-5.4 をリリースして、その目玉機能として Computer Use API を公開したんです。「AIがスクリーンショットを見て、マウスをクリックして、キーボードを叩く」というやつですね。

正直に言うと、最初は「またそういうデモか」と思っていたんです。でも、 OSWorld というデスクトップ自動化のベンチマークで GPT-5.4 が 75.0% を叩き出して、人間専門家の 72.4% を上回ったというのを知って、少し認識が変わりました。

AIが「画面を見て操作する」能力が、初めて人間を超えた瞬間です。

これは Anthropic が Computer Use を Claude 3.5 Sonnet で出したときの流れと同じ文脈なんですけど、GPT-5.4 の特徴は Responses API という統一エンドポイントに統合されている こと。ツールとして computer_use を宣言するだけで、既存の API 呼び出しパターンとほとんど同じ感覚で使えます。

この記事では、GPT-5.4 の Computer Use API が何者で、どう動いて、どうやって Python で動かすか、という話を実際に手を動かしながら整理しています。「理論は知ってるけど実装がわからない」という人に届くといいなと思っています。


第1章 — Computer Use の仕組みを理解する

「画面を見て操作する」とはどういうことか

まず根本的なところを整理しておきましょう。Computer Use は、次のループを繰り返す仕組みです。

  1. あなたのアプリがスクリーンショットを撮る
  2. そのスクリーンショットを GPT-5.4 に送る
  3. GPT-5.4 が「次に何をすべきか」を 構造化されたアクションとして返す
  4. あなたのアプリがそのアクションを実行する(クリック・タイプ・スクロール等)
  5. また1に戻る

重要なのは、GPT-5.4 自身はあなたのPCを直接操作しない という点です。あくまでモデルは「座標(x, y)をクリックせよ」という JSON を返すだけで、実際に動かすのはあなたのコードです。これは安全設計として非常に重要な考え方で、モデルに直接アクチュエーターを持たせないという姿勢が貫かれています。

[スクリーンショット] → [GPT-5.4 API] → [アクションJSON] → [PyAutoGUI] → [画面更新] → [繰り返し]

Chat Completions ではなく Responses API

GPT-5.4 の Computer Use は Responses API 経由でしか使えません。従来の client.chat.completions.create() ではなく client.responses.create() を使う必要があります。

# ❌ これは動かない(Computer Use は Chat Completions 非対応)
response = client.chat.completions.create(
    model="gpt-5.4-pro-2026-03-05",
    messages=[...],
    tools=[{"type": "computer_use"}]
)

# ✅ Responses API を使う
response = client.responses.create(
    model="gpt-5.4-pro-2026-03-05",
    input=[...],
    tools=[{"type": "computer_use", "display_width": 1920, "display_height": 1080}]
)

「また別の API か」と感じるのは理解できます。ただ Responses API は OpenAI が 2026 年に統合を進めている新しい標準エンドポイントで、Tool Search も Computer Use も Reasoning もここに集約されていく方向感があります。先に慣れておくのは損じゃないです。

OSWorld 75% の意味するところ

OSWorld は、実際の PC 画面上でタスクを自律的に完了させるベンチマークです。「Excelで集計してメールに添付して送る」みたいな複合タスクを、AIが何ステップかけてでも完了できるかを測ります。

GPT-5.4 の 75.0% は、人間専門家の 72.4% を上回る初めての事例です。もちろんベンチマークと実際の業務は別物ですが、「少なくとも定型的な操作の自動化」においては AI が十分な選択肢になってきた、というシグナルとして見てよいでしょう。


第2章 — 環境構築と基本実装

前提条件

  • Python 3.10 以上
  • OpenAI API キー(Tier 1 以上、最低 $5 の支払い実績が必要)
  • デスクトップ環境(macOS / Windows / Linux)。ヘッドレスサーバーの場合は Xvfb 等の仮想ディスプレイが必要
mkdir gpt54-computer-use
cd gpt54-computer-use
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

pip install openai pyautogui pillow
  • openai : GPT-5.4 API を叩く
  • pyautogui : マウス・キーボードを制御する
  • pillow : スクリーンショットを処理する

Step 1: スクリーンショットを API に送る形式に変換する

Computer Use に渡す画像は base64 エンコードされた PNG です。

import base64
from io import BytesIO
import pyautogui
from PIL import Image

def take_screenshot() -> str:
    """スクリーンショットを撮って base64 文字列を返す"""
    screenshot = pyautogui.screenshot()
    # 解像度が高すぎると API コストが上がるので 1920x1080 にリサイズ
    screenshot = screenshot.resize((1920, 1080), Image.LANCZOS)
    buffer = BytesIO()
    screenshot.save(buffer, format="PNG")
    return base64.b64encode(buffer.getvalue()).decode("utf-8")

ここで「解像度を下げて大丈夫か」と思うかもしれません。実際には 1920x1080 程度が API とのバランスとして推奨されていて、それ以上だとトークン消費が増える割に認識精度が上がりにくいです。

Step 2: GPT-5.4 に画像を送ってアクションを受け取る

from openai import OpenAI

client = OpenAI()  # OPENAI_API_KEY を環境変数から読む

def ask_gpt54_computer_use(screenshot_b64: str, task: str, history: list = None) -> dict:
    """
    スクリーンショットを送ってアクションを受け取る
    
    Args:
        screenshot_b64: base64 エンコードされたスクリーンショット
        task: 実行したいタスクの説明
        history: これまでのアクション履歴(マルチターン用)
    
    Returns:
        {"type": "click", "x": 500, "y": 300} 等の辞書
    """
    # 最初のメッセージを構築
    user_content = [
        {
            "type": "input_image",
            "image_url": f"data:image/png;base64,{screenshot_b64}"
        },
        {
            "type": "input_text",
            "text": task if not history else "続きを実行してください。"
        }
    ]
    
    input_messages = []
    if history:
        input_messages.extend(history)
    input_messages.append({"role": "user", "content": user_content})
    
    response = client.responses.create(
        model="gpt-5.4-pro-2026-03-05",
        input=input_messages,
        tools=[{
            "type": "computer_use",
            "display_width": 1920,
            "display_height": 1080,
            "display_number": 1
        }],
        reasoning={"effort": "medium"}  # low / medium / high で精度とコストを調整
    )
    
    # アクションを抽出
    for output_item in response.output:
        if output_item.type == "computer_call":
            return output_item.action
    
    # アクションがない = タスク完了と判断
    return {"type": "done", "message": response.output_text}

reasoning.effortlow / medium / high で調整できます。単純なフォーム入力なら low で十分で、複雑な画面判断が必要なら high を使う、という使い分けがコスト最適化のポイントです。

Step 3: アクションを実行する

import time

def execute_action(action: dict) -> bool:
    """
    GPT-5.4 が返したアクションを PyAutoGUI で実行する
    
    Returns:
        False = タスク完了、True = 継続
    """
    action_type = action.get("type")
    
    if action_type == "done":
        print(f"タスク完了: {action.get('message', '')}")
        return False
    
    elif action_type == "click":
        x, y = action["x"], action["y"]
        button = action.get("button", "left")
        print(f"クリック: ({x}, {y}), ボタン: {button}")
        pyautogui.click(x, y, button=button)
    
    elif action_type == "double_click":
        x, y = action["x"], action["y"]
        print(f"ダブルクリック: ({x}, {y})")
        pyautogui.doubleClick(x, y)
    
    elif action_type == "type":
        text = action["text"]
        print(f"入力: {repr(text[:50])}...")
        pyautogui.write(text, interval=0.02)  # 速すぎると認識されないことがある
    
    elif action_type == "key":
        key = action["key"]
        print(f"キー押下: {key}")
        pyautogui.hotkey(*key.split("+"))  # "ctrl+c" → ["ctrl", "c"]
    
    elif action_type == "scroll":
        x, y = action["x"], action["y"]
        direction = action.get("direction", "down")
        amount = action.get("amount", 3)
        print(f"スクロール: ({x}, {y}), 方向: {direction}, 量: {amount}")
        if direction == "down":
            pyautogui.scroll(-amount, x=x, y=y)
        else:
            pyautogui.scroll(amount, x=x, y=y)
    
    elif action_type == "move":
        x, y = action["x"], action["y"]
        pyautogui.moveTo(x, y)
    
    else:
        print(f"未知のアクション: {action_type}")
    
    time.sleep(0.5)  # アクション後に少し待つ(画面更新のため)
    return True

第3章 — 自動化ループを組み立てる

メインループの実装

import pyautogui

# 安全設定: マウスを画面の隅に移動させると緊急停止
pyautogui.PAUSE = 0.3
pyautogui.FAILSAFE = True

def run_computer_use_agent(task: str, max_steps: int = 20) -> str:
    """
    タスクを受け取って Computer Use で自動実行するエージェント
    
    Args:
        task: 実行したいタスク(自然言語)
        max_steps: 最大ステップ数(無限ループ防止)
    
    Returns:
        実行結果のサマリー
    """
    print(f"タスク開始: {task}")
    print(f"最大ステップ: {max_steps}")
    
    history = []
    
    for step in range(max_steps):
        print(f"\n--- ステップ {step + 1} ---")
        
        # スクリーンショットを撮る
        screenshot_b64 = take_screenshot()
        
        # GPT-5.4 にアクションを問い合わせる
        action = ask_gpt54_computer_use(
            screenshot_b64=screenshot_b64,
            task=task,
            history=history if step > 0 else None
        )
        
        print(f"GPT-5.4 のアクション: {action}")
        
        # タスク完了チェック
        if action.get("type") == "done":
            return action.get("message", "タスク完了")
        
        # アクションを実行
        should_continue = execute_action(action)
        
        if not should_continue:
            return "タスク完了"
        
        # 履歴に追加(マルチターン対応)
        history.append({
            "role": "assistant",
            "content": [{"type": "computer_call", "action": action}]
        })
    
    return f"{max_steps} ステップで完了できませんでした。タスクを細分化してください。"


if __name__ == "__main__":
    # 使用例: ブラウザでGoogleを開いて「Python」と検索する
    result = run_computer_use_agent(
        task="Chromeブラウザを開いてgoogle.comにアクセスし、検索ボックスに「Python GPT-5.4 Computer Use」と入力して検索してください。",
        max_steps=15
    )
    print(f"\n結果: {result}")

実際に動かしてみると、最初のステップでブラウザのアイコンを探してクリックし、URLバーにアドレスを入力して、検索ボックスを見つけてテキストを打ち込む、という動作を AI が自分で考えながら進めるのがわかります。

コードを書いて自動化する、ではなく、画面を見て操作する、という人間と同じやり方で自動化する という感覚が伝わるでしょうか。


第4章 — 実践的なユースケースと注意点

ユースケース1: Webフォームの自動入力

import json

def fill_web_form(form_url: str, form_data: dict) -> str:
    """
    Webフォームを開いてデータを入力する
    
    Args:
        form_url: フォームのURL
        form_data: 入力データの辞書
    """
    task = f"""
    以下の手順でフォームを記入してください:
    1. URLバーに {form_url} を入力してEnterを押す
    2. フォームが読み込まれたら、以下のデータを各フィールドに入力する:
    {json.dumps(form_data, ensure_ascii=False, indent=2)}
    3. 全フィールドの入力が完了したら「完了」と報告する(送信ボタンはクリックしないこと)
    """
    return run_computer_use_agent(task, max_steps=30)

# 使用例
result = fill_web_form(
    form_url="https://example.com/contact",
    form_data={
        "name": "田中太郎",
        "email": "tanaka@example.com",
        "message": "お問い合わせのテスト"
    }
)

ここで重要なのは 「送信ボタンはクリックしないこと」 というような制約をタスクに明示すること。AIは実行できますが、実際に送信するかどうかの判断は人間が持つ、というフローが安全です。

ユースケース2: デスクトップアプリからのデータ抽出

def extract_data_from_app(app_name: str, extraction_target: str, output_csv: str) -> str:
    """
    デスクトップアプリのデータをCSVに書き出す
    """
    task = f"""
    {app_name} アプリを操作して、以下のデータを抽出してください:
    抽出対象: {extraction_target}
    
    手順:
    1. アプリが起動していない場合は起動する
    2. 指定されたデータが表示されている画面を開く
    3. データの内容を読み取り、テキストエディタを開いて
       CSV形式(ヘッダー行 + データ行)で書き出す
    4. ファイルを {output_csv} に保存する
    5. 完了したら「保存完了」と報告する
    """
    return run_computer_use_agent(task, max_steps=40)

コストの目安

Computer Use は画像を含む API 呼び出しになるため、テキストのみの呼び出しよりコストがかかります。ただ、思ったより安いです。

セッションの規模 スクリーンショット枚数 コスト目安
軽量(フォーム入力等) 10〜15枚 $0.10〜0.20
中規模(複数ページの操作) 20〜30枚 $0.25〜0.50
重量級(複雑な業務フロー) 50枚以上 $0.80〜

GPT-5.4 の標準レートは入力 $10/百万トークン、出力 $30/百万トークン です。1枚の 1920x1080 スクリーンショットのトークン数は解像度にもよりますが概ね 800〜1,500 トークン程度になります。

コスト最適化のコツとして、スクリーンショット全体を送るのではなく、操作に関係するエリアだけをクロップして送る という手法もあります。

def take_cropped_screenshot(region: tuple = None) -> str:
    """
    特定の領域だけをスクリーンショットする
    
    Args:
        region: (left, top, width, height) のタプル。Noneで全画面
    """
    if region:
        screenshot = pyautogui.screenshot(region=region)
    else:
        screenshot = pyautogui.screenshot()
    
    screenshot = screenshot.resize((1280, 720), Image.LANCZOS)  # さらに小さくする
    buffer = BytesIO()
    screenshot.save(buffer, format="PNG", optimize=True, quality=85)
    return base64.b64encode(buffer.getvalue()).decode("utf-8")

安全設計の基本

Computer Use エージェントを本番で動かす前に、次の点を必ず検討してください。

1. サンドボックス環境でテストする

最初から本番環境で動かさず、VMや Docker コンテナ内でテストします。意図しないクリックが重要なデータを消してしまうリスクを排除します。

# PyAutoGUI のフェイルセーフ設定(必須)
pyautogui.PAUSE = 0.5      # アクション間に 0.5 秒待機
pyautogui.FAILSAFE = True  # マウスを画面左上隅に移動で緊急停止

2. ドライランモードを用意する

DRY_RUN = True  # True の間は実際のアクションを実行しない

def execute_action(action: dict) -> bool:
    if DRY_RUN:
        print(f"[DRY RUN] アクション: {action}")
        return action.get("type") != "done"
    # ... 実際の実行処理

3. アクションのホワイトリスト制御

ALLOWED_ACTIONS = {"click", "type", "scroll", "move"}  # key は除外

def execute_action(action: dict) -> bool:
    action_type = action.get("type")
    if action_type not in ALLOWED_ACTIONS:
        print(f"アクション '{action_type}' はホワイトリスト外のためスキップします")
        return True
    # ... 実行

第5章 — Claude Computer Use との比較と使い分け

Computer Use 機能は、Anthropic の Claude にも存在します(Claude 3.5 Sonnet で 2024 年末から提供)。どちらを選ぶかは用途によります。

観点 GPT-5.4 Computer Use Claude 3.5 Computer Use
OSWorld スコア 75.0%(人間超え) 公表値なし(内部推定60%台)
API の一貫性 Responses API に統合 Messages API + beta ヘッダー
コンテキスト長 1M トークン(試験的) 200K トークン
利用料金 $10/$30 per M tokens $3/$15 per M tokens
ストリーミング 対応 対応

精度と長期セッションを重視するなら GPT-5.4コストを抑えたい・既存の Claude 統合がある場合は Claude というのが現状の使い分けかと思います。

どちらも「完全に信頼できる自律エージェント」というわけではなく、ミスは起きる前提で人間が承認ステップを挟む設計 が今の段階では現実的です。

def run_with_human_approval(task: str) -> str:
    """人間が承認するステップを挟んだエージェント"""
    screenshot_b64 = take_screenshot()
    action = ask_gpt54_computer_use(screenshot_b64, task)
    
    print(f"\n提案アクション: {action}")
    approval = input("実行しますか? (y/n): ")
    
    if approval.lower() == "y":
        execute_action(action)
        return "実行しました"
    else:
        return "キャンセルしました"

自動化が進む一方で、「どこに人間が介在するか」を意識的に設計することが、安全で実用的なエージェントを作るうえで今いちばん大事なことだと感じています。


まとめ

GPT-5.4 の Computer Use API を整理すると、こういう話です。

  • 仕組み: スクリーンショット → API → アクション JSON → PyAutoGUI でループ
  • 前提: Responses API 経由のみ。Chat Completions では使えない
  • 精度: OSWorld で人間専門家を超えた 75.0%。実用レベルに入ってきた
  • コスト: 1セッション $0.10〜0.50 程度。予算管理は解像度調整で対応可能
  • 安全設計: AI は命令を出すだけ。実行判断は人間が持つ設計を守る

Pythonで100行程度のコードを書けば、ブラウザやデスクトップアプリを「目で見て操作する」エージェントが動きます。かつては複雑なDOM操作やXPathを頑張って書いていた処理が、「何をしてほしいか」の自然言語指示で書けるようになってきた、というのは大きな変化です。

もちろん完璧ではないし、ミスもします。でも「完璧じゃないと使えない」と思うより、「どこに人間のチェックポイントを置くか」を考えながら使う方が、今の段階では現実的で生産性が上がると思っています。

参考リンク:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?