Loading...
    • 开发者指南
    • API 参考
    • MCP
    • 资源
    • 更新日志
    Search...
    ⌘K
    入门
    Claude 简介快速开始
    模型与定价
    模型概览选择模型Claude 4.6 新特性迁移指南模型弃用定价
    使用 Claude 构建
    功能概览使用 Messages API处理停止原因提示词最佳实践
    上下文管理
    上下文窗口压缩上下文编辑
    能力
    提示缓存扩展思考自适应思考推理力度流式消息批量处理引用多语言支持Token 计数嵌入视觉PDF 支持Files API搜索结果结构化输出
    工具
    概览如何实现工具使用细粒度工具流式传输Bash 工具代码执行工具程序化工具调用计算机使用工具文本编辑器工具网页抓取工具网页搜索工具记忆工具工具搜索工具
    Agent Skills
    概览快速开始最佳实践企业级 Skills通过 API 使用 Skills
    Agent SDK
    概览快速开始TypeScript SDKTypeScript V2(预览版)Python SDK迁移指南
    流式输入实时流式响应处理停止原因处理权限用户审批与输入使用钩子控制执行会话管理文件检查点SDK 中的结构化输出托管 Agent SDK安全部署 AI 智能体修改系统提示词SDK 中的 MCP自定义工具SDK 中的子智能体SDK 中的斜杠命令SDK 中的 Agent Skills跟踪成本与用量待办事项列表SDK 中的插件
    API 中的 MCP
    MCP 连接器远程 MCP 服务器
    第三方平台上的 Claude
    Amazon BedrockMicrosoft FoundryVertex AI
    提示工程
    概览提示词生成器使用提示词模板提示词优化器清晰直接使用示例(多样本提示)让 Claude 思考(思维链)使用 XML 标签赋予 Claude 角色(系统提示词)链式复杂提示长上下文技巧扩展思考技巧
    测试与评估
    定义成功标准开发测试用例使用评估工具降低延迟
    加强安全护栏
    减少幻觉提高输出一致性防范越狱攻击流式拒绝减少提示词泄露保持 Claude 角色设定
    管理与监控
    Admin API 概览数据驻留工作空间用量与成本 APIClaude Code Analytics API零数据留存
    Console
    Log in
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...

    Solutions

    • AI agents
    • Code modernization
    • Coding
    • Customer support
    • Education
    • Financial services
    • Government
    • Life sciences

    Partners

    • Amazon Bedrock
    • Google Cloud's Vertex AI

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Company

    • Anthropic
    • Careers
    • Economic Futures
    • Research
    • News
    • Responsible Scaling Policy
    • Security and compliance
    • Transparency

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Help and security

    • Availability
    • Status
    • Support
    • Discord

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    指南

    处理停止原因

    在 Agent SDK 中直接从结果消息检测拒绝和其他停止原因

    结果消息上的 stop_reason 字段告诉您模型停止生成的原因。这是检测拒绝、最大 token 限制和其他终止条件的推荐方式(无需解析流)。

    stop_reason 在每个 ResultMessage 上都可用,无论是否启用了流式传输。您不需要设置 include_partial_messages(Python)或 includePartialMessages(TypeScript)。

    读取 stop_reason

    stop_reason 字段存在于成功和错误结果消息中。在遍历消息流后检查它:

    from claude_agent_sdk import query, ResultMessage
    import asyncio
    
    async def check_stop_reason():
        async for message in query(prompt="Write a poem about the ocean"):
            if isinstance(message, ResultMessage):
                print(f"Stop reason: {message.stop_reason}")
                if message.stop_reason == "refusal":
                    print("The model declined this request.")
    
    asyncio.run(check_stop_reason())

    可用的停止原因

    停止原因含义
    end_turn模型正常完成了响应的生成。
    max_tokens响应达到了最大输出 token 限制。
    stop_sequence模型生成了配置的停止序列。
    refusal模型拒绝执行该请求。
    tool_use模型的最终输出是工具调用。这在 SDK 结果中不常见,因为工具调用通常在返回结果之前就已执行。
    null未收到 API 响应;例如,在第一个请求之前发生了错误,或者结果是从缓存会话中重放的。

    错误结果上的停止原因

    错误结果(如 error_max_turns 或 error_during_execution)也携带 stop_reason。该值反映了错误发生前收到的最后一条助手消息:

    结果变体stop_reason 值
    success来自最终助手消息的停止原因。
    error_max_turns达到轮次限制前最后一条助手消息的停止原因。
    error_max_budget_usd超出预算前最后一条助手消息的停止原因。
    error_max_structured_output_retries达到重试限制前最后一条助手消息的停止原因。
    error_during_execution最后看到的停止原因,如果错误发生在任何 API 响应之前则为 null。
    from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
    import asyncio
    
    async def handle_max_turns():
        options = ClaudeAgentOptions(max_turns=3)
    
        async for message in query(prompt="Refactor this module", options=options):
            if isinstance(message, ResultMessage):
                if message.subtype == "error_max_turns":
                    print(f"Hit turn limit. Last stop reason: {message.stop_reason}")
                    # stop_reason might be "end_turn" or "tool_use"
                    # depending on what the model was doing when the limit hit
    
    asyncio.run(handle_max_turns())

    检测拒绝

    stop_reason === "refusal" 是检测模型拒绝请求的最简单方式。以前,检测拒绝需要启用部分消息流并手动扫描 StreamEvent 消息中的 message_delta 事件。有了结果消息上的 stop_reason,您可以直接检查:

    from claude_agent_sdk import query, ResultMessage
    import asyncio
    
    async def safe_query(prompt: str):
        async for message in query(prompt=prompt):
            if isinstance(message, ResultMessage):
                if message.stop_reason == "refusal":
                    print("Request was declined. Please revise your prompt.")
                    return None
                return message.result
        return None
    
    asyncio.run(safe_query("Summarize this article"))

    后续步骤

    • 实时流式响应:在原始 API 事件(包括 message_delta)到达时访问它们
    • 结构化输出:从代理获取类型化的 JSON 响应
    • 跟踪成本和用量:了解结果消息中的 token 使用情况和计费信息

    Was this page helpful?

    • 读取 stop_reason