🦔

GitHub IssueからPRを作成するCLIで動かすAIエージェント

2025/01/30に公開

はじめに

LLMを利用したIssue AgentというCLIツールを開発しました。
このツールは、GitHubのIssueを受け取り自律的に対応し、その結果をPull Requestとして出します。CLIツールとして利用できるほか、GitHub Actions向けのActionも提供しています。

この記事では、Issue Agentの使い方を簡単に紹介します。

https://github.com/clover0/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 plango test ./... などを実行することはできません。

それゆえにIssue Agentにやってもらうことは、われわれがissueを介して指示を出す時点で、成果物の形としておおよそ1つになるような内容が適しているでしょう。

さいごに

今回は、GitHubのIssueをもとに自動で作業を進め、Pull Requestを作成するAIエージェントとして紹介しました。

Issue Agentはまだまだ開発途上ですが、活用の仕方はここに記載した以上にあると思います。

詳しくはIssue Agentをチェックしてみてください:Issue Agent

Discussion