stop_reason 字段,该字段指示模型为什么停止生成响应。理解这些值对于构建能够适当处理不同响应类型的健壮应用程序至关重要。
有关 API 响应中 stop_reason 的详细信息,请参阅 Messages API 参考。
什么是 stop_reason?
stop_reason 字段是每个成功的 Messages API 响应的一部分。与表示处理请求失败的错误不同,stop_reason 告诉您 Claude 为什么成功完成了响应生成。
Example response
停止原因值
end_turn
最常见的停止原因。表示 Claude 自然地完成了其响应。带有 end_turn 的空响应
有时 Claude 返回空响应(恰好 2-3 个令牌且没有内容),stop_reason: "end_turn"。这通常发生在 Claude 解释助手轮次已完成时,特别是在工具结果之后。
常见原因:
- 在工具结果后立即添加文本块(Claude 学会期望用户总是在工具结果后插入文本,因此它结束其轮次以遵循模式)
- 将 Claude 的完整响应发送回去而不添加任何内容(Claude 已经决定完成了,所以它将保持完成状态)
- 永远不要在工具结果后立即添加文本块 - 这会教会 Claude 在每次工具使用后期望用户输入
- 不要在不修改的情况下重试空响应 - 简单地将空响应发送回去不会有帮助
- 将继续提示作为最后手段 - 只有在上述修复无法解决问题时才使用
max_tokens
Claude 停止是因为它达到了您请求中指定的max_tokens 限制。
stop_sequence
Claude 遇到了您的自定义停止序列之一。tool_use
Claude 正在调用工具并期望您执行它。pause_turn
与服务器工具(如网络搜索)一起使用,当 Claude 需要暂停长时间运行的操作时。refusal
Claude 由于安全考虑拒绝生成响应。如果您在使用 Claude Sonnet 4.5 或 Opus 4.1 时经常遇到
refusal 停止原因,您可以尝试更新您的 API 调用以使用 Sonnet 4 (claude-sonnet-4-20250514),它具有不同的使用限制。了解更多关于理解 Sonnet 4.5 的 API 安全过滤器。要了解更多关于 Claude Sonnet 4.5 的 API 安全过滤器触发的拒绝,请参阅理解 Sonnet 4.5 的 API 安全过滤器。
model_context_window_exceeded
Claude 停止是因为它达到了模型的上下文窗口限制。这允许您请求最大可能的令牌,而无需知道确切的输入大小。此停止原因在 Sonnet 4.5 和更新的模型中默认可用。对于较早的模型,使用 beta 头部
model-context-window-exceeded-2025-08-26 来启用此行为。处理停止原因的最佳实践
1. 始终检查 stop_reason
养成在响应处理逻辑中检查stop_reason 的习惯:
2. 优雅地处理截断的响应
当响应由于令牌限制或上下文窗口而被截断时:3. 为 pause_turn 实现重试逻辑
对于可能暂停的服务器工具:停止原因与错误
区分stop_reason 值和实际错误很重要:
停止原因(成功响应)
- 响应体的一部分
- 指示生成为什么正常停止
- 响应包含有效内容
错误(失败请求)
- HTTP 状态码 4xx 或 5xx
- 指示请求处理失败
- 响应包含错误详细信息
流式传输考虑事项
使用流式传输时,stop_reason 是:
- 在初始
message_start事件中为null - 在
message_delta事件中提供 - 在任何其他事件中不提供
常见模式
处理工具使用工作流
确保完整响应
在不知道输入大小的情况下获得最大令牌
使用model_context_window_exceeded 停止原因,您可以请求最大可能的令牌而无需计算输入大小:
stop_reason 值,您可以构建更健壮的应用程序,优雅地处理不同的响应场景并提供更好的用户体验。