中转站检测ZHONGZHUANJIANCE.COM · 独立第三方

检测项目一览 / 流式响应结构

流式响应结构检测

中转站检测流式响应:Claude/OpenAI/Gemini 各自固定的流式事件名与顺序是否吻合官方协议,能揪出把请求转发到别家再包装的协议转换网关。

适用协议:Claude、OpenAI、Gemini计入真假三档评分

测什么

请求流式(stream: true / alt=sse),解析返回的 SSE 数据流,检查它是不是官方固定的结构。Claude 要求事件序列以 message_start 开头、包含 content_block_delta、以 message_stop 结尾;OpenAI 要求每个 chunk 都是规范的 chat.completion.chunk 对象,且以 [DONE] 结束;Gemini 要求每个 chunk 都带 candidates 数组。这一项也把 Gemini 的非流式响应结构(candidates-structure:candidates[0] 要有 finishReason 字段和至少一段带 text 的 parts)放在一起讲,因为它和流式结构是同一层协议判据。

为什么能判真假 / 来路

三家协议的流式(和 Gemini 的非流式)响应结构都是官方固定的,字段名、事件顺序、chunk 形状都写在协议文档里。如果一个中转站其实是把请求转发给了另一家 API、再拼装成看起来像目标协议的响应,这层拼装最容易在流式结构上露馅——比如 Anthropic 端点却吐出了 OpenAI 风格的 chat.completion.chunk。

结果怎么读

  • 通过Claude:事件序列完整且顺序正确。OpenAI:chunk 全部规范且有 [DONE] 终止符。Gemini:所有 chunk(或 candidates-structure 里的 candidates[0])都含官方要求的字段。
  • 存疑Claude:没有任何官方命名事件,或事件顺序异常。OpenAI:请求了流式却返回非流式内容,或 chunk 结构不规范,或缺 [DONE]。Gemini:请求了流式却没有 SSE 数据,或部分 chunk 缺 candidates;非流式的 candidates-structure 里 candidates 存在但缺 finishReason 或 parts.text。
  • 未通过仅 Claude 这一项在明确抓到证据时才判「未通过」:Anthropic 原生端点返回的却是 OpenAI 风格的流(出现 chat.completion.chunk 或 data: [DONE])——这是协议转换网关的直接证据。Gemini 的 candidates-structure 在响应里完全没有 candidates 数组时也判未通过。其余情形都保守判存疑。
  • 信息不足请求失败、超时,或没拿到可解析的响应文本。

局限:它判不了什么

这一项只判「响应结构像不像官方」,判不了「内容是不是真模型权重」——那要靠签名验真、模型名回显、计费元数据等其它项。多数异常情形都保守判「存疑」而不是「未通过」,Claude 只有抓到「Anthropic 端点吐 OpenAI 风格流」这种明确证据时才会判未通过,其余异常(比如事件顺序不对)不代表实锤。

自己怎么验

带 -N(不缓冲)跑一次流式请求,直接看输出里的事件名/chunk 形状。

curl -sN https://YOUR_RELAY_BASE_URL/v1/messages \
  -H "x-api-key: YOUR_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-opus-5","max_tokens":32,"stream":true,"messages":[{"role":"user","content":"hi"}]}'

正常应该看到 event: message_start ... event: content_block_delta ... event: message_stop 这样的事件行;如果看到的是 "object":"chat.completion.chunk" 这种 OpenAI 风格字段,说明这个 anthropic 端点背后其实转发去了别的协议。

用检测工具实测你的中转站 →

相关检测项

常见问题

为什么流式结构能揪出协议转换网关?

三家协议的流式事件命名和结构都是官方固定的。如果中转站背后其实调用了另一家 API 再包装成目标协议返回给你,包装很容易在事件命名或 chunk 结构上留下破绽,比如 Anthropic 端点却混进了 OpenAI 风格的字段。

Gemini 的 candidates 结构测的是什么?

官方 Gemini 响应(无论流式还是非流式)都要求每个候选结果带 candidates 数组,内部有 finishReason 字段和含 text 的 parts。这个结构缺失或不完整,说明底层实现和官方协议有出入。