模型检测依据
记录检测程序实际发送的请求、读取的字段和采用的判定条件,并按协议路径整理
先选你要检测的协议
页面会隐藏这条路径不会执行的探针,证据等级、权重和判定规则都不会改变
17 张计分卡 · 10 张不计分旁证
证据等级
每项探针都有等级。它说明的是这条依据有多硬,而不是我们认为它有多重要
依据来自官方 API 文档明确定义的字段或机制,判定规则可对照文档复核
官方确实存在这个能力,但「哪个渠道支持 / 不支持」来自我们的实测,不同时间点可能变化
依据是我们维护的关键词表、拒答词表或前缀经验,可被提示词或上游改动影响,只作佐证,不单独定性
原生血统
只在目标是 Anthropic 原生端点时出现,这一段内部权重合计 100,是判断「有没有被套壳」最硬的一组
签名校验
thinking_signature无法接入真实 Anthropic 签名校验通道的伪造后端。伪造一个看起来像 thinking 的块很容易,伪造一段能通过 Anthropic 服务端校验的 signature 做不到 —— 但 OAuth / 订阅账号池调用的本来就是真 Anthropic 后端,签名同样会通过,不能靠这一项排除
签名校验
thinking_signature无法接入真实 Anthropic 签名校验通道的伪造后端。伪造一个看起来像 thinking 的块很容易,伪造一段能通过 Anthropic 服务端校验的 signature 做不到 —— 但 OAuth / 订阅账号池调用的本来就是真 Anthropic 后端,签名同样会通过,不能靠这一项排除
原理
先发一道需要思考的算术题,请求带上思考参数(优先 thinking: {type: "adaptive"} 配 effort: high,被 400 拒则退回 {type: "enabled", budget_tokens: 1024}),从响应里取出那个带 signature 字段的独立 thinking 块。再发第二轮,把这个签名块原样放进 assistant 历史继续追问 —— 真 Anthropic 后端会用自己的密钥校验这段签名再继续,伪造或转录的签名会被直接拒掉
防哪种假
无法接入真实 Anthropic 签名校验通道的伪造后端。伪造一个看起来像 thinking 的块很容易,伪造一段能通过 Anthropic 服务端校验的 signature 做不到 —— 但 OAuth / 订阅账号池调用的本来就是真 Anthropic 后端,签名同样会通过,不能靠这一项排除
判定规则
回传被接受(2xx)→ 通过;遇 429 / 5xx 瞬时错误 → 警告,不定性;被明确拒绝 → 未通过,单项即可定性。第一轮就没拿到带签名的 thinking 块 → 记为「无法验真」,既不扣分也不标红 —— 模型没触发思考、或中转裁掉了 thinking 块,都不构成造假证据
依据与边界
依据是 Anthropic Messages API 对 extended thinking 的公开定义:thinking 块携带 signature,且回传时由服务端校验。边界是验真通过只能证明「上游背后是能校验 Anthropic 签名的真后端」,不能区分 Console、Bedrock 还是 Vertex,也不能排除 OAuth 账号池 —— 账号池打的就是真 Anthropic API,签名照样过。区分渠道要靠 web_search、响应头指纹、system 覆盖检测三项合看
LLM 指纹 / 客户端身份
canary + client_identity把 Claude Code 的 OAuth 额度包装成 API 卖的账号池。这类中转会在我们的 system 之前注入 Claude Code 的提示词,模型自己知道,问对了就会说出来。三种措辞并列是为了对抗关键词过滤 —— 中转可以拦掉中文原句,但很难同时拦掉英文改写和工具清单两条路
LLM 指纹 / 客户端身份
canary + client_identity把 Claude Code 的 OAuth 额度包装成 API 卖的账号池。这类中转会在我们的 system 之前注入 Claude Code 的提示词,模型自己知道,问对了就会说出来。三种措辞并列是为了对抗关键词过滤 —— 中转可以拦掉中文原句,但很难同时拦掉英文改写和工具清单两条路
原理
两个子项。金丝雀:每次生成一串随机 10 位大写码,要求原样回显,看中间有没有人改写内容。客户端身份:用中文逐字、英文改写、工具清单三种措辞分别问「你的 system 里有什么」,任一命中 Claude Code 专属标记(含它注入时连带塞进来的工具名词表)即定性
防哪种假
把 Claude Code 的 OAuth 额度包装成 API 卖的账号池。这类中转会在我们的 system 之前注入 Claude Code 的提示词,模型自己知道,问对了就会说出来。三种措辞并列是为了对抗关键词过滤 —— 中转可以拦掉中文原句,但很难同时拦掉英文改写和工具清单两条路
判定规则
金丝雀原样回显 → 通过;被改写或截断 → 未通过。客户端身份命中 Claude Code 标记 → 未通过(套壳确证);返回了干净正文 → 通过;三条措辞全部拒答或全空 → 记为无法判定,不计入分母
依据与边界
关键词表和拒答词表都是我们自己维护的经验规则,所以定为经验指纹。注意方向性:命中是强证据(正常 API 不会凭空冒出 Claude Code 的工具名),没命中不等于干净 —— 一个知道我们在问什么的中转可以把这些词全过滤掉。金丝雀用随机码而不是固定令牌,就是为了防止被硬编码进白名单
行为验证
structured_output + server_tool + multi_turn只转发文本、不支持原生能力的薄壳。其中 web_search 是三项里判别力最强的一条 —— 它是 Anthropic first-party 专属,Bedrock 与 Vertex 都不提供,真跑通了就是直连 Console 的正向证据
行为验证
structured_output + server_tool + multi_turn只转发文本、不支持原生能力的薄壳。其中 web_search 是三项里判别力最强的一条 —— 它是 Anthropic first-party 专属,Bedrock 与 Vertex 都不提供,真跑通了就是直连 Console 的正向证据
原理
三个子项。结构化输出:用 tool_choice 强制调用一个只接受固定枚举值的工具,看返回是否守约。web_search:带上 web_search_20250305 服务端工具发一次联网搜索,检查响应里有没有 server_tool_use 或 web_search_tool_result 块。多轮上下文:先让模型记住数字 74631,第二轮把对话历史带上再问它是多少
防哪种假
只转发文本、不支持原生能力的薄壳。其中 web_search 是三项里判别力最强的一条 —— 它是 Anthropic first-party 专属,Bedrock 与 Vertex 都不提供,真跑通了就是直连 Console 的正向证据
判定规则
三个子项分别计分(结构化输出 8、web_search 10、多轮 5)。web_search 有响应但没触发搜索 → 警告而非未通过,因为该工具需要单独开通,没开通不等于假货。多轮遇 429 / 5xx → 警告
依据与边界
三个能力都是 Anthropic 官方定义的,但「哪个渠道支持」是我们的实测经验,所以定为规范 + 经验。边界是这三项都可能被中转合理裁剪 —— 一个只做转发的正规网关也可能不透传工具参数,所以它们的权重低于签名校验
结构完整性
sse_events裁剪或错误重组 Anthropic SSE 的网关。缺少官方事件、顺序异常或 message_start 没有 input_tokens 都会留下结构痕迹;但中转若完整仿造事件序列,这一项仍可能通过,不能单独证明答案是实时生成
结构完整性
sse_events裁剪或错误重组 Anthropic SSE 的网关。缺少官方事件、顺序异常或 message_start 没有 input_tokens 都会留下结构痕迹;但中转若完整仿造事件序列,这一项仍可能通过,不能单独证明答案是实时生成
原理
开 stream: true 发一次请求,把 SSE 流里的事件类型按出现顺序抽出来,检查 message_start → content_block_start → content_block_delta → content_block_stop → message_delta → message_stop 是否按序齐全,同时确认 message_start 里的 input_tokens 大于 0
防哪种假
裁剪或错误重组 Anthropic SSE 的网关。缺少官方事件、顺序异常或 message_start 没有 input_tokens 都会留下结构痕迹;但中转若完整仿造事件序列,这一项仍可能通过,不能单独证明答案是实时生成
判定规则
事件按序齐全且 input_tokens > 0 → 通过;有流但顺序不全或 input_tokens = 0 → 警告;完全没有 Anthropic 原生 SSE 事件 → 未通过
依据与边界
依据是 Anthropic 官方对流式事件序列的定义,所以定为官方规范。边界是它只校验结构:中转若完整仿造官方事件序列仍可通过,不能据此证明答案是实时生成。TTFT 与分片间隔会一并记录,但当前只供人工复核,不参与判定。另外提醒:非 Anthropic 原生端点的报告里也有一项叫「结构完整性」,那一项检的是响应 JSON 的核心字段(choices / message),不是这里的 SSE 事件序列,两者不会同时出现
多模态能力
multimodal只支持纯文本的替代模型,以及会在中间做格式转换、把附件丢掉的网关。素材每次现生成,所以不存在「记住答案」这条路 —— 模型必须真的看到内容
多模态能力
multimodal只支持纯文本的替代模型,以及会在中间做格式转换、把附件丢掉的网关。素材每次现生成,所以不存在「记住答案」这条路 —— 模型必须真的看到内容
原理
两个子项,都用当场生成的金丝雀素材。图片:生成一张写着随机字符的 PNG,以 base64 送进去问「图里写了什么」。PDF:生成一份内嵌随机校验码的 PDF,同样以 base64 送进去要求原样读出那串码
防哪种假
只支持纯文本的替代模型,以及会在中间做格式转换、把附件丢掉的网关。素材每次现生成,所以不存在「记住答案」这条路 —— 模型必须真的看到内容
判定规则
图片与 PDF 都读对 → 通过;只对一个 → 警告;两个都没读对 → 未通过
依据与边界
图片与文档输入都是 Anthropic 官方能力,但「读不出来就可疑」是工程判断 —— 模型偶尔会答错、渠道也可能出于成本关掉附件支持,所以定为规范 + 经验,权重压得比签名校验低
Gemini 原生协议
只在目标是 Gemini 原生 generateContent 端点时运行,检查原生响应、内容安全反馈和思考签名是否被完整透传
Gemini 原生结构
protocol把 Gemini 请求改投 OpenAI 兼容层、只伪造一段文本,或裁掉 candidates、content、parts、usageMetadata 等原生字段的网关
Gemini 原生结构
protocol把 Gemini 请求改投 OpenAI 兼容层、只伪造一段文本,或裁掉 candidates、content、parts、usageMetadata 等原生字段的网关
原理
向 models/{model}:generateContent 发送一次最小文本请求,Key 放在 x-goog-api-key 请求头,并预留足够输出预算容纳 Gemini 2.5 的内部思考 token;检查响应是否同时包含 candidates[0].content.parts 和 usageMetadata,并记录 finishReason、modelVersion 与 responseId
防哪种假
把 Gemini 请求改投 OpenAI 兼容层、只伪造一段文本,或裁掉 candidates、content、parts、usageMetadata 等原生字段的网关
判定规则
2xx、候选内容含非空文本 Part,usageMetadata 同时包含非负整数的 promptTokenCount、candidatesTokenCount、totalTokenCount,且总量精确等于输入、候选输出与思考 tokens 之和 → 通过;429 / 5xx → 警告;结构或用量算术不完整 → 未通过
依据与边界
端点、鉴权头、响应字段和 token 字段均来自 Google Gemini API 官方文档,因此定为官方规范。边界是网关可以照着文档仿造结构,单独通过只能证明协议形态兼容,不能证明账号来源或模型身份
Safety Ratings 透传
gemini_safety_ratings没有完整转发 Gemini 候选安全反馈的薄壳。官方结构中的 category 与 probability 缺失,会让调用方无法复核内容过滤原因;blocked 为可选状态,返回时一并保留
Safety Ratings 透传
gemini_safety_ratings没有完整转发 Gemini 候选安全反馈的薄壳。官方结构中的 category 与 probability 缺失,会让调用方无法复核内容过滤原因;blocked 为可选状态,返回时一并保留
原理
发送一条普通安全主题提示,并通过 safetySettings 把四个官方可调类别显式设为 BLOCK_NONE;这与 Gemini 2.5 默认的 OFF 不同,会启用安全评估但不拦截内容。随后从 candidates[0].safetyRatings 读取 category、probability 和可选 blocked 状态
防哪种假
没有完整转发 Gemini 候选安全反馈的薄壳。官方结构中的 category 与 probability 缺失,会让调用方无法复核内容过滤原因;blocked 为可选状态,返回时一并保留
判定规则
至少返回一条 category 与 probability 均属于 Google 当前官方枚举的 rating,且本次 usageMetadata 算术有效 → 通过;2xx 但字段缺失、枚举未知、结构不完整或用量无效 → 警告;请求失败且不是瞬时错误 → 未通过
依据与边界
safetyRatings、safetySettings、BLOCK_NONE 与 usageMetadata 都由 Google 官方定义,所以定为官方规范。Gemini 2.5 与 3 默认阈值为 OFF,不显式配置时可能不返回安全元数据;探针因此主动开启评估,但仍只判断字段是否完整透传,不根据概率值评价模型好坏,也不发送危险内容。每个计分请求都独立核对自己的 usage,避免只在第一条响应保留用量、后续响应裁字段的中转通过
Thought Signature 透传
gemini_thought不支持 thinkingConfig、把 thought 块扁平化成普通文本,或裁掉 thoughtSignature 的 Gemini 中转。未返回签名是兼容性告警,不单独证明模型造假
Thought Signature 透传
gemini_thought不支持 thinkingConfig、把 thought 块扁平化成普通文本,或裁掉 thoughtSignature 的 Gemini 中转。未返回签名是兼容性告警,不单独证明模型造假
原理
发送一道简单计算题,在 generationConfig.thinkingConfig 中设置 includeThoughts: true,并通过 toolConfig 强制调用一次 record_total 函数。Google 说明 generateContent 的签名可附在 functionCall Part 或响应最后一个 Part;随后遍历候选 parts,检查 thought: true、非空 thoughtSignature、函数调用和 thoughtsTokenCount
防哪种假
不支持 thinkingConfig、把 thought 块扁平化成普通文本,或裁掉 thoughtSignature 的 Gemini 中转。未返回签名是兼容性告警,不单独证明模型造假
判定规则
思考块和 thoughtSignature 同时存在,且本次 usageMetadata 算术有效 → 通过;请求成功但结构缺失、用量无效,或模型明确不支持 thinkingConfig → 警告;非瞬时请求失败 → 未通过
依据与边界
thinkingConfig、thought、thoughtSignature、函数调用、thoughtsTokenCount 和 usageMetadata 都由 Google 官方定义,所以定为官方规范。纯文本响应不保证每次都把签名放在思考摘要上,因此探针用强制函数调用提供更稳定的签名承载位置;缺失仍只记兼容性告警,不能单凭这一项断言换模。该请求独立核对 usage,确保思考 token 也进入本次用量结构
Gemini 通用行为校验
六项旁证不进入 Gemini 原生 100 分,用于补充识别模型错配、内容改写、明显能力降档、参数丢失、答案重放和流式结构裁剪
模型版本核对
identity请求模型与响应 modelVersion 明显不一致的路由错配或低价模型替换。该字段可被网关改写,因此只作旁证
模型版本核对
identity请求模型与响应 modelVersion 明显不一致的路由错配或低价模型替换。该字段可被网关改写,因此只作旁证
原理
复用 Gemini 原生结构请求已经返回的 modelVersion,去掉 models/、latest 与官方版本后缀后,和请求模型做大小写无关比对,不额外发送请求
防哪种假
请求模型与响应 modelVersion 明显不一致的路由错配或低价模型替换。该字段可被网关改写,因此只作旁证
判定规则
完全匹配或只多官方版本后缀 → 通过;字段缺失或不一致 → 警告并留给人工复核,不扣原生协议分
依据与边界
modelVersion 是 Gemini 官方响应字段,但网关可以自行改写,所以字段读取有官方依据,身份推断仍属于经验指纹
随机金丝雀回显
canary改写、截断或过滤普通文本响应的中间层。校验码每次随机生成,降低针对固定样例硬编码的可能
随机金丝雀回显
canary改写、截断或过滤普通文本响应的中间层。校验码每次随机生成,降低针对固定样例硬编码的可能
原理
每次生成一串新的随机大写校验码,通过 generateContent 要求只原样输出该码,再对去除首尾空白后的完整正文做恒定时间精确比较。Gemini 2.5 Pro 使用官方最低 thinkingBudget=128,2.5 Flash 关闭 thinking,并给正文预留 256 tokens
防哪种假
改写、截断或过滤普通文本响应的中间层。校验码每次随机生成,降低针对固定样例硬编码的可能
判定规则
完整正文与随机码完全一致且正常结束 → 通过;MAX_TOKENS 截断或中转不支持 thinkingBudget → 警告;正常结束但内容被改写、缺失或附加解释 → 未通过
依据与边界
随机令牌回显是工程启发式,不是 Google 身份证明。模型偶尔不严格遵循格式也可能失败,因此只作旁证;截断不再被误写成中转改写
能力下限题
behavior明显降档、低能力模型替换或路由到小模型。固定题可以验证基础组合与几何推理,但无法区分同能力级模型,也可能被针对性硬编码
能力下限题
behavior明显降档、低能力模型替换或路由到小模型。固定题可以验证基础组合与几何推理,但无法区分同能力级模型,也可能被针对性硬编码
原理
复用随机金丝雀的同一次 generateContent 响应,在第二行回答组合几何题:长 14、宽 6 的矩形,从四个顶点任选三个组成三角形,求全部三角形面积总和的一半。题目答案唯一为整数 84,不增加上游请求
防哪种假
明显降档、低能力模型替换或路由到小模型。固定题可以验证基础组合与几何推理,但无法区分同能力级模型,也可能被针对性硬编码
判定规则
第二行只含一个整数且精确等于 84 → 通过;多个整数、错误整数或无法提取答案 → 未通过;MAX_TOKENS 截断或 thinkingBudget 回退 → 警告
依据与边界
固定题只作为能力下限经验指纹:它能发现部分明显降档或低能力替换,但不能区分同能力级模型,单次答错也不能单独证明换模;知道题目的中转还可以硬编码答案
Gemini 参数透传
max_tokens静默丢弃或改写 generationConfig.maxOutputTokens 与 stopSequences 的网关
Gemini 参数透传
max_tokens静默丢弃或改写 generationConfig.maxOutputTokens 与 stopSequences 的网关
原理
两次原生请求。先要求 400 个单词并设置 generationConfig.maxOutputTokens=192,核对候选输出与 thinking tokens 合计未越界且 finishReason=MAX_TOKENS;再以 512 tokens 生成一次性停止标记,放进 stopSequences,检查正文是否在标记前截断且 finishReason=STOP。2.5 Pro 使用最低 thinkingBudget=128,2.5 Flash 关闭 thinking
防哪种假
静默丢弃或改写 generationConfig.maxOutputTokens 与 stopSequences 的网关
判定规则
长度上限与停止序列都生效 → 通过;明确越过上限或输出停止标记/后缀 → 未通过;模型未按提示产出可观察前缀或瞬时错误 → 警告
依据与边界
maxOutputTokens、stopSequences、candidatesTokenCount 与 finishReason 都由 Gemini 官方协议定义。提示遵循仍有随机性,所以当前先不并入原生协议分
随机性 / 重放检测
determinism在高温开放式请求下仍原样重放完整答案的缓存层。重复是可疑旁证,但模板化文案也可能自然重复
随机性 / 重放检测
determinism在高温开放式请求下仍原样重放完整答案的缓存层。重复是可疑旁证,但模板化文案也可能自然重复
原理
用同一道开放式文案提示连续调用 3 次,temperature=1、maxOutputTokens=256,去掉完整输出中的空白并转小写后比较是否逐字相同;只有 finishReason=STOP 的非空正文才算有效样本
防哪种假
在高温开放式请求下仍原样重放完整答案的缓存层。重复是可疑旁证,但模板化文案也可能自然重复
判定规则
3 份正常结束的有效输出都不同 → 通过;任意两份完整输出相同 → 未通过;MAX_TOKENS 截断或有效样本不足 3 份 → 警告,不对重放下结论
依据与边界
temperature 是官方采样参数,但重复阈值是工程判断。它只能发现逐字重放,识别不了语义缓存,也不能证明一次重复必然来自缓存
Gemini 原生流式结构
stream不支持 streamGenerateContent?alt=sse,或把流式响应改造成非 Gemini 数据事件格式的兼容层
Gemini 原生流式结构
stream不支持 streamGenerateContent?alt=sse,或把流式响应改造成非 Gemini 数据事件格式的兼容层
原理
向 models/{model}:streamGenerateContent?alt=sse 发送 512-token 原生请求,要求 Content-Type 包含 text/event-stream,逐条解析 data: JSON,并检查事件中存在 candidates[].content.parts、非空文本 Part 与有效 usageMetadata
防哪种假
不支持 streamGenerateContent?alt=sse,或把流式响应改造成非 Gemini 数据事件格式的兼容层
判定规则
2xx、SSE Content-Type、合法 data 事件、非空文本 Part 与有效用量结构同时存在 → 通过;只有结构但无正文、用量缺失、MAX_TOKENS 截断或 thinkingBudget 回退 → 警告;返回普通 JSON 或非 Gemini 事件结构 → 未通过
依据与边界
端点、alt=sse 与事件 payload 均来自 Gemini 官方流式协议。当前实现校验的是原生 SSE 结构,不把客户端收到的缓冲 body 用来声称 TTFT 或实时生成
协议根基
最基础的一层:响应长得对不对、账单字段全不全。这三项都能对着官方文档逐字复核
协议 Schema 合规
schema三家协议互相套壳、网关裁掉字段、以及把错误信息伪装成正常成功响应返回
协议 Schema 合规
schema三家协议互相套壳、网关裁掉字段、以及把错误信息伪装成正常成功响应返回
原理
发一次最普通的请求(temperature=0,问太阳从哪个方向升起),检查返回的 JSON 结构:Anthropic 协议要有 content 数组,OpenAI 协议要有 choices 且 choices[0].message 是对象
防哪种假
三家协议互相套壳、网关裁掉字段、以及把错误信息伪装成正常成功响应返回
判定规则
2xx 且核心结构存在 → 通过;429 / 5xx 瞬时错误 → 警告;结构缺失 → 未通过
依据与边界
响应结构由 OpenAI 与 Anthropic 官方 API 文档明确定义,判定规则可以直接对照文档核对,所以定为官方规范;Gemini 使用独立的原生结构卡。边界是它只看结构不看内容 —— 结构对了不代表模型是真的,这一项过了只说明「对面至少实现了这套协议」
Usage 完整性
usage不回传用量、或者用量数字自相矛盾的网关。usage 是你对账的唯一依据,这个字段缺失或造假,账单就无从核对
Usage 完整性
usage不回传用量、或者用量数字自相矛盾的网关。usage 是你对账的唯一依据,这个字段缺失或造假,账单就无从核对
原理
从同一次请求的响应里取 usage 字段,检查 prompt_tokens 与 completion_tokens 至少有一个大于 0,且 total_tokens 要么为 0(未提供),要么不小于两者之和
防哪种假
不回传用量、或者用量数字自相矛盾的网关。usage 是你对账的唯一依据,这个字段缺失或造假,账单就无从核对
判定规则
有用量且加总关系成立 → 通过;2xx 但用量缺失或数字对不上 → 警告;完全拿不到 → 未通过
依据与边界
usage 字段的语义由官方 API 文档定义,所以定为官方规范。边界是我们只校验内部一致性,不校验数字本身是否诚实 —— 判断「上游报的用量和中转向你收的钱是否一致」需要跨请求对比,不在这一项范围内
Stop Reason 合法性
stop_reason自己拼装响应的中转,它们经常在协议对应的停止原因字段上露馅:要么写一个官方没有的值,要么把字段漏掉或留空
Stop Reason 合法性
stop_reason自己拼装响应的中转,它们经常在协议对应的停止原因字段上露馅:要么写一个官方没有的值,要么把字段漏掉或留空
原理
按目标协议读取停止原因:OpenAI 兼容响应必须在 choices[0].finish_reason 返回非空值,Anthropic 非流式响应必须在顶层 stop_reason 返回非空值;然后检查它是否属于该协议的官方枚举
防哪种假
自己拼装响应的中转,它们经常在协议对应的停止原因字段上露馅:要么写一个官方没有的值,要么把字段漏掉或留空
判定规则
2xx、协议对应字段存在且值在合法枚举内 → 通过;429 / 5xx 瞬时错误 → 警告;字段缺失、值为空或出现枚举外值 → 未通过
依据与边界
字段位置与枚举值来自 OpenAI Chat Completions 和 Anthropic Messages 的官方 schema,所以定为官方规范。Anthropic 类型为适配流式 message_start 而声明 nullable,但官方明确非流式响应始终非 null。边界是照着文档补一个合法值并不难,所以通过只是协议合规证据,未通过才是更强的负面信号
运行表现
检查流式参数是否生效、记录链路时序与延迟,并给出稳定性旁证;当前不判定语义缓存
流式支持
stream不支持 stream=true、或把整个响应一次性返回的接口。我们会同时记录首字节和分片间隔作为人工复核旁证,但这些值目前不参与通过 / 失败判定,也不能识别把缓存答案拆成多个网络 chunk 的重放
流式支持
stream不支持 stream=true、或把整个响应一次性返回的接口。我们会同时记录首字节和分片间隔作为人工复核旁证,但这些值目前不参与通过 / 失败判定,也不能识别把缓存答案拆成多个网络 chunk 的重放
原理
开 stream: true 发一次请求,除了检查能不能拿到有效分片,还记录首字节耗时占总耗时的比例、分片间隔的中位数与最大值
防哪种假
不支持 stream=true、或把整个响应一次性返回的接口。我们会同时记录首字节和分片间隔作为人工复核旁证,但这些值目前不参与通过 / 失败判定,也不能识别把缓存答案拆成多个网络 chunk 的重放
判定规则
2xx 且收到多个网络 chunk → 通过;瞬时错误 → 警告;没有多个网络 chunk → 未通过。TTFT 与间隔统计只写进 evidence,不参与当前状态判定
依据与边界
stream=true 参数与 SSE 传输由官方协议定义,所以定为官方规范。边界是多个网络 chunk 不等于模型正在实时生成:中转可以先取得完整答案,再拆成多块重放。TTFT 与间隔数据也会受网络抖动影响,目前只供人工复核,不能据此判假或识别语义缓存
延迟与吞吐
latency本身不判真伪,是给你看链路质量的:同样的模型,绕了几层的中转在首字节延迟上通常明显更差
延迟与吞吐
latency本身不判真伪,是给你看链路质量的:同样的模型,绕了几层的中转在首字节延迟上通常明显更差
原理
记录首 token 耗时与整体耗时。鉴权失败或压根没拿到有效模型响应时,这一项不参与评估
防哪种假
本身不判真伪,是给你看链路质量的:同样的模型,绕了几层的中转在首字节延迟上通常明显更差
判定规则
拿到有效模型响应即通过并记录数值;没有有效响应或鉴权失败 → 不评估,不计入分母
依据与边界
耗时是客观测量值,不涉及推断,所以定为官方规范。边界是单次测量受网络位置和当时负载影响很大,横向对比不同中转时要留意测试来源是不是同一个
随机性 / 重放检测
determinism把缓存答案直接重放的网关。相同开放式提示连续高温采样,正常模型通常会给出不同措辞;若完整答案在归一化空白后重复,说明可能没有重新生成
随机性 / 重放检测
determinism把缓存答案直接重放的网关。相同开放式提示连续高温采样,正常模型通常会给出不同措辞;若完整答案在归一化空白后重复,说明可能没有重新生成
原理
用同一道开放式创作提示连续请求 3 次,temperature=1、max_tokens=120。去掉每份完整输出中的空白并转成小写,再比较三份完整答案是否完全相同
防哪种假
把缓存答案直接重放的网关。相同开放式提示连续高温采样,正常模型通常会给出不同措辞;若完整答案在归一化空白后重复,说明可能没有重新生成
判定规则
任意两份归一化后的完整输出相同 → 未通过;没有重复但少于 3 份有效输出 → 警告,不对重放下结论;3 份有效输出均不同 → 通过
依据与边界
高 temperature 与完整答案重复率结合了官方采样参数和我们的工程判定,所以定为规范 + 经验。它能发现原样答案重放,但不能证明重复一定来自缓存,也识别不了只改几个字的语义缓存、模板化文案或把缓存答案拆成网络 chunk 的行为;网络时序数据仍只作人工复核,不参与这一项判定
模型身份
对面自称是谁、有没有守住我们给的边界
模型自我声明
identity低价模型替换、路由错配。model 字段对不上是很直接的线索 —— 你要 Opus,回来的字段写着别的
模型自我声明
identity低价模型替换、路由错配。model 字段对不上是很直接的线索 —— 你要 Opus,回来的字段写着别的
原理
主要看响应里的 model 字段与我们请求的模型是否一致:完全相同得满分,包含关系(比如带日期后缀)也算通过,对不上则告警。同时问模型「你是哪家公司开发的什么模型」,把它的自述原样记进报告
防哪种假
低价模型替换、路由错配。model 字段对不上是很直接的线索 —— 你要 Opus,回来的字段写着别的
判定规则
model 字段相同或包含请求模型 → 通过;不一致 → 警告;返回里没有 model 字段但有正文 → 按有无内容降级判定
依据与边界
定为经验指纹,原因是模型的自我声明可以被 system 提示词随意塑造,厂商从未承诺它可以当身份凭证 —— 一个中转让模型自称是 Claude 毫无难度。model 字段本身也是中转可以随手改写的。所以这一项只作佐证,真正定性靠签名校验和渠道指纹
能力下限题
behavior明显降档、低能力模型替换或路由到小模型。固定题可以验证基础组合与几何推理,但无法区分同能力级模型,也可能被针对性硬编码
能力下限题
behavior明显降档、低能力模型替换或路由到小模型。固定题可以验证基础组合与几何推理,但无法区分同能力级模型,也可能被针对性硬编码
原理
发送一道答案唯一的组合几何题:长 14、宽 6 的矩形,从四个顶点任选三个组成三角形,求全部三角形面积总和的一半。优先使用 temperature=0、max_tokens=128,并要求只输出一个十进制整数;若 Anthropic 中转明确拒绝 temperature,则移除该参数重试一次
防哪种假
明显降档、低能力模型替换或路由到小模型。固定题可以验证基础组合与几何推理,但无法区分同能力级模型,也可能被针对性硬编码
判定规则
响应中恰好只有一个整数且精确等于 84 → 通过;包含多个整数、错误整数或没有整数 → 未通过
依据与边界
定为经验指纹。固定题能提供基础能力下限,帮助发现明显降档、低能力模型替换或错误路由,但不能区分同能力级模型;模型可能偶发答错,知道题目的中转也可以硬编码答案,因此必须与协议、身份和原生证据一起看
参数透传
max_tokens静默丢弃或改写 max_tokens、stop / stop_sequences 的网关。随机停止标记若穿过本应截断的位置出现在输出中,就说明停止参数没有按协议生效
参数透传
max_tokens静默丢弃或改写 max_tokens、stop / stop_sequences 的网关。随机停止标记若穿过本应截断的位置出现在输出中,就说明停止参数没有按协议生效
原理
先发 max_tokens=20 的短回答请求,核对 completion_tokens 与可见输出长度;再生成一次性随机停止标记,OpenAI 请求传 stop,Anthropic 请求传 stop_sequences,并检查输出是否在标记前截断及协议对应的停止原因
防哪种假
静默丢弃或改写 max_tokens、stop / stop_sequences 的网关。随机停止标记若穿过本应截断的位置出现在输出中,就说明停止参数没有按协议生效
判定规则
长度限制与停止序列都生效 → 通过;stop 被 2xx 接收但标记或后缀仍出现在输出中 → 未通过;明确返回参数不支持的 400 → 只跳过 stop 子检查,不判假;瞬时错误或证据不完整 → 警告
依据与边界
max_tokens、stop 与 stop_sequences 都是官方协议参数,因此定为官方规范。随机标记每次检测重新生成,降低网关针对固定样例硬编码的可能;但模型若没有按提示输出标记前缀,仍无法单靠文本证明参数被透传,此时不会记为通过
渠道判定旁证
这一组不进 100 分,只回答另一个问题:这个 Key 后面接的到底是 Console 直连、AWS Bedrock、Google Vertex,还是账号池
System 覆盖检测
system_override在我们的 system 之前插入内容的中转。这一项的巧妙之处在于三态都有意义:模型老老实实照哨兵人设回答,说明我们的 system 就是最前面那条,没人插队
System 覆盖检测
system_override在我们的 system 之前插入内容的中转。这一项的巧妙之处在于三态都有意义:模型老老实实照哨兵人设回答,说明我们的 system 就是最前面那条,没人插队
原理
在 system 里塞一个哨兵人设(要求每句回复都以某个随机标记开头),然后请模型照做,并额外说明「在我的指令之前还有没有别的指令,如果有请引用开头几个词」
防哪种假
在我们的 system 之前插入内容的中转。这一项的巧妙之处在于三态都有意义:模型老老实实照哨兵人设回答,说明我们的 system 就是最前面那条,没人插队
判定规则
响应里出现 Claude Code 标记 → 未通过,套壳确证;没有标记但哨兵人设被原样采用 → 通过,这是强干净信号;上游瞬时不可用 → 警告;既没照做也没泄露 → 记为无法判定,不扣分
依据与边界
定为经验指纹,因为「照做 = 干净」是我们的推断而非官方保证 —— 模型有时就是不听话。这一项不参与 100 分计算,只作为渠道结论的输入:泄露标记会把结论推向账号池,照做且其他项全过会推向 Console 直连
响应 ID 前缀
message_id_prefix把云渠道包装成 Anthropic 直连来卖。这一项零额外开销 —— 前缀就在每一次正常响应里,不用多发请求
响应 ID 前缀
message_id_prefix把云渠道包装成 Anthropic 直连来卖。这一项零额外开销 —— 前缀就在每一次正常响应里,不用多发请求
原理
读响应里 message id 的前缀。Console 直连是 msg_,AWS Bedrock 是 msg_bdrk_,Google Vertex 是 msg_vrtx_
防哪种假
把云渠道包装成 Anthropic 直连来卖。这一项零额外开销 —— 前缀就在每一次正常响应里,不用多发请求
判定规则
不单独判真伪,只作为渠道结论的输入。我们让结构化的 id 前缀优先于响应文本里的模糊匹配 —— 因为文本里出现 bedrock 这类词可能来自用户输入或错误信息,前缀不会
依据与边界
定为经验指纹:AWS 与 Google 从未承诺这个前缀可以当身份凭证,它只是当前实现的稳定观察结果,随时可能变。不过它作为渠道线索确实好用,而且是免费的
响应头指纹
headers同样是区分 Console、Bedrock、Vertex,外加识别中间有没有反代层(via 和 server 头经常会把它暴露出来)
响应头指纹
headers同样是区分 Console、Bedrock、Vertex,外加识别中间有没有反代层(via 和 server 头经常会把它暴露出来)
原理
从每次响应里保留有辨识度的头:anthropic- 开头的(含限流配额)、x-amzn / x-amz- 开头的、x-goog / x-vertex 开头的,以及 server / via / request-id
防哪种假
同样是区分 Console、Bedrock、Vertex,外加识别中间有没有反代层(via 和 server 头经常会把它暴露出来)
判定规则
不单独判真伪,与响应 ID 前缀一起作为渠道结论的输入
依据与边界
定为经验指纹,理由与 ID 前缀相同:这些头由各家基础设施决定,不是承诺的接口。价值在于零额外 token 开销 —— 它们随着我们本来就要发的请求一起回来
AWS 图片 URL 指纹
multimodal.aws_image_url_check把 AWS Bedrock 包在 Anthropic Messages 外壳里的 New-API 转换层。它会先下载 URL 图片并转成 base64,失败时可能把适配器自己的固定错误前缀泄露出来
AWS 图片 URL 指纹
multimodal.aws_image_url_check把 AWS Bedrock 包在 Anthropic Messages 外壳里的 New-API 转换层。它会先下载 URL 图片并转成 base64,失败时可能把适配器自己的固定错误前缀泄露出来
原理
向 Anthropic Messages 发送一张指向保留域名的 URL 图片。当前 Anthropic 协议支持 URLImageSource,而 Bedrock 的 Claude Messages 输入仍使用 base64;New-API 的 AWS 适配器会先下载 URL 并转成 base64
防哪种假
把 AWS Bedrock 包在 Anthropic Messages 外壳里的 New-API 转换层。它会先下载 URL 图片并转成 base64,失败时可能把适配器自己的固定错误前缀泄露出来
判定规则
错误文本精确命中 New-API AWS 适配器的 get file base64 from url failed 前缀 → 记为 AWS / New-API 转换链路线索;其他 400、请求成功或传输错误 → 未命中,不判假、不扣分
依据与边界
定为规范 + 经验:Anthropic URLImageSource 与 Bedrock base64 输入来自当前官方类型和文档,但固定错误前缀来自 New-API 的 AWS 适配器实现,不是 AWS 稳定接口。上游升级或改写错误后可能漏检,因此只作渠道旁证
这份报告是什么,不是什么
这是工程取证,不是密码学身份证明。我们能做的是:对 Anthropic 原生端点执行 16 个步骤,或对 Gemini 原生端点执行 7 个步骤——其中部分步骤会产生多次上游请求——把响应里可观测的结构、字段、事件顺序和行为,与官方 API 的公开定义逐项比对,对无法解释的差异给出概率性判断。做不到的是:证明某个 Key 背后的账号归属、证明它在别的时间点不会表现不同、或对「中转商是否合规」下法律结论。所有经验指纹项都可能被针对性绕过 —— 一个知道我们检什么的中转可以让这些项全过。所以我们把权重压在官方规范项上,并把判定规则和边界完整公开:你可以自己复核每一条,而不是相信一个分数
常见问题
满分 100 是不是就说明这家一定是真的?
不是。它只说明所有计分项都通过了,不计分的行为旁证仍可能出现警告或失败。经验指纹级的项,一个知道我们问什么的中转可以全部绕过;而签名校验过了也只证明背后是真 Anthropic 后端,既不说明是哪个渠道,也不保证明天还是这样
为什么有些项写「不评估」而不是判不通过?
因为「没拿到证据」不等于「有造假证据」。模型压根没触发思考、或者三种措辞全被拒答,我们就记为无法判定并把它从分母里去掉,而不是为一件没观察到的事扣分
为什么我的报告里项目比这页少?
Anthropic 原生检测出 4 段 14 项计分卡,Gemini 原生检测出 2 段,其中 3 项计分、6 项只作旁证,OpenAI 兼容检测出 3 段 9 项。渠道判定与 Gemini 通用行为旁证都不会改变 100 分
中转能不能发现自己正在被检测,然后临时装乖?
有可能,这一点我们直说。金丝雀码和哨兵标记每次都是随机生成的,没法被硬编码进白名单,但一个下决心的运营方仍然可以针对我们的流量做特殊处理。这里没有任何手段能杜绝这件事,只能抬高它的成本
为什么签名校验值 25 分,模型自我声明只值 22 分?
因为签名是由 Anthropic 自己的服务器校验的,中转够不着;而模型的自我描述一句 system 提示词就能改写。这两项在报告上看起来差不多,但只有一项是难伪造的
把我们的检测器指向一个中转端点,对照这一页读它的报告
微信扫一扫