Qodo Merge (PR-Agent) をVertex AI と GitHub Actions で動かしてみた
はじめに
Qodo Merge (PR-Agent)[1] は、プルリクエストの自動レビューや説明生成などを行うオープンソースの AI ツールです。今回は Vertex AI を使って、普段良く使っている GitHub Actions 上で実行する方法を紹介します。
導入
早速、導入していきます。まず、GitHub Actions から Google Cloud へアクセスできるようにします。その後、PR-Agent を実行するための Action を設定するといった流れです。
1. Direct Workload Identity Federation を設定する
GitHub Actions から Vertex AI を利用するため、Workload Identity 連携を構成します。今回は、Service Account を利用しない方法にします。Workload Identity 連携については、以下の記事がとてもわかりやすかったです。
プールとしてgithub-for-pr-agent
を作成し、その配下にgithub-for-pr-agent
という OIDC プロバイダを作成します。プロバイダには、条件としてリポジトリのオーナーを設定するようにしましょう。
# プロジェクトを設定する
PROJECT_ID="Your Google Cloud Project ID"
gcloud config set project $PROJECT_ID
# 1. Workload Identity Poolを作成する
gcloud iam workload-identity-pools create github-for-pr-agent \
--location=global \
--display-name='GitHub for PR-Agent' \
--description='GitHub Actions Identity Pool for PR-Agent'
## 確認
gcloud iam workload-identity-pools describe github-for-pr-agent \
--location=global
# 2. Workload Identity Provider を作成する
GITHUB_USER_NAME="Your GitHub User Name"
gcloud iam workload-identity-pools providers create-oidc github-for-pr-agent-oidc \
--location=global \
--workload-identity-pool='github-for-pr-agent' \
--display-name='GitHub for PR-Agent OIDC' \
--description='GitHub Actions OIDC Provider for PR-Agent' \
--attribute-mapping="attribute.repository_owner=assertion.repository_owner, attribute.actor=assertion.actor, attribute.repository=assertion.repository, google.subject=assertion.sub" \
--attribute-condition="assertion.repository_owner == '$GITHUB_USER_NAME'" \
--issuer-uri='https://token.actions.githubusercontent.com'
## 確認
gcloud iam workload-identity-pools providers describe github-for-pr-agent-oidc \
--location=global \
--workload-identity-pool=github-for-pr-agent
2. Vertex AI にアクセスするためのカスタムロールを設定する
Vertex AI には事前定義の Vertex AI Administrator (roles/aiplatform.admin)
や Vertex AI User (roles/aiplatform.user)
[2] を利用する方法もあります。今回はそこまで広い権限が必要ないので、カスタムロールを作成して利用します。
# Custome Role - PR Agent Role を作成する
ROLE_ID=PRAgentRole
gcloud iam roles create $ROLE_ID --project=$PROJECT_ID \
--title='PR Agent Role' \
--description='Role for PR Agent' \
--permissions='aiplatform.endpoints.predict' \
--stage=ALPHA
# Workload Identity へカスタムロールを付与する
GITHUB_USER_NAME="Your GitHub User Name"
REPOSITORY_NAME="Your GitHub Repository Name"
PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(project_number)")
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="principalSet://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/github-for-pr-agent/attribute.repository/$GITHUB_USER_NAME/$REPOSITORY_NAME" \
--role="projects/$PROJECT_ID/roles/PRAgentRole"
3. GitHub Actions を設定する
ドキュメント[3]を参考に PR-Agent を利用するための GitHub Actions の workflow 定義ファイルを.github/workflows/pr_agent.yml
として作成します。チェックアウトしたあと、google-github-actions/auth
[4]で認証し、PR-Agent を呼び出すだけです。今回はモデルとして、gemini-1.5-flash
を利用します。モデルは環境変数として設定することができます。※コード上では後述する設定ファイルを使うためコメントアウトしてます。
リポジトリ配下に.pr_agent.toml
[5]としてファイルを定義することで、設定をカスタマイズすることができます。今回はモデルの定義と、結果を日本語にするような追加のプロンプトを追加するように構成しています。
カスタマイズについては以下の記事を参考にさせていただきました。
4. 動作確認
いよいよ、どんな形で出力されるのか試してみたいと思います。今回はテスト用として、記載のような Javascript ファイルを PR として出してみます。
でました。きちんと日本語になっていて、素晴らしいです 😀
PR Description
PR Review
Code Suggestions
コメントによる実行も試してみます。レビューコメントが更新されたようです 🎉
以上で終わります。
PR Review by Comment
The Result
ちなみにの話
1. トラブルシューティング
「Usage Guide[6]」では、Codey for Code Chat(codechat-bison)がサンプルとして書いてあります。しかし、そのまま利用すると以下のエラーがでて、利用できません。
litellm.exceptions.APIConnectionError: litellm.APIConnectionError:
400 Project `0000000000` is not allowed to use Publisher Model `projects/xxxxxxxxxx/locations/us-central1/publishers/google/models/codechat-bison@002`
モデルの提供状況[7]をみると、codechat-bison モデルは 2024 年 10 月 9 日 に廃止されており、これが原因ではないかと思います。
2. LiteLLM
今回のツールは AI モデルを呼び出すときに、LiteLLM[8] というツールを使っているようです。このツールを使うことで、さまざまな提供元の AI モデル API を一貫した方法で呼び出すことができるようです。例えば以下のように利用することができます。
from litellm import completion
import json
## GET CREDENTIALS
## RUN ##
# !gcloud auth application-default login - run this to add vertex credentials to your env
## OR ##
file_path = 'service-account-key.json'
# Load the JSON file
with open(file_path, 'r') as file:
vertex_credentials = json.load(file)
# Convert to JSON string
vertex_credentials_json = json.dumps(vertex_credentials)
## COMPLETION CALL
response = completion(
model="vertex_ai/gemini-1.5-flash",
messages=[{ "content": "Hello, how are you?","role": "user"}],
vertex_credentials=vertex_credentials_json
)
print(f"response: {response.choices[0].message.content}")
$ pip install litellm google-cloud-aiplatform
$ python main.py
response: I am an AI language model, so I don't have feelings like humans do. But I'm here and ready to assist you! 😊 How can I help you today?
手軽にいろいろなモデルを試せそうなので、今度から使ってみたいなと思いました 💪
さいごに
今回利用したモデルは、Gemini 1.5 Flash でしたが他の Vertex AI 対応のモデルも試してみると結果が変わって面白いかもしれません。費用対効果をみつつ、追加のプロンプトとあわせていろいろ試してみたいと思います。
Google Cloud をお使いの方は、使い慣れた基盤で簡単に利用することができるのでぜひお試しください。
参考
- PR-Agent を使って Pull Request を AI レビューしてみた。(日本語対応もしてみた) - LayerX エンジニアブログ
- AI によるコードレビュー "PR-Agent" を導入した効果と課題について
Discussion