English | 简体中文
Coding agent 一晚上生成上百条改动,你却要逐条亲自看——人成了吞吐瓶颈。Diverge 让 Qwen flash 与 DeepSeek 两个独立家族的国产 flash 档模型各审一遍:意见一致自动放行并汇成摘要,只有分歧的 Agent 改动带着双份判词送到你眼前,双审成本以分钱计。
路由信号是机器可检查的:两个审稿人各自对每个 diff hunk 给结构化判词(approve / reject / unsure),approve+approve 之外的任何组合都进人工队列。没有 oracle,没有训练出来的风险模型——「两个独立模型是否意见相反」直接可算。
零 API key,先看分流长什么样:
# 从 PyPI 安装(发布后可用)
uv tool install diverge
# 或从源码安装
git clone https://github.com/SuperMarioYL/diverge && cd diverge
uv tool install .
# 内置一周样例 agent diff + 本地 mock 双审端点,全程离线
diverge demodiverge demo 会打印分流统计、逐条演示分歧裁决、生成 digest 报告——结果确定性,重跑数字不变。
换成你自己的数据与真实端点(OpenAI 兼容,分钟级跑完一周产出):
export DASHSCOPE_API_KEY=sk-... # Qwen(阿里云百炼兼容端点)
export DEEPSEEK_API_KEY=sk-... # DeepSeek
diverge review agent-week.diff --reviewer qwen --reviewer deepseek
diverge triage # 行式走分歧队列:a=accept / r=reject / d=defer,q 随时退出
diverge report # 生成 digest.md样例数据上的分流统计:
112 hunks → 13 divergent, 99 auto-advanced · 双审总成本 ¥0.98
两点如实说明:演示跑在本地 mock 双审端点上,判词由确定性规则产生(换真实端点流程与口径完全一致);¥0.98 是 mock 按内置 flash 档单价模拟的成本(qwen ¥2/¥8、deepseek ¥1/¥4 每百万 tokens),量级参考,不是账单。想重录:vhs docs/demo.tape。
评审收件箱类工具把 agent 产出停进队列等你裁决,但队列里每一条都只有一个隐含判词——「请人来断」——所以人始终要看 100%。第二意见本身不难,难在经济学:frontier 定价下给每个 hunk 再跑一遍永远开不起;flash 档(¥1–2/M tokens)让这件事第一次可以默认打开。
- 分歧即信号,无需训练:路由判定是「两个独立家族的模型是否意见相反」,一条比较就能复算,无需风险模型、无需标注数据。
- 强制跨家族:同家族模型判词高度相关,分歧队列会退化为空(agreement collapse)。Diverge 的两个内置审稿人固定 Qwen flash × DeepSeek,并自带家族警告。
- 路由保守:只有 approve+approve 才放行;reject、unsure、解析失败统统进人工队列。digest 把自动放行集逐条留档,一致不等于不可见。
- 一致不是正确性证明:它是廉价初筛。漏网情况在 digest 里可审计,工具不替你背书。
与相邻工具的分工(各自解决各自的问题):
| 工具形态 | 评审信号 | 人要看多少 |
|---|---|---|
| 评审收件箱(如 Pinrail 类) | 单判词,逐条待人断 | 全部 |
| 学习式风险门 | 训练出的风险分级 | 高风险项 |
| 单 AI 审稿(frontier 定价) | 一个模型逐 hunk 评论 | 仍由人逐条消化 |
| Diverge | 双模型判词分歧 | 只看分歧项 |
单进程 Python CLI,无服务、无数据库、无守护进程,状态全部在本地 .diverge/ 的 JSONL 里:
diff/patch 文件
│ hunks.py unified diff → {id, file, header, body} 有序 hunk 列表
▼
reviewers.py 端点注册表(qwen / deepseek / mock / 自定义 base_url)
│ 每个 hunk 请求一次,抽取 JSON 判词 → verdicts.py 校验
▼
分歧路由(triage.is_divergent,唯一实现)
├── approve+approve → 自动放行 → digest 摘要留档
└── 其余任何组合 → 人工队列 → triage 行式裁决(a/r/d)
▼
digest.py digest.md:分流统计 + 放行集摘要 + 人工裁决记录
- 判词结构:
{hunk_id, reviewer, verdict: approve|reject|unsure, reason, cost: {tokens, cny}, ts},pydantic 校验后落 JSONL。 - 模型回复不是合法 JSON 时按
unsure保守路由,理由记解析失败原因——错杀进人工队列,永不静默放行。 - 成本按响应
usage的 tokens 与注册表单价本地估算,随判词一并留档。
| 命令 | 作用 |
|---|---|
diverge review <diff> |
切分 → 双审 → 打印分流统计,判词写入 .diverge/state.jsonl |
diverge triage |
行式走分歧队列:hunk 原文 + 双判词并排,a/r/d 一键裁决,断点续走 |
diverge report |
渲染 digest.md:分流统计 + 自动放行集摘要 + 人工裁决记录 |
diverge demo |
零 key 快速路径:内置样例 diff + 本地 mock 双审 |
review 常用选项:
| 选项 | 说明 |
|---|---|
--reviewer NAME -r NAME |
两位审稿人,默认 qwen + deepseek;也可 mock 或自定义名(配 --base-url) |
--max-cny 金额 |
成本墙:双审累计超过该金额即中止,已完成部分照常入库 |
--base-url / --model / --api-key-env |
自定义 OpenAI 兼容端点三件套 |
triage 与 report 不传 --diff 时自动接最近一次 review 的 diff(.diverge/last_review.json)。
全部走环境变量与命令行参数,没有配置文件:
| 环境变量 | 用途 |
|---|---|
DASHSCOPE_API_KEY |
Qwen(阿里云百炼 OpenAI 兼容端点) |
DEEPSEEK_API_KEY |
DeepSeek 开放平台 |
DIVERGE_QWEN_MODEL / DIVERGE_DEEPSEEK_MODEL |
覆盖内置 model id(端点方升级时不必改代码) |
OPENAI_API_KEY |
自定义端点默认读取(可用 --api-key-env 换) |
自定义端点示例(任何 OpenAI 兼容服务):
diverge review week.diff \
--reviewer glm --base-url https://open.bigmodel.cn/api/paas/v4 \
--model glm-4.5-flash --api-key-env ZHIPUAI_API_KEY成本与判词的诚实边界:内置单价(qwen ¥2/¥8、deepseek ¥1/¥4 每 M tokens,输入/输出)是量级估计,可在 diverge/reviewers.py 的注册表里调整;它影响统计与成本墙,不代表你的实际账单。两个审稿人若同家族,review 会打印警告——同家族判词相关,队列可能退化为空。
方案是否成立由一个数字决定:真实一周 agent 产出上的分歧率。experiments/pilot_divergence.py 对输入跑双审,输出分歧率、¥/hunk 与 go/no-go 报告:
python experiments/pilot_divergence.py --source your-week.diff
python experiments/pilot_divergence.py --source session.jsonl # agent harness 会话 JSONL,自动抽取编辑补丁
python experiments/pilot_divergence.py --mock # 无 key 冒烟(判词为确定性模拟)判定阈值(写在生成的 experiments/pilot-report.md 里):分歧率 < 5%(agreement collapse)或 > 70%(人仍要全看)→ kill;落在健康带且每 hunk 分钱级 → go。mock 冒烟只证明管道可用——go/no-go 必须来自真实端点的数据。
- v0.1(当前):hunk 切分、跨家族双审、成本墙、行式 triage、digest、mock 演示、m1 试点脚本
- v0.2:OpenAI 兼容协议之外的原生端点一等支持;CI 集成(在流水线里按分歧路由评审)
- 更远:跨模型分歧基准数据集——判词对本身就是语料
MIT © 2026 SuperMarioYL
