用 GitHub Actions 做多模型代码审查
单模型做代码审查有视角盲区,误报、漏报都难消除。让 2–3 个模型并行独立审查同一个 PR,再合并去重、标注置信度,正确率明显高于单模型。GitHub 的 claude-code-action 只会说 Anthropic 协议——靠网关的协议互通,qwen3.8-max、kimi-k3 这类非 Anthropic 模型也能进入审查队列;一把网关访问密钥统一承接所有审查流量,凭证集中、成本可计量。
场景背景与「为什么经网关」见 增强模型能力 场景三。
配好后的体验:每次 PR 打开或更新,审查 job 自动运行,模型在 PR 下发布审查评论(发现项 + 机器可解析的 TODO 修复清单);多模型模式额外带置信度标注。开发者还可以在评论区 @claude 追问,触发带上下文的再次审查。
工作原理:
PR 打开/更新(或 @claude 评论)
→ GitHub Actions 触发审查 job
→ 经网关调用审查模型(ANTHROPIC_BASE_URL 指向网关,网关做协议互译)
→ 多模型并行独立审查 → 汇总去重、标注共识 → 发布一条 PR 评论现成组件:开源的 gatellm-io/gatellm-code-review 封装了 anthropics/claude-code-action,自带 PR 行数门限、历史评论最小化、短结果重试、@claude 追问触发。下面按 5 步配齐。
前置
- 网关已运行、能登录控制台(还没部署先走 Docker 单机)
- 已设
ENCRYPTION_KEY(保存上游与签发密钥都要用,见 Docker 单机 → 前置) - 参与审查的模型已在网关配好上游
- 对目标 GitHub 仓库有管理员权限(要配 Secrets / Variables)
第 1 步:网关侧配好审查模型
控制台 → 上游与模型,确认参与审查的模型(如 qwen3.8-max、kimi-k3)已建好。大 PR 多的话,优先用带 [1m] 后缀的 1M 上下文窗口变体。注意 [1m] 只是模型名的一部分(命名约定),不是审查流程的语法要求——带不带后缀都是合法模型名,以你网关里的实际配置为准;所以下文示例里 qwen3.8-max 与 qwen3.8-max[1m] 两种写法都有效。
模型名在后面两处会用到:单模式的 CODE_REVIEW_MODEL、多模式的 CODE_REVIEW_MODELS / summary_model。它们必须与网关里的模型名逐字一致,否则审查请求打过去就是 404 model_not_found。
第 2 步:为 CI 签发专用访问密钥
控制台 → 访问密钥:
- 新建一个密钥组,
models只勾选审查用的模型(最小权限;机制见 多租户隔离)。 - 签发一把访问密钥挂到该组,记下来——它要放进 GitHub Secret。
- 给这把密钥设 RPM / 并发上限(
RATE_LIMIT_*):多模型审查是并行请求,限流避免挤占生产流量。
控制台实际界面(截图为英文 UI,中文 UI 对应「访问控制 / 访问密钥 / 密钥组 / 添加访问密钥」):


组里勾的是模型完整名称(带上游前缀)——与控制台模型列表是同一份清单。


