OpenHandsをローカルLLMで動かしてみます。
OpenHandsの準備
https://github.com/All-Hands-AI/OpenHands/のQuick Startに従って、dockerを動かすだけです。 Rootless dockerでも動作します。
/var/run/docker.sockを使ってOpenHandsがdockerを制御するようでしたので、今回は、KVM上でUbuntu24.04を動作させ、その中でAllHandsを動作させました。
ollamaの準備
ローカルLLMについてはollamaで動作させます。
ollamaもdockerイメージがhttps://hub.docker.com/r/ollama/ollamaで配布されているのでそれをそのまま利用します。 こちらもrootless dockerでも動作します。
$ docker run -d --gpus=all -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollamaを実行するとollamaが立ち上がります。
$ docker exec -it ollama bashでdocker内に入って、ollamaを実行すると
root@xxxxxxxx:/# ollama Usage: ollama [flags] ollama [command] Available Commands: serve Start ollama create Create a model from a Modelfile show Show information for a model run Run a model stop Stop a running model pull Pull a model from a registry push Push a model to a registry list List models ps List running models cp Copy a model rm Remove a model help Help about any command Flags: -h, --help help for ollama -v, --version Show version information Use "ollama [command] --help" for more information about a command.となり、ollamaが実行できることが確認できます。
ollamaのモデルの準備
試している環境ではGPUメモリが8GBなので、小さめのLLMを探してきます。
以下のものを試してみましたが、hhao/qwen2.5-coder-tools:7bがかろうじて動く程度で、ほかはOpenHandsで使うには適切ではないLLMでした。
hhao/qwen2.5-coder-tools:7b 1fbf62f22cd4 4.7 GB codegemma:7b 0c96700aaada 5.0 GB llama3.2:3b a80c4f17acd5 2.0 GB codellama:7b 8fdf8f752f6e 3.8 GB qwen2.5-coder:3b e7149271c296 1.9 GB opencoder:1.5b 8573dfc23c16 1.4 GB opencoder:8b cd882db52297 4.7 GBもっと良いLLMがあるかもしれませんが、ここではhhao/qwen2.5-coder-tools:7bを使って進めます。runすると
/# ollama run hhao/qwen2.5-coder-tools:7b >>> Send a message (/? for help)と表示され、OpenHandsからアクセスできる状態になりました。試しにメッセージを入れてみると、
>>> Pythonでhelloと出力するスクリプトを作成してください ```python print("hello") ```とか
>>> rustでhelloと出力するコードを書いて、ビルドして実行する方法を書いてください ```json { "name": "create_file", "arguments": { "filename": "main.rs", "content": "fn main() {\n println!(\"Hello\");\n}" } } ```のように出力されました。日本語でも動きそうです。OpenHandsから呼び出すときにollama runが実行されている必要はありません。
OpenHandsの設定
KVM内からollamaにアクセスできることを確認します。
curl http://host.ip.address:11434/api/generate -d '{ "model": "hhao/qwen2.5-coder-tools:7b", "prompt":"Write a bash script that prints hello" }'json形式の応答が返ってくれば、動作しています。
docker run -it --rm -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.29-nikolaik \ -e LOG_ALL_EVENTS=true \ -e LOG_JSON=false \ -e LOG_LEVEL=DEBUG \ -e DEBUG=true \ -e OLLAMA_API_BASE=http://host.ip.address:11434 \ -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.29host.ip.addressは適切な値に書き換えてください。
KVM内のブラウザでlocalhost:3000にアクセスします。 左下の⚙アイコンをクリックして、
Custom model: ollama/hhao/qwen2.5-coder-tools:7b Base URL: http://host.ip.address:11434 API Key: なんでもOK Agent: CodeActAgentと設定します。
これで動くようになります。指示として例えば
Could you write a bash script that just prints "こんにちは" ?を入力すると動き始め、下図のようになりました。 ただ、ファイルはつくれたもののその後はうまく動作しなくなってしまいました。
OpenHandsを活用するには、もっと賢いLLMが必要なようです。