Google CloudのVertex AIでOpenHandsを試してみた

# はじめに
過去に[OpenHandsをAzure OpenAIで試した記事](https://qiita.com/kei1-dev/items/20e20eee220e544a8323)を書いたのですが、
AzureではClaudeが使えず、OpenAIのGPT-4oを使っていました。(o1を使うにも申請が必要で面倒)

Google CloudのVertex AIでは、Claudeを使うことができ、
公式ページにも簡単なガイドがあったので、
これを機に試してみることにしました。

# 前提
- ローカル端末: M1 Macbook + Docker
- Google Cloud アカウント
  - プロジェクト、Vertex AIのAPIを有効化

# 手順

## 1. サービスアカウントを作成
- Vertex AI APIの画面から認証情報タブ>認証情報を作成を押下>サービスアカウントを選択
![vertex-ai-api-credentials.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/84c430c9-2cdf-481e-854e-86279f711084.png)

- サービスアカウント名を入力し、次のページへ
- このサービス アカウントにプロジェクトへのアクセスを許可するページでベース>編集者を選択し、次のページへ
- 特に設定せずに、作成を押下し、サービスアカウントを作成

## 2. サービスアカウントのJSONキーを取得
- 作成したサービスアカウントを選択し、鍵タブからキーを追加>新しい鍵を作成を押下
- JSONを選択し、作成を押下
- 鍵をダウンロードし、保存

## 3. 作業ディレクトリの準備
- `$HOME/Documents/OpenHands-Workspace`ディレクトリを作成
- ダウンロードしたサービスアカウントのJSONキーをこのディレクトリに配置

## 4. OpenHands用のDocker環境を準備
まず、必要なDockerイメージをプルします：

```bash
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.23-nikolaik
```

## 5. 環境変数の準備
OpenHandsの起動前に、以下の環境変数を準備する必要があります：

1. **認証関連**
- `GOOGLE_APPLICATION_CREDENTIALS`: サービスアカウントのJSONキーファイルのパス
  - コンテナ内のパスを指定（例："/opt/workspace_base/your-key.json"）
  - JSONキーは作業ディレクトリ（OpenHands-Workspace）に配置しておく

2. **Vertex AI設定**
- `VERTEXAI_PROJECT`: Google CloudのプロジェクトID
  - Google Cloudコンソールのプロジェクト情報から確認可能
- `VERTEXAI_LOCATION`: Vertex AIのリージョン
  - 日本の場合は"asia-northeast1"を推奨
  - レイテンシを考慮して選択

3. **OpenHands設定**
- `WORKSPACE_MOUNT_PATH`: 作業ディレクトリのマウントパス
  - コンテナ内のパスを指定（例："/opt/workspace_base"）
- `SANDBOX_RUNTIME_CONTAINER_IMAGE`: 使用するランタイムイメージ
  - 最新のイメージを指定（例：docker.all-hands.dev/all-hands-ai/runtime:0.23-nikolaik）

## 6. ディレクトリとファイルの確認
起動前に以下の点を確認してください：

1. 作業ディレクトリの構造例
```
$HOME/Documents/OpenHands-Workspace/
└── your-service-account-key.json  # サービスアカウントのJSONキー
```

2. 必要なディレクトリの存在
- `~/.openhands-state`ディレクトリ（なければ作成）
- 作業ディレクトリ（$HOME/Documents/OpenHands-Workspace）

## 7. OpenHandsの起動
以下の環境変数とボリュームマウントを指定してOpenHandsを起動します：

```bash
docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.23-nikolaik \
-e LOG_ALL_EVENTS=true \
-e WORKSPACE_MOUNT_PATH=$HOME/Documents/OpenHands-Workspace \
-e GOOGLE_APPLICATION_CREDENTIALS="/opt/workspace_base/XXX.json" \
-e VERTEXAI_PROJECT="XXX" \
-e VERTEXAI_LOCATION="asia-northeast1" \
-v $HOME/Documents/OpenHands-Workspace:/opt/workspace_base \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands-state:/.openhands-state \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.23
```

コンテナが正常に起動すると、`http://localhost:3000`でOpenHandsのWebインターフェースにアクセスできます。

# Webインターフェースでモデルの設定
OpenHandsのWebインターフェースにアクセスし、AIプロバイダ設定で以下を設定します：
- LLMプロバイダ: Vertex AI
- LLMモデル: claude-3-5-sonnet-v2@20241022

![openhands-vertex-ai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/df2b794f-9c30-466a-929b-523e934fbdde.png)


# まとめ
Google CloudのVertex AIを使ってOpenHandsを設定する手順を紹介しました。
これでOpenHandsをClaude-3.5-sontnet-v2モデルを使って利用できるようになりました。

設定自体は非常にシンプルで、サービスアカウントの作成とJSONキーの配置、
そして必要な環境変数を設定するだけで利用できます。

# 参考
- [OpenHands on Google Cloud](https://docs.all-hands.dev/modules/usage/llms/google-llms)
- [AIエージェントの1つであるOpenHandsを試すための導入手順](https://qiita.com/kei1-dev/items/20e20eee220e544a8323)
- [OpenHandsを使用したAWS CDKプロトタイプ開発の記録](https://qiita.com/kei1-dev/items/c4c34586de549ea5cbfd)