
bug(python-sdk): Langchain base tool handled errors are considered like successful outputs
快速结论:当 LangChain 工具将 handle_tool_error 设置为 true 且工具抛出 ToolException 时,Langfuse 会将工具调用标记为成功(而非失败)。优先排查你的 Langfuse SDK 版本是否包含针对 on_tool_end 中 ToolMessage.status 的修复。
问题场景
用户在使用 Langfuse Python SDK 集成 LangChain 回调管理器时,创建了一个继承 BaseTool 并设置了 handle_tool_error = True 的 LangChain 工具。当工具抛出 ToolException 时,LangChain 正确调用了 on_tool_end(而非 on_tool_error),但 Langfuse 的追踪记录中该工具调用被标记为成功,未能反映实际发生的错误。
报错原文
# 行为表现而非传统报错:
# Langfuse 追踪中工具调用的 Observation Level 显示为 "DEFAULT"(成功)
# 期望应为 "ERROR"(失败)
# 核心逻辑缺陷位置:on_tool_end 回调方法
# 未检查 ToolMessage.status 属性
# 导致即使 status="error" 也被视为成功输出
原因分析
LangChain 在 handle_tool_error=True 的情况下,工具抛出 ToolException 后不会调用 on_tool_error,而是调用 on_tool_end,并将返回的 ToolMessage 的 status 字段设置为 "error"。Langfuse 的 LangChain 回调处理器中的 on_tool_end 方法没有检查该 status,而是将所有结束的工具调用直接标记为成功。
环境排查
- Langfuse Python SDK 版本:确认是否 < 待发布或修补版本(Issue 提及 v4.0.0 受影响)
- LangChain 版本:确认是否使用支持
handle_tool_error和ToolMessage.status的版本 - Langfuse 版本:确认 self-hosted 部署版本(Issue 中为 v3.155)
- Python 版本:建议使用 3.9+
解决步骤
- 确认你的 Langfuse Python SDK 版本是否包含该修复。Issue 中已提交 PR(langfuse-python#1718),检查当前 SDK 是否已合并该 PR。
- 如果尚未包含修复,可优先尝试在
on_tool_end方法中手动检查ToolMessage的status属性:如果status == "error",将对应的 Langfuse 观察级别设置为ERROR。 - 也可以等待官方 SDK 更新后,升级到包含该修复的版本。
- 升级后,针对使用了
handle_tool_error=True的 BaseTool 运行回归测试,确保工具错误能被正确标记为失败。
验证方法
创建一个简单的 LangChain 工具,设置 handle_tool_error=True,使其抛出 ToolException,并绑定 Langfuse 回调管理器。触发工具调用后,在 Langfuse 追踪中查看该工具调用的 Observation Level。修复前显示为成功(绿色图标),修复后应显示为错误(红色图标),且工具调用的输出内容包含错误信息。



