🤖 GitHub AI 自动流:issue 分类 / 问答 / 总结(零成本)

2024 年底 GitHub 悄悄上线了 GitHub Models——给所有仓库提供免费的 LLM API(GPT-4o、Claude Sonnet、Llama 等),workflow 里只要加一行 permissions: models: read 就能调用。

本篇讲如何用这个能力零成本给 lhx-kit 仓库接入 3 条基础 AI 自动流:新 issue 自动打标签 + 评论 @ai-bot 回答问题 + 打 ai-summary 标签做长讨论总结。

📌 只想知道"怎么用"(命令 / 触发位置 / 排错)? 直接看 🎮 AI 命令使用手册 —— 那是用户视角的速查;本篇是实现视角的 YAML 深度讲解。 📌 想了解后续扩展的 5 条 workflow(双模型 PR review / autofix / code-fix / docs)?🎯 AI 协作策略


🧭 8 条 AI workflow 全景

lhx-kit 现在一共有 9 条 AI workflow,本篇讲前 3 条基础的,其余 6 条详见对应篇目

# Workflow 触发 本篇覆盖
1 ai-triage.yaml 新 issue 打开 ✅ 本篇
2 ai-assistant.yaml @ai-bot <问题> ✅ 本篇
3 ai-summarize.yaml ai-summary label ✅ 本篇
4 ai-review-gpt.yaml PR 事件 ai-review-strategy
5 ai-review-llama.yaml PR 事件 ai-review-strategy
6 ai-review-deepseek.yaml PR 事件 ai-review-strategy
7 ai-autofix.yaml @bot-fix-lint (PR) ai-review-strategy
8 ai-code-fix.yaml @ai-bot fix <...> (issue) ai-review-strategy
9 ai-docs-assistant.yaml @ai-docs draft/polish ... ai-review-strategy

所有 9 条都跑在 GitHub Models 上,公开仓库免费、零 API key。


🎯 为什么是 GitHub Models,而不是自己接 OpenAI / Claude

方案 成本 需要 secret 维护 适合谁
GitHub Models(本篇) 🟢 开源仓库免费无限,私有仓库每日配额 开源项目 / 个人仓库
自建 + OpenAI API 🔴 按 token 付费 OPENAI_API_KEY 要管 key 轮换 预算充足的公司项目
自建 + Anthropic API 🔴 按 token 付费 ANTHROPIC_API_KEY 要管 key 轮换 要 Claude 质量
GitHub Copilot Coding Agent 🔴 Pro+ / Enterprise 席位费 有 Copilot 预算的公司

lhx-kit 是开源项目,GitHub Models 是绝对首选。质量足够做 issue 分类、总结、技术问答这些轻量场景。


🔑 三个 Workflow 一览

Workflow 触发条件 作用
ai-triage.yaml 新 issue 打开 自动分类 + 打标签 + 欢迎评论(带语言检测)
ai-assistant.yaml 评论里 @ai-bot ... 上下文感知问答,读 README + issue + 最近 5 条评论
ai-summarize.yaml ai-summary 标签 长讨论串 TL;DR 总结,自动替换旧的总结评论

🧩 通用设计要点

在贴具体代码前,先讲 4 个必须做对才能长期稳定运行的点:

1. permissions: models: read 是专属权限

这是 GitHub 2024 年新增的 token scope,不开它就调不了。和 contentsissues 这些老权限并列写:

permissions:
  contents: read
  issues: write
  models: read   # ← 专门给 GitHub Models 的

漏写会直接 403。

2. 用官方 action:actions/ai-inference@v1

这个 action 封装了对 /inference/v1/chat/completions 的调用,支持的模型:

# 轻量任务(分类、总结、回答常见问题)
model: openai/gpt-4o-mini            # 最快、配额最宽
model: meta/llama-3.3-70b-instruct   # 开源首选

# 需要更强推理
model: openai/gpt-4o
model: anthropic/claude-3-5-sonnet
model: deepseek/deepseek-v3

