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 個 token 且沒有內容)並帶有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 停止是因為它達到了模型的上下文視窗限制。這允許您請求最大可能的 token 而無需知道確切的輸入大小。此停止原因在 Sonnet 4.5 和更新的模型中預設可用。對於較早的模型,請使用 beta 標頭
model-context-window-exceeded-2025-08-26 來啟用此行為。處理停止原因的最佳實踐
1. 始終檢查 stop_reason
養成在回應處理邏輯中檢查stop_reason 的習慣:
2. 優雅地處理截斷的回應
當回應由於 token 限制或上下文視窗而被截斷時:3. 為 pause_turn 實施重試邏輯
對於可能暫停的伺服器工具:停止原因 vs. 錯誤
區分stop_reason 值和實際錯誤很重要:
停止原因(成功回應)
- 回應主體的一部分
- 指示生成為何正常停止
- 回應包含有效內容
錯誤(失敗請求)
- HTTP 狀態碼 4xx 或 5xx
- 指示請求處理失敗
- 回應包含錯誤詳細資訊
串流考慮事項
使用串流時,stop_reason 是:
- 在初始
message_start事件中為null - 在
message_delta事件中提供 - 在任何其他事件中不提供
常見模式
處理工具使用工作流程
確保完整回應
在不知道輸入大小的情況下獲得最大 token
使用model_context_window_exceeded 停止原因,您可以請求最大可能的 token 而無需計算輸入大小:
stop_reason 值,您可以建構更穩健的應用程式,優雅地處理不同的回應場景並提供更好的使用者體驗。