
一、站内那篇文章的配置示例只给了 Anthropic
V2EX t/1239395 里有人写:"单看每百万 Token 多少钱没意义,应该看同一件事最后到底花多少钱、还有花多长时间。"我用 7 档 qwen 模型把这笔账算了一遍:单价差 40 倍,一次审查的总账差 545 倍。
先说这篇要补的位置。站内介绍 open-code-review 的那篇文章(developer.aliyun.com/article/1740677,2026-06-10)给出的配置示例走的是 Anthropic 端点,原文是这两行:
ocr config set llm.url https://api.anthropic.com/v1/messages
ocr config set llm.use_anthropic true
接百炼这一步是空的。而它其实比自定义 provider 更短,因为 open-code-review 内置了对应的 provider。
二、ocr 内置 dashscope provider
open-code-review(命令名 ocr,Apache-2.0)v1.12.1 于 2026 年 9 月 14 日发布,当天 GitHub Trending 日榜第 2,26k stars。它内置 28 个 provider,其中一个叫 dashscope,端点即百炼的 OpenAI 兼容地址,预置模型列表前 5 个全是 qwen:
{
Name: "dashscope",
DisplayName: "Alibaba DashScope API",
Protocol: ProtocolOpenAIChatCompletions,
BaseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1",
EnvVar: "DASHSCOPE_API_KEY",
Models: []string{
"qwen3.8-max", "qwen3.7-max", "qwen3.7-plus", "qwen3.6-plus", "qwen3.6-flash",
...
},
}
另有一个 dashscope-tokenplan,Base URL 是 https://token-plan.cn-beijing.maas.aliyuncs.com/compatible-mode/v1,环境变量名 DASHSCOPE_TOKENPLAN_KEY。
有一点需要说准确:在仓库里 grep bailian、百炼、Model Studio、tongyi、通义 是 0 命中的,命中的是 dashscope 与 qwen。所以准确的表述是"ocr 内置了 dashscope provider,端点即百炼的 OpenAI 兼容地址,预置模型列表包含 qwen 系列",而不是"ocr 官方文档提到了百炼"。
qwen 驱动 ocr 这条路,官方自己跑过。仓库的 benchmark 组件里有 Qwen3.8-Max / Alibaba / Open Code Review v1.8.7 和 Qwen3.7-Max / Alibaba / Open Code Review v1.3.1 两条记录。官方 FAQ 也点名 qwen3 满足"必须原生支持 tool calling"这一硬要求:ocr 完全通过工具调用驱动审查,只在文本里叙述工具调用的模型无论怎么调 prompt 都跑不通。
三、接入步骤
安装(前置依赖 Node.js 与 Git ≥ 2.41):
npm install -g @alibaba-group/open-code-review
API Key 在控制台创建:百炼 API Key 页面
非交互式配置三行,CI 环境同样适用:
ocr config set provider dashscope
ocr config set model qwen3.7-plus
ocr config set providers.dashscope.api_key sk-你的key
ocr llm test
配置字段名对照表,写错会静默失效:
| 语义 | 正确字段名 | 说明 |
|---|---|---|
| Base URL | url |
不是 base_url |
| API Key | api_key |
也可用 api_key_cmd 从密钥管理器取 |
| 当前生效模型 | model |
字符串 |
| 候选模型列表 | models |
数组,仅供 TUI 选择器使用,不是生效模型 |
| 挂载位置 | 内置 provider 用 providers.<name>.* |
与自定义的 custom_providers.<name>.* 是两个不同的 map |
配置文件路径 ~/.opencodereview/config.json。若工作空间已迁移到专属域名,url 的优先级高于预设,可以直接覆盖:
ocr config set providers.dashscope.url https://<WorkspaceId>.cn-beijing.maas.aliyuncs.com/compatible-mode/v1
需要注意 API Key 按地域绑定,调用某个地域的 base_url 必须使用同一地域创建的 Key,跨地域返回 401 或 invalid_api_key。
审查命令面:
ocr review # 工作区模式,审 staged/unstaged/untracked
ocr review --from main --to feature-branch # 分支区间,merge-base 模式
ocr review --commit abc123 # 单个提交
ocr review --format json --output result.json # 结果落文件,接门禁用这个
ocr scan --path internal/agent # 全文件扫描,不依赖 git 历史
四、实测口径
为了得到可横比的数据,实验只保留一个变量:模型。
被测代码是一份 64 行的 Python 订单服务模块,埋了 4 个真缺陷(不判空、SQL 拼接、计数器未加锁、open() 未用 with)和 2 个诱饵(@lru_cache 装饰纯函数、except Exception: raise)。诱饵用来计误报,避免话痨模型靠多报刷分。
同一份代码、同一个 prompt、逐字节相同的输入,7 个模型各审一遍。得分 = 真阳 + 0.5 × 部分命中 − 误报,满分 4。单价取自 bl model list --model <模型> --output json(免登录命令);token 数是 API 原样返回的 usage;耗时是客户端墙钟,含网络往返。
限定条件:每组只跑一次,未做重复取样。同一模型两次跑分已观察到差异,因此所有结论都带"这一次实测"的限定。
五、实测结果
| 模型 | 思考 token | 真阳 | 漏报 | 误报 | 得分 | 耗时 | 输入 tok | 输出 tok | 审一次 ¥ |
|---|---|---|---|---|---|---|---|---|---|
| qwen-turbo | 不思考 | 2/4(B1,B2) | 2(B3,B4) | 4 | -2.0 | 7.4 秒 | 468 | 1,005 | 0.0007 |
| qwen3-coder-plus | 不思考 | 3/4(B1,B2,B4) | 1(B3) | 1 | 2.0 | 10.1 秒 | 464 | 712 | 阶梯计费,见控制台 |
| qwen-plus | 不思考 | 2/4(B2,B3)+ B4 半分 | 1(B1) | 1 | 1.5 | 39.3 秒 | 464 | 1,766 | 0.0039 |
| qwen3.7-plus | 1,182 | 4/4 全中 | 0 | 0 | 4.0 | 23.4 秒 | 502 | 2,052 | 见控制台 |
| qwen3.6-flash | 4,258 | 4/4 全中 | 0 | 1 | 3.0 | 42.6 秒 | 502 | 5,075 | 见控制台 |
| qwen3.8-flash | 9,517 | 4/4 全中 | 0 | 0 | 4.0 | 241.0 秒 | 540 | 12,909 | 0.0353 |
| qwen3.8-max | 9,770 | 4/4 全中 | 0 | 0 | 4.0 | 293.1 秒 | 540 | 11,064 | 0.4048 |
三条对选型有直接影响的规律。
分水岭是会不会思考,不是价格。三个不思考的模型得分 -2.0、2.0、1.5,全部有漏报;四个会思考的得分 3.0、4.0、4.0、4.0,零漏报。
思考量过了一个点就不再换分。qwen3.7-plus 用 1,182 个思考 token 拿满分,qwen3.8-max 用 9,770 个也是满分,中间 8,588 个 token 换来的是 12.5 倍耗时与 5.4 倍输出 token。
行号准确率随档位单调上升:qwen-turbo 0/9、qwen-plus 0/4、qwen3-coder-plus 1/5、qwen3.6-flash 2/5、qwen3.7-plus 6/6(±1)、qwen3.8-flash 与 qwen3.8-max 全对。turbo 把 SQL 注入报在第 9 行,实际在第 18 行。低价档的输出适合当线索清单,不适合直接接跳转定位。

