rpdiag 是 LLM API 中转通道质量检测仪
用同一组探针同时测官方 baseline 与中转候选,对比行为差异并按 rpdiag 方法论给出参考分。 它不替你选购,也不替你判断"是不是假"。
为什么不只看一个绝对分
一个通道的绝对分没有意义——延迟、cache 行为、协议表面这些信号都依赖具体的网络、账号和上游策略。 rpdiag 选择把候选通道与官方 baseline 在同一时刻、同一组 prompt、同一组 mitmproxy 拦截下并行跑, 只有这样得出的差异才能告诉你"这家中转和官方在哪些维度行为一致、哪些不一致"。
因此 rpdiag 的所有评分都是相对评分。 一个候选通道在缺乏 baseline、baseline 与候选不可对照时,相关维度会被跳过或降权, 而不是被强行打高分或打低分。
它怎么测
当前主评分来自 quick-probe-v1:ping、identity-structured、
cutoff、identity-free、knowledge-tier 五步会话 flow,
通过 claude-cli 的 --session-id / --resume 保持会话连续性。
每个测试组里 candidate channel 与 official baseline 收到完全相同的 prompt(pinned_prompts 锁定),
请求通过 mitmproxy 拦截,rpanalyze 解析 token 用量与上游指纹。
针对 Anthropic SSE 响应,mitm 还会在流式 chunk 流过的同时记录 message_start /
content_block_delta / message_stop 三个事件的到达时刻,
让 compare 页区分 HTTP 头时间、首文本时间与完整流总耗时。
盲评期所有渠道身份隐藏,等组内任务全部终态后整组揭晓。
评分器把抓包信号聚合为 24 个 protocol / behavior 维度(当前版本 v3.28.0,合计权重 190), 每个维度按其相对权重做归一化后加权得 0-100 参考分。 权重是占比而非绝对分数——加强或弱化某一维只需改它自己的整数,其余维度由后端按当前 active 维度的权重总和自动稀释或抬升。 v3.0 (2026-05-20) 起评分对照的是近 3 次官方基线的窗口,单次基线漂移不会冤打候选;有 1-2 次历史基线也照用,只有完全没有 eligible 历史基线(冷启动)时才回退到当组同跑的单次基线。 24 维按主题分组:
模型与缓存
合计权重 76| 维度 | 权重 | 说明 |
|---|---|---|
cache_hit_ratio_match | 20 | 与官方 baseline 比较缓存命中比例 sum(cache_read) / sum(total_input)(Claude 最多 5 步;codex 只取缓存连续的前 4 步、排除 fresh 召回步)。候选低于 baseline 20% 以内满分,低于 50% 记 0;体现 wrapper 是否在保留 cache_read 字面量的同时膨胀了未命中输入。 |
cache_continuity_intra | 14 | 相邻步骤的后一步输入要覆盖前一步输入加输出的至少 85%,发现会话上下文丢失或缓存断裂。 |
model_match | 14 | 所有步骤响应的 model 字段必须都等于请求模型;分数 0 直接拉低总分但不再触发 v2.5 时代的 cap。 |
cache_sliding_correctness | 13 | 步骤 1/2/3 应有 cache_read,且步骤 2 的 carry-over 至少保留步骤 1 的一半(5 分钟 sliding 行为)。 |
cache_ttl_consistency | 15 | 与官方 baseline 对齐 TTL 表面(5m/1h 键暴露);仅看协议形状,缓存命中比例从 v2.4 起拆分到 cache_hit_ratio_match。v3.1 把权重从 3 抬到 15:v3.0 删 cap 后,"中转商剥离 1h 缓存表面"必须靠权重来惩罚。 |
身份与知识
合计权重 60| 维度 | 权重 | 说明 |
|---|---|---|
self_identity_consistency | 8 | v2.5 新增:rpanalyze 从 SSE thinking_delta / text_delta 提取 Claude 自报模型 id,与 request.model family/major 比对;冲突记 0。Step 1 visible 已被 identity_structured_match 覆盖,自动跳过避免双算。 |
envelope_self_report_match | 3 | v3.21.0 新增(仅 claude):把同一响应内的「信封 release ⊕ 自报 release」按精确点版本互比(信封 message_start.message.model 被改写成请求版本时,第 1 步结构化身份回答仍可能泄露另一 release)。仅在同族同大版本下判定(不双算族/档信号);date-only 构建号经固定历史表解析;无可比对则跳过、不扣分。codex 等非 claude 服务 N/A。**v3.24.1 调轻(权重 6→3)并去除「实锤替换」口径**:同档位冲突无法区分「真同档降级」与「诚实删除 # Environment 系统块」——后者让真模型丢身份注入、自报更旧 release,触发同样的冲突,而 knowledge_recall + tier 在近版(如 sonnet-4-5 vs 4-6)上分不开。删官方提示词仍是保真度偏差、该扣,故保留惩罚但调轻;区分近版的重活交给 knowledge_recall。 |
thinking_present | 4 | v3.1 新增:thinking_detected 表示该步 SSE 是否开了 thinking content block(与 thinking_volume_match 看的 thinking_delta 流式量不同源,block 开了却 0 个 delta 是合法传输指纹)。当官方 baseline 至少一步开了 thinking block 而候选全流程都没开时记 0;两边都无 thinking block 时跳过维度(active_weight 归零)。检测中转商把 thinking-capable 模型替换为非 thinking 后端。 |
thinking_volume_match | 6 | v3.1 新增:候选 5 步 thinking_event_count 总和 vs 近 3 次官方 baseline 各自总和的中位数。0.5x-2x 满分;下侧 0.3x 线性降到 0(强相似度惩罚截断),上侧 3x 线性降到 0(容忍 Claude 推理变异);baseline 中位数=0 时跳过。 |
tier_thinking_volume_match | 8 | v3.20.0 新增(仅 claude):第 6 步数字计数题(数一段 72 位随机数字串里某几个数字的出现次数),在系统提示「只回最终紧凑 JSON、不要推理」+ fresh 单轮会话 + effort=low 下,用候选 step-6 output_tokens(思考体量)与近 3 次同条件官方基线的中位数比 ratio(复用 thinking_volume_match 的 0.5x-2x 满分、下侧 0.3x / 上侧 3x 归零分带)。opus 遵从「不要推理」秒答跳过数数(~19 tok)、sonnet/haiku 仍照数(数百~数千 tok),借此抓「中转商把 opus 通道静默降级成更便宜档位」的同厂降级。baseline-grounded:不硬编码绝对阈值(随模型代漂移),opus 绝对值漂了基线同步漂、诚实 opus 仍满分,只有 opus/sonnet 的体量 separation 本身崩了才失效。信号本质是指令遵从癖(条件敏感):指令必须走系统提示、且必须 fresh 单轮,正文放指令或续接多轮会话都会让 opus 也开始数数而塌进 sonnet 档。候选无第 6 步、或基线无同条件样本时跳过(active_weight 归零)。codex 等非 claude 服务 N/A。 |
identity_structured_match | 7 | v3.5 起 baseline-aware:仅当近 3 次官方 baseline 至少有一次产出合法 vendor/brand/model 三行时启用;baseline 全部拒答或破格式时该维度 skip,active_weight=0,不冤打那些"跟着官方一起拒答"的候选。启用后,候选结构化身份回答必须只有这三行,且与 Anthropic / Claude / 请求模型一致。 |
cutoff_match | 5 | v3.4 起:候选知识截止月份与近 3 次官方基线月份的 mode 对齐(平票取最新一次 baseline);偏差越大扣分。baseline window 内可解析月份不足 2 个时回退最新单次 baseline;baseline 完全不可用时跳过维度。v3.18.0 起探针只问「可靠知识截止(reliable knowledge cutoff)」框架:早先随机轮换里夹带的「训练数据截止 / training data cutoff」措辞会让真模型报出更宽的训练数据日期(而非烤进自我认知的可靠截止),在多轮会话+步间延迟的真实路径下被放大,造成基线 cutoff 双峰、误判 cutoff_match=0;裁剪到稳定的知识截止措辞后源头消抖,评分逻辑不变。v3.26.0 权重 7→5:这是自报的软信号,把判别重活让给 knowledge_recall / tier 等硬探针。 |
identity_free_clean | 7 | 自由身份回答中出现强 wrapper 自称(如「我是 Kiro / Antigravity / Augment / RooCode / Windsurf / AnyClaude / Cline」)时记为 0;不再触发 cap,但 7 分权重的损失会直接体现在总分。v3.8 起列表扩到 10 项以覆盖 2026-05 后入榜的新 wrapper。 |
knowledge_recall_match | 12 | v3.14.0 起的第 4 步主力知识维度(服务无关):一组中性、带确切日期的公共事实,按 2024Q1→2025Q4 季度网格排布(每季度 2-3 题,纯体育/科学/奖项,已剔除选举/政府任命题以避免拒答被误读为无知),在工具/联网禁用下让模型仅凭参数化记忆作答,得到「召回向量」,与同版本官方基线的召回向量逐题对照。只惩罚「基线已知却答错/不知」(降级信号),「比基线知道得更多」不扣分;基线已知题(命中率 ≥ 0.6)不足 4 道、或跨度不足 3 个季度则跳过。任何联网/工具痕迹一律判 0(绝不跳过,防止中转商靠开搜索蒙混)。v3.16.0 起题集换成经真实 CLI 路径实证的季度网格(claude opus/sonnet/haiku + codex gpt-5.5/gpt-5.4 五个官方基线)。坑:codex 默认 medium 推理会让 gpt-5.4 把确知的旧事实「想」成不确定而误答 UNKNOWN(默认档下一度只召回约 3/17,并非真不知道),故 v3.17.0 起把召回步固定到最低推理档;2026-06-25 起 codex 统一发 `none`(真实 CLI 实证 `none` 与 `minimal` 在 gpt-5.4 上逐题判分一致,且兼容只认 `none` 的严格上游)。固定后 gpt-5.4 召回回升到约 12/17、与官方基线稳定对齐。评分始终是候选与同版本官方基线的逐题对照:声称为某版本却召回更少 late-window 事实的后端即露出降级;事实集与逐题公式不变(Claude 路径不受影响)。补上了 model_match 在「信封被改写」时无行为兜底的缺口。 |
world_knowledge_tier_match | 12 | (v3.14.0 起为遗留维度,仅对历史 {"a":[...]} 数据生效;新流程改用上面的 knowledge_recall_match,二者按第 4 步输出 schema 互斥,同一 flow 只有一个计入。)旧逻辑:第 4 步用 5 道公共事件硬事实题推断实测能力 tier(haiku / sonnet / opus),与请求模型声明的 tier 对照;低于声明 ≥ 2 档记为 0。codex 等非 Claude 服务对其 N/A。 |
上游协议表面
合计权重 34| 维度 | 权重 | 说明 |
|---|---|---|
anthropic_msg_id_format | 8 | 响应 message_id 是否保持 Anthropic 原生 msg_01 前缀(中转改格式通常意味着 rebuild shim)。v3.1 从 4 抬到 8,作为 rebuild shim 的强信号。 |
service_tier_present | 6 | 响应体 usage.service_tier 等字段是否稳定出现(Anthropic 原生通常带,wrapper 经常漏)。v3.1 从 3 抬到 6。 |
inference_geo_present | 5 | 响应体的 inference geo 字段是否稳定出现(同上)。v3.1 从 2 抬到 5。 |
system_prompt_clean | 8 | 比较候选与 baseline 的 step 0 输入体积,识别候选侧注入或剥离 system prompt 的情况。v3.2 从 4 抬到 8——与 anthropic_msg_id_format / self_identity_consistency 并列:实测 wrapper 可注入 +5207 tokens 或剥离 -16499 tokens 而原权重 4 仅与 stop_reason_present (3) 一档,与信号强度严重不匹配。 |
anthropic_request_id_passthrough | 2 | HTTP 响应 request_id_chain 中是否出现 Anthropic 原生 req_01 id。v3.10.0 起链中任意位置命中即满分(中转/CDN 把自己的 id prepend 到前面属正常链路形状,不算质量损失),命中位置以 req=True@N 留在 evidence 供取证;空链仍记 0。v3.1 权重从 1 抬到 4,v3.26.0 再调回 2——它是协议表面里最弱的信号,"header 透传缺失"比"rebuild shim"更常是无心 nginx 配置问题。 |
stop_reason_present | 3 | 四步响应需要返回允许的 stop_reason 字段(end_turn / max_tokens / stop_sequence 等)。 |
sdk_consistency | 2 | 四步的 sdk_name 需要一致且非空;陌生 SDK 名只作为提示,不直接扣高分。 |
流式投递
合计权重 5| 维度 | 权重 | 说明 |
|---|---|---|
buffer_dump_match | 5 | v3.19.0 新增、v3.22.0 重写的传输层维度:用第 4 步(knowledge_recall)的"可见文本投递跨度" visible_text_span_ms(最后一个 text_delta 时间 − 第一个 text_delta 时间,全程在 chunk 时间线内)与近 3 次官方 baseline 的中位数比较。真流式逐步吐可见文本、跨度宽;中转商"攒满整段再一次性 dump"(假流式)则把可见文本压在末尾一股脑发、跨度塌向 0。跨度纯按 text_delta 计、构造上排除 thinking 块——sonnet/haiku 会先流一大段思考再出文本,旧版用首个 content_block_delta(含 thinking)做窗口会把末尾文本 dump 误判成正常,新版不会。候选跨度 ≥ 70% baseline 满分、≤ 25% 记 0、中间线性,比 baseline 更慢/更分散不扣分;候选有实质输出却只有 1 个可见文本块即视为塌缩判 0。输出 < 100 token / 截断 / baseline 样本 < 2、以及 **baseline 自身可见跨度过小(< 500ms,如 haiku 在长思考后秒吐文本)都跳过**——那是观测信息不足、无渐进投递参照,而非可隐藏的信号。第 3 步过短("50 字以内")撑不起流式特征,故 v3.22 移到第 4 步并退役了配套的 stream_pacing_match(其 ≥5 text_delta chunk 的要求在 Claude 的投递粒度下基本不可达)。**这是传输层差异,不代表模型被替换或降级**——分低只说明"疑似攒批假流式",与模型真假是两回事。 |
延迟
合计权重 15| 维度 | 权重 | 说明 |
|---|---|---|
latency_baseline_match | 15 | 用 HTTP TTFB(响应头到达)与总耗时相对官方 baseline 的比值评分(取前 4 个轻步骤的中位数,两项各占一半);候选比基线更快不扣分。v3.25.0 起对照的是「同一对比组内、同时刻测得的官方基线」(而非历史滚动基线)——延迟是唯一强时变量,同时刻共测才能抵消时段网络波动,避免某天基线偏慢就让所有通道虚高满分。满分门槛同步收紧到 ≤1.5×(≥3× 记 0、中间线性),让稳定明显偏慢的通道如实扣分。只取前 4 步是因为第 4/5 步重在模型思考耗时(属 tier 信号、另维评分),非传输延迟。v3.26.0 权重 5→15:v3.25.0 改用同时刻共测官方基线后,稳定偏慢已是可信的服务质量差距,值得重权。 |
分数怎么读
0-100 相似度分
每个维度先按各自规则得 0-10 分,再按权重归一化汇总成 0-100。 分数表达"与官方近 3 次基线的统计相似度",不是中转商总评。 仅供 RelayPulse 平台内部参考。
主理人主观加权
权重是主理人对各维度重要性的主观判断(不是中立平均)。 权重表完整公开,可在 方法论 查看, 历次调整在 git 中可追溯。中转商提交收录即接受该方法论。
评分契约(v3.0 起)
v3.0 (2026-05-20) 取消 verdict cap,改为纯加权相似度,该契约延续至当前版本。
后续小版本仅在该契约下调整单维 scorer 行为或权重(最新版本见 方法论)。
版本升级后历史分数不能直接和新分数横排——榜单默认混算各版本冻结分(cutover 期老分不消失),只取近 30 天样本,可加 ?scoring_version=current 看仅当前版本,
每行评分内嵌 methodology_version + weights_hash 可追溯当时权重。
| 契约项 | 行为(v3.0 起,当前 v3.28.0) |
|---|---|
| 分数构成 | overall_score = Σ(weight × dim_score) / Σ(weight) × 10(dim_score 为每维 0-10 分),纯加权,无 cap 上限。 |
| 基线窗口 | 近 3 次官方基线滚动窗口(有 1-2 次也直接使用);无 eligible 历史基线时才回退到当组同跑的单次基线(带 baseline_window.samples 字段披露)。 |
| verdict / cap | 已删除。不再作为顶层 verdict/cap 或用户面结论输出,前端不渲染任何定性判定("模型替换" / "缓存断裂" / "wrapper 暴露")。 |
| 定位 | 仅供 RelayPulse 平台内部参考。详情请直接读 dimensions 字段的 24 维证据。 |
| 每行可追溯 | 评分内嵌 methodology_version 与 weights_hash,可在 git 中精确定位当时的权重表。 |
当前能说明什么
当前不能说明什么
- 此评分仅供 RelayPulse 平台内部参考,权重由主理人主观给出。提交收录即接受该方法论(详见 入驻协议)。
- 评分衡量候选通道相对官方近 3 次基线的行为差异,是统计观测,不构成"商家是否掺假"或商誉的定性结论。
- 官方基线缺失、过旧或解析失败时,相关维度会跳过、降权或仅作为提示。
- Prompt cache 的 TTL 与命名空间表现依赖当前采样条件,跨账号、跨出口或上游策略变化可能改变结果。
- Anthropic 等上游服务策略变更期间,基线滞后可能导致短期评分波动;窗口自然滑动后恢复。
- claude-cli 首轮 main/sub-agent 并发已做主调用选择防护,但 CLI 行为变化仍可能需要重新校准。
- 方法论仍在测试开发阶段,scoring_version 升级后历史分数不能直接和新分数横排;榜单默认混算各版本的冻结分(让 cutover 期老分仍可见、不被洗掉),但只统计近 30 天内的样本,可加 ?scoring_version=current 切到仅当前版本的严格视图。
谁在维护,怎么反馈
rpdiag 主要是 maintainer prehisle 自用的测试开发项目, 目前没有正式发布、没有公开用户群,方法论会随生产样本和回放验证继续迭代。
中转商对评分有异议、看到样本异常或想反馈方法论问题,欢迎邮件 [email protected]。