关于 Claude Messages API,最重要的一件事:它没有记忆。每次 API 请求都是完全独立的。没有 session,没有 conversation ID,服务端不保存任何状态。
实际使用中意味着什么
当你发送对话中的第 4 条消息时,你不是只发那第 4 条。你得把前面 4 条全部发过去——完整的对话历史,从头到尾每一条 user 和 assistant 消息。API 每次都当作第一次看到这段对话来处理,因为对它来说确实就是第一次。
请求体有三个核心部分:
model— 用哪个 Claude 模型messages— 完整对话历史的数组(user 和 assistant 交替)system— 可选的顶层参数,放系统提示词
注意 system 不在 messages 数组里面。它在请求的顶层,跟对话流分开。这是刻意的设计:system prompt 提供持久的行为框架(角色、语气、约束),为整个对话定调;而 messages 记录的是来回的对话内容。
system prompt 不是必填的
不带 system prompt 也能发一个完全合法的请求。很多应用根本不需要它。model、messages 和 max_tokens 才是唯一的必填参数。
无状态为什么重要
每多一轮对话,请求就更大、更贵。到第 50 轮的时候,你的输入里包含了前面 49 条消息的累积历史。这不是 bug——这是无状态 API 的根本取舍。你换来了简洁(不用管理会话、不用操心过期、不会有服务端状态损坏),代价是请求体不断膨胀。
如果一个多轮对话突然丢了上下文——模型表现得像从没见过前面的消息——原因几乎一定是你的代码没把完整历史塞进请求。服务端没有”忘记”任何东西,它压根就不知道。
一句话总结: API 是无状态的——每次请求必须携带完整对话历史,system prompt 放在顶层,不在 messages 里面。