六、团队月度成本怎么估
单价(元/百万 tokens,bl model list 免登录实跑):qwen-turbo 0.3/0.6,qwen-plus 0.8/2,qwen3.8-flash 0.8/2.7,qwen3.8-max 12/36。乘上真实 usage:
| 模型 | 审一次 | 1 元可审 | 审 100 次 | 每天 10 次 × 22 个工作日 |
|---|---|---|---|---|
| qwen-turbo | ¥0.0007 | ≈1,345 次 | ¥0.07 | ¥0.16 |
| qwen-plus | ¥0.0039 | ≈256 次 | ¥0.39 | ¥0.86 |
| qwen3.8-flash | ¥0.0353 | ≈28 次 | ¥3.53 | ¥7.76 |
| qwen3.8-max | ¥0.4048 | ≈2 次 | ¥40.48 | ¥89.05 |
最后一列就是单人单月的量。团队规模按人数线性放大即可,放大之前建议先在真实仓库上跑一批 PR 取自己的 usage 均值,因为这次实测用的是一份 64 行的模块,真实 PR 的 diff 通常更大。
单价差 40 倍(输入 0.3 对 12),单次总账差 545 倍(0.000743 对 0.404784)。差额来自思考 token 计入输出计费,这正是 V2EX 那条质疑的实证版本。
未公开单价的模型用不等式而不是估算。qwen3.7-plus 的单价在 bl model list 里没有返回,即使假设它与旗舰完全同价(12/36),这一次审查也只花 (502×12 + 2052×36)/1e6 = ¥0.0799,是旗舰 ¥0.4048 的 1/5.1;而它的实际单价不可能高于旗舰。qwen3-coder 系列官方文档写明采取阶梯计费,本次抓取未给出分档数字,同样以控制台模型详情页为准。
批量跑之前建议先看限流:
bl quota list --model qwen-turbo
七、合并门禁该挂哪一档
门禁场景要同时满足两个条件:漏报为零,行号可直接跳转。这次实测里满足的是 qwen3.7-plus(23.4 秒、4.0 分、行号 6/6)和 qwen3.8-max(293.1 秒、4.0 分、行号全对,且额外报出三个埋点之外的真问题,例如 amount <= 0 拦不住 float('nan'))。
工程上建议异步挂 qwen3.8-max,同步阻塞的门禁用 qwen3.7-plus 这一档。293.1 秒挂在同步流水线里会直接把 PR 卡住。结果落文件后由门禁脚本判定:
ocr review --format json --output result.json
八、免费额度口径
新账号开通时自动发放,无需实名认证。官方文档口径如下,这几条容易被第三方文章写错:
| 项 | 官方口径 |
|---|---|
| 额度量 | 每个模型独立,通常 100 万 Token,不能跨模型合并或转移 |
| 有效期 | 90 天,从开通、模型发布或申请通过之日起算(以较晚者为准) |
| 地域 | 仅华北2(北京)地域享有,其他地域无免费额度 |
| 过期 | 自动失效,不支持补发、延期或重置 |
| 用尽后 | 不会自动切换到其他有额度的模型,需手动修改 model 参数 |
| 抵扣范围 | 仅抵扣模型实时推理费用,Batch 调用、模型调优、模型部署不可抵扣 |
生产环境要特别注意"用尽不自动切换"这一条:额度耗尽后调用会直接失败,不会降级到别的模型,需要提前配好按量付费或额度告警。抵扣顺序是免费额度 → 资源包 → 节省计划 → 按量付费。
九、工程约束
不是秒级工具。V2EX 上有人实测 1,400 个 PR 跑了十多个小时,几行改动的小 PR 也要几分钟。规划流水线时要按分钟级排队,不能按秒级同步阻塞设计。
不替代静态扫描。规则引擎报的是确定命中的模式,ocr 报的是读懂代码之后觉得不对的地方,覆盖面不重合,两者并存。
旗舰档不适合高频调用。一次 ¥0.4048、293.1 秒,挂在 pre-commit 上两个维度都撑不住。
本机还观察到一条与耗时相关的硬约束:用 bl text chat 非流式调用 qwen3.8-max 会撞 Node undici 的 300 秒响应头上限,实测 293.1 秒已经贴着这条线。要用该 CLI 跑旗舰档需加 --stream,但 --stream 下 --output json 不返回 usage,成本需另行计算。
第一节那条 Anthropic 端点路径另有一个已知问题。issue #1064 报过 400:The tool_choice parameter does not support being set to required or object in thinking mode,触发环节是审查过滤器分组调用。该 issue 已关闭但没有维护者说明,因此这里不做"已修复"的断言,只给实测可用的路径:走内置的 dashscope provider(OpenAI 兼容协议),不会遇到这个报错。
另外,只 export DASHSCOPE_API_KEY 不足以让 ocr 工作。它的 resolver 要求 (url, token, model) 三元组齐全,环境变量只补 token 那一份,url 与 model 仍需由 ocr config set provider dashscope 和 ocr config set model 提供。
十、成本可复算
单价与 token 都可自行核验:
npm install -g bailian-cli
bl model list --model qwen-plus --output json
token 在每次调用返回的 usage.prompt_tokens 与 usage.completion_tokens 里。算账脚本:
from decimal import Decimal, ROUND_HALF_UP
def cost(in_tok, out_tok, price_in, price_out):
"""price 单位:元/百万 tokens"""
c = (Decimal(in_tok) * Decimal(price_in) + Decimal(out_tok) * Decimal(price_out)) / Decimal(1000000)
return c.quantize(Decimal("0.0001"), rounding=ROUND_HALF_UP)
print(cost(502, 2052, "12", "36")) # 即使按旗舰单价算,qwen3.7-plus 这一次也只花 0.0799
用 Decimal 配 ROUND_HALF_UP 是必要的:Python 内置 round() 是银行家舍入,算钱会得到反直觉结果。