专用密钥的好处:审查开销与业务流量天然分账;出问题时吊销密钥即刻切断审查流量。
第 3 步:GitHub 侧配凭证
仓库 Settings → Secrets and variables → Actions(多仓库共用可放组织级):
| 类型 | 名称 | 值 |
|---|---|---|
| Secret | CODE_REVIEW_API_KEY | 第 2 步签发的网关访问密钥 |
| Variable | CODE_REVIEW_BASE_URL | 网关根地址,如 http://your-gateway:7890(不带 /v1,Claude Code 自己拼) |
| Variable | CODE_REVIEW_MODEL | 单模式用的审查模型名,如 qwen3.8-max |
| Variable | CODE_REVIEW_MODELS | 多模式用的逗号分隔列表,如 qwen3.8-max[1m],kimi-k3[1m] |
| Variable | CODE_REVIEW_SUMMARY_MODEL | 多模式的汇总模型(可选,留空取列表第一个) |
第 4 步:添加 workflow 文件
两种接法,按需求二选一。
接法 A:单模型审查(Composite Action,快速上手)
新建 .github/workflows/claude-code-review.yml。下面这份改三处即可用:branches、runs-on、模型变量:
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize, reopened]
branches: [main] # ← 只审查指向该分支的 PR,按你的默认分支改
issue_comment:
types: [created]
jobs:
claude-review:
# 两种触发:PR 打开/更新;或有人在 PR 评论里 @claude 追问
if: >-
github.event_name == 'pull_request' ||
(github.event_name == 'issue_comment' &&
github.event.issue.pull_request != null &&
github.event.comment.user.type != 'Bot' &&
contains(github.event.comment.body, '@claude'))
runs-on: ubuntu-latest # ← 可换自托管 runner 标签,如 [code-review, arm64]
permissions:
contents: read
pull-requests: write
issues: write
actions: read
# 同一 PR 的新推送会取消进行中的旧审查,只留最新一轮
concurrency:
group: claude-review-${{ github.event.pull_request.number || github.event.issue.number }}-${{ github.event_name }}
cancel-in-progress: true
steps:
- name: Checkout repository
uses: actions/checkout@v7
with:
fetch-depth: 1
- name: Run Claude Auto Review
uses: gatellm-io/gatellm-code-review@v1
with:
# 凭证:指向你的网关
anthropic_api_key: ${{ secrets.CODE_REVIEW_API_KEY }}
anthropic_base_url: ${{ vars.CODE_REVIEW_BASE_URL }}
# 业务参数(均有默认值,按需覆盖)
model: ${{ vars.CODE_REVIEW_MODEL }} # 必须显式转发:composite action 读不到 vars
# max_lines: 10000 # PR 变更行数超上限则跳过;-1 = 不限
# review_language: "Simplified Chinese" # 审查评论语言,默认 English
# prompt: | # 覆盖默认审查提示词
# 自定义...要点:
- 审查模型同样可以是
qwen3.8-max、kimi-k3这类非 Anthropic 模型——claude-code-action说的是 Anthropic 协议,网关负责翻译。 - runner 没预装 Claude CLI 时 action 会自动安装;自托管 runner 预装了则直接复用。
- 评论短于 100 字符会判定审查失败并自动重试一次,无需额外处理。
接法 B:多模型共识审查(Reusable Workflow,推荐)
多模型才有共识置信度。新建 .github/workflows/pr-review.yml,整段调用三阶段工作流(setup → review 矩阵 → summarize):
name: PR Review
on:
pull_request:
types: [opened, synchronize, reopened]
issue_comment:
types: [created]
jobs:
claude-review:
if: >-
github.event_name == 'pull_request' ||
(github.event_name == 'issue_comment' &&
github.event.issue.pull_request != null &&
github.event.comment.user.type != 'Bot' &&
contains(github.event.comment.body, '@claude'))
uses: gatellm-io/gatellm-code-review/.github/workflows/claude-auto-review.yml@v1
secrets: inherit # 把 CODE_REVIEW_API_KEY 等透传给子工作流
with:
runs_on: "ubuntu-latest" # 或自托管 runner 标签
models: "qwen3.8-max[1m],kimi-k3[1m]" # 2–3 个,超过 3 个会截断
summary_model: "qwen3.8-max"
review_language: "Simplified Chinese" # 审查评论用中文要点:
models给 ≥2 个才启用多模型模式;只给 1 个(或留空走model)则自动回退单模型直评。permissions/concurrency都由子工作流内置,调用方不用操心。- 多仓库统一改模型组合时,把
models换成${{ vars.CODE_REVIEW_MODELS }}即可集中管理。
第 5 步:验证
- 开一个测试 PR(随便改一行),Actions 里应出现审查 job 并开始运行。
- job 完成后 PR 页面出现审查评论:多模型模式下发现项带
[Consensus N/M]/[Single model]标注。 - 控制台 → 日志,能看到审查流量经网关(User-Agent 含
gatellm-claude-code-review);→ 统计按模型查看审查用量。 - 在 PR 评论区回复
@claude 重点看并发安全,应触发一次带该请求的再次审查。
没跑通时:
- job 报 401 →
CODE_REVIEW_API_KEY填错或密钥被禁用。 - 报 404
model_not_found→ 模型变量与网关模型名不一致,回第 1 步核对。 - 连不上网关 / 超时 → GitHub-hosted runner 只能访问公网地址;内网网关要用自托管 runner 或打通网络。
- job 成功但没评论 → 查看 Actions artifacts 里的执行日志定位。
产出长什么样
- 发现项带置信度(多模型):
[Consensus N/M]表示 N 个模型独立得出同样结论(M 为参与模型数),[Single model]表示单模型独有发现,采信优先级一目了然。 - 评论结构固定:Findings(按严重度排序、带
file:line)→## TODO Fix List(机器可解析,[P0]–[P3]分级,可直接交给 coding AI 认领修复)→ Requires manual attention(需人工把关项);多模式底部折叠区块保留每个模型的原始审查。 - 护栏:PR 变更行数超
max_lines(默认 10000)自动跳过,手动重跑可强制;每轮审查前历史 Claude 评论自动折叠为 OUTDATED,PR 不积噪声。
完整输入项、权限要求与行为细节见该仓库的 README。
常见问题
Q:每个 PR 都审,评论会刷屏吗? 不会。每轮审查开始前,action 会把该 PR 上历史 Claude 评论自动折叠为 OUTDATED,PR 时间线里只留最新一轮的展开评论;超大 PR(超 max_lines)默认直接跳过。
Q:审查费用怎么算? 按各审查模型分别计价、网关统一汇总,统计与账单里体现为各审查模型的用量。见 定价与计费。
下一步:增强模型能力 看场景全貌;Claude Code 经网关接入 看 Claude Code 的基础接法;多租户隔离 看最小权限密钥组的设计。
