> 原始 Markdown 孪生体（构建期从源 Markdown 生成）。渲染页：https://docs.gatellm.io/zh-CN/howto/github-code-review · 文档索引：https://docs.gatellm.io/zh-CN/llms.txt


# 用 GitHub Actions 做多模型代码审查

单模型做代码审查有视角盲区，误报、漏报都难消除。让 2–3 个模型**并行独立审查同一个 PR**，再合并去重、标注置信度，正确率明显高于单模型。GitHub 的 `claude-code-action` 只会说 Anthropic 协议——靠网关的协议互通，`qwen3.8-max`、`kimi-k3` 这类非 Anthropic 模型也能进入审查队列；一把网关访问密钥统一承接所有审查流量，凭证集中、成本可计量。

场景背景与「为什么经网关」见 [增强模型能力](/zh-CN/usecases/model-enhancement.md) 场景三。

**配好后的体验**：每次 PR 打开或更新，审查 job 自动运行，模型在 PR 下发布审查评论（发现项 + 机器可解析的 TODO 修复清单）；多模型模式额外带置信度标注。开发者还可以在评论区 `@claude` 追问，触发带上下文的再次审查。

**工作原理**：

```
PR 打开/更新（或 @claude 评论）
    → GitHub Actions 触发审查 job
    → 经网关调用审查模型（ANTHROPIC_BASE_URL 指向网关，网关做协议互译）
    → 多模型并行独立审查 → 汇总去重、标注共识 → 发布一条 PR 评论
```

现成组件：开源的 [gatellm-io/gatellm-code-review](https://github.com/gatellm-io/gatellm-code-review) 封装了 `anthropics/claude-code-action`，自带 PR 行数门限、历史评论最小化、短结果重试、`@claude` 追问触发。下面按 5 步配齐。

## 前置

- 网关已运行、能登录控制台（还没部署先走 [Docker 单机](/zh-CN/quickstart/docker-single-node.md)）
- 已设 `ENCRYPTION_KEY`（保存上游与签发密钥都要用，见 [Docker 单机 → 前置](/zh-CN/quickstart/docker-single-node.md#prereq)）
- 参与审查的模型已在网关配好上游
- 对目标 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 签发专用访问密钥

控制台 → 访问密钥：

1. 新建一个**密钥组**，`models` 只勾选审查用的模型（最小权限；机制见 [多租户隔离](/zh-CN/usecases/multi-tenant-isolation.md)）。
2. 签发一把访问密钥挂到该组，记下来——它要放进 GitHub Secret。
3. 给这把密钥设 RPM / 并发上限（`RATE_LIMIT_*`）：多模型审查是并行请求，限流避免挤占生产流量。

控制台实际界面（截图为英文 UI，中文 UI 对应「访问控制 / 访问密钥 / 密钥组 / 添加访问密钥」）：

![Key Groups 页签：密钥组列表，Models 与 Load Balancers 是两个独立授权维度](/images/usecases/access-control-groups-list.png)

![Edit Group：Models 页签按上游分组列出全部模型，逐个勾选该组可达的模型（* (All Models) 为全选）；CI 密钥组只勾审查模型](/images/usecases/access-control-edit-group-models.png)

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

![Add Access Key：生成 API Key、填 Name、在 Group 勾选所属密钥组后保存](/images/usecases/access-control-add-key.png)

![Access Keys 页签：签发后的密钥列表，显示掩码密钥、所属组与状态；点该行复制按钮取完整密钥，放进 GitHub Secret](/images/usecases/access-control-keys-list.png)

专用密钥的好处：审查开销与业务流量天然分账；出问题时吊销密钥即刻切断审查流量。

## 第 3 步：GitHub 侧配凭证

仓库 Settings → Secrets and variables → Actions（多仓库共用可放[组织级](https://docs.github.com/en/actions/security-guides/using-secrets-in-github-actions#creating-secrets-for-an-organization)）：

| 类型 | 名称 | 值 |
|------|------|-----|
| 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`、模型变量：

```yaml
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`）：

```yaml
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 步：验证

1. 开一个测试 PR（随便改一行），Actions 里应出现审查 job 并开始运行。
2. job 完成后 PR 页面出现审查评论：多模型模式下发现项带 `[Consensus N/M]` / `[Single model]` 标注。
3. 控制台 → **日志**，能看到审查流量经网关（User-Agent 含 `gatellm-claude-code-review`）；→ **统计**按模型查看审查用量。
4. 在 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](https://github.com/gatellm-io/gatellm-code-review)。

## 常见问题

**Q：每个 PR 都审，评论会刷屏吗？**
不会。每轮审查开始前，action 会把该 PR 上历史 Claude 评论自动折叠为 OUTDATED，PR 时间线里只留最新一轮的展开评论；超大 PR（超 `max_lines`）默认直接跳过。

**Q：审查费用怎么算？**
按各审查模型分别计价、网关统一汇总，统计与账单里体现为各审查模型的用量。见 [定价与计费](/zh-CN/howto/setup-pricing-and-billing.md)。

**下一步**：[增强模型能力](/zh-CN/usecases/model-enhancement.md) 看场景全貌；[Claude Code 经网关接入](/zh-CN/quickstart/claude-code-via-gateway.md) 看 Claude Code 的基础接法；[多租户隔离](/zh-CN/usecases/multi-tenant-isolation.md) 看最小权限密钥组的设计。