十一、场景与档位分工
| 场景 | 档位 | 单次成本 | 依据 |
|---|---|---|---|
| 每次提交都跑的粗筛 | qwen-turbo | ¥0.0007 | 7.4 秒返回;误报 4 条,当提醒不当结论 |
| 日常 PR 审查、同步门禁 | qwen3.7-plus 这一档 | 单价见控制台,输出 2,052 tok,上界 ¥0.0799 | 23.4 秒满分,本次实测的性价比拐点 |
| 安全相关、异步合并门禁 | qwen3.8-max | ¥0.4048 | 会报出埋点之外的真问题,行号可直接跳转 |
| 结论存疑时交叉复核 | 两个便宜档各跑一遍 | 两次便宜档的钱 | 这次 plus 漏了 B1、coder-plus 漏了 B3,漏报不重叠 |
最后一行是观察而非结论,7 组样本不足以支撑普适判断,且误报会叠加,人工复核成本需一并计入。
十二、边界说明
这次实测里最贵的模型没有赢,赢的是会思考但思考得克制的那一档:23.4 秒,满分,行号全对。样本是一份 64 行的 Python 模块,复杂仓库上拐点是否右移,本次未测。
已经使用 Copilot 或 CodeRabbit 且订阅用得顺手的团队,本文不建议更换。它面向的是另一类需求:希望用开源工具自主配置模型底座,并且需要知道每一档在一次 PR 上到底花多少钱、多少秒、会漏哪一类缺陷。
百炼控制台入口:https://bailian.console.aliyun.com/?source_channel=hh_github
下一步计划把 ocr review --format json 接进 CI 当合并门禁,用真实仓库的 PR 复算时间与成本两个维度。
实验材料:64 行被测代码、答案卷、计分脚本、8 组原始输出(含 API 原样返回的 usage 与墙钟耗时)随本包附在 source/lab/。所有金额 = 真实 usage × bl model list 免登录实跑单价;未返回单价的模型一律标注"见控制台",不估算。