【CUA】 - Computer-Using Agent - OpenAIのコンピュータ操作エージェントを触ってみた！人間不要時代の到来か！？


## はじめに

あ、ナルほど！ナル先生です。最近「AIがコンピュータを自分で操作する」というSFみたいな技術が出てきたので触ってみました。これが思った以上にすごかったので共有します。

OpenAIが開発した「コンピュータ操作エージェント」、名前からしてもうヤバさが伝わってきますよね。簡単に言うと、AIが画面を見て、「あ、ここクリックすれば良さそう」「このフォームに入力しよう」みたいな判断を自分でして、実際にマウスとキーボードを操作してくれるシステムです。

映画アイアンマンのジャービスみたいなSFの世界観が、もう目の前まで来ている感じです。


## コンピュータ操作エージェントの仕組み

事前に技術的な詳細を理解していると、APIを使ったときの挙動も理解しやすいので、まずは簡単に仕組みを解説します。

このシステムは大きく分けて3つのコンポーネントで構成されています：

1. **視覚システム**: 画面をキャプチャして解析するAI
2. **意思決定エンジン**: 何をすべきか判断するAI
3. **操作システム**: マウスとキーボードを実際に動かす部分

例えば「天気を調べてメールで送って」と指示すると：

```
視覚AI: 「今デスクトップ画面が表示されている。ブラウザのアイコンが左下にある」
意思決定AI: 「まずブラウザを開くべき」
操作システム: 「左下のChromeアイコンをクリック」

視覚AI: 「ブラウザが開いた。検索バーがある」
意思決定AI: 「検索バーに『東京 天気』と入力する」
操作システム: 「検索バーをクリックして『東京 天気』とタイプ」
```

みたいな感じでAI同士が会話しながら処理を進めていくイメージです。

## API実装：思ったより簡単だった

実際にAPIを触ってみましたが、意外と実装は簡単です。基本的なNode.jsでの実装例を紹介します：

```javascript
import axios from 'axios';

// 基本設定
const API_KEY = 'your_openai_api_key'; // ← ここは自分のキーに置き換えてね
const API_URL = 'https://api.openai.com/v1/computer-agent';

// エージェントにタスクを依頼する関数
async function runComputerAgent(taskDescription) {
  try {
    const response = await axios.post(
      API_URL,
      {
        task: taskDescription,
        allowed_apps: ["chrome", "notepad", "excel"], // 使用許可するアプリ
        screen_recording: true, // 操作の録画（デバッグ用）
        confirmation_level: "high" // 重要な操作前に確認を求めるレベル
      },
      {
        headers: {
          'Authorization': `Bearer ${API_KEY}`,
          'Content-Type': 'application/json'
        }
      }
    );
    
    return response.data;
  } catch (error) {
    console.error('エラーが発生しました:', error.response?.data || error);
    throw error;
  }
}

// 使用例
async function main() {
  const result = await runComputerAgent(
    "Googleで『最新のAIニュース』を検索して、最初の3つの記事タイトルをメモ帳にまとめてください"
  );
  
  console.log('タスクID:', result.task_id);
  console.log('実行状況URL:', result.status_url);
}

main();
```

これだけで、あなたのPCでAIがGoogle検索して、その結果をメモ帳にまとめてくれます。怖いくらい簡単ですよね。

## ユースケース：何ができるの？

実際に試してみて、「これは便利だ！」と思ったユースケースをいくつか紹介します：

### 1. データ収集の自動化

```javascript
// 株価データを毎日収集する例
const collectStockData = async (ticker) => {
  return await runComputerAgent(`
    1. Yahoo!ファイナンスで${ticker}の株価チャートを開く
    2. 過去1ヶ月のデータをCSVでダウンロード
    3. ダウンロードしたCSVを開き、終値だけを抽出
    4. 抽出したデータをstock_data.csvに追記（日付、ティッカー、終値の形式で）
  `);
};

// 複数銘柄を処理
const tickers = ['7203.T', '9984.T', '6758.T'];
for (const ticker of tickers) {
  await collectStockData(ticker);
}
```

これまでだとSeleniumとかPuppeteerとか使って頑張ってスクレイピングコード書いてたけど、それが自然言語の指示だけでできちゃうのがやばすぎる。しかも画面UIが変わっても勝手に対応してくれる！

### 2. 退屈な作業の自動化

毎月やってる経費精算とか、すごいで退屈なんですよね...。そういうのも任せられます：

```javascript
await runComputerAgent(`
  1. 社内ポータルにログインして経費精算ページを開く
  2. デスクトップの「経費2024-03.xlsx」を開く
  3. エクセルのデータを経費精算フォームに転記する
  4. 添付ファイルとして「receipts.zip」をアップロード
  5. 内容を確認して申請ボタンを押す
`);
```

### 3. テストの自動化

UIテストって、本当に面倒くさいですよね。特にフロントエンドが頻繁に変わるアプリだと、テストコードの保守が大変...。

```javascript
// テスト関数の例
const testUserRegistration = async () => {
  return await runComputerAgent(`
    1. ブラウザでhttp://myapp.localを開く
    2. "新規登録"ボタンをクリック
    3. フォームに以下の情報を入力:
       - ユーザー名: testuser123
       - メール: test@example.com
       - パスワード: TestPass123!
       - パスワード確認: TestPass123!
    4. "登録"ボタンをクリック
    5. 登録成功メッセージが表示されたか確認
    6. ログインページに移動したか確認
    7. テスト結果をJSONファイルに保存
  `);
};
```

