面向内网 Git 托管平台(华为 CodeHub / CodeArts Repo)的自动化 AI 代码检视系统。
核心链路复用阿里开源 OpenCodeReview(OCR) 与 code-review-graph(CRG):
MR 创建/更新(目标分支匹配 develop*)
│
▼
取 Git diff(本地 git 或服务端机器人镜像)
│
▼
OCR 确定性阶段:文件筛选 + 规则匹配
│
▼
CRG 链路审视:Tree-sitter 图谱 + blast-radius(可选)
│
▼
DeepSeek V4 Flash(内网 OpenAI 兼容接口)生成检视意见
│
▼
结构化解析 + 位置校验 + 去重
│
▼
本地报告 / CodeHub 行内检视意见(DiffNote)+ 总结评论
| 形态 | 触发方式 | 部署 | 产物 |
|---|---|---|---|
| 本地 agent(保留现有 demo) | 用户在 AI 工具里说"帮我检视代码" | 用户电脑一键安装 | 检视报告 |
| 中心服务(本仓库新增) | CodeHub Webhook 自动触发 | 一台内网服务器 | CodeHub MR 行内评论 + 总结 |
两者共用同一套检视链路(OCR + CRG + DeepSeek),只是入口和出口不同。
code-review-master/
├── README.md # 本文档
├── config.example.json # 中心服务配置模板
├── docs/
│ ├── dependencies.md # 依赖清单(服务器离线手动安装必读)
│ └── HANDOFF.md # 交接文档(给下一个 AI 的完整任务说明)
├── rules/ # 自定义检视规则(OCR --rule)
│ ├── rule.json # 规则索引(path -> 规则文档)
│ └── docs/ # 规则文档目录(.md,用户自己补充)
├── scripts/
│ ├── install_local.ps1 # 本地 agent 一键安装(Windows)
│ ├── install_local.sh # 本地 agent 一键安装(macOS/Linux)
│ ├── install_server.ps1 # 中心服务安装(Windows)
│ └── install_server.sh # 中心服务安装(Linux)
├── server/ # 中心服务(Python 标准库实现,离线可跑)
│ ├── reviewbot/ # 核心代码
│ └── ...
└── tests/ # 单元测试(unittest)
cd 你的项目目录
./scripts/install_local.ps1脚本会:检查 git/node/python 版本 → 安装 @alibaba-group/open-code-review(OCR)与 code-review-graph(CRG)→ 写入 OCR 的模型配置(从环境变量 OCR_LLM_URL / OCR_LLM_AUTH_TOKEN / OCR_LLM_MODEL 读取)→ 复制 rules/ 模板到当前目录。
之后在你的 AI 工具(Codex/Claude/Cursor 等)里说"帮我检视代码",AI 调用 ocr review 完成检视。也可以直接用命令行:
ocr review --from origin/main --to HEAD --format json服务器无法联网 npm install / pip install,请先按 docs/dependencies.md 手动装好依赖,然后:
# 1. 生成配置
Copy-Item config.example.json config.json
# 2. 编辑 config.json:目标分支、机器人账号、模型地址等
# 3. 设置环境变量(密钥不进配置文件)
$env:CODEHUB_API_BASE = "https://codehub.internal/api" # 占位,按内网实际地址改
$env:CODEHUB_API_TOKEN = "机器人账号 token"
$env:CODEHUB_BOT_USER = "bot"
$env:CODEHUB_BOT_TOKEN = "机器人 git 账号 token"
$env:CODEHUB_WEBHOOK_SECRET = "webhook 签名密钥"
$env:OCR_LLM_URL = "https://llm.internal/v1/chat/completions" # 占位,按公司默认配置改
$env:OCR_LLM_AUTH_TOKEN = "" # 本地拿不到 key 时留空,由公司默认配置注入
$env:OCR_LLM_MODEL = "deepseek-v4-flash"
# 4. 启动
py -m reviewbot.cli serve --config config.json然后在 CodeHub 的仓库设置里添加 Webhook:URL 填 http://服务器IP:8123/webhook/codehub,勾选合并请求事件,密钥与 CODEHUB_WEBHOOK_SECRET 一致。
| 配置项 | 说明 | 示例 |
|---|---|---|
service.port |
Webhook 监听端口 | 8123 |
service.webhook_path |
Webhook 路径 | /webhook/codehub |
service.bot_marker |
检视评论标识,用于去重 | [AI检视] |
target_branches |
触发检视的目标分支通配符 | ["develop*"](匹配 develop、develop-v2、develop/2026…) |
exclude_branches |
排除的分支 | ["develop-release"] |
git.clone_url_template |
机器人克隆地址模板,{repo_path} 会被替换 |
https://${CODEHUB_BOT_USER}:${CODEHUB_BOT_TOKEN}@${CODEHUB_HOST}/git/{repo_path}.git |
codehub.api_base_env |
环境变量名,提供 CodeHub API 地址 | CODEHUB_API_BASE |
codehub.api_token_env |
环境变量名,提供机器人 API token | CODEHUB_API_TOKEN |
ocr.rule_file |
自定义规则索引(相对本文件所在目录) | rules/rule.json |
ocr.concurrency |
OCR 并发文件检视数 | 8 |
graph.enabled |
是否启用 CRG 链路审视 | true |
severity_map |
OCR 严重度 → CodeHub 严重度映射 | critical → fatal |
post.dedupe |
同一 MR 同一 head 已检视过则跳过 | true |
post.max_inline |
行内评论上限,超出走总结 | 50 |
规则目录是 rules/,对应 OCR 的 --rule 参数。格式:
// rules/rule.json
{
"default_rule": "default.md",
"path_rule_map": {
"**/*.py": "python.md",
"**/*.java": "java.md"
}
}rules/docs/ 下放对应的 .md 规则文档,OCR 会按文件路径匹配并注入检视。当前只有模板(python.md.example),自定义规则留空待补充——你们后续把公司规范整理成 md 放进 rules/docs/ 并在 rule.json 里登记即可,不需要改代码。
- 所有密钥(CodeHub token、模型 token、webhook secret)只从环境变量读取,不进配置文件、不进代码、不写日志。
- 代码只在公司内网流转:检视在服务器/用户本地执行,模型走内网 DeepSeek 接口。
- 服务端为机器人账号维护仓库镜像(
git clone),用于 OCR/CRG 计算 diff,不依赖外部 MCP。 - OCR 检视失败时默认fail-open:不影响 MR 流程,只记录日志/发一条提示。
- 检视意见贴错行:OCR 自带定位模块,且我们在回贴前会用真实 diff 的 refs 校验;如果内网 CodeHub 的 API 字段不同,调整
server/reviewbot/codehub.py里的 endpoint 模板即可。 - 同一个 MR 重复检视:
post.dedupe开启后,服务会先查该 MR 是否已存在包含bot_marker+ head SHA 的检视意见,有则跳过,省 token。 - 只检视部分分支:改
target_branches即可,例如["develop*", "release/*"]。
cd server
py -m unittest discover -s ../tests -p "test_*.py"