OpenHandsをセルフホストする:Dockerで独自のAIコーディングエージェントを動かす

AI tutorial - IT technology blog
AI tutorial - IT technology blog

チャットボットを超えて:AIに実際にコードを書かせる

AIに助けを求めたものの、生成されたコードをわざわざコピペし、インデントを修正し、AIが紛れ込ませたバグを追いかける……そんな経験は誰にでもあるはずです。OpenHands(旧OpenDevin)はこのループを断ち切ります。これは単なるチャットウィンドウではありません。ターミナルを使い、ファイルを管理し、コマンドを実行する自律型エージェントです。忙しくて手が回らないタスクを、管理された環境内で代わりにこなしてくれるジュニア開発者のような存在と考えてください。

私は複雑なリファクタリングにこのセットアップを使用していますが、その安定性には目を見張るものがあります。実行環境をDockerコンテナに移すことで、ホストマシンをクリーンに保ちながら、エージェントが依存関係をインストールしたりテストを実行したりできる遊び場を提供できます。ブラウザとIDEの間を往復することに疲れたなら、OpenHandsをセルフホストするのが集中力を取り戻す最善の方法です。

なぜ Docker が不可欠なのか

AIエージェントにシェルコマンドの実行権限を与えるのは強力ですが、リスクも伴います。ハルシネーション(幻覚)によって、単なるクリーンアップのつもりがメインOS上でrm -rf /を実行されるような大惨事は避けたいものです。Dockerは、ファイルを安全に保つために必要な隔離レイヤーを提供します。

Using Docker solves three specific problems:

  • セキュリティ: エージェントは制限されたサンドボックス内に存在し、明示的に許可しない限りホストシステムに直接アクセスできません。
  • 一貫性: 常に同一の環境が提供されます。「自分の環境では動いた」という問題はもう起こりません。
  • 環境を汚さない: ローカル環境に特定のPython 3.11やNode.jsのバージョンを管理する必要がなくなります。

環境構築の準備

開始する前にDockerが起動していることを確認してください。また、APIキーも必要です。OpenAIのGPT-4oも手堅い選択肢ですが、コーディングにおける推論能力の高さから、現在はClaude 3.5 SonnetがOpenHandsのゴールドスタンダードとされています。プライバシーを重視する場合は、ローカルのOllamaインスタンスを利用することも可能です。

1. ワークスペースの準備

OpenHandsが作業するための特定の場所が必要です。エージェントがルートフォルダで迷子にならないよう、専用のディレクトリを作成しましょう。

mkdir -p ~/openhands-projects
cd ~/openhands-projects

2. OpenHandsイメージのプル

イメージのサイズは約3GBと大きめです。これは、完全なLinux実行環境が同梱されているためです。次のコマンドで最新の安定版を取得します。

docker pull ghcr.io/all-hands-ai/openhands:0.9

3. コンテナの起動

以下のコマンドでエンジンを起動します。Dockerソケットをマッピングすることで、OpenHandsがタスク実行用の「兄弟」コンテナを自ら立ち上げられるようになります。

docker run -it \
    --pull=always \
    -e SANDBOX_USER_ID=$UID \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v ~/.openhands-state:/.openhands-state \
    -v $(pwd):/opt/workspace_base \
    -p 3000:3000 \
    --add-host host.docker.internal:host-gateway \
    --name openhands-app \
    ghcr.io/all-hands-ai/openhands:0.9

最高のパフォーマンスのための設定

主要な作業はWeb UI上で行われますが、最初の環境変数が体験の安定性を左右します。起動コマンドの重要な部分を詳しく見ていきましょう。

スマートなワークスペース・マッピング

-v $(pwd):/opt/workspace_baseフラグは架け橋となります。現在のフォルダをエージェントの視界にマウントします。AIが/opt/workspace_base内でファイルを書き込むと、即座に手元のPCに反映されます。これはリアルタイムの共同作業です。

Dockerソケットの解説

なぜ/var/run/docker.sockをマウントするのでしょうか?それはOpenHandsをオーケストレーターとして機能させるためです。エージェントがコードを実行する必要があるとき、メインのアプリコンテナ内では行いません。そのタスク専用の、新しく隔離されたコンテナを作成します。もしコードがクラッシュしても、その一時的なコンテナが消えるだけです。

LLMの微調整

http://localhost:3000にアクセスして設定を完了します。最良の結果を得るには、以下の設定を使用してください:

  • 言語モデルプロバイダー: Anthropic
  • モデル: claude-3-5-sonnet-20240620
  • APIキー: [あなたのキー]
  • ベースURL: 公式APIを使用する場合は空欄のまま

検証とトラブルシューティング

保存ボタンを押すと、チャットインターフェースが表示されます。具体的なタスクで試してみましょう。例えば、次のように指示してみてください:「ViteプロジェクトをReactとTypeScriptで初期化し、基本的なログインコンポーネントを作成してください。」

ログの監視

UIの動作が重く感じる場合は、ターミナルを確認するのが一番です。私はよく、コンテナの状態を監視するために別のタブを開いています。これにより、APIのレート制限や権限の問題を早期に発見できます。

docker logs -f openhands-app

「Permission Denied」エラーの修正

Linuxユーザーは、エージェントがDocker内部で特定のユーザーとして動作するため、ファイルの所有権の問題に直面することがよくあります。-e SANDBOX_USER_ID=$UIDでほとんどの場合は解決しますが、たまにプロジェクトフォルダの所有権を再取得する必要があるかもしれません:

sudo chown -R $USER:$USER ~/openhands-projects

リソース管理

OpenHandsはリソースを多く消費します。ファンの回転が速すぎる場合は、リソースを制限しましょう。実行コマンドに--memory="4g" --cpus="2.0"を追加することで、コンテナを4GBのRAMと2つのCPUコアに制限できます。私は通常、エージェントが迅速に仕事を終えられるよう、大規模なリファクタリング中はこれらの制限を外しています。

これで、基本的なAI補完の域を超えました。あなたは今、退屈なボイラープレートやユニットテストを担当し、自身はハイレベルなアーキテクチャに集中させてくれる実用的なチームメイトを手に入れました。これは、あらゆる開発者のワークフローにとって大きなアップグレードとなるはずです。

Share: