Skip to content
SuperMarioYLPublic

About

为 coding agent 改动评审做双审分歧分流的开源命令行工具,只有模型意见相反的改动才需要人看

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

English | 简体中文

Diverge:双审分歧分流——两个模型意见一致就自动放行,只有分歧的才需要人看

Diverge

version python CI license

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 demo

diverge 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

演示

约 1 分钟终端演示:diverge demo 打印 112 hunks → 13 divergent, 99 auto-advanced,随后逐条展示分歧 hunk 与两侧判词并排,最后生成 digest

样例数据上的分流统计:

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 会打印警告——同家族判词相关,队列可能退化为空。

m1 分歧率试点

方案是否成立由一个数字决定:真实一周 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

About

为 coding agent 改动评审做双审分歧分流的开源命令行工具,只有模型意见相反的改动才需要人看

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages