もうSEはいらない??生成AIでアプリを作るOpenHands(旧OpenDevin)

# 目次

1. [はじめに](#はじめに)
1. [TL;DR](#TL;DR)
1. [OpenHandsとは](#OpenHandsとは)
1. [触ってみる](#触ってみる)
1. [その他の機能](#その他の機能)
1. [OpenHandsのアーキテクチャ](#OpenHandsのアーキテクチャ)
1. [ロードマップ](#ロードマップ)
1. [まとめ](#まとめ)

# はじめに

皆さん **Devin** はご存じでしょうか。

https://app.devin.ai/

DevinはAIスタートアップのCognitionが2024年3月に発表しました。
Devinは**自律型AIソフトウェアエンジニア**と紹介されていて、Copilotによるコーディングのサポートなどとは異なり、コードを書き、実行し、テストすることができます。他にもいろいろなことができるみたいです。

そんなDevinが先日、2024年12月10日に一般公開されました。さっそく触ってみようと思ったのですが、エンジニアリングチーム向けに月額500ドルからのプランしかなかったので断念しました。。

https://www.cognition.ai/blog/devin-generally-available

ただ！
Devinを参考にした **OpenHands** というOSSを見つけました。元々OpenDevinという名前だったみたいです。
OSSなのでDevinほど充実した機能はないのかもしれないですが、コンセプトは同じですしUIもDevinにかなり似ているということで今回はOpenHandsを触ってみることにしました。

# TL;DR


**たった3行、OpenHandsに指示するだけで以下のアプリが完成しました。**

> Reactでかんばんボードアプリを構築してください。
TODOデータは'dummyjson.com/todos'から取得します。
Tanstack QueryとJotaiを使用します。

↓

![デモ動画.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/ba8ed0f4-7006-6f15-119e-94c491aa71c7.gif)

# OpenHandsとは

https://github.com/All-Hands-AI/OpenHands

Githubでは以下のように説明されています。

> OpenHands（旧OpenDevin）へようこそ！OpenHandsはAIを搭載したソフトウェア開発エージェントのプラットフォームです。
OpenHands のエージェントは人間の開発者ができることなら何でもできます: コードの修正、コマンドの実行、ウェブのブラウズ、API の呼び出し、そしてそう、StackOverflow からのコードスニペットのコピーさえも。

まさにDevinのOSSクローンのようです。

2024年12月17日時点でのStarの推移です。2024年3月13日に初回コミットがされてから約9ヶ月で38.7kまでStar数を伸ばしており、注目度の高さがうかがえます。
![star-history-20241217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/d8066bab-8315-e332-66c8-9aef1af30e63.png)

# 触ってみる

## 環境構築

コンテナをPullします。
```sh

$ docker pull docker.all-hands.dev/all-hands-ai/runtime:0.15-nikolaik
0.15-nikolaik: Pulling from all-hands-ai/runtime
82312fccb35f: Pull complete 
4ac722d9cf93: Pull complete 
261351ed796d: Pull complete 
a9d319298afc: Pull complete 
1a9c4439d5b5: Pull complete 
f675b592de6b: Pull complete 
6b4631a7a0ae: Pull complete 
0ea9bd0f6d2b: Pull complete 
4f4fb700ef54: Pull complete 
774ff1d4afc1: Pull complete 
c10c733cfd1c: Pull complete 
9b554b014bc1: Pull complete 
4e94ebe749fa: Pull complete 
08f729034c82: Pull complete 
0d2ee62b44be: Pull complete 
d977b57caeaf: Pull complete 
3b2d1c39c7a7: Pull complete 
0928cd372245: Pull complete 
4b949c4d0369: Pull complete 
9ac583f2da92: Pull complete 
9a695fc0fcc4: Pull complete 
81f453121873: Pull complete 
35b332df4b6f: Pull complete 
4751d6beecac: Pull complete 
Digest: sha256:ce57b36cf491d403c98c0602642465f6edfbc83922ab9c75b34484aa374195a0
Status: Downloaded newer image for docker.all-hands.dev/all-hands-ai/runtime:0.15-nikolaik
docker.all-hands.dev/all-hands-ai/runtime:0.15-nikolaik
```

コンテナを起動します。
```sh
docker run -it --rm --pull=always \
    -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.15-nikolaik \
    -e LOG_ALL_EVENTS=true \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -p 3000:3000 \
    --add-host host.docker.internal:host-gateway \
    --name openhands-app \
    docker.all-hands.dev/all-hands-ai/openhands:0.15
0.15: Pulling from all-hands-ai/openhands
24c63b8dcb66: Pull complete 
e7a4e3413405: Pull complete 
bde8cdf335c3: Pull complete 
ebf1025c057d: Pull complete 
878f5f58be89: Pull complete 
a61bfcb65899: Pull complete 
c2910453af43: Pull complete 
5672ea600d47: Pull complete 
853283e29f1f: Pull complete 
32a47e4538ca: Pull complete 
79fe26f19c46: Pull complete 
d3a900da481a: Pull complete 
eb6a91c8c36b: Pull complete 
2bd584afe430: Pull complete 
2f18c959e0e9: Pull complete 
fa1922e857ed: Pull complete 
08ed80a5d812: Pull complete 
e8f4ef90b847: Pull complete 
4f4fb700ef54: Pull complete 
b97f0db850cb: Pull complete 
afa551501423: Pull complete 
2bb36158ef45: Pull complete 
299c3fe5d0f9: Pull complete 
120e720153d7: Pull complete 
3be3b6f77c80: Pull complete 
0c3887533732: Pull complete 
813c24b74def: Pull complete 
9f66eb91bac3: Pull complete 
Digest: sha256:b84abd00ba65a453f2fff0889fb14dd6172b1ad0944026608cab8bc32ebe8930
Status: Downloaded newer image for docker.all-hands.dev/all-hands-ai/openhands:0.15
Starting OpenHands...
Running OpenHands as root
INFO:     Started server process [13]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:3000 (Press CTRL+C to quit)
```

localhost:3000で画面が起動します。

![スクリーンショット 2024-12-16 2.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/0be2476f-3d60-7195-651e-ebf9a541aab0.png)

AI Providerの設定をします。

![スクリーンショット 2024-12-16 8.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/b8a15735-9898-6c08-ee1a-adfce63704db.png)

Githubに以下のような記載があったので、今回は`Anthropic's Claude 3.5 Sonnet`を設定しました。

https://github.com/All-Hands-AI/OpenHands?tab=readme-ov-file#-quick-start

> Finally, you'll need a model provider and API key. Anthropic's Claude 3.5 Sonnet (anthropic/claude-3-5-sonnet-20241022) works best, but you have many options.


設定するとこんな画面になります。プロンプト入れて送信すると開発画面に遷移します。
![スクリーンショット 2024-12-16 5.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/811fb398-9735-3531-f709-de561a92d628.png)
![](./img/スクリーンショット%202024-12-16%202.32.15.png)

これで環境構築、設定は完了です。

## Reactのかんばんボードを作ってみる

Reactのかんばんボードアプリを作ってみたいと思います。
かんばんに表示するデータはDummyJSONというインターネット上に公開されたREST APIから取得することにします。
https://dummyjson.com/docs/todos#todos-all

以下のような質問をしました。

> Please build a kanban board app using React. 
Fetch the TODO data from 'dummyjson.com/todos'.
Use Tanstack Query and Jotai.

翻訳

> Reactでかんばんボードアプリを構築してください。
TODOデータは'dummyjson.com/todos'から取得します。
Tanstack QueryとJotaiを使用します。

最初のプロンプトを送信すると以下のような画面になります。
![スクリーンショット 2024-12-16 5.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/107bda4e-a978-4277-c39a-2d6cacc75a33.png)

以降、以下のように自動でアプリが作られていきました。(Google翻訳でページごと翻訳しています。)
![スクリーンショット 2024-12-16 7.49.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/120a6762-4616-cba8-643b-7b312f71b423.png)

コマンドを実行して失敗したらトラブルシュートしてコマンドを再実行したりしています。

<details><summary>これ以降のチャットのキャプチャ長いのでしまっておきます。</summary>

![スクリーンショット 2024-12-16 7.50.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/0dec0b22-bcdc-8806-02ad-f4a862cfde11.png)

![スクリーンショット 2024-12-16 7.50.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/67459263-3a5d-8fbc-9e5d-41559a9e0d4a.png)

</details>

最終的にこんなアプリが完成しました。

![デモ動画.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/ba8ed0f4-7006-6f15-119e-94c491aa71c7.gif)

Githubにプッシュします。環境変数にトークンを設定済みです。

<details><summary>ここもチャットのキャプチャ長いのでしまっておきます。</summary>

![スクリーンショット 2024-12-16 7.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/f1883aa8-f619-3a9d-85fa-9f6ae58ec8d9.png)

![スクリーンショット 2024-12-16 7.53.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636552/bec6f488-c9b4-a2fa-c408-7ed2feea5e54.png)

</details>

以下のリポジトリに無事プッシュできました。

https://github.com/k-kanno/kanban-board/tree/feature/create-kanban-board

# その他の機能

触ってみる、で触らなかった機能を紹介していきます。

## プロンプトのカスタマイズ
リポジトリ固有のコンテキストとガイドラインを定義して、より効果的に動作するようカスタマイズできます。
`.openhands_instructions`ファイルに以下のような定義をします。

```text:.openhands_instructions
# リポジトリ名
Repository: MyProject

# リポジトリの説明
Description: A web application for task management

# ディレクトリ構造
Directory Structure:
- src/: Main application code
- tests/: Test files
- docs/: Documentation

# セットアップ手順
Setup:
- Run `npm install` to install dependencies
- Use `npm run dev` for development
- Run `npm test` for testing

# コーディングルールなどのガイドライン
Guidelines:
- Follow ESLint configuration
- Write tests for all new features
- Use TypeScript for new code
```

## マイクロエージェント

マイクロエージェントは、特定のシナリオに特化した動作と知識を提供するコンポーネントです。

`openhands/agenthub/codeact_agent/micro/`配下に格納したMarkdownファイルがエージェントとして利用されます。
このファイルには以下を定義します。
- どんなユースケースに対処するか
- どんな独自の機能や知識が必要か
- アクティブにするトリガーとなる単語
- 制約やルール

以下はDocker関連のエージェント用のファイル(`docker.md`)です。
```markdown:openhands/agenthub/codeact_agent/micro/docker.md
---
name: docker
agent: CodeActAgent
triggers:
- docker
- container
---

You are responsible for Docker container management and Dockerfile creation.

Key responsibilities:
1. Create and modify Dockerfiles
2. Manage container lifecycle
3. Handle Docker Compose configurations

Guidelines:
- Always use official base images when possible
- Include necessary security considerations
- Follow Docker best practices for layer optimization

Examples:
1. Creating a Dockerfile:
   ```dockerfile
   FROM node:18-alpine
   WORKDIR /app
   COPY package*.json ./
   RUN npm install
   COPY . .
   CMD ["npm", "start"]
```

## CLIモード・Headlessモード

[触ってみる](#触ってみる)の画面による操作はGUIモードでした。
それ以外にも[CLIモード](https://docs.all-hands.dev/modules/usage/how-to/cli-mode)と[Headlessモード](https://docs.all-hands.dev/modules/usage/how-to/headless-mode)があります。
CLIモードは対話型のCLI、Headlessモードは非対話型のCLIのようです。
 
# OpenHandsのアーキテクチャ

以下にOpenHandsのアーキテクチャが記載されています。

https://docs.all-hands.dev/modules/usage/architecture/backend

# ロードマップ

ここでOpenHandsのロードマップを見られます。

https://github.com/orgs/All-Hands-AI/projects/1/views/1

できたばかりのOSSですがかなりきちんと運営されているようなので、今後も期待できそうです。

# まとめ

今回は自律型AIソフトウェアエンジニアDevinのOSSクローン、OpenHandsについて調べてみました。
今回作ったようなレベルのサンプルアプリであれば十分OpenHandsで作ることができると思いました。例えばプロトタイプをビジネスサイド寄りのエンジニアがさくっと作るなど利用できるシーンは現時点でもあるかもしれないです。あとはより大規模でプロダクションレベルのアプリ開発でどこまでできるのかも今後検証してみたいと思いました。開発も活発ですし、今後の動向も注視していきたいと思います。

最後に、これは良いことだと思いますがAIによってSEに求められるスキルや領域は変わっていく、というか狭くなっていくと思います。OpenHandsに触れたことでそれを実感することができました。
そうは言っても明日全ての仕事がなくなるわけではないですし、私たちエンジニアはこういった技術を常にキャッチアップし、働き方やスキルアップの方向性を修正し続けることが大切だなと思いました。