本页目录5
这个考点是什么
多智能体系统里,一个子任务(subagent/subtask)失败时,"错误"具体指什么、该怎么让上游知道,是这个考点的核心。
这里有两条容易混淆的轴需要先分开:
-
一条是HTTP层面的真错误——
429 rate_limit_error、500 api_error、529 overloaded_error、连接错误、400 invalid_request_error、401 authentication_error等,这些在SDK里表现为异常,需要区分"瞬时故障、值得重试"和"请求/凭证本身有问题、重试无意义"两类; -
另一条是Claude返回的
stop_reason——它是HTTP 200的成功完成状态,包括end_turn、tool_use、refusal、pause_turn、model_context_window_exceeded等,每一种都有自己该走的处理路径,不是"出错了就重试"那么简单。
考点的第二层,是多智能体架构里子智能体到coordinator(协调者)之间的错误传播设计。
当一个子智能体(比如负责网页检索的subagent)遇到超时或工具调用失败时,它应该如何把这个失败"告诉"上游?一个常见反模式是子智能体自己在内部兜底,把失败伪装成一个"成功但空"的结果往上传,结果是拥有全局视野、本该做恢复决策的coordinator完全看不到问题发生过,下游的synthesis agent也无法区分这是"合法的空结果"还是"被掩盖的失败",最终产出的报告悄悄缺了一块内容却没有任何异常信号。
真正稳妥的做法,是把失败连同足够的上下文(失败类型、原始尝试的参数、已拿到的部分结果、可能的替代方案)结构化地一起往上传,把恢复决策权留给有全局视角的一层,而不是让每个子智能体各自决定"要不要装作没事发生"。
为什么考
出题角度大致从三层设卡:
-
一是SDK重试语义,考你能否分清
429/500/529这类瞬时故障(自动指数退避重试、遵守retry-after)和400/401这类客户端永久性错误(重试无意义)的边界; -
二是
stop_reason与处理策略的配对,考你是否会把refusal、pause_turn、model_context_window_exceeded这些"成功但特殊"的结束状态,误当成需要退避重试的系统故障来处理; -
三是给一个具体的多智能体场景(如research coordinator调度web search subagent),让你判断怎样的错误传播设计才算"给了coordinator做智能恢复决策的信息",并识别"把失败伪装成success"这种最隐蔽也最常考的反模式。
核心辨析
- 1
先分清两条轴
HTTP错误(4xx/5xx,SDK抛异常)是请求/网络/服务层面的真故障,走重试逻辑;
stop_reason(如end_turn、tool_use、refusal、pause_turn、model_context_window_exceeded)是HTTP 200成功响应里的完成状态,各自有专属处理路径,不能套用"报错就退避重试"的思路。 - 2
重试的边界
429 rate_limit_error、500 api_error、529 overloaded_error及连接错误属于瞬时故障,官方SDK默认自动指数退避重试两次并遵守retry-after;400 invalid_request_error和401 authentication_error是请求内容或凭证本身的问题,原样重试只会得到同样的失败,应当修正请求或凭证,而不是加大重试次数。 - 3
refusal的处理不是简单判失败只有
refusal时stop_details才会被填充,携带策略category等信息;正确做法是先读取该字段判断被拒的原因,再考虑是否切换到fallback模型重试,而不是直接终止任务或不加区分地当异常升级处理。 - 4
pause_turn表示服务端工具调用循环触达了默认迭代上限,而不是出错;恢复方式是把assistant返回的内容连同原始消息一起发回,让服务端继续该轮循环,把它当成异常从头重来会丢失已经完成的中间进度。 - 5
子智能体到coordinator的传播关键在"结构化上下文"
失败类型、原始尝试的参数或查询、已获得的部分结果、可能的替代方案都要一起往上传,让掌握全局视角的coordinator决定重试、换策略还是带着部分结果继续,而不是让子智能体自己拍板。
- 6
最隐蔽的反模式是把失败悄悄伪装成成功
子智能体内部catch住超时后返回
status: 'success'加空结果,coordinator和下游synthesis agent都拿不到任何异常信号,导致最终产出物缺了一整块内容却显得完全正常。
反模式对照
子智能体内部catch住超时,直接返回status: 'success'和空的results。
返回结构化错误上下文——失败类型、尝试的查询、已有的部分结果、可能的替代方案——交给coordinator决策。
掩盖失败会让下游无法区分"确实没有结果"和"失败了",导致最终报告悄悄缺内容且没有任何提示。
把429/500/529和400/401一视同仁,要么一律不重试,要么一律加大重试次数。
对429/500/529用指数退避重试并遵守retry-after;对400/401直接修正请求内容或凭证。
前者是瞬时故障,重试大概率成功;后者是请求本身有问题,原样重试只会得到同样的失败并浪费配额。
收到refusal就直接判定任务失败、终止整个流程。
读取stop_details里的category了解被拒原因,再考虑切换到fallback模型重试。
refusal是安全分类器给出的正常终止路径而非系统故障,stop_details携带的分类信息本身就是用来指导后续处理的。
任意一个子任务失败就把整个多智能体工作流杀掉重来。
让coordinator基于结构化错误上下文决定局部重试、切换策略,或带着已有的部分结果继续往下走。
直接杀死整个workflow会连同已经拿到、可复用的部分结果一起丢弃,牺牲了本可挽救的进度。
练这个考点
练习模式支持按考点专练(需 Google 登录,不占用正式考机会)。
专练考点 5.3该考点的公开题(免登录,含完整解析):
- For resilient API integrations, which of the following HTTP status codes returned by the C…
- For a production agent, select all correct pairings of a Claude `stop_reason` with an appr…
- Which approach to API error propagation and retries best supports production reliability o…
- Scenario — Multi-Agent Research System. The web search subagent times out while researchin…
延伸阅读: