了解如何处理Claude API响应中的stop_reason字段,包括不同停止原因的含义和最佳实践。
stop_reason
字段,该字段指示模型为什么停止生成响应。理解这些值对于构建能够适当处理不同响应类型的健壮应用程序至关重要。
有关API响应中stop_reason
的详细信息,请参阅Messages API参考。
stop_reason
字段是每个成功的Messages API响应的一部分。与表示处理请求失败的错误不同,stop_reason
告诉您Claude为什么成功完成了其响应生成。
{
"id": "msg_01234",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Here's the answer to your question..."
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 100,
"output_tokens": 50
}
}
if response.stop_reason == "end_turn":
# 处理完整响应
print(response.content[0].text)
max_tokens
限制。
# 带有有限令牌的请求
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=10,
messages=[{"role": "user", "content": "Explain quantum physics"}]
)
if response.stop_reason == "max_tokens":
# 响应被截断
print("Response was cut off at token limit")
# 考虑发出另一个请求以继续
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
stop_sequences=["END", "STOP"],
messages=[{"role": "user", "content": "Generate text until you say END"}]
)
if response.stop_reason == "stop_sequence":
print(f"Stopped at sequence: {response.stop_sequence}")
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
tools=[weather_tool],
messages=[{"role": "user", "content": "What's the weather?"}]
)
if response.stop_reason == "tool_use":
# 提取并执行工具
for content in response.content:
if content.type == "tool_use":
result = execute_tool(content.name, content.input)
# 将结果返回给Claude以获得最终响应
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
tools=[{"type": "web_search_20250305", "name": "web_search"}],
messages=[{"role": "user", "content": "Search for latest AI news"}]
)
if response.stop_reason == "pause_turn":
# 继续对话
messages = [
{"role": "user", "content": original_query},
{"role": "assistant", "content": response.content}
]
continuation = client.messages.create(
model="claude-sonnet-4-20250514",
messages=messages,
tools=[{"type": "web_search_20250305", "name": "web_search"}]
)
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "[Unsafe request]"}]
)
if response.stop_reason == "refusal":
# Claude拒绝响应
print("Claude was unable to process this request")
# 考虑重新措辞或修改请求
stop_reason
的习惯:
def handle_response(response):
if response.stop_reason == "tool_use":
return handle_tool_use(response)
elif response.stop_reason == "max_tokens":
return handle_truncation(response)
elif response.stop_reason == "pause_turn":
return handle_pause(response)
elif response.stop_reason == "refusal":
return handle_refusal(response)
else:
# 处理end_turn和其他情况
return response.content[0].text
def handle_truncated_response(response):
if response.stop_reason == "max_tokens":
# 选项1:警告用户
return f"{response.content[0].text}\n\n[Response truncated due to length]"
# 选项2:继续生成
messages = [
{"role": "user", "content": original_prompt},
{"role": "assistant", "content": response.content[0].text}
]
continuation = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=messages + [{"role": "user", "content": "Please continue"}]
)
return response.content[0].text + continuation.content[0].text
def handle_paused_conversation(initial_response, max_retries=3):
response = initial_response
messages = [{"role": "user", "content": original_query}]
for attempt in range(max_retries):
if response.stop_reason != "pause_turn":
break
messages.append({"role": "assistant", "content": response.content})
response = client.messages.create(
model="claude-sonnet-4-20250514",
messages=messages,
tools=original_tools
)
return response
stop_reason
值和实际错误很重要:
try:
response = client.messages.create(...)
# 使用stop_reason处理成功响应
if response.stop_reason == "max_tokens":
print("Response was truncated")
except anthropic.APIError as e:
# 处理实际错误
if e.status_code == 429:
print("Rate limit exceeded")
elif e.status_code == 500:
print("Server error")
stop_reason
是:
message_start
事件中为null
message_delta
事件中提供with client.messages.stream(...) as stream:
for event in stream:
if event.type == "message_delta":
stop_reason = event.delta.stop_reason
if stop_reason:
print(f"Stream ended with: {stop_reason}")
def complete_tool_workflow(client, user_query, tools):
messages = [{"role": "user", "content": user_query}]
while True:
response = client.messages.create(
model="claude-sonnet-4-20250514",
messages=messages,
tools=tools
)
if response.stop_reason == "tool_use":
# 执行工具并继续
tool_results = execute_tools(response.content)
messages.append({"role": "assistant", "content": response.content})
messages.append({"role": "user", "content": tool_results})
else:
# 最终响应
return response
def get_complete_response(client, prompt, max_attempts=3):
messages = [{"role": "user", "content": prompt}]
full_response = ""
for _ in range(max_attempts):
response = client.messages.create(
model="claude-sonnet-4-20250514",
messages=messages,
max_tokens=4096
)
full_response += response.content[0].text
if response.stop_reason != "max_tokens":
break
# 从停止的地方继续
messages = [
{"role": "user", "content": prompt},
{"role": "assistant", "content": full_response},
{"role": "user", "content": "Please continue from where you left off."}
]
return full_response
stop_reason
值,您可以构建更健壮的应用程序,优雅地处理不同的响应场景并提供更好的用户体验。