thinking signature 是什么:为什么它能用来辨别是不是真 Claude
Claude 的每个思考块都带一个 signature 字段,是加密后的完整思考内容,只有 Anthropic 的服务端能生成和校验。本文按官方文档讲清它是什么、在最新的 Claude 5 模型上怎么看到它、几种容易误判的情况,以及自己能看到什么、验证不了什么。
辨别一个中转站给的是不是真的 Claude,最硬的一条线索叫 thinking signature,思考签名。先说结论:
- 它是什么:Claude 思考时,响应里每个思考块都带一个
signature字段。按官方文档,它是加密后的完整思考内容,由 Anthropic 的服务端生成。 - 为什么和真假有关:这串东西只有 Anthropic 的服务端能生成和校验。顶替的模型没有这个字段,中转站也造不出一个能通过校验的。
- 你自己能做到哪一步:能看到它在不在、长什么样。验证不了它是不是真的,因为它对外是不透明的。
- 在最新的模型上有几处容易误判:思考文字默认是空的、简单的问题可能根本不思考、旧的参数写法会直接报错。这些都不是中转站的问题。
官方文档怎么说
Claude 思考时,响应的 content 里先是一个或多个 thinking 块,然后才是 text 块。官方给的例子:
{
"content": [
{
"type": "thinking",
"thinking": "Let me break this down. The question has two parts...",
"signature": "WaUjzkypQ2mUEVM36O2Txu...."
},
{
"type": "text",
"text": "Based on my analysis..."
}
]
}
关于 signature,官方文档写明了这几点:
- 完整的思考内容被加密后放在
signature字段里返回。 - 你在多轮对话或工具调用里把思考块传回去时,API 用这个签名来确认思考块是 Claude 生成的。
- 这个字段是不透明的,不要去解读或解析它。
- 签名在 Claude API、Amazon Bedrock 和 Google Cloud 之间通用,一个平台上生成的在另一个平台上也能用。
最后一点对判断中转站有用:上游是 Bedrock 或 Google Cloud 的中转站,拿到的响应同样带签名。经过云平台不是没有签名的理由。
它为什么能用来辨别真假
把上面几点合起来看:签名是服务端加密的产物,校验也在服务端做。
- 顶替的模型,无论是别家的还是别的渠道来的,响应里不会有这个字段。
- 中转站可以自己往响应里塞一串字符冒充,但那串字符通不过 Anthropic 的校验。
检测工具 Veridrop 把这一项作为 Claude 检测里权重最高的一项,占 25%,其他十来项都排在它后面。它的说明里的原话是,这是 Claude 协议下可以加密验证的真伪指标,OpenAI 和 Gemini 没有同等级别的机制。
Veridrop 还提到一种它在检测中见过的情况:有的中转站把 Kiro、Amazon Q 这类面向开发工具的产品渠道当作 Claude API 转卖,这样得到的响应里没有思考签名,它在这一项上会判零分。这是 Veridrop 一方的说法,本站没有独立验证。
在最新的模型上看到它
下面用 Claude Sonnet 5.5 举例。把地址和 key 换成你的中转站的:
curl -sS https://你的中转站地址/v1/messages \
-H "Authorization: Bearer 你的key" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-5-5",
"max_tokens": 16000,
"thinking": { "type": "adaptive", "display": "summarized" },
"messages": [
{ "role": "user", "content": "1071 和 462 的最大公约数是多少?写出推导过程。" }
]
}'
如果你的中转站用的是 x-api-key,把 Authorization 那一行换成 -H "x-api-key: 你的key"。
请求里的 thinking 一项,写法取自官方文档的示例。在返回的 JSON 里找 "type": "thinking" 的块,看它有没有 signature,以及这个字段是不是很长的一串不可读的字符。官方文档提到,Claude 4 及之后的模型,签名比早期的模型长得多。
几种容易误判的情况
Claude 5 这一代的思考方式和以前不同,下面几种现象都是正常的,不要因此断定中转站有问题。
思考的文字是空的
官方文档的表格写明:Claude Opus 5.5、Sonnet 5.5、Haiku 5.5、Fable 5.1 等模型,思考默认是开着的,但 display 默认是 "omitted"。这时思考块照常返回,只是里面的 thinking 文字是空字符串,signature 仍然在。
所以“思考内容是空的”不说明问题,要看的是签名在不在。想看到思考的文字,像上面的例子那样加上 "display": "summarized"。官方还说明,无论 display 设成什么,签名都是一样的。
根本没有思考块
这一代模型用的是自适应思考:Claude 根据请求的复杂程度自己决定要不要思考、思考多深。官方的原话是,某一次请求会不会思考,取决于你的配置和请求本身的复杂度。
所以问一句“你好”,很可能没有思考块,这是正常的。测试时要用一个需要推理的问题,像上面的例子那样。
一发请求就报 400
很多旧教程里的写法是 "thinking": {"type": "enabled", "budget_tokens": 10000}。官方文档写明,Claude 4.7 及之后的模型不支持这种写法,会直接返回 400 错误。在新模型上要用 "type": "adaptive"。
如果报错信息以 "thinking.type.enabled" is not supported 开头,就是这个原因,和中转站无关。
流式输出时签名来得晚
用流式输出时,签名不在思考块的开头,而是在这个块结束之前,作为一个单独的 signature_delta 事件到达。自己拼接流式数据时容易漏掉。官方建议用 SDK 自带的方法取最终的完整消息,不要自己拼。
真的没有签名时,可能是什么原因
排除了上面的情况,用一个需要推理的问题、正确的参数,还是没有思考块或没有签名,再往下考虑:
| 可能的原因 | 说明 |
|---|---|
中转站没有把 thinking 参数传给上游 |
响应里没有思考块,但模型可能是真的 |
| 中转站把思考块从响应里去掉了 | 同上 |
| 后面不是 Claude,或者不是官方的渠道 | 这是签名这条线索最想抓的情况 |
前两种和第三种,单看一次响应区分不开。这时结论只能写“这一项没有通过”,不能直接写“是假模型”。
你自己验证不了的部分
看到一串很长的 signature,只说明“响应里有这个字段”。它是不是 Anthropic 生成的,你没有办法判断:官方说了这个字段不透明,不要解析;能校验它的只有 Anthropic 的服务端。
所以自己看一眼,能排除的是“连这个字段都没有”的情况。要确认签名是真的,需要专门的检测。可以用自己的 key 到 Veridrop 跑一次,它的 Claude 检测里这一项是单独打分的。
另外要记住,这一项通过,说明的是这一次请求。中转站可以对不同的请求、不同的时间走不同的线路,一次通过不代表每一次都是真的。
两条和中转站有关的新规则
官方文档里还有两条比较新的规定,对用中转站跑长对话的人有影响。
思考块和账号绑定。 Claude Sonnet 5.5 和 Haiku 5.5 生成的思考块,只能在生成它的账号(或与之关联的账号)里使用。别的账号把它传回去时,API 会在模型看到之前把这个块丢掉,请求照常成功,模型在没有这段思考的情况下作答。
思考块和前文绑定。 从 Claude Fable 5.1 开始,一个思考块只在它前面的系统提示词、工具和消息都没有变动时才有效。前面有任何改动,这个块和之后的思考块都会失效,API 要么返回 400,要么把它们丢掉。
官方没有说这对中转站意味着什么,下面是本文的推断:中转站如果在一段对话中途换了上游账号,或者每次请求注入的系统提示词不一样,前面的思考就可能被悄悄丢掉,表现出来是长任务做到后面“忘了之前想过什么”。遇到这种情况,可以把它列为排查的方向之一,见中转站模型降智是怎么回事。
小结
- 思考签名是加密后的思考内容,只有 Anthropic 的服务端能生成和校验,所以是辨别真假 Claude 最硬的一条线索。
- 在 Claude 5 模型上,思考文字默认是空的、简单问题不思考、旧参数会报 400,这些都正常。
- 自己能看到签名在不在,验证不了它的真假;一次通过也不代表每次都真。
- 其他的掺假手段见中转站怎么掺假;GPT 这边没有签名,要看的是别的东西,见GPT 中转站背后是不是 Claude。