1. 为什么我要把 PR 审查交给 Hermes 和统一 Key
每次提 PR,最怕的不是 CI 红,而是没人 review。团队小、节奏快,代码评审经常拖到第二天,等来的还可能是「LGTM」三个字母。我试过把 AI 拉进评审流程,但很快撞上两个现实问题:一是每个仓库、每个脚本都要单独配一份模型 Key,散落在各种.env和 CI Secret 里,轮换一次要改十几个地方;二是 Webhook 触发之后,怎么把 diff 稳定地喂给模型、再把评审意见准确回写到 PR 评论,中间链路全靠自己拼。
Hermes 的 GitHub PR 审查能力正好补上后半段:它内置 Webhook 监听、路由配置、技能系统和投递层,PR 一提交就能触发 AI 审查并发布评论。而前半段的「统一 Key」问题,我用 TaoToken 来解决——一个 Key 走通所有模型调用,Hermes 的settings.json/config.toml里只填一处,Webhook 触发的评审请求全部经这条通道出去。这篇就把这条端到端链路拆开:Webhook 怎么配、Key 怎么接、PR 怎么验证、报错怎么排。
适合谁看:手上有一两个活跃仓库、想让 PR 自动过一遍 AI 评审、又不想维护一堆 Key 的开发者。全程可复制,配置骨架直接抄。
2. TaoToken 前置:一个 Key 打通评审链路
Hermes 的评审流程里,模型调用发生在「Agent 拿到 diff 之后」。也就是说,Webhook 只负责把 PR 事件送进来,真正烧 token 的是后面那次 AI 审查。如果这一步的 Key 管理是散的,整条链路的可维护性就很差。
TaoToken 在这里的角色是统一入口:官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 端点是 https://taotoken.net/api 。你只需要在 TaoToken 控制台生成一个 Key,然后把它写进 Hermes 的配置里,Webhook 触发的每一次评审都复用这一个 Key。
具体要准备三样东西:
第一,TaoToken 的 API Key。登录控制台,在 API Keys 页面创建一个,复制出来。这个 Key 就是后面settings.json里api_key字段的值。
第二,确认模型名。TaoToken 兼容主流模型调用格式,你在配置里填的model字段要和通道支持的模型名一致。评审场景我一般选推理能力强的模型,diff 长了也不容易漏掉边界问题。
第三,本地或服务器上跑着 Hermes,并且能对外暴露一个 Webhook 端口(默认 8644)。GitHub 要能访问到这个地址,所以本地调试建议用内网穿透工具把端口映射出去,或者直接部署在有公网 IP 的机器上。
注意:Webhook 的 Secret 和 TaoToken 的 API Key 是两回事。前者用来验证「这个请求确实来自 GitHub」,后者用来调用模型。两个都要配,别混。
拿到 Key 之后,先别急着配 Webhook,先把 Hermes 的模型通道接通,确认单次调用能通,再去接 GitHub 事件。顺序反了的话,出问题你分不清是 Key 错还是 Webhook 错。
3. 可复制配置:settings.json 与 config.toml 骨架
Hermes 的配置分两层:模型通道配置(Key、endpoint、model)和 Webhook 路由配置(端口、secret、routes)。前者我放在settings.json,后者放在config.toml,职责清晰,改起来不打架。
3.1 settings.json:接入 TaoToken 统一 Key
{ "providers": { "taotoken": { "type": "openai-compatible", "base_url": "https://taotoken.net/api", "api_key": "sk-your-taotoken-key", "model": "your-preferred-model", "timeout": 120 } }, "default_provider": "taotoken" }几个字段说明一下。type填openai-compatible,因为 TaoToken 的 API 端点兼容这套调用格式。base_url就是 https://taotoken.net/api ,注意不要带多余的路径后缀。api_key填你在控制台生成的那个。timeout给到 120 秒,PR diff 大的时候模型响应会慢一些,超时太短会误判成失败。
default_provider指向taotoken,这样 Hermes 里所有没显式指定 provider 的调用都走这条通道,包括 Webhook 触发的评审。
3.2 config.toml:Webhook 与路由骨架
[platforms.webhook] enabled = true port = 8644 secret = "global-fallback-secret" [platforms.webhook.routes.github-pr] events = ["pull_request"] secret = "github-webhook-secret" prompt = """ Review this pull request: Repository: {repository.full_name} PR #{number}: {pull_request.title} Author: {pull_request.user.login} URL: {pull_request.html_url} Diff URL: {pull_request.diff_url} Action: {action} """ skills = ["github-code-review"] deliver = "github_comment" deliver_extra = { repo = "{repository.full_name}", pr_number = "{number}" }这里的关键点:routes.github-pr里的secret必须和 GitHub Webhook 页面填的 Secret 完全一致,Hermes 会用它对请求做 HMAC-SHA256 校验。events只勾pull_request,避免 issues、push 之类的事件也触发评审。prompt里的{...}是变量占位,Hermes 会从 GitHub 的 payload 里按点号路径取值,比如{pull_request.user.login}就是提 PR 的人。
deliver = "github_comment"表示评审结果通过ghCLI 回写成 PR 评论。deliver_extra把仓库名和 PR 号传进去,告诉gh评论发到哪个 PR。
3.3 认证 gh CLI
回写评论依赖gh,所以要先登录:
gh auth login # 按提示选择 GitHub.com → HTTPS → 浏览器授权 gh auth status # 确认输出 Logged in to github.comgh auth status显示已登录,说明评论回写这条腿是通的。如果这一步没过,后面 Webhook 触发了、模型也审了,但评论发不出去,你会以为是模型问题,其实是 CLI 没认证。
4. 验证请求:从 PR 提交到评论回写
配置齐了,走一遍完整验证。这一步的目标是看到「PR 上真的出现了一条 AI 评审评论」。
4.1 在 GitHub 创建 Webhook
进入仓库 → Settings → Webhooks → Add webhook。Payload URL 填http://your-server:8644/webhooks/github-pr,Content type 选application/json,Secret 填和config.toml里github-webhook-secret一样的值。事件选择那里选「Let me select individual events」,只勾Pull requests。
保存后 GitHub 会发一个 ping 事件,Hermes 日志里应该能看到收到请求。如果 ping 都收不到,先查网络和端口,别往下走。
4.2 启动 Hermes 并观察日志
hermes gateway # 前台运行,方便看实时日志启动后确认 Webhook 监听在 8644。然后提交一个测试 PR:
git checkout -b test-pr-review echo "// test change" >> src/demo.js git add . && git commit -m "test: trigger ai review" git push origin test-pr-review # 在 GitHub 上创建 PRPR 一创建,GitHub 就会发pull_request事件。Hermes 收到后按路由配置走:校验 secret → 渲染 prompt → 注入github-code-review技能 → 调用 TaoToken 通道的模型 → 拿到评审结果 → 通过gh回写评论。
4.3 成功结果长什么样
几秒到几十秒后(取决于 diff 大小和模型速度),PR 页面会出现一条评论,内容大致是分点的评审意见:潜在 bug、命名建议、边界条件提醒。同时 Hermes 日志里能看到这次调用的 token 消耗和耗时。
如果评论出现了,说明整条链路通了:Webhook 触发正常、Key 通道正常、技能加载正常、评论回写正常。这时候你可以把测试 PR 关掉,正式用起来。
5. 本篇常见错排查
5.1 Webhook 返回 401 或 403
八成是 secret 不匹配。GitHub 那边填的 Secret 和config.toml里routes.github-pr.secret必须逐字符一致,注意别把global-fallback-secret和路由 secret 搞混。改完 secret 后 GitHub 需要重新发一次事件才能验证。
5.2 模型调用报鉴权失败
检查settings.json里的api_key是不是 TaoToken 控制台生成的那个,base_url是不是 https://taotoken.net/api 。如果 Key 刚生成,确认没有多余空格。另外确认default_provider指向的是taotoken,别指向了一个没配 Key 的 provider。
5.3 评论发不出来,但日志显示评审完成
这是ghCLI 的问题。跑gh auth status确认登录状态,再确认运行 Hermes 的用户和登录gh的用户是同一个。服务器上跑的话,gh auth login要用 token 方式,别用浏览器授权。
5.4 变量渲染成字面量
比如评论里出现{pull_request.title}原样输出。说明 payload 里没有这个字段,或者路径写错了。Hermes 对缺失的键保留字面量,不会报错。用{__raw__}把整个 payload 打出来(会截断到 4000 字符),对照着改路径。
5.5 触发太频繁或误触发
默认限速 30 请求/分钟,Body 限制 1 MB。如果仓库 PR 很密集,可能撞限速。另外确认events只勾了pull_request,别把push也勾上,否则每次 push 都会触发一次评审,token 消耗会失控。
6. 把评审链路固定下来
跑通之后,我建议做两件事让这条链路更稳。
第一,把github-code-review技能的内容按团队规范调一遍。技能文件里定义了评审的关注点,比如是否检查测试覆盖、是否强制要求错误处理。改技能比改 prompt 更清晰,也更容易复用。
第二,给 Webhook 加个失败告警。Hermes 的投递层支持多平台,你可以在路由里加一个deliver到 Telegram 或 Discord 的配置,评审失败时推一条消息,别等 PR 挂了一天没人发现。
长期做编码和 Agent 自动化的,可以考虑 Coding Plan 这类按周期计费的方案,把评审、补全、Agent 调用都归到一个额度里,比零散按次调用好管。模型对话调试可以直接在模型对话页面验证 prompt 效果,接入文档在接入文档,Key 管理在 API Keys。
这条链路的价值不在于「AI 帮你 review」,而在于它把评审从「等人」变成「等几秒」,而且每次评审的标准是一致的。Key 统一之后,你换模型、调额度、加仓库,都只动一处配置。