技術は私たちの力。技術は私たちの楽しみ。 Creative Developer BLOG 技術部ブログ
Technology is our strength. Technology is what we enjoy.

無料でAIとペアプロ!?OpenHands × OpenRouterでAndroidアプリをバイブコーディングしてみた話

2025-08-18 勉強会
システム部開発ユニットの大原です!

最近、生成AIの話題は毎日と言っていいほど出てきますよね。
「でも、実際に開発フローにAIを組み込んでみたらどうなるの?」
と思ったことはありませんか?

今回は、ほぼ無料環境のOpenHands(旧OpenDevin)とOpenRouterの組み合わせで、GitHub Actionsと連携して、Issue対応からPR作成、ビルド、テスト、修正までを自動化してみました!
やってみた感想も含めてレポートします。

最後までお読みいただけますと幸いです!

1. OpenHandsって何?

OpenHands(旧 OpenDevin)は、AIが直接リポジトリのコードを読み込み、要件に応じて実装・修正を行ってくれるオープンソースのコーディングエージェントです。
ローカルでもクラウドでも動作し、GitHubリポジトリと連携すれば、Issueを起点にPull Request作成まで自動化できます。

大きく分けて3つの使い方があります。

1-1. 通常のローカル実行

OpenHandsをローカルなDocker環境で立ち上げる方法です。
※2025年8月14日更新の最新バージョン
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.53-nikolaik

docker run -it --rm --pull=always \
-e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.53-nikolaik \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands-app \
docker.all-hands.dev/all-hands-ai/openhands:0.53
最新の状態は公式ドキュメントをご確認ください。

OpenHands公式ドキュメント

https://docs.all-hands.dev/usage/cloud/openhands-cloud

http://localhost:3000 で確認できます。

1-2. OpenHands CLI

OpenHandsはGUI上だけでなく、CLI(コマンドライン)から直接タスクを依頼することもできます。
CLIを使うと、ローカルのディレクトリを直接参照してコード編集を行わせることも可能です。

OpenHands CLI公式ドキュメント

https://docs.all-hands.dev/usage/how-to/cli-mode

最初に初期設定を求められます。

コマンド操作などができるようになります。

1-3. GitHub Actionsでの openhands-resolver

OpenHandsはGitHub Actions用ワークフロー openhands-resolver を公式で提供しています。
これを使えば、特定のアクションをトリガーに自動でコード修正〜PR作成ができます。

たとえば、openhands-resolverではIssueやPRに fix-me ラベルを付けると、自動で修正作業が走ります。
設定例は公式ドキュメントとGitHubリポジトリに掲載されています。

OpenHands GitHub Action公式ドキュメント

https://docs.all-hands.dev/usage/how-to/github-action#custom-configurations

2. OpenRouterって何?

OpenRouterは1つのAPIキーで複数のLLMモデルを呼び出せる便利なサービス。
OpenAI、Anthropic、Google Gemini、Meta Llamaなど、いろんなモデルを切り替えながら使えます。

無料で使えるモデルも存在しています

https://openrouter.ai/models?q=free
「まずは無料で試したい」という場合にありがたい存在です。
この後の実践でも無料の
「deepseek/deepseek-chat-v3-0324:free」
を利用してみます。

※ OpenRouterには無料枠とクレジットの2段階がある

無料モデルには、1日あたり50リクエストという上限が設定されています。 この上限を解除し、より多くのリクエスト(1000リクエスト)を送信したい場合は、最低10ドルのクレジットを一度だけ購入する必要があります。

今回のバイブコーディング実践で料金が発生したのはここだけでした。

3. 実践!Android日記アプリをAIとバイブコーディング

今回は、自作のAndroid日記アプリを題材にしてみました。

3-0. 事前準備

.github/workflows/
にGitAction用のYAMLを設置(複数可)

今回は以下を設置
・OpenHands用のopenhands-resolver
・自動テスト用のfirebase-testlab(後述)

3-1. IssueからPR(プルリクエスト)作成まで

以下内容のGitHub Issueを作成します。

タイトル:○○機能の実装
説明:要件を記載
ラベル:fix-me

"fix-me"ラベルがついたGitHub Issueを検知するとGitActionが実行されOpenHandsが働いてくれます。

しばらく待つと開発ブランチ(openhands-fix-issue-{issue番号})にコミットしてPRを作成してくれます