推荐策略:triage 用 mini,assistant 用 mini(回答技术问题足够),summarize 用 mini。本项目统一全部 mini 够了。

3. 防死循环:过滤机器人触发

AI 发的评论自己看到了可能又触发一轮 AI。必须在触发条件里过滤:

if: >-
  github.event.comment.user.type != 'Bot' &&
  !contains(github.event.comment.body, '🤖 This comment was generated by AI')

两层保险:一层看 user type,一层看评论里是否有 AI 签名 marker。

4. 透明性:给每条 AI 回复加签名

每条 AI 生成的评论必须在末尾附一句:

---
<sub>🤖 This reply was generated by AI. Answers may be inaccurate —
please verify before acting on technical advice.</sub>

原因:

  • 防止和人类评论混淆
  • 给 workflow 做"识别自己之前产出"的 marker
  • 体现 AI 透明度(未来 GitHub / 监管可能会强制要求)

📝 Workflow 1: ai-triage.yaml —— 新 issue 自动分类

运行时效果

用户:打开 issue "构建报 lockfile error" ↓ AI 在 30 秒内: ① 识别是 bug 类 + 涉及 cli 包 ② 检查 body 只写了"报错了救救我"→ 判定 needs_info = true ③ 自动打标签: [bug, cli, needs-reproduction] ④ 回复评论: "你好 @xxx,谢谢反馈!能否提供一下完整错误日志和 pnpm-lock.yaml 的 git blame 信息?这样我们能更快定位。"

核心 prompt 设计

让模型输出 JSON 是关键——不然 workflow 没法用自然语言响应做 github-script 调用:

system-prompt: |
  Output STRICT JSON — no prose, no markdown fences:
  {
    "labels": string[],
    "category": string,
    "needs_info": boolean,
    "welcome_message": string
  }

然后在 github-script 里兜底清理:

