bilibili.com/video/BV1xpVQ6xERh/?spm_id_from=333.1387.upload.video_card.click
Code Review Agent 是一个代码审查场景的 AI 辅助审查工具。它可以拉取 Pull Request (自动或手动)或指定分支差异,结合依赖关系、静态扫描、团队规则和项目规则生成结构化审查结果,并在 Web 控制台中展示风险、证据、上下文和后续追问。
给谁用?
只要你想用,谁都可以用。主要是给开发者使用。
它解决的核心问题是:传统代码审查高度依赖人工经验,容易遗漏跨文件影响、重复审查相同代码、静态扫描结果缺少上下文判断,且审查结论难以沉淀成团队规则。Code Review Agent 通过“Git diff + 依赖分析 + 静态扫描 + AI map-reduce + 规则/偏好沉淀”的组合,把审查过程自动化、结构化、可追踪。
| 功能 | 解决的问题 |
|---|---|
| 手动发起审查 | 支持在控制台输入仓库、baseRef、headRef 和可选访问 token,适合本地验证、非 webhook 场景或临时审查。 |
| GitHub PR Webhook | PR opened、synchronize、reopened、ready_for_review 时自动触发审查,减少人工操作。 |
| GitHub OAuth 和 Webhook 注册 | 支持绑定代码托管账号,并为仓库注册 webhook,降低接入成本。 |
| Git 差异采集 | 自动 clone 仓库、解析 base/head commit、获取 changed files 和 unified diff,为后续分析提供准确输入。 |
| 依赖图和影响面分析 | 根据源码 import/export 关系推断受影响文件,避免只看直接变更文件。 |
| 分块审查 Chunk Planner | 将变更按文件、依赖和 diff 拆成审查单元,控制上下文规模,并支持并发 AI 审查。 |
| 静态扫描 | 内置 ESLint 扫描,并可接入 Sonar 报告或命令,先用确定性规则发现基础问题。 |
| AI Map-Reduce 审查 | Map 阶段逐块审查,Reduce 阶段汇总全局变更、影响范围、风险计数和测试建议。 |
| 增量复用 | 对 fingerprint 未变化的 chunk 复用上次审查结果,减少重复调用模型和等待时间。 |
| 团队规则和项目规则 | 将团队约定、项目特殊规范注入审查 prompt,让 AI 审查更贴近本团队上下文。 |
| 忽略偏好 | 用户可忽略某类 rule 或 tag,后续审查自动过滤相同偏好,降低噪音。 |
| 问题追问 | 对单个 finding 继续提问,结合 chunk、diff、上下文和历史问答生成解释。 |
| Web 控制台 | 展示审查列表、结构化摘要、文件树、diff、finding、追问、忽略偏好、规则和集成配置。 |
| MySQL 持久化 | 可选择将审查结果、规则、连接信息和追问历史落库;未配置数据库时使用内存存储。 |
项目采用 npm workspaces 管理 apps/api、apps/web 和 packages/shared。这样可以让前后端共享类型定义,同时保持 API、Web 和共享包的边界清晰。
前后端和共享模型都使用 TypeScript,适合审查结果、finding、chunk、规则、OAuth 等结构化数据较多的场景。类型定义集中在 packages/shared,能减少接口漂移。
后端使用 Fastify 提供 API、Webhook、OAuth callback 和健康检查。Fastify 启动快、插件模型简单、适合这种轻量 API 服务。
前端使用 Vue 3 和 Vite。Vite 提供快速本地开发体验,Vue 组合式 API 适合将审查控制台中的状态、筛选、追问、规则管理等交互拆到 composable 中。
接口输入使用 Zod 做运行时校验,避免 webhook payload、手动审查请求、OAuth callback 等外部输入直接进入业务逻辑。
一次 PR 可能包含很多文件,直接把完整 diff 发给模型会遇到上下文长度、成本和稳定性问题。因此这里采用 Map-Reduce:
- Map:按 chunk 并发审查,聚焦局部 diff、上下文和静态扫描结果。
- Reduce:汇总所有 chunk 和 findings,生成全局摘要、影响范围和风险计数。
纯 AI 审查容易产生幻觉,纯静态扫描又缺少业务上下文。当前方案先运行 ESLint/Sonar,再将静态结果作为 AI 输入;最终 finding 标记来源,如 ai、static-ai-adjudicated、local-adjudicator,便于判断可信度。
未配置 DATABASE_URL 时使用内存仓储,方便本地快速启动;配置 MySQL 后使用正式持久化,适合长期运行和 webhook 场景。
- Node.js 20+,建议使用当前 LTS。
- npm。
- Git 命令行。
- 可选:MySQL 8+。
- 可选:Sonar Scanner 或能产出 Sonar issues JSON 的工具。
npm install复制 API 环境变量模板:
cp apps/api/.env.example apps/api/.env常用配置如下:
| 变量 | 说明 |
|---|---|
PORT |
API 端口,默认 3001。 |
DASHSCOPE_API_KEY |
DashScope API Key;不配置时会退化为本地裁决/静态扫描结果,AI 能力不可用。【sk-c7d8993a9d17412aa19c11d5bb1a24e6(这是我都aliyun API KEY额度9元)】 |
DASHSCOPE_BASE_URL |
DashScope 兼容模式地址,默认 https://dashscope.aliyuncs.com/compatible-mode/v1。 |
MAP_MODEL |
Map 阶段模型,默认 qwen-plus。 |
MAP_DEEP_MODEL |
大上下文或复杂变更时使用的 Map 模型,默认 qwen-max。 |
MAP_DEEP_MODEL_CONTEXT_BYTES |
触发 deep model 的上下文字节阈值,默认 120000。 |
MAP_DEEP_MODEL_CHANGED_FILES |
触发 deep model 的变更文件数阈值,默认 8。 |
MAP_CONCURRENCY |
Map 阶段并发数,默认 4。 |
MODEL_REQUEST_TIMEOUT_MS |
模型请求超时时间,默认 60000。 |
REDUCE_MODEL |
Reduce 阶段模型,默认 qwen-max。 |
DATABASE_URL |
MySQL 连接串;不配置时使用内存存储。(示例:mysql://root:123456@192.168.111.111:3306/code_review_agent)【SQL文件在apps\api\schema.sql】 |
CONSOLE_BASE_URL |
Web 控制台地址,默认本地开发通常为 http://127.0.0.1:5173。 |
API_BASE_URL |
API 对外地址,webhook 注册时会用到。 |
OAUTH_STATE_SECRET |
OAuth state 签名密钥。 |
GITHUB_OAUTH_CLIENT_ID / GITHUB_OAUTH_CLIENT_SECRET |
GitHub OAuth App 配置。 |
GITHUB_WEBHOOK_SECRET |
GitHub webhook 签名校验密钥。 |
GITHUB_API_TOKEN |
读取 PR metadata 或注册 webhook 时使用的 GitHub token。 |
SONAR_SCANNER_COMMAND |
可选,执行 Sonar 扫描的命令。 |
SONAR_ISSUES_REPORT_PATH |
可选,Sonar issues JSON 报告路径。 |
GIT_COMMAND_TIMEOUT_MS |
Git/Sonar 命令超时时间,默认 45000。 |
GIT_COMMAND_MAX_BUFFER |
Git/Sonar 命令输出 buffer,默认 10485760。 |
分别启动 API 和 Web:
npm run dev:api
npm run dev:web或使用根目录脚本同时启动:
npm run dev默认地址:
- API:
http://127.0.0.1:3001 - Web:
http://127.0.0.1:5173
npm run build
npm test- 审查成本高:Reviewer 需要手动打开 diff、理解上下文、定位风险,耗时且受经验影响大。
- 只看变更文件不够:很多问题来自调用链、依赖关系和间接受影响文件,人工审查容易漏掉。
- 静态扫描噪音多:ESLint/Sonar 能找到基础问题,但无法判断业务影响、是否命中新增代码、是否值得阻塞合并。
- 重复审查浪费时间:PR 多次提交后,未变化的代码会被反复审查。
- 团队规范难沉淀:约定常散落在文档、口头经验或 reviewer 习惯里,难以稳定注入每次审查。
- 审查结论难追踪:人工评论缺少统一结构,后续追问、忽略偏好和历史复用不容易管理。
- 触发审查:通过手动表单、API 或 GitHub PR webhook 创建审查任务。
- 创建记录:后端生成 queued review,并查找同一 PR 的上一次完成审查,用于增量复用。
- 拉取仓库:克隆目标仓库,解析 base/head ref 对应的 commit SHA。
- 计算差异:获取 changed files 和 unified diff。
- 构建依赖图:分析源码依赖关系,推断 impacted files 和 related files。
- 拆分审查单元:按变更文件、依赖关系和 diff 创建 chunks,并附加代码上下文。
- 增量复用判断:对 fingerprint 未变化的 chunk 复用上次结果,只重新审查变化部分。
- 运行静态扫描:对待审查 chunk 执行 ESLint,并可合并 Sonar findings。
- 加载规则和偏好:读取团队规则、项目规则和用户忽略偏好。
- AI Map 审查:并发审查各 chunk,生成结构化 findings。
- AI Reduce 汇总:汇总 chunk、findings 和风险计数,生成全局摘要。
- 保存结果并通知:持久化 review、chunks、findings,必要时向平台发送 queued/completed/failed 通知。
- 控制台查看和追问:前端展示结果,支持筛选风险、查看 diff、忽略 finding 和追问。
fastify:HTTP API 服务。@fastify/cors:跨域配置。dotenv:加载环境变量。zod:请求、配置和外部报告的运行时校验。mysql2:MySQL 持久化。eslint:内置静态扫描。@typescript-eslint/parser:支持 TypeScript/TSX 语法扫描。ts-morph:构建源码依赖关系。tsx:本地开发时运行 TypeScript。vitest:测试框架。
vue:Web 控制台框架。vite:前端开发服务器和构建工具。vue-tsc:Vue TypeScript 类型检查。lucide-vue-next:图标库。markdown-it:渲染 AI 返回的 Markdown 内容。dompurify:清洗 Markdown HTML,降低 XSS 风险。vitest:前端单元测试。
- Git:clone、diff、commit SHA 解析。
- GitHub:OAuth、Pull Request metadata、Webhook。
- DashScope:AI 审查模型服务。
- Sonar/SonarQube:可选静态扫描输入。
- MySQL:可选持久化存储。
- 代码托管平台目前主要面向 GitHub,其他平台还没有完整接入。
- AI 模型客户端当前面向 DashScope 兼容模式,暂未抽象成多供应商配置。
- 依赖图分析主要适合 JavaScript/TypeScript 项目,其他语言需要扩展解析器。
- Sonar 集成依赖外部命令或报告路径,项目本身不负责 Sonar 服务配置。
- 未配置 MySQL 时使用内存存储,重启后审查记录、规则和偏好会丢失。
- Webhook 场景需要 API 有公网可访问地址,本地开发通常需要 ngrok、内网穿透或反向代理。
- 当前源码中存在部分中文字符串编码异常,可能影响界面文案和错误信息展示,需要后续统一修复编码。
- 支持更多代码托管平台,如 GitLab、Gitee。
- 抽象模型供应商
- 扩展多语言依赖图和静态扫描能力。
- 增加审查任务队列、重试、超时恢复和更完整的运行状态追踪。
- 支持直接回写 PR review comments 或 check run 状态。
- 增加组织级规则模板、规则版本管理和审查效果统计。
- 优化前端文案编码、空状态、失败恢复和大 diff 性能。
- 编辑器插件
- 通过编辑器插件一键替换建议代码
- 通过编辑器插件一键生成总结