SuperAPI AI 工具集

langgraph-error-handling

智能体与模型

查看项目

更新于 10-16 02:33

技能介绍

一、用途 该技能用于在 LangGraph 中实现错误处理,覆盖失败分类、瞬时故障重试、LLM 恢复循环、人工审批升级、预构建 ToolNode 失败处理,以及并行超级步(superstep)中事务性失败行为的调试。

二、策略选择顺序

  1. 瞬时/基础设施问题(429、超时、5xx、临时数据库锁)使用 RetryPolicy。
  2. 可由模型或工具参数修正的错误,将错误存入 state 并用 Command 路由回去。
  3. 需要用户批准或缺少信息,使用 interrupt() + 恢复。
  4. 未知或程序缺陷,让其抛出并调试。 按错误归属:瞬时由系统负责,机制为 RetryPolicy;LLM 可恢复由 LLM 负责,机制为状态更新 + Command(goto=...);用户可修复由人负责,机制为 interrupt() + Command(resume=...);意外由开发者负责,抛出/记录/调试。

三、主要用法 重试瞬时失败:用 builder.add_node("call_api", call_api, retry_policy=RetryPolicy(max_attempts=3, initial_interval=1.0)),JS 端为 retryPolicy: { maxAttempts: 3, initialInterval: 1.0 }。Python 与 JS 默认重试行为按异常类型不同,非瞬时领域建议用 retry_on/retryOn 精确指定。 LLM 恢复循环:Python 使用 MessagesState,在 State 中加入 error 与 retry_count;节点返回 Command[Literal["tool", "end"]],达到重试上限时 goto end。JS 中若节点返回 Command,需在 addNode 上添加 ends 元数据。 人工介入升级:用 interrupt({"question": "Proceed?", ...}) 获取批准,返回 Command(goto="execute" 或 "cancel");恢复时调用 graph.invoke(Command(resume=True), config={"configurable": {"thread_id": "t-1"}})。要求编译时带 checkpointer,恢复时复用同一 thread_id。 ToolNode 错误处理:ToolNode(tools, handle_tool_errors=True) 或传入字符串、异常元组,也可用自定义处理器做确定性错误整形。

四、关键行为 超级步是事务性的:一个并行分支失败会导致整个超级步状态更新失败;RetryPolicy 只重试失败分支,不重试已成功的兄弟分支。interrupt() 在恢复时会重新运行节点,因此 interrupt 之前的副作用必须幂等,或移到 interrupt 之后/单独节点。JS 中 Command 路由需要 addNode 的 ends 元数据。需使用明确的重试上限(max_attempts,加上恢复循环用的状态计数器)。

五、本地资产 脚本 scripts/classify_error.py 分类异常并给出建议处理,scripts/wrap_with_retry.py 生成带重试/恢复/升级选项的节点包装样板,示例位于 assets/examples/ 下的 retry-example 与 human-loop-example(Python 与 JS)。在仓库根目录运行,例如 uv run skills/langgraph-error-handling/scripts/classify_error.py TimeoutError --verbose 和 uv run skills/langgraph-error-handling/scripts/wrap_with_retry.py call_llm --with-llm-recovery。参考文档按需加载:error-types.md、retry-strategies.md、llm-recovery.md、human-escalation.md。

六、常见问题 interrupt() 运行时失败多因没有 checkpointer;恢复启动新运行多因 thread_id 不同;JS Command 路由未生效多因缺少 ends;无限循环多因缺少终止计数器/条件;重试未触发多因异常被重试过滤器排除,应显式设置 retry_on/retryOn。