const cleaned = raw
  .replace(/^```(?:json)?\s*/i, '')   // 模型偶尔包 ```json
  .replace(/\s*```\s*$/i, '')
  .trim();
const parsed = JSON.parse(cleaned);

JSON.parse 失败时用 core.warning 记录,不抛异常阻断——AI 偶尔会输出畸形 JSON,哑一次比把 workflow 打红好。

语言自适应

system-prompt: |
  - Detect the language of the issue and write welcome_message in that language
    (Chinese input → Chinese reply; English input → English).

中文 issue 自动中文回复,完全不用你自己做语言检测。


📝 Workflow 2: ai-assistant.yaml —— 评论 @ai-bot 触发问答

运行时效果

用户在某个 issue 评论: @ai-bot offline 包的 hashConcurrency 默认是多少?能改吗? 10 秒内: ① 评论出现 👀 表情反应(workflow 收到了) ② AI 回复一条详细评论,引用 packages/offline/src/index.ts 说明默认值 + 指向 packaging-deep-dive.md 文档 ③ 表情反应变成 👍(表示已回复)

关键:上下文拼接

AI 回答质量 = Prompt 里喂了多少相关信息。本 workflow 拼 4 层上下文:

┌──────────────────────────────┐ │ Layer 1: System prompt │ ← 仓库角色设定 ├──────────────────────────────┤ │ Layer 2: README (前 100 行) │ ← 项目背景 ├──────────────────────────────┤ │ Layer 3: issue title + body │ ← 当前讨论主题 ├──────────────────────────────┤ │ Layer 4: 最近 5 条评论 │ ← 上下文脉络 ├──────────────────────────────┤ │ Layer 5: 用户问题 │ ← 去掉 @ai-bot 前缀 └──────────────────────────────┘

用 sparse-checkout 只拉 README(秒级完成),不用 full clone:

- uses: actions/checkout@v4
  with:
    sparse-checkout: |
      README.md
      packages/*/README.md
      apps/docs/docs
    sparse-checkout-cone-mode: false

为什么限制"不改代码"

system-prompt: |
  Never claim to have made code changes — you only answer questions.
  If the question asks you to change code, kindly redirect: suggest the user
  open a PR or ping a maintainer.

理由:

  • 改代码要权限链、diff review、测试验证——轻量方案不值得
  • 防止 AI 误导用户"我已经帮你改好了"(幻觉)
  • 真要改代码用 Claude Code Action 或 Copilot Coding Agent(另外文章讲)

📝 Workflow 3: ai-summarize.yaml —— 长讨论串 TL;DR

运行时效果

issue #42 有 35 条评论,各路讨论混在一起 ──▶ 维护者打上 'ai-summary' 标签 ──▶ AI 30 秒内生成: 📋 Summary: 用户在 @lhx-kit/offline 的哈希并发配置上遇到了 Node 18 兼容问题。 🗣️ Key points discussed: - @alice 最早报告在 concurrency=16 时 Node 18 内存泄漏 - @bob 确认 Node 20 无此问题 - @maintainer 提议降默认值到 8 ✅ Decisions / agreements reached: - 默认 hashConcurrency 从 16 降到 8 - 文档里补说明 ❓ Still open: - 是否需要同时保留 env 开关 ➡️ Suggested next step: 开 PR 改默认值 + 补文档。

防重复发总结

第二次再打标签时,应该替换旧总结而不是堆一堆。用 HTML 注释作为 marker:

// 发总结时插入 marker
const body = [
  '<!-- ai-summary-marker -->',
  summaryText,
  ...
].join('\n');

// 下次发新总结前扫评论删旧的
for (const c of comments) {
  if ((c.body || '').includes('<!-- ai-summary-marker -->')) {
    await github.rest.issues.deleteComment({ ... });
  }
}

自动取标签

发完总结立刻把 ai-summary 标签摘掉:

await github.rest.issues.removeLabel({
  name: 'ai-summary',
});

好处:

  • 状态清晰(标签存在 = 待处理;不存在 = 已处理)
  • 用户想刷新只要"取消→重新打"即可,天然触发新一轮总结

🛡️ 安全与配额

GitHub Models 的配额

仓库类型 限制
公开仓库 无官方硬限,实际很宽
私有仓库 每个 model 按天 / 按分钟有限制,普通项目够用
企业私有仓库 需要 enterprise 级 GitHub Copilot 订阅才开

查看当前 rate limit:/settings/actions/general 底部有显示。

防滥用

一个潜在风险:恶意用户在 issue 里疯狂 @ai-bot 消耗配额。本方案已包含 3 道防线:

  1. concurrency group:同一 issue 并发时取消旧的
  2. 触发条件过滤:非人类 user、含 AI 签名的评论都不跑
  3. timeout-minutes: 8:卡死自动断

如果进一步想做"只有仓库贡献者才能 @ai-bot":

if: >-
  startsWith(github.event.comment.body, '@ai-bot ') &&
  contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'),
           github.event.comment.author_association)

author_association 是 GitHub 原生字段,值为 OWNER/MEMBER/COLLABORATOR/CONTRIBUTOR/FIRST_TIME_CONTRIBUTOR/NONE。按需放宽。


🎨 落地配套:仓库 Labels 规划与批量创建

3 个 AI workflow 会大量 read/write 仓库 labels。workflow 本身不需要 label 预先存在(GitHub API 对不存在的 label 会自动创建),但提前建好有两个好处

  1. 颜色一致——自动创建的是随机灰色,逐个改颜色很累
  2. 语义分层——给维护者快速识别"哪些 label 是给人打的、哪些是 AI 打的"

📋 推荐的 label 矩阵

lhx-kit 目前用以下 3 类 22 个 label(比默认多 13 个):

类别 Labels 颜色 用途
GitHub 默认(9 个) bug / documentation / duplicate / enhancement / good first issue / help wanted / invalid / question / wontfix 默认 新建仓库自带
AI 相关(3 个) ai-summary #8957e5 打上触发 summarize workflow
ai-triaged #5319e7 ai-triage 运行完会盖这个章
needs-reproduction #fbca04 body 太短时 ai-triage 自动打
包 scope(8 个) cli config offline renderer runtime skills tsconfig vite-plugin 浅蓝 #c5def5 issue 影响到的具体包,ai-triage 按 scope 自动打
其他 scope(2 个) docs 深蓝 #1d76db apps/docs 文档站
engineering 绿 #0e8a16 CI / release / tooling

🛠️ 用 gh CLI 一次性批量创建

📖 完整的 gh 使用手册(登录、workflow 运维、PR/issue/release/secret 管理等)见 🔧 GitHub CLI 实战手册。下面只放建 label 所需的最小片段。

前置gh auth login -h github.com 已登录过一次,且 token 仍有效(gh auth status 看一眼)。

在仓库根目录批量建 label

cd /path/to/lhx-kit  # gh 靠 git remote 识别仓库,必须 cd 进去

# ① AI 相关(3 个)
gh label create ai-summary         --color 8957e5 --description "Trigger AI to summarize the thread"   --force
gh label create ai-triaged         --color 5319e7 --description "Auto-triaged by AI bot"               --force
gh label create needs-reproduction --color fbca04 --description "Missing or incomplete reproduction steps" --force

# ② 包 scope(8 个,统一浅蓝 c5def5)
for p in cli config offline renderer runtime skills tsconfig vite-plugin; do
  gh label create "$p" --color c5def5 --description "Scope: @lhx-kit/$p" --force
done

# ③ 其他 scope(2 个)
gh label create docs        --color 1d76db --description "Scope: documentation site (apps/docs)" --force
gh label create engineering --color 0e8a16 --description "Scope: CI / release / tooling"         --force

# 验证
gh label list --limit 100 --json name | jq '.[].name' | sort
# 期望看到 22 个名字

--force 的作用:label 已存在则 PATCH 颜色/描述,不存在则创建——幂等,可反复跑

⚠️ 3 个易踩的小坑

  • 别用 && 串联:任何一个失败会中断后续命令。用 for 循环或分号 ;
  • Watch 超时:某些终端对长命令有 watchdog 超时,一行塞 15 个 gh label create 可能被截断。分段跑每次 8~10 条稳。
  • 必须在仓库目录gh 不带 --repo 时靠 git remote get-url origin 反推仓库。

📖 关于 gh auth login 的完整交互问答(HTTPS vs SSH 的选择、8 位 device code 流程、网络抖动时的 EOF 报错如何判断真实登录状态)——见 🔧 GitHub CLI 实战手册 §场景 1


🚀 路径地图:轻量做完之后怎么升级

阶段 方案 能力
本篇(已完成) GitHub Models + 3 个轻量 workflow 分类 / 问答 / 总结
下一步(已完成 ✅) 多模型 PR review + AI 改代码(见"AI 协作策略") 双 AI 评审 + 确定性 autofix + 受控 AI 修复 + AI 文档助手
进阶 接入 anthropics/claude-code-action 升级某条 workflow 用 Claude 3.5 Sonnet(需 API key,$5-10/月)
企业版 开 Copilot Enterprise + Coding Agent 真正的 AI 工程师,@Copilot 派任务

每一阶能力强度翻倍,但复杂度和风险面也扩大。升级路线请仔细读 AI 协作策略 里的"安全门"和"prompt 陷阱"两节再落地。


🔧 常见问题

问题 解法
workflow 触发了但没反应 检查 permissions: models: read 有没写;去 Actions 页面看具体 step 日志
403 Forbidden on AI inference models: read 权限没开,或仓库在组织里且组织禁用了 Models
AI 回复是英文但 issue 是中文 system prompt 里加 "Reply in the SAME language as the input"(本模板已加)
回复里包含乱码 \n\n 检查 max-tokens 是否被截断;prompt 结尾加 "Keep under N words"
issue 打开没触发 workflow issues 事件默认不会在仓库 fork 后从 fork 触发 master,只在主仓发 issue 才触发
AI 评论自己又被 triage 识别成 issue 加了 github.event.issue.user.login != 'github-actions[bot]' 过滤

📚 相关资料


📖 专栏内其他文章