假 Claude 检测器现已成为开源库
ai-model-verifier 是我们模型测试器背后的引擎,现以 AGPL-3.0 许可证发布在 npm 上。给它一个基础 URL、一个密钥和一个模型,它就能告诉你该端点提供的是否是它所售卖的模型,现在还新增了思考签名和 token 计费检查。
四月份我们公布了假 Claude 转售商的数据:8 家供应商的 183 个通道以 Kiro、Codeium 或其他挂着 Claude 名牌的模型作答。抓到它们的探针当时位于我们的同步流水线内部。现在它们位于一个任何人都可以安装的软件包中。
ai-model-verifier 以 AGPL-3.0 许可证发布在 npm 和 GitHub 上。它接收基础 URL、API 密钥和模型名称,返回三种判定之一:genuine、suspicious 或 unverified,并附带触发的规则以及探针的原始响应。
为什么做成库
同一套检查现在在三个地方运行:在你浏览器里的模型测试器中,在我们为公开排行榜提供服务的服务器上,以及在决定 UnoRouter 究竟开放哪些上游通道的同步流水线里。一份模式列表复制三份必然会各自漂移。一个软件包则不会。
它刻意做成同构的。只使用 Web 标准 API,没有 node: 导入,零运行时依赖。HTTP 调用由外部注入,因此浏览器可以绕过 CORS,服务器可以走防 SSRF 的 fetch。供应商和检测器是独立的入口点,所以检查 Anthropic 时永远不会打包 Gemini 的配置。
四月以来的新内容
第一篇文章里的四个行为探针仍然是核心:小猫的故事、俳句、身份提问和模型名称提问,现在支持 Anthropic、OpenAI 和 Gemini 格式的端点。围绕它们新增了一批不依赖于询问模型“你是谁”的检查。
- 思考签名。Claude 会在每个思考块上附加服务器生成的签名。提供其他模型的中继无法生成它。身份探针可以用系统提示词来诱导,签名却不行。
- token 计账。中继可以转发真正的 Claude,却在每次调用时虚增
input_tokens。两个仅相差一段固定文本的提示词,其计费 token 数必须在已知区间内产生差异,count_tokens必须与计费值一致,输出必须保持在max_tokens以下。Opus 4.7 和 4.8 使用不同的分词器,因此这个区间同时也是一项档位检查。 - 档位不符与替换。按 Opus 计费却提供 Sonnet 能够骗过行为探针,因为 Sonnet 也能写出一篇像样的小猫故事。模型名称探针会抓到说出更便宜档位的回答,信封检查会抓到回传的模型 ID 与请求不一致的端点。
- 响应串扰与语言泄漏。每个提示词都带有一个 nonce。回传了别人 nonce 的回答说明代理在用户之间混淆了响应。对英文提示词的回答里出现 CJK 字符,则指向被替换的中文模型。
- 信封元数据。Anthropic 格式回复里出现
chatcmpl-前缀的 ID,或者 Messages 响应里出现 OpenAI 的 usage 字段,说明你和模型之间有一层转换层。这只作为观察结果报告,而不是判定:我们自己的网关正是这样一层。 - 吞吐量。越大的模型每个 token 越慢,所以一条按 Opus 计费却跑出 Sonnet 速度的通道值得留意。只采样,从不设阈值:有意义的比较发生在提供同一模型的多条通道之间,而这只有调用方才能拼出来。
它无法证明什么
一个有效的签名证明是真正的 Anthropic 链路在作答。它无法证明是哪个档位:Sonnet 被当作 Opus 售卖时同样会返回完全有效的签名,所以这里通过了仍然需要档位检查。把思考块回传给 Anthropic 重新验证签名听起来像是最终测试。我们实现了它,但它无法穿过中继。两个线上上游对真实的块和把签名换成 308 字节随机 base64 的同一个块都返回了 200。中继会把这一轮重新发给自己的后端,因此没有任何东西真正做了验证。该选项默认关闭,并如实写在文档里。
签名检查和 token 检查移植自同为 AGPL 的 veridrop,其容差是对照官方 API 校准的。我们保留了那些看起来偏松的边界,因为真实的 Anthropic 响应就落在它们附近。
如何使用
模型测试器会在你的浏览器里运行全套检查,包括签名和 token 检查,除了发往你供应商的调用之外没有任何数据离开你的机器。排行榜页面发布的是人们主动选择分享的结果。在你自己的流水线里:
import { runVerification } from "ai-model-verifier";
const result = await runVerification({
provider: "anthropic",
baseUrl: "https://YOUR-PROVIDER",
apiKey: process.env.YOUR_KEY,
model: "claude-opus-4-8",
mode: "server",
checkSignature: true,
checkTokenTruth: true,
});
console.log(result.verdict, result.reasons);
// "suspicious" [ "tier-mismatch: requested claude-opus-4-8, served sonnet" ]按需开启。checkSignature 和 checkTokenTruth 各自需要额外请求,因此不指定就保持关闭。信封元数据和吞吐量从本次运行已经拿到的响应中读取,不产生任何开销。
测试一个供应商,阅读四月的文章了解这一切的起点数据,或者在某个真实端点得到错误判定时到 GitHub 提交 issue。
LLM 网关是一个端点和一把密钥,把请求路由到众多模型供应商。下面讲它做什么、为何有帮助,以及谁真正需要它。
我们已将 18 家免费提供方接入 UnoRouter:190+ 条免费模型、一个 OpenAI-compatible 端点、$0 per token。它们自带我们无法提高的上游限额,我们还额外加了一道轻量的每分钟 1 次上限,以保持共享池的公平。这是诚实的说法。
UnoRouter已收录于各大 AI 工具与创业产品目录。您可以在这里找到我们、核实收录信息并阅读独立评价。