3-2. 自動ビルド&テスト

main(default)ブランチ向けのPRが作成されるタイミングでビルドチェックを行い、ビルドエラーの場合はエラーログをPRにコメントして、ビルド成功した場合はFirebase Test Labでテストコード実行してキャプチャを残すGitActionを用意しました。

↓.github/workflows/firebase-testlab.yml
name: Run Instrumentation Tests on Firebase Test Lab

on:
pull_request:
branches: [ main ]
push:
branches: [ main ]

jobs:
firebase-test:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Set up JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'

- name: Set up Android SDK
uses: android-actions/setup-android@v2

- name: Write service account key from Base64
run: |
echo "${{ secrets.GCLOUD_SERVICE_KEY_B64 }}" | base64 -d > gcloud_key.json

- name: Authenticate to GCP
run: |
gcloud auth activate-service-account --key-file=gcloud_key.json
gcloud config set project your-gcp-project-id
env:
GOOGLE_APPLICATION_CREDENTIALS: gcloud_key.json

- name: Build debug and test APKs
id: build_apk
run: |
./gradlew assembleDebug assembleAndroidTest > build.log 2>&1 || echo "BUILD_FAILED=true" >> $GITHUB_ENV

- name: Comment build error on PR
if: env.BUILD_FAILED == 'true'
run: |
echo " :x: Android Build Failed" > comment.md
echo '```' >> comment.md
tail -n 300 build.log >> comment.md
echo '```' >> comment.md
gh pr comment "$PR_NUMBER" --body-file comment.md
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}

- name: Run tests on Firebase Test Lab
run: |
gcloud firebase test android run \
--type instrumentation \
--app app/build/outputs/apk/debug/app-debug.apk \
--test app/build/outputs/apk/androidTest/debug/app-debug-androidTest.apk \
--device model=redfin,version=30,locale=en,orientation=portrait \
--results-bucket=your-test-lab-results

3-3. 自動修正

PRのラベルに"fix-me"をつけるとPRコメントを読んで修正してくれました。
今回はImageButtonのimportが抜けていただけのようでした。

ビルドが成功したので、Firebase Test Lab がテストを実行して、UIテストのキャプチャーをバケットに残してくれています

テスト結果のキャプチャがバケットに保存されていました

今回は試しに、ログイン画面に特定のログイン情報が入力されるかのテストコードだけを書いた状態のため問題なくキャプチャが撮れていそうでした。

3-4. 最終確認

エミュレータで実行して動作確認。
OKならMergeしてしまいます!

例ではお気に入り機能をつけてうまく実装されていそうでした。

4. やってみた感想

今回は無料モデルでバイブコーディングを試してみましたが、プロンプト次第では実践前に思っていたより意図を組んで実装してくれた印象でした。
読み込むコードの量が小規模なのと、MVVMアーキテクチャを意識して作ったアプリだったこともプラスに働いてくれたような気もしました。

マークダウン形式での設計書なども読み込む対象に組み込むことができればより期待した結果が返ってくるのかなとも思いました。

設計書やテストをOpenHandsに都度作成してもらうのが理想ですので、そのフローをGitActionで組み込んでもいいかと思います。

5. おまけ:AIで情報キャッチアップツールも作ってみた

AIの進化が速すぎて追いつけないので、RSS経由で技術記事を集めて要約・通知する仕組みを作りました。

実装内容
・Qiita, Zenn, Android Developers, Apple DeveloperのRSS取得(モバイルエンジニア用)
・無料で使えるLLM APIキーを利用して記事の要約&スプレッドシートに書き出しと読み込みで記事関心度の分析(個別フィルタリングのカスタマイズ用)
・GASでGoogle Chatに定期的に通知

無料APIキーを活用して、自分専用ニュースアシスタントが完成しました。

まとめ

AIを「開発フローの中」に入れるだけで、
・Issueからコード作成
・自動ビルド&テスト
・エラー修正
のサイクルがかなり短縮できます。

しかも今回の構成、ほぼ無料。
「AIにコーディングを手伝ってもらう」のは、もう実験段階を超えて実用レベルだと感じました。

これからもAIと協力していく仕組みづくりを進めていきたいと思います!

最後まで読んでいただきありがとうございました!
記事一覧へ

New!

Member

システム部開発ユニット
クリエイティブ戦略部デザインユニット
クリエイティブ戦略部プランニングユニット
管理部