Open Code Review – 一款基于人工智能的代码审查命令行工具
Open Code Review 是一个基于人工智能的代码审查命令行(CLI)工具,旨在帮助开发者通过自动化的方式提升代码审查效率。
阿里巴巴把内部用了两年、审查了数百万缺陷的AI代码审查工具开源,它不走纯Agent路线,用确定性工程保证覆盖和位置准确,想落地AI代码审查的团队可以直接用。
OpenCodeReview
English | 简体中文 | 日本語 | 한국어 | Русский
什么是 Open Code Review?
Open Code Review 是一款 AI 驱动的代码审查 CLI 工具。它最初是阿里巴巴集团内部的官方 AI 代码审查助手——在过去两年里,它已服务了数万名开发者,并识别出数百万个代码缺陷。经过大规模充分验证后,我们将其孵化成了一个面向社区的开源项目。只需配置一个模型端点即可开始使用。
它会读取 Git diff,通过一个具备工具调用能力的智能体将变更文件发送给可配置的 LLM,并生成具有行级精度的结构化审查评论。该智能体可以读取完整文件内容、搜索代码库、检查其他变更文件以获取上下文,并产出深度审查——而不仅仅是表层的 diff 反馈。除了 diff 审查之外,ocr scan 还能审查整个文件,用于审计不熟悉的代码库或没有有意义 diff 的目录。
访问官方网站了解更多详情。
基准测试
与通用型智能体(Claude Code)相比,在相同底层模型下,Open Code Review 的精确率和F1显著更高,同时仅消耗约 1/9 的 token,并且完成审查的速度更快。需要注意的是,它的召回率低于通用型智能体——这是有意为之的权衡,优先保证精确率而非减少噪声。
一个基于50个热门开源代码仓库、200个真实 Pull Request 以及10种编程语言构建的真实世界代码审查基准——由 80 多位资深工程师交叉验证(1,505个标注的基准问题)。
| 指标 | 它衡量什么 | 为什么重要 |
|---|---|---|
| F1 | 精确率与召回率的调和平均数 | 衡量整体审查质量的最佳单一数值 |
| 精确率 | 所报告问题中属于真实缺陷的比例 | 越高 = 需要人工分诊的误报越少 |
| 召回率 | 发现的真实缺陷所占比例 | 越高 = 越少问题在审查中漏过 |
| 平均时间 | 每次审查的实际耗时 | 影响 CI 流水线的延迟 |
| 平均 Token | 每次审查消耗的 Token 总量 | 直接影响 API 成本 |
为什么要做 Open Code Review?
通用型智能体的问题
如果你用过 Claude Code 这类通用型智能体配合 Skills 做代码审查,很可能遇到过这些痛点:
- 覆盖不完整——面对较大的变更集时,智能体倾向于“偷工减料”,只选择性地审查部分文件,而遗漏其他文件。
- 位置漂移——报告的问题经常与实际代码位置不符,行号或文件引用偏离目标。
- 质量不稳定——自然语言驱动的技能难以调试,审查质量会随提示词的细微变化而大幅波动。
根本原因在于:纯语言驱动的架构对审查流程缺乏硬性约束。
核心设计:确定性工程 × 智能体混合
Open Code Review 的核心理念是将确定性工程与 AI 智能体相结合,各司其职、各展所长。
确定性工程——硬性约束
对于绝不能出错的审查步骤,由工程逻辑——而非语言模型——来保证正确性:
- 精确文件选择——准确判定哪些文件需要审查、哪些应被过滤,确保不遗漏任何重要变更。
- 智能文件打包 — 将相关文件归入同一个审查单元(例如
message_en.properties和message_zh.properties被打包在一起)。每个包作为一个拥有隔离上下文的子智能体运行——这是一种分而治之的策略,在超大型变更集上保持稳定,并天然支持并发审查。 - 细粒度规则匹配 — 将审查规则与每个文件的特征进行匹配,使模型的注意力保持高度集中,从源头消除信息噪声。与纯粹由语言驱动的规则引导相比,基于模板引擎的规则匹配更加稳定且可预测。
- 外部定位与反思模块 — 独立的评论定位与评论反思模块系统性地提升了 AI 反馈的定位准确度和内容准确度。
智能体 — 动态决策
智能体的优势集中在最关键的地方——动态决策与动态上下文检索:
- 场景调优提示词 — 针对代码审查深度优化的提示词模板,在提升效果的同时降低 token 消耗。
- 场景调优工具集——通过对大规模生产数据中工具调用轨迹的深度分析提炼而成——包括调用频率分布、各工具重复调用率,以及新工具对整个调用链的影响——从而打造出一套专用工具集,在代码审查方面比通用智能体工具包更稳定、更可预测。
如何使用
前置条件
- Git >= 2.41——Open Code Review 依赖 Git 进行差异生成、代码搜索和仓库操作。
CLI
安装
通过 NPM 安装(推荐)
npm install -g @alibaba-group/open-code-review
安装完成后,ocr 命令即可全局使用。
更新
如果你是通过 NPM 安装的,请手动更新到最新版本:
npm install -g @alibaba-group/open-code-review@latest
通过 NPM 安装的版本默认还会在后台检查新版本并自动升级。要禁用自动更新,请设置 OCR_NO_UPDATE=1。
如果你是通过安装脚本或手动下载的二进制文件进行安装的,请重新运行相同的安装/下载命令,用最新版本替换本地二进制文件。当你需要固定到某个特定的发布标签时,请使用 OCR_VERSION。
来自 GitHub Release
用一条命令为你的操作系统/架构安装最新的二进制文件(macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/alibaba/open-code-review/main/install.sh | sh该脚本会挑选正确的发布二进制文件,验证其 SHA-256 校验和,并将其作为 ocr 安装到 /usr/local/bin 中。可用 OCR_INSTALL_DIR 覆盖目标位置,或用 OCR_VERSION 固定某个发布版本:
OCR_INSTALL_DIR="$HOME/.local/bin" OCR_VERSION=v1.3.13 \ sh -c "$(curl -fsSL https://raw.githubusercontent.com/alibaba/open-code-review/main/install.sh)"
在 Windows 上(PowerShell 5.1+):
irm https://raw.githubusercontent.com/alibaba/open-code-review/main/install.ps1 | iex
该脚本会挑选正确的 Windows 发布二进制文件,验证其 SHA-256 校验和,并将其作为 ocr.exe 安装到 %LOCALAPPDATA%\Programs\ocr 中。可用 OCR_INSTALL_DIR 覆盖目标位置,或用 OCR_VERSION 固定某个发布版本:
$env:OCR_INSTALL_DIR = "$env:USERPROFILE\bin" $env:OCR_VERSION = "v1.3.13" irm https://raw.githubusercontent.com/alibaba/open-code-review/main/install.ps1 | iex
将远程脚本通过管道传给 shell 会执行来自互联网的代码。建议先下载并检查:
curl -fsSL https://raw.githubusercontent.com/alibaba/open-code-review/main/install.sh -o install.sh
less install.sh && sh install.shirm https://raw.githubusercontent.com/alibaba/open-code-review/main/install.ps1 -OutFile install.ps1 notepad install.ps1 # review, then: .\install.ps1
手动下载(所有平台,包括 Windows)
从 GitHub Releases 下载适合你平台的二进制文件:
# macOS (Apple Silicon) curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-darwin-arm64 chmod +x ocr && sudo mv ocr /usr/local/bin/ocr # macOS (Intel) curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-darwin-amd64 chmod +x ocr && sudo mv ocr /usr/local/bin/ocr # Linux (x86_64) curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-linux-amd64 chmod +x ocr && sudo mv ocr /usr/local/bin/ocr # Linux (ARM64) curl -Lo ocr https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-linux-arm64 chmod +x ocr && sudo mv ocr /usr/local/bin/ocr # Windows (x86_64) — move ocr.exe to a directory in your PATH curl -Lo ocr.exe https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-windows-amd64.exe # Windows (ARM64) — move ocr.exe to a directory in your PATH curl -Lo ocr.exe https://github.com/alibaba/open-code-review/releases/latest/download/opencodereview-windows-arm64.exe
从源码构建
git clone https://github.com/alibaba/open-code-review.git
cd open-code-review
make build
sudo cp dist/opencodereview /usr/local/bin/ocr快速开始
1. 配置 LLM
在审查代码之前,你必须先配置一个 LLM。
OCR 通过统一的 Provider 系统管理 LLM 配置。它内置了许多流行的提供商,同时也支持添加自定义提供商,以连接私有部署或其他兼容端点。配置存储在 ~/.opencodereview/config.json 中。
方式 A:交互式设置(推荐)
ocr config provider # Select a built-in provider or add a custom one ocr config model # Pick a model for the active provider
交互式界面会引导你完成提供商选择、API key 输入和模型配置,然后自动测试连通性。
运行 ocr llm providers 可查看所有内置提供商。内置提供商自带预设的 API URL 和协议——只需提供 API key 即可开始使用。如果相应的环境变量已经设置(例如 ANTHROPIC_API_KEY、OPENAI_API_KEY),API key 会被自动读取。
自定义提供商也可以通过交互式界面添加——你需要提供名称、API URL、协议类型(anthropic 或 openai)以及 API key。
方式 B:CLI 设置(用于 CI/CD 和非交互式环境)
使用 ocr config set 直接写入提供商配置,适合脚本和自动化场景。
使用内置提供商:
ocr config set provider anthropic ocr config set providers.anthropic.api_key your-api-key-here ocr config set providers.anthropic.model claude-sonnet-4-6
使用自定义提供商(私有网关或其他兼容端点):
ocr config set provider my-gateway ocr config set custom_providers.my-gateway.url https://my-llm-gateway.internal/v1 ocr config set custom_providers.my-gateway.protocol openai ocr config set custom_providers.my-gateway.api_key your-api-key-here ocr config set custom_providers.my-gateway.model gpt-4o
自定义提供商需要
url和protocol。支持的协议:anthropic、openai、openai-responses。
可选设置:
| 键 | 描述 |
|---|---|
providers.<name>.auth_header | 认证请求头:x-api-key 或 authorization(默认:authorization) |
providers.<name>.extra_body | 合并到请求体中的自定义 JSON 字段 |
providers.<name>.extra_headers | 以逗号分隔的 key=value 键值对,作为自定义 HTTP 请求头添加到每个请求中 |
providers.<name>.models | 用于交互式选择的模型列表 |
extra_headers(可选):为每个 LLM API 请求添加自定义 HTTP 请求头。适用于需要额外请求头的代理、网关或企业端点(例如组织 ID、追踪 ID)。格式为逗号分隔的 key=value 键值对。包含逗号的值请使用双引号括起来:
ocr config set llm.extra_headers "X-Org-ID=org-123,X-Forwarded-For=\"1.2.3.4,5.6.7.8\""
你也可以为每个提供商单独设置额外的请求头:
ocr config set providers.anthropic.extra_headers "X-Org-ID=org-123"
环境变量(最高优先级)
环境变量会覆盖配置文件中的设置,这在 CI/CD 中非常有用,因为在这些场景下写入配置文件并不方便:
export OCR_LLM_URL=https://api.anthropic.com/v1/messages export OCR_LLM_TOKEN=your-api-key-here export OCR_LLM_MODEL=claude-opus-4-6 export OCR_USE_ANTHROPIC=true
要使用 OpenAI Responses API(GPT-5.x / o 系列),请设置 OCR_LLM_PROTOCOL 而不是 OCR_USE_ANTHROPIC:
export OCR_LLM_URL=https://api.openai.com/v1 export OCR_LLM_TOKEN=your-openai-key export OCR_LLM_MODEL=gpt-5.4 export OCR_LLM_PROTOCOL=openai-responses
OCR_LLM_PROTOCOL 接受 anthropic、openai、openai-responses,并且当两者同时设置时,其优先级高于 OCR_USE_ANTHROPIC。
同时兼容 Claude Code 的环境变量(ANTHROPIC_BASE_URL、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_MODEL),并会为这些导出解析 ~/.zshrc / ~/.bashrc。
CC-Switch 用户须知:如果你正在使用 CC-Switch 并启用了 路由服务,你可以将该提供商的
url指向 CC-Switch 代理地址,无需额外配置:
- 对于 Claude 提供商:将
providers.anthropic.url设置为http://127.0.0.1:15721- 对于 Codex 提供商:将对应提供商的
url设置为http://127.0.0.1:15721/v1api_key可以是任意值;extra_body设置仍然适用
2. 测试连通性
ocr llm test3. 审查
cd your-project # Workspace mode — review all staged, unstaged, and untracked changes ocr review # Branch range — compare two refs ocr review --from main --to feature-branch # Single commit ocr review --commit abc123 # Resume an interrupted range or commit review ocr session list ocr review --from main --to feature-branch --resume <session-id> # Full-file scan — review whole files instead of a diff (no git history needed) ocr scan # scan the entire repository ocr scan --path internal/agent # scan a directory or specific files # Delegation mode — let your AI coding agent perform the review itself # OCR handles file selection and rule resolution; no LLM configuration needed ocr delegate preview ocr delegate rule src/main.go src/handler.go
与编码智能体集成
OCR 可以作为一个斜杠命令无缝集成到 AI 编程智能体中,让你直接在智能体工作流内进行代码审查。
方案 1:作为技能安装
使用 npx 将 OCR 技能安装到你的项目中:
npx skills add alibaba/open-code-review --skill open-code-review
这会安装open-code-review来自技能注册表的技能,它会教你的编程智能体如何调用ocr进行代码审查、按优先级对问题分类,并可选择性地应用修复。
委托模式 —— 如果你希望让你的编码智能体自行执行审查(仅使用 OCR 进行文件选择和规则解析,OCR 侧无需配置 LLM):
npx skills add alibaba/open-code-review --skill open-code-review-delegate
详情请参阅 skills/open-code-review-delegate/SKILL.md。
方案 2:作为 Claude Code 插件安装
对于 Claude Code,请在 Claude Code 中通过以下命令安装该命令插件:
/plugin marketplace add alibaba/open-code-review /plugin install open-code-review@open-code-review
这会注册 /open-code-review:review 斜杠命令,该命令会运行 OCR 并自动过滤和修复问题。它还提供 /open-code-review:delegate-review 用于委托模式(智能体使用自身能力进行审查,而 OCR 负责文件选择和规则)。
方案 3:作为 Codex 插件安装
对于本地 Codex,请从此仓库安装 Open Code Review 插件:
codex plugin marketplace add alibaba/open-code-review codex /plugins
对于本地检出或 fork:
codex plugin marketplace add .
codex
/plugins安装并启用 Open Code Review,然后启动一个新的 Codex 线程并显式调用它:
@Open Code Review review my current changes
@Open Code Review review this branch against main
@Open Code Review review and fix high-confidence issues
这会注册一个运行本地 OCR CLI 的 Codex 技能:
ocr review --audience agent
此集成不会更改 OCR 内部的 LLM 后端,也不要求为 Codex 配置 OpenAI Responses API 端点。OCR 本身仍需要按照 CLI 设置部分所述安装并配置 ocr CLI。
韩语指南:plugins/open-code-review/CODEX.ko-KR.md
选项 4:作为 Cursor 插件安装
对于 Cursor,从此仓库安装 Open Code Review 插件:
cursor-plugin marketplace add alibaba/open-code-review
或者手动添加市场。在 Cursor 中,打开 /plugins,搜索 Open Code Review,然后安装它。
对于本地检出或 fork:
cursor-plugin marketplace add .
安装后,在 Cursor 中调用它:
@Open Code Review review my current changes
@Open Code Review review this branch against main
@Open Code Review review and fix high-confidence issues
这会注册一个 Cursor 技能,用于运行本地 OCR CLI:
ocr review --audience agent
此集成不会改变 OCR 内部的 LLM 后端。OCR 本身仍然需要按照 CLI 设置部分所述安装并配置 ocr CLI。
选项 5:直接复制命令文件
如果不想使用任何包管理器进行快速设置,只需复制命令文件,即可在 Claude Code 中使用 /open-code-review 斜杠命令。
项目级(通过 git 与团队共享):
mkdir -p .claude/commands curl -o .claude/commands/open-code-review.md \ https://raw.githubusercontent.com/alibaba/open-code-review/main/plugins/open-code-review/claude-code/commands/review.md
用户级(在所有项目中个人全局使用):
mkdir -p ~/.claude/commands curl -o ~/.claude/commands/open-code-review.md \ https://raw.githubusercontent.com/alibaba/open-code-review/main/plugins/open-code-review/claude-code/commands/review.md
对于委托模式(OCR 侧无需 LLM 配置):
# Project-level mkdir -p .claude/commands curl -o .claude/commands/open-code-review-delegate.md \ https://raw.githubusercontent.com/alibaba/open-code-review/main/plugins/open-code-review/claude-code/commands/delegate-review.md # User-level mkdir -p ~/.claude/commands curl -o ~/.claude/commands/open-code-review-delegate.md \ https://raw.githubusercontent.com/alibaba/open-code-review/main/plugins/open-code-review/claude-code/commands/delegate-review.md
前提条件:所有集成方式都要求安装
ocrCLI。标准模式还额外要求配置 LLM——参见上文的 安装 和 配置 LLM。委托模式在 OCR 侧不要求配置 LLM。
CI/CD 集成
OCR 可以集成到 CI/CD 流水线中,在合并请求 / 拉取请求上自动执行代码审查。
CI 集成的核心命令:
ocr review \ --from "origin/main" \ --to "<commit_sha>" \ --format json
--from 标志接受分支引用(例如 origin/main)或提交 SHA 作为基准,而 --to 接受提交 SHA 或分支引用作为头部。在 CI 环境中,建议为 --to 使用提交 SHA,以便正确处理源分支在 origin 远程上不存在的 fork PR/MR。
--format json 标志输出适合在 CI 脚本中解析的机器可读结果。
每条发现都带有两个结构化字段,以便 CI 集成能够对构建进行排序、分组、过滤或门控,而无需重新解析评论文本:
| 字段 | 允许的值 | 说明 |
|---|---|---|
category | bug、security、performance、maintainability、test、style、documentation、other | 该问题所属的类别。 |
severity | critical、high、medium、low | 该问题的重要性。 |
在 JSON 输出中,这两个字段与 content、start_line 等字段以同级形式出现。在终端中,它们会以行内 [category · severity] 徽章的形式渲染在评论之前,并根据严重程度着色。
请参阅 examples/ 目录以获取集成示例:
github_actions/— GitHub Actions 集成示例gitlab_ci/— GitLab CI 集成示例gitflic_ci/— GitFlic CI 集成示例
GitHub Action
对于 GitHub,该仓库还在仓库根目录提供了一个开箱即用的复合 Action(action.yml)。无需自己编写 ocr review 脚本,直接引用它即可处理完整流水线——检出、安装 OCR、运行审查、发布行内评论和摘要评论、上传产物,以及重试/幂等处理:
- uses: alibaba/open-code-review@main with: llm_url: ${{ secrets.OCR_LLM_URL }} llm_auth_token: ${{ secrets.OCR_LLM_AUTH_TOKEN }} llm_model: ${{ vars.OCR_LLM_MODEL }} llm_use_anthropic: ${{ vars.OCR_LLM_USE_ANTHROPIC }}
固定到某个版本标签或提交 SHA 以确保可复现性。请查看 examples/github_actions/ 目录,获取完整的工作流演示以及输入、输出和评论发布模式(置顶摘要、增量非破坏性发布)的完整列表。
命令
| 命令 | 别名 | 描述 |
|---|---|---|
ocr review | ocr r | 启动基于 diff 的代码审查 |
ocr scan | ocr s | 审查整个文件(无需 diff) |
ocr delegate preview | ocr d preview | 预览可审查文件,附带 mode/ref 元数据(无需 LLM) |
ocr delegate rule <path...> | ocr d rule | 输出按内容分组的已解析审查规则(无需 LLM) |
ocr rules check <file> | — | 预览某条审查规则适用于哪个文件路径 |
ocr config provider | — | 交互式提供商设置(内置、自定义或手动) |
ocr config model | — | 为当前激活的提供商交互式选择模型 |
ocr config set <key> <value> | — | 设置配置值 |
ocr config unset custom_providers.<name> | — | 删除自定义提供商 |
ocr llm test | — | 测试 LLM 连接 |
ocr llm providers | — | 列出内置 LLM 提供商 |
ocr session list | ocr sessions list, ocr session ls | 列出已保存的审查会话 |
ocr session show <id> | ocr sessions show <id> | 查看单个会话及其逐文件检查点 |
ocr viewer | ocr v | 在 localhost:5483 上启动 WebUI 会话查看器 |
ocr version | — | 显示版本信息 |
ocr review 标志
| 标志 | 简写 | 默认值 | 描述 |
|---|---|---|---|
--repo | — | 当前目录 | Git 仓库根目录 |
--from | — | — | 源引用(例如 main) |
--to | — | — | 目标引用(例如 feature-branch) |
--commit | -c | — | 单个提交供审查 |
--exclude | — | — | 以逗号分隔的 gitignore 风格模式用于跳过;与 rule.json 的 excludes 合并 |
--preview | -p | false | 预览哪些文件将被审查,而不运行 LLM |
--resume | — | — | 从之前兼容的范围或提交审查会话中恢复 |
--format | -f | text | 输出格式:text 或 json |
--concurrency | — | 8 | 最大并发文件审查数 |
--timeout | — | 10 | 并发任务超时时间(分钟) |
--audience | — | human | human(显示进度)或 agent(仅摘要) |
--background | -b | — | 审查的可选需求/业务背景;使用 --commit 时从提交信息自动填充 |
--background-file | -B | — | 来自 Markdown 文件的可选需求/业务上下文;与 --background 结合使用时,内联值优先给出 |
--model | — | — | 选择或覆盖用于本次审查的 LLM 模型 |
--rule | — | — | 自定义 JSON 审查规则的路径 |
--max-tools | — | 内置 | 每个文件的最大工具调用轮数;仅在大于模板默认值时才生效 |
--max-git-procs | — | 16 | 最大并发 git 子进程数 |
--tools | — | 内置 | 自定义 JSON 工具配置的路径 |
可恢复的审查与会话
每次 ocr review 运行都会在 ~/.opencodereview/sessions/ 下持久化保存一份本地会话日志。成功时的文本输出仍聚焦于审查结果,不会打印会话 ID;可使用 ocr session list/show 查找已保存的会话,或使用 --format json 在机器可读输出中包含 session_id。如果某个范围或提交的审查被中断,请列出已保存的会话,并从与同一审查目标匹配的那个会话恢复:
ocr session list ocr session show <session-id> ocr review --from main --to feature-branch --resume <session-id> ocr review --commit abc123 --resume <session-id>
恢复是有意设计得严格的:它仅支持分支范围和单提交审查,不支持工作区审查,并且当前的 --from/--to 或 --commit 必须与已保存的会话匹配。--preview 不能与 --resume 组合使用。
当使用 --format json 时,恢复的运行会包含:
session_id— 当前运行的会话 IDresume.resumed_from— 源会话 IDresume.reused_files— 从已保存检查点复用的文件resume.rerun_files— 在当前运行中再次审查的文件
ocr session 标志
| 命令 | 标志 | 默认值 | 描述 |
|---|---|---|---|
ocr session list | --repo | 当前目录 | 应列出其会话的仓库 |
ocr session list | --json | false | 以 JSON 形式输出会话摘要 |
ocr session list | --limit | 20 | 限制列出的会话数量;使用 0 表示不限制 |
ocr session show <id> | --repo | 当前目录 | 需要检查其会话的仓库 |
ocr session show <id> | --json | false | 以 JSON 形式输出会话元数据和逐文件条目 |
ocr scan 标志
ocr scan 审查整个文件而非差异——适用于审计不熟悉的代码库、迁移前的全面排查,或任何没有有意义差异的目录。它也能在非 git 目录中工作(会回退到遵循 .gitignore 的文件系统遍历)。
| 标志 | 简写 | 默认值 | 描述 |
|---|---|---|---|
--path | — | 整个仓库 | 以逗号分隔的要扫描的目录/文件 |
--exclude | — | — | 以逗号分隔的 gitignore 风格跳过模式;与 rule.json 的排除项合并 |
--preview | -p | false | 列出将要扫描的文件,而不运行 LLM |
--max-tokens-budget | — | 0(无限制) | 限制总 token 用量;一旦超出即停止调度 |
--no-plan | — | false | 跳过逐文件规划预扫描 |
--no-dedup | — | false | 跳过对相似评论的逐批次去重 |
--no-summary | — | false | 跳过项目级摘要 |
--batch | — | by-language | 批处理策略:none、by-language 或 by-directory |
--format | -f | text | 输出格式:text 或 json(JSON 包含一个 project_summary 字段) |
--concurrency | — | 8 | 最大并发文件扫描数 |
--rule | — | — | 自定义 JSON 审查规则的路径 |
--repo | — | 当前目录 | 要扫描的仓库或目录根路径 |
每次运行前,ocr scan 会打印一份粗略的 token 成本估算。先用 --preview 查看文件列表,再用 --max-tokens-budget 限制在大型仓库上的花费。
ocr delegate 标志
ocr delegate 是 AI 编程智能体的委派模式。它提供确定性的文件选择和规则解析,不调用任何 LLM——由宿主智能体使用自身能力执行实际审查。
| 子命令 | 描述 |
|---|---|
ocr delegate preview | 输出可审查文件列表,附带模式/引用元数据 |
ocr delegate rule <path...> | 输出按内容分组的已解析审查规则 |
两个子命令共享以下标志:
| 标志 | 简写 | 默认值 | 描述 |
|---|---|---|---|
--repo | — | 当前目录 | Git 仓库根目录 |
--from | — | — | 源引用(例如 main) |
--to | — | — | 目标引用(例如 feature-branch) |
--commit | -c | — | 单个提交供审查 |
--exclude | — | — | 以逗号分隔的 gitignore 风格模式,用于跳过 |
--rule | — | — | 自定义 JSON 审查规则的路径 |
--background | -b | — | 可选的 需求/业务上下文 |
--background-file | -B | — | 来自 Markdown 文件的业务上下文 |
--max-git-procs | — | 16 | 最大并发 git 子进程数 |
示例
# Interactive provider and model setup ocr config provider ocr config model ocr llm providers # Delete a custom provider ocr config unset custom_providers.my-gateway # Preview which files will be reviewed (no LLM calls) ocr review --preview ocr review -c abc123 -p # Review workspace changes with default settings ocr review # Review branch diff with higher concurrency ocr review --from main --to my-feature --concurrency 4 # Review a specific commit with verbose JSON output ocr review --commit abc123 --format json --audience agent # Resume an interrupted range or commit review ocr session list ocr session show <session-id> ocr review --from main --to my-feature --resume <session-id> ocr review --commit abc123 --resume <session-id> # Select or override model for this review ocr review --model claude-opus-4-6 ocr review --commit abc123 --model claude-sonnet-4-6 # Provide requirement context for more targeted review ocr review --background "Adding rate limiting to the login API" # Provide requirement context from a Markdown file ocr review --background-file ./docs/my_business_context.md # Combine inline context with a local context file (both are used) ocr review --background "Focus on auth" --background-file ./docs/my_business_context.md # Use custom review rules ocr review --rule /path/to/my-rules.json # Preview which rule applies to a file ocr rules check src/main/java/com/example/Foo.java ocr rules check --rule custom.json src/main/resources/mapper/UserMapper.xml # Full-file scan: preview the file list first (no LLM calls) ocr scan --preview # Scan the whole repo, cap spend at ~500k tokens ocr scan --max-tokens-budget 500000 # Scan a subdirectory, skipping generated/test files ocr scan --path internal --exclude '**/*_test.go,**/generated/**' # Scan a non-git directory with JSON output (includes project_summary) ocr scan --repo /path/to/plain/dir --format json # Fastest scan: skip planning, dedup, and the project summary ocr scan --no-plan --no-dedup --no-summary # Delegation mode — let your AI agent drive the review (no LLM config needed) ocr delegate preview ocr delegate preview --from main --to feature-branch ocr delegate preview --commit abc123 ocr delegate rule internal/handler.go internal/service.go cmd/main.go # View review session history in browser ocr viewer ocr viewer --addr :3000
查看器安全性
查看器通过 HTTP 提供会话 JSONL 内容(LLM 请求消息与响应)。它对每个请求都强制执行 Host 头允许列表:回环名称(localhost、127.0.0.0/8、::1)以及具体的绑定主机始终被允许。通配符绑定(--addr :3000、--addr 0.0.0.0:3000)以及其他非回环主机名必须通过 OCR_VIEWER_ALLOWED_HOSTS 环境变量添加(以逗号分隔):
OCR_VIEWER_ALLOWED_HOSTS=review.internal,ocr.lan ocr viewer --addr :3000
这可以阻止针对本地查看器的 DNS 重绑定攻击。
审查规则
OCR 使用四层优先级链来解析审查规则。每一层都采用首个匹配即胜出:如果某个文件路径匹配某个模式,就使用该规则;否则继续向下落到下一层。
| 优先级 | 来源 | 路径 | 描述 |
|---|---|---|---|
| 1(最高) | --rule 标志 | 用户指定的路径 | CLI 显式覆盖 |
| 2 | 项目配置 | <repoDir>/.opencodereview/rule.json | 按项目划分的规则,可提交到 git |
| 3 | 全局配置 | ~/.opencodereview/rule.json | 用户范围内的个人偏好 |
| 4(最低) | 系统默认 | 内嵌的 system_rules.json | 覆盖常见语言和文件类型的内置规则 |
规则文件格式
第 1–3 层共享相同的 JSON 格式:
{
"rules": [
{
"path": "force-api/**/*.java",
"rule": "All new methods must validate required parameters for null values",
"merge_system_rule": true
},
{
"path": "**/*mapper*.xml",
"rule": "Check SQL for injection risks, parameter errors, and missing closing tags"
}
]
}path支持**递归匹配和{java,kt}花括号展开。merge_system_rule是可选的。当true时,匹配到的内置系统规则会与此用户规则合并;否则用户规则将替换系统规则。- 在每一层内,规则按声明顺序依次求值——第一个匹配的规则生效。
- 如果某个规则文件不存在,则会被静默跳过。
rule 字段同时支持内联内容和文件路径。 系统会自动检测你指的是哪一种:
- 如果该值包含换行符 → 内联内容(多行规则绝不会被当作文件路径)。
- If the value is a single line, contains no spaces, and ends with
.md/.txt/.markdown→ file path.- 绝对路径(以
/开头)会被直接使用。 - 相对路径会相对于项目根目录进行解析。路径穿越(例如
../../etc/passwd.md)会被阻止。如果未找到,则会发出一个[WARN],并清除该规则(不会回退到内联内容)。 - 该文件必须通过校验:扩展名在白名单内、≤ 512 KB,且解析后的符号链接目标也必须具有白名单内的扩展名。如果校验失败,该规则将被清除。
- 绝对路径(以
- 否则 → 内联内容。
{
"rules": [
{
"path": "**/*mapper*.xml",
"rule": "docs/sql-rules.md"
},
{
"path": "**/*.java",
"rule": "Always check for null safety and resource leaks"
},
{
"path": "**/*.go",
"rule": "shared/go-concurrency.md"
},
{
"path": "**/*.py",
"rule": "/Users/me/team-rules/python.md"
}
]
}docs/sql-rules.md— 相对路径,从<project>/docs/sql-rules.md解析。Always check for null safety…— 内联字符串,直接使用。shared/go-concurrency.md— 相对路径,解析方式相同。/Users/me/team-rules/python.md— 绝对路径,直接使用。
绝对路径可以访问项目目录之外的文件——这是有意为之。
rule.json由项目维护者编写,即受信任的输入。团队可以将共享规则存储在公共路径(例如/opt/company-rules/),而无需将其复制到每个项目中。
路径过滤
规则文件还支持 include 和 exclude 字段,用于控制哪些文件进入审查范围:
{
"rules": [
{"path": "**/*.java", "rule": "Check for null safety"}
],
"include": ["src/main/**/*.java", "lib/**/*.kt"],
"exclude": ["**/generated/**", "vendor/**"]
}过滤决策优先级(从高到低):
| 步骤 | 条件 | 结果 |
|---|---|---|
| 1 | 文件为二进制 | 已排除 |
| 2 | 路径匹配用户 exclude 模式 | 已排除 |
| 3 | 文件扩展名不在支持列表中 | 已排除 |
| 4 | include 已配置且路径匹配 | 已审查(跳过步骤 5) |
| 5 | 路径匹配内置默认排除模式(测试文件等) | 已排除 |
| 6 | 以上均不匹配 | 已审查 |
include和exclude遵循与审查规则相同的优先级链(--rule> 项目配置 > 全局配置)。配置了 include/exclude 的最高优先级层整体生效——模式不会跨层合并。exclude始终优先于include——同时匹配两者的文件会被排除。include充当内置默认排除模式的旁路(例如测试文件),而非独占式允许列表——不匹配任何include模式的文件仍会正常通过默认过滤检查。- 模式语法:支持
**递归匹配、*单段匹配以及{a,b}花括号展开。匹配不区分大小写。
内置默认排除模式(过滤测试文件等——可通过 include 覆盖):
**/*_test.go, **/*Test.java, **/*Tests.java, **/*_test.rs,
**/*.test.{js,jsx,ts,tsx}, **/*.spec.{js,jsx,ts,tsx}, **/__tests__/**,
**/src/test/java/**/*.java, **/src/test/**/*.kt,
**/test/**/*_test.py, **/tests/**/*_test.py, **/*_test.py,
**/*_spec.rb, **/spec/**/*_spec.rb, **/oh_modules/**
配置参考
配置文件:~/.opencodereview/config.json
| 键 | 类型 | 示例 |
|---|---|---|
provider | 字符串 | anthropic | openai | dashscope | deepseek | z-ai |
providers.<name>.api_key | 字符串 | 特定提供商的 API key |
providers.<name>.url | 字符串 | 提供商 base URL 覆盖 |
providers.<name>.protocol | 字符串 | anthropic | openai | openai-responses |
providers.<name>.model | 字符串 | 提供商的模型名称 |
providers.<name>.models | 数组 | 用于交互式选择的可选提供商模型列表 |
providers.<name>.auth_header | 字符串 | x-api-key | authorization |
providers.<name>.extra_body | 对象 | 合并到每个请求体中的 JSON 对象 |
providers.<name>.timeout_sec | 整数 | 每个请求的 HTTP 超时时间,单位为秒(默认值:300) |
providers.<name>.extra_headers | 字符串 | 以逗号分隔的 key=value HTTP 请求头 |
custom_providers.<name>.* | — | 与 providers.<name>.* 相同的字段,包括可选的 models |
llm.url | 字符串 | https://api.openai.com/v1/chat/completions |
llm.auth_token | 字符串 | sk-xxxxxxx |
llm.auth_header | 字符串 | 仅 Anthropic:x-api-key | authorization |
llm.extra_body | 对象 | 合并到每个请求体中的 JSON 对象 |
llm.timeout_sec | 整数 | 每个请求的 HTTP 超时时间(秒,默认值:300) |
llm.extra_headers | 字符串 | 以逗号分隔的 key=value HTTP 请求头 |
llm.model | 字符串 | claude-opus-4-6 |
llm.protocol | 字符串 | anthropic | openai | openai-responses;优先级高于 llm.use_anthropic |
llm.use_anthropic | 布尔值 | true | false(旧版;建议使用 llm.protocol) |
mcp_servers.<name>.command | 字符串 | 启动 MCP 服务器的命令 |
mcp_servers.<name>.args | 数组 | MCP 服务器的命令行参数 |
mcp_servers.<name>.env | 数组 | KEY=VALUE 格式的环境变量 |
mcp_servers.<name>.tools | 数组 | 允许的工具名称(留空 = 所有工具) |
mcp_servers.<name>.setup | string | 启动服务器前要运行的安装命令 |
language | string | 任意语言名称,例如 English、Chinese(默认:English) |
telemetry.enabled | boolean | true | false |
telemetry.exporter | string | console | otlp |
telemetry.otlp_endpoint | string | OTLP 收集器地址 |
telemetry.content_logging | boolean | 在遥测数据中包含提示词 |
环境变量的优先级高于配置文件。
MCP 服务器
Open Code Review 支持 Model Context Protocol (MCP) 服务器,允许审查智能体在代码审查过程中通过 stdio 传输使用外部工具。
通过 CLI 配置 MCP 服务器:
# Add an MCP server ocr config set mcp_servers.<name>.command <command> ocr config set mcp_servers.<name>.args '["arg1","arg2"]' ocr config set mcp_servers.<name>.env '["KEY=VALUE"]' ocr config set mcp_servers.<name>.tools '["tool_name"]' ocr config set mcp_servers.<name>.setup '<setup command>' # Delete an MCP server ocr config unset mcp_servers.<name>
| 字段 | 必填 | 描述 |
|---|---|---|
command | 是 | 用于启动 MCP 服务器的可执行命令 |
args | 否 | 传递给服务器的命令行参数 |
env | 否 | 以 KEY=VALUE 格式表示的环境变量 |
tools | 否 | 允许的工具名称;如果为空,则服务器中的所有工具均可用 |
setup | 否 | 在启动服务器之前运行的 shell 命令(例如构建索引) |
注意:如果 MCP 工具的名称与内置工具冲突,该工具将被跳过并发出警告。
setup命令有 5 分钟超时限制。
示例:添加 CodeGraph 用于代码结构分析
ocr config set mcp_servers.codegraph.command codegraph ocr config set mcp_servers.codegraph.args '["serve","--mcp"]' ocr config set mcp_servers.codegraph.tools '["codegraph_explore"]' ocr config set mcp_servers.codegraph.setup 'codegraph init && codegraph index'
环境变量
| 变量 | 用途 |
|---|---|
OCR_LLM_URL | LLM API 端点 URL |
OCR_LLM_TOKEN | API 密钥 / 认证 token |
OCR_LLM_AUTH_HEADER | Anthropic 认证头(x-api-key 或 authorization) |
OCR_LLM_EXTRA_HEADERS | 以逗号分隔的 key=value HTTP 头 |
OCR_LLM_MODEL | 模型名称 |
OCR_LLM_PROTOCOL | 协议:anthropic | openai | openai-responses;优先于 OCR_USE_ANTHROPIC |
OCR_LLM_TIMEOUT | 每次请求的 HTTP 超时时间(秒)(覆盖配置文件 timeout_sec) |
OCR_USE_ANTHROPIC | true = Anthropic,false = OpenAI Chat Completions(旧版;推荐使用 OCR_LLM_PROTOCOL) |
遥测
用于可观测性(span、指标)的 OpenTelemetry 集成。默认禁用。
ocr config set telemetry.enabled true ocr config set telemetry.exporter otlp ocr config set telemetry.otlp_endpoint localhost:4317
设置 telemetry.content_logging 以在导出数据中包含 LLM 提示词和响应。
协议选择: 设置环境变量 OTEL_EXPORTER_OTLP_PROTOCOL 以选择导出协议:
| 值 | 传输方式 | 说明 |
|---|---|---|
grpc(默认) | gRPC | 默认端口 4317 |
http/protobuf | HTTP | 默认端口 4318 |
端点格式: telemetry.otlp_endpoint期望一个基础 URL,格式为host:port或http://host:port,不带路径部分。SDK 会按照/v1/traces自动追加信号路径(例如OTLP 规范.
贡献
本项目的存在离不开所有贡献者。有关开发环境搭建、编码规范以及如何提交 pull request,请参阅 CONTRIBUTING.md。
许可证
Apache-2.0 — 版权所有 2026 阿里巴巴
来源:Hacker News 热门(buzzing.cc 中文翻译) · github.com