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 は、次のループを繰り返す仕組みです。
- あなたのアプリがスクリーンショットを撮る
- そのスクリーンショットを GPT-5.4 に送る
- GPT-5.4 が「次に何をすべきか」を 構造化されたアクションとして返す
- あなたのアプリがそのアクションを実行する(クリック・タイプ・スクロール等)
- また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.effort は low / 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を頑張って書いていた処理が、「何をしてほしいか」の自然言語指示で書けるようになってきた、というのは大きな変化です。
もちろん完璧ではないし、ミスもします。でも「完璧じゃないと使えない」と思うより、「どこに人間のチェックポイントを置くか」を考えながら使う方が、今の段階では現実的で生産性が上がると思っています。
参考リンク: