一个面向 GitHub Pull Request 的 AI 代码评审 demo。用户输入公开 PR URL 后,系统会拉取 PR 元信息、changed files 和 diff,生成风险概览、文件风险排行、结构化 review findings、测试建议、PR 准备产物,并提供可复制的 GitHub 评论 Markdown 预览。
项目同时保留离线演示数据:即使没有 GitHub token 或 LLM key,也可以展示完整 UI 流程。
- 输入公开 GitHub PR URL,异步创建分析任务并通过 SSE 展示进度。
- 支持快速、标准、深度三种分析模式,可取消任务、失败重试、查看历史报告。
- 拉取 PR 标题、描述、作者、分支、commits、changed files 和 patch。
- 通过规则识别高风险文件:认证/授权、支付、数据库、迁移、安全、配置、错误处理、并发、性能、测试缺失等。
- 为大 PR 使用 diff budgeter:优先保留高风险文件完整 patch,压缩中等风险 patch,对低价值或超预算文件只保留摘要上下文。
- 可接 OpenAI-compatible
/chat/completions生成结构化中文评审;未配置或调用失败时自动降级到规则分析和启发式 findings。 - 生成 PR 准备产物:建议标题、类型、labels、PR 描述、walkthrough、changelog、相似 issue/PR、非阻塞改进建议和文档建议。
- 提供报告追问能力:可针对整体报告、单个 finding、单个文件追问,也可请求修复代码或测试用例。
- 前端展示摘要、上下文覆盖、风险文件、findings、测试建议、PR 准备稿、改进建议、相似历史项和 GitHub 评论预览。
backend/
app/
main.py # FastAPI app entrypoint 和 CORS
api/ # analyze/report/demo/qa 路由
analyzer/ # 风险分类、diff budget、上下文收集、review、验证、产物生成
db/ # SQLite/SQLAlchemy 模型和轻量迁移
github/ # PR URL 解析和 GitHub REST client
llm/ # OpenAI-compatible provider
models/ # Pydantic schemas
tests/ # 后端测试
frontend/
src/
main.tsx # React UI
api/ # API client
data/ # 离线 demo report
types/ # TypeScript report types
action/
action.yml # Composite GitHub Action 示例
.github/workflows/
ai-pr-review.yml # 示例 workflow
推荐在仓库根目录执行:
cd backend
python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txt
copy .env.example .env
python -m uvicorn app.main:app --reload --host 127.0.0.1 --port 8765使用 python -m uvicorn 可以确保走当前虚拟环境。若 Windows 上遇到端口绑定问题,可换成其他端口。
cd frontend
npm install
$env:VITE_API_BASE_URL='http://127.0.0.1:8765'
npm run dev打开 http://127.0.0.1:5173。如果后端、GitHub 或 LLM 暂不可用,可以点击“加载演示”查看离线报告。
后端从仓库根目录 .env 和 backend/.env 读取配置,常用项如下:
GITHUB_TOKEN=
LLM_API_KEY=
LLM_BASE_URL=https://api.openai.com/v1
LLM_MODEL_FAST=gpt-4.1-mini
LLM_MODEL_STRONG=gpt-4.1
LLM_MODEL_MULTIMODAL=gpt-4.1
LLM_TIMEOUT_SECONDS=180
LLM_RETRY_TIMEOUT_SECONDS=90
LLM_QA_TEMPERATURE=0.3
LLM_MAX_CONTEXT_MESSAGES=20
MAX_FILES=80
MAX_PATCH_CHARS=14000
MAX_CONTEXT_FILES=20
MAX_CONTEXT_FILE_CHARS=40000
MAX_RELATED_FILES=12
MAX_HISTORY_ITEMS=10
MAX_GITHUB_PAGES=4
ALLOW_LOCALHOST_DEV_ORIGINS=true
# DATABASE_URL=sqlite:///./ai_pr_review.db说明:
GITHUB_TOKEN:可选的 GitHub Personal Access Token,提高 API 限额(匿名访问极易触发 403),并支持私有仓库访问。LLM_API_KEY:LLM 服务的 API Key。未配置时系统仍会返回规则分析和离线 demo,不会报错。LLM_BASE_URL:OpenAI-compatible 的/chat/completions端点地址,可切换到其他兼容服务。LLM_MODEL_FAST:Fast 模式下使用的模型,负责 PR 摘要、风险粗筛、测试建议;强模型超时时也会用此模型重试。LLM_MODEL_STRONG:Standard / Deep 模式下使用的模型,负责高风险文件深度审查、安全/正确性分析、跨文件逻辑判断。LLM_MODEL_MULTIMODAL:当 Q&A 附带图片时使用的多模态模型。LLM_TIMEOUT_SECONDS:单次 LLM 调用的超时秒数,超时后将使用 fast 模型重试。LLM_RETRY_TIMEOUT_SECONDS:超时重试时 fast 模型的超时秒数。LLM_QA_TEMPERATURE:Q&A 对话中 LLM 的 temperature 参数,控制回复随机性。LLM_MAX_CONTEXT_MESSAGES:Q&A 对话保留的最大历史消息数。MAX_FILES:单次分析最多拉取的 PR 变更文件数。MAX_PATCH_CHARS:所有文件 patch 合计的最大字符数,超出后由 diff budgeter 按优先级裁剪。MAX_CONTEXT_FILES:上下文收集器最多补充的周边文件数(README、配置、测试等)。MAX_CONTEXT_FILE_CHARS:上下文收集器补充内容的合计最大字符数。MAX_RELATED_FILES:最多查找的相关测试/配置文件数。MAX_HISTORY_ITEMS:GitHub issue/PR 历史搜索最多返回的条目数。MAX_GITHUB_PAGES:GitHub API 分页获取的最大页数。ALLOW_LOCALHOST_DEV_ORIGINS:是否允许 localhost 来源的 CORS 请求,本地开发时建议开启。DATABASE_URL:SQLite 数据库路径,默认为backend/ai_pr_review.db。轻量迁移逻辑在启动时自动补齐新增列。
前端默认 API 地址是 http://127.0.0.1:8000,本地推荐用:
VITE_API_BASE_URL=http://127.0.0.1:8765POST /api/analyze-pr:创建异步分析任务。GET /api/reports:列出最近报告。GET /api/reports/{report_id}:获取报告状态。GET /api/reports/{report_id}/events:SSE 进度流。GET /api/reports/{report_id}/result:获取完整报告结果。POST /api/reports/{report_id}/retry:基于原 PR URL 和模式创建重试任务。POST /api/reports/{report_id}/cancel:请求取消运行中的任务。POST /api/reports/{report_id}/comment:返回 dry-run 评论 Markdown;comment_type支持summary、full、artifacts。POST /api/reports/{report_id}/qa:基于报告上下文追问,qa_type支持qa、fix_request、test_gen。GET /api/reports/{report_id}/qa/history:获取追问历史。GET /api/reports/{report_id}/qa/suggestions:获取建议追问。GET /api/demo-report:返回离线 demo 报告。
GET /api/reports/{report_id}/result 的核心字段包括:
summary:变更摘要、风险概览、评审重点。file_risks:文件风险等级、分数、原因、维度和 patch。findings:问题标题、等级、置信度、文件、行号、证据、影响、建议。test_suggestions:测试补充建议。generated_artifacts:PR 标题/类型/labels、描述、walkthrough、changelog、改进建议、文档建议、相似历史项。context_summary/review_context:上下文收集覆盖情况。github_comment_markdown:可复制的评论预览。
- Fast 模式主要关注 P0/P1 严重问题。
- Standard 模式聚焦高风险文件。
- Deep 模式覆盖更多文件和审查维度。
- 强模型超时时会尝试快模型重试;LLM 不可用时降级到规则分析。
- 提示词要求除代码、路径、枚举值、URL、label 名称外,所有解释性字段尽量使用简体中文。
- 风险分类器先基于文件路径、diff 规模、行为关键词、测试信号和上下文信号给文件排序。
- 上下文收集器会补充 changed hunk 周边代码、函数/类片段、相关测试、README/docs、配置文件和轻量历史 issue/PR。
- Diff budgeter 会根据模式和风险分配 review 输入预算,避免大 PR 直接截断掉全部后续文件。
- finding 必须有文件、变更行、证据、影响、建议和置信度。
- verifier 会过滤非变更文件、非变更行、证据不足、置信度过低和重复 findings。
- 风格类建议会降级为 P3 /
[建议],真实发布前只提供 dry-run Markdown 预览。
后端:
cd backend
$env:PYTHONPATH='.'
pytest前端构建检查:
cd frontend
npm run build常用合并前检查:
cd backend
$env:PYTHONPATH='.'
pytest
cd ..\frontend
npm run build测试覆盖 PR URL 解析、GitHub client、diff 解析、diff budgeter、风险分类、pattern analyzer、finding verifier、上下文收集、报告服务、artifact generator、OpenAI provider 和 CORS。
- 启动后端和前端。
- 输入公开 GitHub PR URL,选择快速/标准/深度模式,点击“开始分析”。
- 观察进度;需要时可以取消或对失败报告重试。
- 查看摘要、上下文覆盖、风险文件、具体 findings、测试建议、PR 准备稿和相似历史项。
- 使用“追问与交互”询问风险原因、请求修复代码或生成测试。
- 复制 GitHub 评论预览或 artifacts 预览,作为 dry-run 内容人工确认后再发布。
- 未配置
GITHUB_TOKEN时,GitHub 匿名 API 很容易触发403 rate limit exceeded。 - 旧报告内容已经写入 SQLite,不会因提示词或模板修改自动更新;需要重新分析才能得到新输出。
- 当前
commentAPI 只返回预览 Markdown,不会自动写回 GitHub。 - 不要提交
.env、虚拟环境、SQLite 数据库、node_modules或构建产物。
项目通过 docker compose 编排两个服务:backend(FastAPI + uvicorn,端口 8765)和 frontend(Nginx 静态服务 + 反向代理,端口 80)。前端 Nginx 将 /api/ 和 /health 请求代理到 backend 容器,无需分别暴露后端端口。
- Docker Engine 24+ 及
docker compose插件(或 Docker Desktop) - (可选)GitHub Personal Access Token 和 LLM API Key,用于完整 AI 审查功能;无凭证时系统会自动降级
在仓库根目录准备 .env 文件(可参照 backend/.env.example):
# 服务端口(宿主机映射端口,默认 8080)
APP_PORT=8080
# GitHub 与 LLM(不配置则降级为规则分析 / 离线演示)
GITHUB_TOKEN=ghp_xxxxxxxxxxxx
LLM_API_KEY=sk-xxxxxxxxxxxx
LLM_BASE_URL=https://api.openai.com/v1
LLM_MODEL_FAST=gpt-4.1-mini
LLM_MODEL_STRONG=gpt-4.1
LLM_MODEL_MULTIMODAL=gpt-4.1
# LLM 超时与重试
LLM_TIMEOUT_SECONDS=180
LLM_RETRY_TIMEOUT_SECONDS=90
# Q&A 参数
LLM_QA_TEMPERATURE=0.3
LLM_MAX_CONTEXT_MESSAGES=20
# 分析容量限制
MAX_FILES=80
MAX_PATCH_CHARS=14000
MAX_CONTEXT_FILES=20
MAX_CONTEXT_FILE_CHARS=40000
MAX_RELATED_FILES=12
MAX_HISTORY_ITEMS=10
MAX_GITHUB_PAGES=4
# Docker 内部使用 /data 目录持久化 SQLite
DATABASE_URL=sqlite:////data/ai_pr_review.db
# 生产环境应关闭 localhost CORS 宽松策略
ALLOW_LOCALHOST_DEV_ORIGINS=falsedocker-compose.yml 中所有环境变量均设有合理默认值,无需全量填写即可启动。
# 在仓库根目录执行
docker compose up --build -d首次构建会安装依赖并编译前端,耗时约 1–3 分钟。之后可直接使用:
docker compose up -d浏览器打开 http://127.0.0.1:8080(或自定义的 APP_PORT)。如果后端、GitHub 或 LLM 暂不可用,可以点击"加载演示"查看离线报告。
docker compose logs -f # 实时查看日志
docker compose logs backend # 仅查看后端日志
docker compose restart # 重启所有服务
docker compose down # 停止并删除容器(保留数据卷)
docker compose down -v # 停止并删除容器 + 数据卷(清空数据库)
docker compose pull # 拉取基础镜像更新
docker compose up -d --build # 重新构建并启动- 前端:多阶段构建 — 第一阶段用
node:22-alpine执行npm ci+npm run build,第二阶段用nginx:1.27-alpine托管静态产物。Nginx 配置 (frontend/nginx.conf) 同时承担 SPA 路由回退和/api/反向代理。 - 后端:基于
python:3.12-slim,通过uvicorn在容器内0.0.0.0:8765监听。/health端点供 Docker healthcheck 探活。 - 数据持久化:SQLite 数据库存储在命名卷
backend-data中,映射到容器内/data目录。docker compose down不会删除该卷,除非加-v参数。 - 网络:两个服务共享 Compose 默认网络,前端通过服务名
backend解析后端地址,无需公网暴露后端端口。
项目已部署至:http://dearxzh.asia:7989/