🤑

無料でたっぷり使えるGitHub PRレビューbotを作りました

2024/12/27に公開

動機

「個人開発でもそろそろ生成AIのレビューbotを入れたい!」

「でも、何かの拍子にpackage.lock.jsonみたいな大容量ファイルをうっかり投げた日には生成AI破産💰💥が怖い…🙀」

「そうだ!無料でたくさん使えて高性能と噂のGemini 2.0 Flashを使おう!」

「うーん、Geminiが使えるいい感じのレビューbotが見つからない…」

「作っちゃえ!」

できたもの

https://github.com/marketplace/actions/gemini-review-bot

こんなのができました。Google AI StudioからAPI keyを取得すれば無料で使えます。よければ使ってみてください。開発にも生成AIをフル活用しました。
設定が簡単で、コード行に対してコメントを返してくれたり、優先度を含めてコメントを残してくれるのがこだわりです。

こだわり

  1. ちゃんとコード行に対して引用コメントを返します。

    こんな感じ

これがお好みでない方のために、USE_SINGLE_COMMENT_REVIEW環境変数も用意しました。trueにすることで、1つのコメントでレビューを行います。

今はお節介なくらいコメントを入れてくれるので、Priorityが低いコメントは投稿しないようにする機能をつける予定です。(logLevelみたいなイメージ)

  1. EXCLUDE_PATHSが使えます。

ビルド後のアセットやpackage.lock.jsonなど、レビューを求めないファイルはEXCLUDE_PATHS環境変数にパスを指定すれば除外してプロンプトを組み立てます。
生成AIレビューツールを探していてこの機能がないものも意外とありました。。

  1. 設定側のworkflow ymlが短めです。
    実行されるスクリプトの方でOctokitを使ってデータフェッチをするのでactions/checkoutなども不要な作りにしました。
name: "Run ai-reviewer"

permissions:
  pull-requests: write
  contents: read

on:
  pull_request:
    types: [opened, synchronize, reopened]
  workflow_dispatch:

jobs:
  run-review:
    runs-on: ubuntu-latest
    steps:
      - name: Gemini Review Bot
        uses: Nasubikun/ai-reviewer@v1
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
          LANGUAGE: "Japanese"
          EXCLUDE_PATHS: "**/pnpm-lock.yaml"

こんな感じで設定します。

実装

実装はvercel/aiを使っています。以前Geminiを使った時にLangchainのwithStructuredOutputが安定しなかったので、その名残りでvercel/aiのgenerateObjectを使っています。[1]

コード行のそれぞれにコメントを残すために、Github REST APIで必要なcommentsのパラメーター(body, line)などzodスキーマで定義し、Geminiに返させています。

また、生成AIが行数を数えやすいようにpatchの内容はjsdiffでobjectにし、各行に行数を付与するようにしています。

あとがき

いずれAmazon Bedrockも使えるようにします!いずれ!

脚注
  1. https://github.com/langchain-ai/langchainjs/issues/6901 ↩︎

Discussion