Claude API 加了 Message threads:长对话每轮只发新消息,首字更快,token 不省;本站实测直连能续、经中转站续不上
11 月 2 日 Messages API 加了 message threads(beta):第一轮照常发完整对话,之后每轮只发新消息,对话存在服务器上,5 分钟没动静就过期。官方说请求变小、首字更快,价格和限流不变。本站直连官方测了一轮,续接正常,计费的输入 token 和整段重发一样;经酷站AI 续接一律 404。
本页目录(4 节)
2026 年 11 月 2 日,Claude 的 Messages API 加了 message threads,测试版,要带 beta 头 message-threads-2026-08-12。
以前每一轮都要把整段对话、system 和 tools 重新发一遍,接口每次都要重新校验、重新分词。用了 thread,对话存在服务器上,之后每轮只发新消息。官方说请求变小,首字出来得更快,对话越长越稳,最适合跑很多轮的智能体循环。价格和限流都不变。
它和托管智能体里的 session threads 是两回事。
怎么用
- 第一轮(create): 和平时一样发完整对话、
system、tools,再加"thread": {"type": "create"}。接口把对话连同这次的回答存在响应的id下。 - 之后每轮(continue): 只发上一个响应之后的新消息,加
"thread": {"type": "continue", "previous_message_id": "<上一个响应的 id>"},不要再发system和tools。每轮拿新响应的id接下一轮。 - 续不上了(replay): thread 尽力而为,最后一次请求后 5 分钟过期,最多 1 小时内删掉。续不上时返回 404,这时把整段对话重新发一个 create,从新的
id接着来。
官方特别强调:对话以你自己存的为准。 每条消息都要自己留一份,一开始就把重发那条路写好;响应里不会告诉你这一轮存没存上,下一次续接才知道。
各语言 SDK 都有一个 thread 助手(Python 是 client.beta.messages.thread(...),之后每轮 thread.send(...)),它替你加 beta 头、只发新消息、碰到 404 自动重发一次完整对话。SDK 里测试版的 tool runner 默认也走 thread,可以在创建时关掉。
每轮能改什么,不能改什么
| 类别 | 字段 | 规矩 |
|---|---|---|
| 只在 create 时发 | system、tools |
continue 时带上就 400,哪怕是 null |
| 固定不变 | model、tool_choice、thinking、mcp_servers(授权 token 除外)、context_management、output_config、container 里的 skills、顶层 cache_control、beta 头的集合 |
每轮都要发,而且和 create 时一样,不一样返回 400 thread_fingerprint_mismatch,报错里写明是哪几个字段 |
| 每轮可以变 | max_tokens、stop_sequences、stream、metadata、service_tier 等 |
随便改 |
要改前两类,只能开一个新 thread。thread 只能往后加:每个响应 id 只能续一次,改早先的消息、分叉、用摘要压缩,都得重新 create。
几处容易踩的:
- 缓存不会自动做。 要缓存,就每轮都发同一个顶层
cache_control;一次请求最多 4 个缓存断点。 - 流式:
id在message_start里就有,但要等到message_stop再续,早了会 404。 - 被拒答(
stop_reason: "refusal")后不要续,换个说法重新 create。 - 不支持: 批量处理、数 token、压缩(compaction)、大部分上下文编辑;开了 HIPAA 或 inference hooks 的组织也用不了。
- 没有接口能列出、读取或删除 thread。 数据只放在内存里,加密,不落盘,最多一小时后删;不适用零数据保留(ZDR)。
- 平台: Claude API、AWS 上的 Claude Platform、Google Cloud 上的 Anthropic managed、Microsoft Foundry。
本站实测
11 月 4 日在服务器上测了两组,每组都用 claude-sonnet-5-5,API 版本 2026-10-21,直接发 HTTP 请求,没用 SDK 的助手。system 写的是“只用四个字回答”,第一轮让它记住暗号“青山绿水”,第二轮只发“暗号是什么?”。
直连官方(官方 key):
| 试了什么 | 结果 |
|---|---|
| 第 1 轮 create | 200,回答“记住了。”,input_tokens 46 |
| 第 2 轮 continue,只发新消息、不带 system | 200,回答“青山绿水”,四个字,说明 system 和前文都还在;input_tokens 61 |
| 对照:不用 thread,整段对话重发 | 200,回答“青山绿水。”,input_tokens 60 |
再从第 1 轮的 id 续一次 |
400 thread_already_continued |
continue 时又带了 system |
400,报错说 continue 不能带 system,没有 error_code |
续一个不存在的 id |
404 thread_not_found,报错里让你重新 create |
注意第二行和第三行:续接这一轮计费的输入 token 和整段重发几乎一样。 thread 省的是上传的数据量和服务端的处理时间,不是 token 钱;要省钱还得靠缓存。对话这么短,首字时间的差别本站没有测。
经酷站AI: 第 1 轮 create 返回 200,但第 2 轮 continue 一律 404 thread_not_found,前后试了三遍都一样,整段重发照常能用。原因从外面看不出来;官方列的 404 原因里包括“请求来自另一个组织、工作区或另一把 key”,中转站在多把 key 之间分流时就会碰上。所以走中转站的,先别指望 thread:用 SDK 的 thread 助手或 tool runner 也不会出错,它碰到 404 会自动整段重发,只是每轮都重发,等于没开。
对本站读者
- **直连官方、跑长智能体循环的,**值得试:改动不大,用 SDK 的 thread 助手几乎不用改代码。记得自己存一份完整对话,并且每轮发顶层
cache_control,不然不省钱。 - **走中转站的,**目前没有好处,见上面的实测。
- 用 Claude Code 的不用管,这是接口层面的功能。
想先弄清每轮请求里到底发了什么,可以看《Claude 的提示缓存》和《对话中途的系统消息》。