これまでのUIテストツールとの大きな違いは、「画面のどこにボタンがあるか」とか「どんなCSSセレクタを使うか」みたいな低レベルの実装を気にしなくていいこと。人間が見てるのと同じように「あ、登録ボタンはここだな」って認識してくれるんです。

## 気づいた問題点と対策

実際に使ってみて気づいた問題点もいくつかあります：

### 1. 認証とセキュリティ

当然ながら、AIにパスワードとか見られちゃいますよね。これは結構怖い。解決策としては：

```javascript
// センシティブな情報を扱う場合の例
await runComputerAgent(`
  1. ブラウザでログインページを開く
  2. ユーザー名フィールドに「admin」と入力
  3. パスワードを入力する準備ができたら通知してください（人間が入力します）
`);

// ↑ここでAIが停止して人間にパスワード入力を促す
// 人間がパスワードを入力した後、続行

await continueTask(taskId, "パスワードの入力が完了しました。続けてください");
```

こんな感じで、センシティブな部分だけ人間が介入するハイブリッド方式がおすすめです。

### 2. エラー処理

予期しないポップアップとかエラーダイアログが出ると混乱することも。以下のように対策できます：

```javascript
await runComputerAgent(`
  1. アプリケーションを開く
  2. データをインポートする
  3. もし"ファイルが見つかりません"というエラーが出たら:
     a. "OK"をクリック
     b. "sample.csv"を選択してインポート
  4. もし"更新してもよろしいですか?"と聞かれたら:
     a. "はい"をクリック
`);
```

あらかじめ想定されるエラーパターンと対処法を示しておくと安心です。

## API高度活用テクニック

もうちょっと踏み込んだ使い方も紹介します。

### 1. カスタム前処理と後処理

```javascript
// マルチステップ処理の例
async function processWebData() {
  // 1. データ取得フェーズ
  const extractionResult = await runComputerAgent(
    "Webサイトからデータテーブルを抽出してCSVに保存"
  );
  
  // 2. 人間による確認
  console.log("データを確認してください:", extractionResult.output_file);
  const userConfirmation = await promptUser("データは正しいですか？(yes/no)");
  
  if (userConfirmation === 'yes') {
    // 3. 続行: データ処理
    await runComputerAgent(
      `抽出されたCSVファイル${extractionResult.output_file}を開いて分析`
    );
  } else {
    console.log("処理を中止しました");
  }
}
```

### 2. 並列処理

```javascript
// 複数タスクを並列実行
async function parallelTasks() {
  const tasks = [
    runComputerAgent("タスク1の説明"),
    runComputerAgent("タスク2の説明"),
    runComputerAgent("タスク3の説明")
  ];
  
  const results = await Promise.all(tasks);
  console.log("全タスク完了:", results);
}
```

ただし、同じ画面を複数のエージェントが操作すると混乱するので、仮想デスクトップや別ウィンドウでの実行がおすすめです。

## 感想：人間不要時代は来るのか？

正直、最初にこのAPIを触ったときは「これはヤバい」と思いました。現実世界のコンピュータを直接操作できるAIって、小説とかSF映画の世界の話だと思ってたんですよね。それが今、僕のパソコンの中で動いている。

特に驚いたのは、詳細な手順を指示しなくても「なんとなくやりたいこと」を伝えるだけでちゃんと理解して実行してくれること。例えば「Amazon.co.jpで最新のイヤホンを検索して、レビューが良くて5000円以下のものを3つピックアップして比較表を作って」みたいな指示だけでちゃんとやってくれる。

これって、プログラミングの本質的な部分が変わるってことですよね。「コンピュータに何をさせたいか」を直接言語化するだけで良くて、「どうやってやらせるか」の部分は必要なくなる。

ただ、完全に人間が不要になるかというと、そこはまだ安心していいと思います。結局、「何をさせたいか」を考えるのは人間の仕事だし、最終的な判断も人間がする必要があります。AIは完璧じゃないので、特にクリティカルな場面では人間の監視が必要です。

とはいえ、日常のルーチンワークやデータ処理、テストなどは、かなりの部分が自動化できると思います。これからのエンジニアは、こういったAIツールをどう活用するかが腕の見せどころになるんじゃないでしょうか。

## まとめ：未来はもう始まっている

コンピュータ操作エージェントは、AIの進化の中でも特に影響が大きい技術の一つだと思います。単なるテキスト生成や画像生成とは違って、実際の物理的な（まあデジタルだけど）世界に干渉できる能力を持っているからです。

APIの使い方自体はシンプルなので、興味がある方はぜひ試してみてください。でも、最初は閉じた環境でテストすることをお勧めします。重要なファイルが入ったPCでいきなり実行すると、予期せぬことが起きるかも...

次回は、このエージェントを使って「1日の始業から終業までの全作業を自動化してみた」というのをやってみたいと思います。朝起きたらAIが勝手に仕事してくれてる世界...ちょっと見てみたくないですか？

---

### おまけ：サンプルコード一式

実際に試したコード一式をGitHubにアップしました。
興味がある方はこちらから：[github.com/GOROman/computer-agent-samples](https://github.com/GOROman/computer-agent-samples)

---

ちなみにこの記事を書いてる間も、別窓でAIエージェントに「Xで最近のAI関連ニュースをチェックして要約してくれ」って頼んでました。