Claude 代码 CLI: --max-budget-usd
作者: Ajra16创建于 2026年9月19日更新于 2026年9月19日
标签bug
Claude 代码 CLI: --max-budget-usd 在子代理中触发会使查询挂起(没有 ResultMessage) 组件: Claude 代码 CLI 由 Python 代理 SDK (Claude-agent-sdk 0.2.134,捆绑的 CLI 2.1.226; 在 SDK 0.2.152 中捆绑的 CLI 2.1.259 上再现,Linux aarch64)。 已观察到的平台: Windows 11 x64(笔记本电脑),Raspberry Pi OS 64 位 / Debian Trixie(Pi 5)。 严重性: 无头调用者永远不会得到结果;只有其自己的墙表计时才会结束轮次。 ## 摘要 当 max_budget_usd(CLI --max-budget-usd)超过 Agent 工具启动的 子代理 正在运行时,父查询不会发出 ResultMessage(既不是 success 也不是 error_max_budget_usd)。子代理自己的记录显示它完成了工作,但父查询从来没有收到 Agent 工具结果,流一直保持打开,直到客户端放弃。当同一个限制在 主线程 上触发时,查询会以 subtype: error_max_budget_usd 正常结束。 ## 环境 - Python 3.14,Claude-agent-sdk==0.2.134,其捆绑的 Claude 2.1.226(_cli_version.py);还有一个在 Raspberry Pi 5 上捆绑的 2.1.259 的 Claude-agent-sdk==0.2.152。 - 身份验证:Claude setup-token(OAuth),不是 API 密钥。 - 重要的选项:permission_mode="bypassPermissions",agents={...} 包含两个 AgentDefinition(tools=[...],disallowedTools=[...],model="haiku" 在重现中),tools=["Read","WebSearch","Agent"],strict_mcp_config=True,两个进程内 SDK MCP 服务器,PreToolUse 钩子允许重现中的每个调用,max_budget_usd=0.02,max_turns=40,setting_sources=[],env={"CLAUDE_CODE_DISABLE_AUTO_MEMORY": "1"}。 ## 最小重现(2026 年 9 月 18 日的烟雾做了什么) 1. 定义一个代理,例如 worker,其中包含一个系统提示,告诉它在回答之前多次调用 MCP 工具,以及一个父系统提示,说:通过代理工具委托任何关于 X 的问题给 worker,并粘贴其答案。 2. 在父选项中设置 max_budget_usd=0.02(小到在子代理的第二个或第三个模型调用期间触发限制;在我们的运行中,父代理当时花费了 0.0097 美元)。 3. async for message in query(prompt="<a question about X that needs 3 tool calls>", options=options)。 4. 观察流:SystemMessage,父代理的 AssistantMessage(包含代理 tool_use),TaskStartedMessage,子代理的工具调用(PreToolUse 钩子对每个调用都触发,其中 agent_type="worker"),然后什么都没有。没有携带结果的 TaskNotificationMessage,没有父代理的 AssistantMessage,也没有 ResultMessage。我们的客户端在取消之前等待了 300 秒(笔记本电脑)和 420 秒(Pi)。 5. 控制:在父代理中使用相同的提示,将 max_budget_usd=None 设置为 20 秒内完成,结果为 ResultMessage(subtype="success");在父代理中使用相同的限制,而不进行委托,结果为 ResultMessage(subtype="error_max_budget_usd"),如文档中所述。 在上面的两个 CLI 上观察到,每个运行三次。子代理的 …
内容来源: anthropics/claude-agent-sdk-python