AIエージェントの1つであるOpenHandsを試すための導入手順

# はじめに

[OpenHands](https://github.com/All-Hands-AI/OpenHands)は、AIを活用したソフトウェア開発エージェントであり、人間の開発者が行うようなコードの修正、コマンドの実行、ウェブの閲覧、APIの呼び出しなど、さまざまなタスクを自律的に実行することができます。このツールは、開発プロセスを効率化し、反復的な作業を自動化することで、開発者がより創造的なタスクに集中できる環境を提供します。本記事では、OpenHandsの導入手順とその活用方法について詳しく解説します。

# 導入手順

OpenHandsを導入するには、以下の手順を実行します。

## 必要な環境の準備

1. Dockerを使用して以下のコマンドでOpenHandsを起動します

    ```bash
    export WORKSPACE_BASE=XXX
    
    docker pull docker.all-hands.dev/all-hands-ai/runtime:0.19-nikolaik
    
    docker run -it --rm --pull=always \
        -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.19-nikolaik \ # コンテナのランタイムイメージを指定
        -e LOG_ALL_EVENTS=true \ # すべてのイベントをログに記録する設定
        -e WORKSPACE_MOUNT_PATH=$WORKSPACE_BASE \ # コンテナ内のワークスペースのマウントパスを環境変数で設定
        -v $WORKSPACE_BASE:/opt/workspace_base \ # ホストのワークスペースディレクトリをコンテナの/opt/workspace_baseにマウント
        -v /var/run/docker.sock:/var/run/docker.sock \ # ホストのDockerソケットをコンテナにマウントし、コンテナ内からホストのDockerデーモンを操作可能にする
        -v ~/.openhands-state:/.openhands-state \ # ホストのOpenHands状態ディレクトリをコンテナの/.openhands-stateにマウント
        -p 8888:3000\ # ホストの8888ポートをコンテナの3000ポートにマッピング
        --add-host host.docker.internal:host-gateway \
        --name openhands-app \
        docker.all-hands.dev/all-hands-ai/openhands:0.19
    ```  
 
    - OpenHandsのQuick Startではローカルフォルダのマウント設定は入っていませんが、入れておくとローカルフォルダのファイルをOpenHandsで直接編集できるようになり、OpenHandsと共同で作業する際に便利です

2. OpenHandsの起動が完了したら、ブラウザで`http://localhost:8888`にアクセスします
   - QuickStartでは3000ポートで起動しますが、フロントエンド開発でよく使われるため、8888ポートで起動しています
![openhands_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/dc5baa4a-0523-2190-c411-2f298197a975.png)


## モデル設定手順

OpenHandsを使用する際は使用したいモデルを指定できます。今回はAzure OpenAI Serviceを利用するため、以下の手順で設定を行います。

1. AzureポータルでOpenAIリソースを作成します。
2. 作成したリソースのエンドポイントURLとAPIキー、モデル名を取得します。
3. `http://localhost:8888`で立ち上げたOpenHandsの画面左端歯車アイコンからAI Provider Configurationをクリック、Advanced Optionsをトグルして、APIキー、エンドポイントURL、モデル名を入力します。
   1. Custom Model: `azure/<モデル名>`
   2. Base URL: `<エンドポイントURL>`
   3. API Key: `<APIキー>`
   
   ※ Agent, Security Analyzer, Enable Confirmation ModeはデフォルトのままでOKです。
   ![openhands_azure_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/f67fb197-f6f5-d1f2-6628-df81758f9d48.png)

4. 設定が完了したら、Saveをクリックします。

## Github連携

OpenHandsはGithubと連携できます。

1. `http://localhost:8888`で立ち上げたOpenHandsの画面左端人型アイコンからAccount Settingsをクリックします。
2. Github Token(Optional)にGithubのAPIトークンを入力します。
   ![openhands_github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/3c42c6c4-66d4-abda-2859-2d6f546c9a67.png)

   - トークンを作成していない場合、Get your token hereのhereからGithubのトークン作成ページに遷移するため、そちらからトークンを作成してください
3. トークンを作成したら、Connectをクリックします
4. Topページ左下のOpenRepoからGithubのリポジトリを選択します
   ![openhands_repository_choice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479886/d146a138-40cd-5738-0fe2-277262f01223.png)

5. WorkspaceにリポジトリがCloneされた状態でOpenHandsが起動します

## ディレクトリ構成
起動時のWORKSPACE_BASE配下にリポジトリがCloneされるため、以下の構造になります。
そのため、ユーザがOpenHandsと共同で作業する際は、OpenHandsのワークスペースをVSCodeなどで開き、OpenHandsのワークスペースを開くことで、ローカルファイルを編集できるようになります。

```
WORKSPACE_BASE
├── GithubリポジトリA
├── GithubリポジトリB
...
```

# おわりに

昨年末にDevin AIが発表されてからAIエージェントが気になっていましたが、既存のLLM基盤を用いたAIエージェントの1つであるOpenHandsを試してみました。
その際の導入手順をまとめただけですが、AIエージェントを試す際に参考にしていただければと思います。

# 参考

- [OpenHands](https://github.com/All-Hands-AI/OpenHands)
- [OpenHands Azure](https://docs.all-hands.dev/modules/usage/llms/azure-llms)