GitHub IssueからPRを作成するCLIで動かすAIエージェント
はじめに
LLMを利用したIssue AgentというCLIツールを開発しました。
このツールは、GitHubのIssueを受け取り自律的に対応し、その結果をPull Requestとして出します。CLIツールとして利用できるほか、GitHub Actions向けのActionも提供しています。
この記事では、Issue Agentの使い方を簡単に紹介します。
インストール方法
事前に必要なこと
Dockerのインストール
ツールの内部でDockerを利用しているため、Dockerのインストールが必要です。
たぶんこのあたり...
利用するLLMのAPIキーまたはAWS Bedrockが利用できる環境
Anthropic Claude 3.5またはAWS BedrockでClaude 3.5の利用がオススメです。
OpenAI系のモデルはGPT-4oに対応していますが、期待ハズレな成果物になってしまうことが多いです...
インストール
Homebrew
brew install clover0/issue-agent/issue-agent
GitHub Actions
GitHub Actions上で利用する場合は、setup-issue-agent
でsetupして利用します。
基本的な使い方
コマンド例
以下の例は指定したIssueに取り組んで最終的にPRを作成します。
AnthropicのClaude 3.5 Sonnetを利用しています。
$ issue-agent create-pr clover0/example-repository/issues/123 \
--base_branch main \
--language Japanese \
--model claude-3-5-sonnet-latest
OWNER/REPOSITORY/issues/ISSUE_NUMBER
の形式が引数です。
Terraformの非推奨な記述をマイグレーションしてみる
今回は試しにTerraformで非推奨になったAWS S3 Bucketの記述をマイグレーションするIssueをやってもらうとしましょう。
例えば、このようなissueがあるとします。どのように変更するか具体的な指示がなく、とてもふわっとした内容です。
次にissue-agentコマンドを実行しましょう。今回はAgentのLLMとのやりとりも見たいので --log_level debug
をつけておきます。
また、GitHubの操作に必要な GITHUB_TOKEN
と Claudeを利用するためにANTHROPIC_API_KEY
の環境変数の指定をします。
$ GITHUB_TOKEN=$(gh auth token) \
ANTHROPIC_API_KEY="api_key" \
issue-agent create-pr clover0/example-repository/issues/123 \
--base_branch main \
--language Japanese \
--model claude-3-5-sonnet-latest \
--log_level debug
実行するとAgentはリポジトリをクローンして、ディレクトリ構成などを読み取り、対象を特定します。
ファイルを開き、必要な変更を行い、PRを作成します。
すると、こんなPRが出来上がります。
かなり前からでしたが、TerraformでS3を構築する記述が古くなっていて、書き方を更新する必要がありました。今回をそれをエージェントにやってもらいました。
実際に terraform apply
をしましたが、エラーなくapply出来ました。これにて非推奨の記述のマイグレーションが完了です。
GitHub Actionsで利用する
GitHub Actionsで利用することでissueをアサインしたりラベルをつけたりした場合に issue-agent
を動かすようにすれば、そのissueをAgentにお任せするフローが作れます。
例えば、以下のような設定でGitHub Actionsのワークフローに載せることができます。
例ではissueに run-agent
ラベルがつけられたときに発火するようにしています。
GitHub Actions上では、PATかGitHub Appで生成したトークンが必要です。例では create-github-app-token Actionを利用して GITHUB_TOKEN
を生成しています。
name: Run Agent
on:
issues:
types:
- labeled
jobs:
run-agent:
if: ${{ github.event.label.name == 'run-agent' }}
permissions:
contents: write
pull-requests: write
issues: read
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Install Issue Agent Action
uses: clover0/setup-issue-agent@v1
# Personal Access Token (PAT) を使うのであればここは不要です
- uses: actions/create-github-app-token@v1
id: app-token
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
- name: Run Issue Agent Action
run: |
issue-agent create-pr ${GITHUB_REPOSITORY}/issues/${{ github.event.issue.number }} \
--base_branch main \
--model claude-3-5-sonnet-latest \
--language Japanese
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
Issue Agentをつくろうと思ったわけ
単純だが自動化が難しい変更がそこそこある
例えばモノレポ構成において、ある箇所でやった変更をほかの階層でも展開したい場合や、単純だけれど自動化ツールがなかったり、スクリプトを作るにも敷居のあるような変更をさくっとうまく片付けたいようなことってありませんか...
LLMをうまく使えば、issueを書いてそれをアサインしたらいい感じにやってくれないかな。
そんなようなことからGitHub Actionsで使えるようなツール作成にいたりました。
アサインしたらそのまま突っ走ってほしい
チャットでやりとりしたり、Copiotなどのエディタ上でインタラクティブに変更を行うのとは別に、日頃課題としてあげていたissueをAgentにアサインしたら、そのまま指示を待たずにとりあえずPRを作ってほしい。
できることが限られたエージェントにしたい
Agentの環境でシェルを実行するようなタイプ、自律的に環境を構築してテストを動かしたりlintをかけたりできるAIエージェントもあると思います。うっかり大事な情報を外に送信してしまうかもしれないリスクよりも、エージェントができる操作を限定してセキュアにしたいというのがありました。
Issue Agentはfunction callingを介して自身の環境でコードを変更する設計です。
Issue Agentができること・できないこと
ありそうでないようなことをちょっと記載します。
できること:
- 指定されたリポジトリ内のみでPRを作成します
- Issueを読み取り、同じリポジトリにPRを出します
できないこと:
- エージェントとインタラクティブな開発はできません
- 状況に応じてPRを出す先を判断するようなことはできません。コマンド引数で与えたらRepositoryのみが操作対象です。(将来的に、他のRepositoryも参照できるようにする拡張はアリかもと考えてます)
- OS環境内での自由なシェル実行など(
find
,curl
など)
Issue Agentは、PRを出す前に自身の環境でterraform plan
やgo test ./...
などを実行することはできません。
それゆえにIssue Agentにやってもらうことは、われわれがissueを介して指示を出す時点で、成果物の形としておおよそ1つになるような内容が適しているでしょう。
さいごに
今回は、GitHubのIssueをもとに自動で作業を進め、Pull Requestを作成するAIエージェントとして紹介しました。
Issue Agentはまだまだ開発途上ですが、活用の仕方はここに記載した以上にあると思います。
詳しくはIssue Agentをチェックしてみてください:Issue Agent
Discussion