rpdiag 是 LLM API 中转通道质量检测仪

用同一组探针同时测官方 baseline 与中转候选,对比行为差异并按 rpdiag 方法论给出参考分。 它不替你选购,也不替你判断"是不是假"。

差异度量

为什么不只看一个绝对分

一个通道的绝对分没有意义——延迟、cache 行为、协议表面这些信号都依赖具体的网络、账号和上游策略。 rpdiag 选择把候选通道与官方 baseline 在同一时刻、同一组 prompt、同一组 mitmproxy 拦截下并行跑, 只有这样得出的差异才能告诉你"这家中转和官方在哪些维度行为一致、哪些不一致"。

因此 rpdiag 的所有评分都是相对评分。 一个候选通道在缺乏 baseline、baseline 与候选不可对照时,相关维度会被跳过或降权, 而不是被强行打高分或打低分。

方法论

它怎么测

当前主评分来自 quick-probe-v1pingidentity-structuredcutoffidentity-freeknowledge-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_versionweights_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]