8.0 KiB
8.0 KiB
GPT Workflows
本项目使用 GPT 驱动的 GitHub Actions 工作流辅助 PR 审查。
架构概览
.github/
├── actions/ # 公共 Composite Actions
│ ├── gather-pr-diff/action.yml # 收集 PR diff 和变更文件列表
│ ├── read-file-contents/action.yml # 按优先级读取变更文件内容
│ └── call-openai/action.yml # 调用 OpenAI API(含重试逻辑)
└── workflows/
├── gpt-review.yml # 代码质量审查
├── gpt-pr-assessment.yml # PR 价值评估
└── pr-checks.yml # PR 检查入口(触发 gpt-review + gpt-pr-assessment)
两个 GPT 工作流对比
| GPT Review | GPT PR Assessment | |
|---|---|---|
| 目的 | 代码质量审查(bug、安全、性能) | 维护者价值评估(合并优先级、风险) |
| 角色 | 代码审查专家 | 项目维护者 / 技术负责人 |
| 触发 | PR 创建时自动触发(via pr-checks.yml)+ 手动触发(workflow_dispatch) | 外部贡献者 PR 自动触发(via pr-checks.yml)+ 手动触发(workflow_dispatch) |
| 额外数据 | 无 | 关联 Issue 内容 |
| 输出方式 | PR Review(createReview) | Issue Comment(可更新,不重复创建) |
| 输出模板 | 按严重性分级的问题列表 | 7 维度结构化评估报告 |
公共 Actions
三个 Composite Action 封装了两个工作流的公共逻辑,避免重复代码:
gather-pr-diff
收集 PR 的 diff 和变更文件列表。
- 输入:
pr_number(手动触发时需要) - 输出:
skip,pr_number,additions,deletions,total_lines,file_count,diff_truncated - 临时文件:
pr_diff.txt,file_list.json(写入RUNNER_TEMP)
read-file-contents
按优先级顺序读取变更文件的完整内容,供 GPT 做跨文件分析。
- 输出:
contents_truncated - 临时文件:
file_contents.txt(写入RUNNER_TEMP) - 前置条件: 需要先运行
checkout和gather-pr-diff - 限制: 跳过锁文件/二进制文件,总内容上限 80K 字符
文件读取优先级(由高到低):
packages/desktop/src/process/,packages/desktop/src/process/agent/,packages/desktop/src/process/webserver/— 核心后端packages/desktop/src/process/channels/— Agent 通信packages/desktop/src/common/— 公共模块packages/desktop/src/process/worker/— Worker 进程packages/desktop/src/renderer/— 前端 UI- 其他
.ts/.tsx/.js/.jsx文件 - 其余文件
call-openai
调用 OpenAI Chat Completions API,包含自动重试、截断提示和长度限制处理。
- 输入:
openai_api_key,output_file,diff_truncated,contents_truncated - 临时文件读取:
system_prompt.txt,user_prompt.txt(从RUNNER_TEMP读取) - 临时文件写入:
{output_file}(写入RUNNER_TEMP) - 模型:
gpt-5.2 - 重试策略: 最多 2 次重试,指数退避(429/5xx 状态码和网络错误)
数据流
┌─────────────────────┐
│ gather-pr-diff │
│ (GitHub API) │
└────────┬────────────┘
│
pr_diff.txt, file_list.json
│
┌──────────────┼──────────────┐
│ │ │
▼ │ ▼
┌────────────────┐ │ ┌───────────────────┐
│ read-file- │ │ │ fetch PR metadata │
│ contents │ │ │ + linked issues │
│ (本地文件系统) │ │ │ (assessment only) │
└───────┬────────┘ │ └────────┬──────────┘
│ │ │
file_contents.txt │ pr_meta.json,
│ │ linked_issues.json
└──────┬───────┘ │
│ │
▼ │
┌──────────────────┐ │
│ Construct GPT │◄───────────┘
│ Prompts │
│ (各工作流自定义) │
└────────┬─────────┘
│
system_prompt.txt, user_prompt.txt
│
▼
┌──────────────────┐
│ call-openai │
│ (OpenAI API) │
└────────┬─────────┘
│
{output_file}
│
▼
┌──────────────────┐
│ Post Comment │
│ (各工作流自定义) │
└──────────────────┘
语言检测
两个工作流都会自动检测 PR 标题和描述的语言,并使用相同语言输出回复:
- PR 内容为中文 → 中文评论
- PR 内容为英文 → 英文评论
- 混合或无法判断 → 默认英文
使用方式
GPT Review(自动 + 手动触发)
自动触发:通过 pr-checks.yml 在 PR 首次提交时自动触发,无需手动操作。
手动触发:
- 进入 GitHub 仓库 → Actions 页面
- 左侧选择 GPT Review
- 点击 Run workflow
- 输入 PR number
- 等待执行完成,审查结果将以 PR Review 形式出现
GPT PR Assessment(自动 + 手动触发)
自动触发:当非项目成员(即 author_association 既不是 OWNER 也不是 MEMBER)首次提交 PR 时,pr-checks.yml 会在代码质量检查通过后自动触发评估。
手动触发:
- 进入 GitHub 仓库 → Actions 页面
- 左侧选择 GPT PR Assessment
- 点击 Run workflow
- 输入 PR number
- 等待执行完成,评估报告将作为评论出现在 PR 中
重复对同一 PR 触发时,评论会被更新而非重复创建。
Secrets 配置
| Secret | 用途 |
|---|---|
OPENAI_API_KEY |
OpenAI API 访问密钥,两个工作流共用 |
修改指南
- 更换模型: 修改
.github/actions/call-openai/action.yml中的model字段 - 调整重试逻辑: 修改
.github/actions/call-openai/action.yml中的callOpenAI函数 - 修改文件优先级: 修改
.github/actions/read-file-contents/action.yml中的filePriority函数 - 修改 Review prompt: 修改
gpt-review.yml中的 "Construct GPT prompts" step - 修改 Assessment prompt: 修改
gpt-pr-assessment.yml中的 "Construct GPT prompts" step