iT邦幫忙

2026 iThome 鐵人賽

DAY 28
0

https://ithelp.ithome.com.tw/upload/images/20260916/20124384NQ5Z5JI7OZ.jpg

今天介紹什麼

打造自己的 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 底下自動留言。

整套系統只需要四個檔案:

  1. prompts.py:給 Agent 的 SOP 工作說明書(審查規則)。
  2. tools.py:Agent 的手腳(讓它能夠讀取 diff 檔案的 Python 函式)。
  3. agent.py:把模型、工具和 SOP 組裝起來的 Agent 主體。
  4. run_review.py:在 CI 環境中負責呼叫 Agent、計算 Token 與成本的執行檔。

第一步:先把審查規則講清楚(prompts.py)

做審查 Agent 最忌諱的就是直接跟 AI 說「請幫我看 code」,這樣它通常只會回你一大堆廢話,甚至去挑縮排或引號。

我們要像教新人一樣,在 prompts.py 裡明確訂出「抓大放小」的原則:

REVIEW_INSTRUCTION = """
你是一位友善、有經驗的資深工程師,負責審查同事送出的程式碼變更(diff)。

## 你一定要抓出來的問題(🔴 嚴重)
- 安全問題:密碼、金鑰、Token 直接寫死在程式碼裡;SQL 注入等風險
- 會讓程式崩潰的錯誤:除以零、忘記處理 null / None、無窮迴圈
- 執行緒問題:例如在 Android 主執行緒連網

## 值得提醒的建議(🟡 建議)
- 命名看不出用途、一個函式做太多事
- 沒用到的變數、import 或註解掉的舊程式碼
- 缺少錯誤處理

## 不要管的事
- 排版、縮排、單雙引號(這些交給 linter / formatter 自動化工具)
- 純粹個人喜好的寫法

## 輸出格式(固定四段、繁體中文、400 字以內)
## 總結
## 🔴 嚴重
## 🟡 建議
## ✅ 做得好的地方(至少找一點肯定同事,語氣要鼓勵)
"""

規則寫清楚後,AI 就不會在瑣碎的排版上碎碎念,而是精準盯緊資安與系統崩潰的致命傷。


第二步:組裝 Agent 本體(agent.py)

有了規則與工具後,我們在 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],
)

第三步:故意埋 6 個雷來實測驗證

為了驗證我們的 Agent 到底管不管用,我們故意寫了一段包含 6 個經典錯誤的 Kotlin 程式碼(RemoteDataRepository.kt)送進去測:

  1. API Key 寫死在常數裡(資安風險)。
  2. 在 Flow 裡直接開連線(主執行緒連網,在 Android 會引發 ANR)。
  3. cache!! 強制解包(若為 null 會丟 NullPointerException)。
  4. total / list.size(空清單時會除以零)。
  5. 在背景用 GlobalScope.launch(容易造成記憶體洩漏)。
  6. 定義了沒用到的變數 unused。

實測 Gemini 3.7 Flash 的表現:

  • 6 個地雷全部精準揪出!
  • 連主執行緒連網會 ANR、建議加上 .flowOn(Dispatchers.IO) 這種 Android 深度問題都指出來了。
  • 整個過程消耗約 9,800 個 Token,換算台幣成本只要 NT$0.52,性價比極高。

第四步:無縫切換 Grok 4.6(不用改程式碼)

如果想試試看 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

實測對比兩個模型的審查風格:

  • Gemini 3.7 Flash:語氣非常友善客氣,著重在怎麼改會更好,便宜又實惠(約 NT$0.52)。
  • Grok 4.6:語氣非常犀利直接,除了 6 個雷全抓到,還額外抓出連線沒有關閉、金鑰被拼在 URL query 裡等細節。雖然價格高了一點(約 NT$0.92),但抓問題的角度非常刁鑽。

第五步:接上 GitHub Actions 自動化

最後一步,就是把這個工讀生搬到 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 永遠只會保持最新的一則審查意見


加碼:掛載 SKILL.md 讓審查更專業

如果團隊有額外的規範(例如中文排版指北:中英文要加半形空格、專有名詞大小寫),你不需要把上百行的規範全部塞進 prompts.py。

ADK 支援動態載入技能(Skill):

  1. 在 skills/ 資料夾底下放一份 SKILL.md。
  2. 在 agent.py 加上 SkillToolset。
  3. Agent 在審查時,只要覺得需要,就會自己呼叫 load_skill 把整套排版規則翻開來看,審完再產出符合規範的中文審查意見。

上一篇
115/27 - ADK 介紹
下一篇
115/29 - A2A 介紹
系列文
第一次用 Antigravity CLI 做出 Plugin 就上手30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

我要留言

立即登入留言