
打造自己的 GitHub Code Review Agent
如果有人提交 PR,有個 AI Agent 先把 PR 看過,先排除簡單的問題,就很方便,昨天我們介紹過 ADK,今天來介紹 ADK 搭配 Agent Platform(前 Vertex AI)做出 Gemini 和 Grok 的 GitHub Code Review Agent
我們今天的目標很單純:有人在 GitHub 開了一個 PR(拉取請求,Pull Request),或是推了新的 commit,GitHub Actions 就會自動啟動,呼叫我們寫好的 ADK Agent,把改動的程式碼 diff 看過一遍,並在 PR 底下自動留言。
整套系統只需要四個檔案:
做審查 Agent 最忌諱的就是直接跟 AI 說「請幫我看 code」,這樣它通常只會回你一大堆廢話,甚至去挑縮排或引號。
我們要像教新人一樣,在 prompts.py 裡明確訂出「抓大放小」的原則:
REVIEW_INSTRUCTION = """
你是一位友善、有經驗的資深工程師,負責審查同事送出的程式碼變更(diff)。
## 你一定要抓出來的問題(🔴 嚴重)
- 安全問題:密碼、金鑰、Token 直接寫死在程式碼裡;SQL 注入等風險
- 會讓程式崩潰的錯誤:除以零、忘記處理 null / None、無窮迴圈
- 執行緒問題:例如在 Android 主執行緒連網
## 值得提醒的建議(🟡 建議)
- 命名看不出用途、一個函式做太多事
- 沒用到的變數、import 或註解掉的舊程式碼
- 缺少錯誤處理
## 不要管的事
- 排版、縮排、單雙引號(這些交給 linter / formatter 自動化工具)
- 純粹個人喜好的寫法
## 輸出格式(固定四段、繁體中文、400 字以內)
## 總結
## 🔴 嚴重
## 🟡 建議
## ✅ 做得好的地方(至少找一點肯定同事,語氣要鼓勵)
"""
規則寫清楚後,AI 就不會在瑣碎的排版上碎碎念,而是精準盯緊資安與系統崩潰的致命傷。
有了規則與工具後,我們在 agent.py 裡把它們接起來。這裡還順便做了環境變數切換,看你想用 Gemini 還是 Grok 都行:
import os
from dotenv import load_dotenv
from google.adk.agents import LlmAgent
from .prompts import REVIEW_INSTRUCTION
from .tools import read_diff_file, summarize_changed_files
load_dotenv()
# 根據環境變數決定用哪個模型
def build_model():
provider = os.getenv("MODEL_PROVIDER", "gemini").lower()
if provider == "gemini":
return os.getenv("GEMINI_MODEL", "gemini-3.7-flash")
if provider == "grok":
from google.adk.models.lite_llm import LiteLlm
return LiteLlm(model=os.getenv("GROK_MODEL", "vertex_ai/xai/grok-4.6"))
raise ValueError("MODEL_PROVIDER 只能是 gemini 或 grok")
root_agent = LlmAgent(
name="code_review_agent",
model=build_model(),
description="閱讀程式碼 diff,找出嚴重問題與改善建議的審查助理。",
instruction=REVIEW_INSTRUCTION,
tools=[read_diff_file, summarize_changed_files],
)
為了驗證我們的 Agent 到底管不管用,我們故意寫了一段包含 6 個經典錯誤的 Kotlin 程式碼(RemoteDataRepository.kt)送進去測:
實測 Gemini 3.7 Flash 的表現:
如果想試試看 xAI 的 Grok 4.6,在 ADK 裡面只要透過 LiteLLM 轉接頭,連到 GCP 的 Agent Platform(前身 Vertex AI)即可。
最棒的是:agent.py 一個字都不用改,只要把 .env 改掉:
MODEL_PROVIDER=grok
GROK_MODEL=vertex_ai/xai/grok-4.6
VERTEXAI_PROJECT=你的GCP專案ID
VERTEXAI_LOCATION=global
實測對比兩個模型的審查風格:
最後一步,就是把這個工讀生搬到 GitHub 雲端上班!在專案裡建立 .github/workflows/ai-code-review.yml:
name: adk-code-review
on:
pull_request:
types: [opened, synchronize, reopened]
paths-ignore:
- "**.md"
- "package-lock.json"
permissions:
pull-requests: write
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install -r requirements.txt
# 抓下目前 PR 的 diff
- env:
GH_TOKEN: ${{ github.token }}
run: gh pr diff ${{ github.event.pull_request.number }} > pr.diff
# 執行我們的 ADK 審查程式
- env:
MODEL_PROVIDER: gemini
GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }}
run: python run_review.py pr.diff --output review.md
# 貼回 PR 留言(防洗版密技)
- env:
GH_TOKEN: ${{ github.token }}
PR: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
run: |
OLD_ID=$(gh api "repos/$REPO/issues/$PR/comments" --paginate \
--jq '.[] | select(.body | startswith("<!-- ai-review:gemini -->")) | .id' | head -n1)
if [ -n "$OLD_ID" ]; then
gh api -X PATCH "repos/$REPO/issues/comments/$OLD_ID" -F body=@review.md
else
gh pr comment "$PR" --body-file review.md
fi
這裡分享一個實戰非常實用的小技巧:
在 review.md 輸出的第一行藏一段隱藏註解(例如 <!-- ai-review:gemini -->)。當開發者修改程式碼再推新 commit 時,腳本會先查有沒有留過言;有的話直接用 PATCH 更新舊留言,沒有才新增。這樣同一個 PR 永遠只會保持最新的一則審查意見
如果團隊有額外的規範(例如中文排版指北:中英文要加半形空格、專有名詞大小寫),你不需要把上百行的規範全部塞進 prompts.py。
ADK 支援動態載入技能(Skill):