乐于分享
好东西不私藏

给 OpenClaw 加上 Langfuse 追踪后,我终于看清每一次大模型调用了

给 OpenClaw 加上 Langfuse 追踪后,我终于看清每一次大模型调用了

最近我给 OpenClaw 做了一个很实用的小增强:新增了一个独立的 Langfuse 追踪插件,并进行了配置,OpenClaw 每一次调用大模型时的输入、输出、耗时、Token 使用情况,都可以在 Langfuse 里清楚看到。

Openclaw的使用情况页面主要是API 使用情况和成本,并没有大模型运行时的输入、输出,让龙虾内部调用的变得不透明。

这次实验的核心就是把 OpenClaw 的三个 Hook 映射到 Langfuse 的 trace 和 generation,并没有侵入 OpenClaw 的核心逻辑,而是利用 OpenClaw 自己的 Hook 机制,在三个关键时机做追踪上报。

1. llm_input

当 OpenClaw 准备调用模型时,插件会先记录一次输入信息。

这里会上报的内容包括:

当前 runId 和 sessionId

provider 和 model

system prompt

用户 prompt

historyMessages

图片数量等元数据

这一步主要对应 Langfuse 里的 trace-create 和 generation-create 。

你可以理解为:模型还没回答,但这次调用已经“立案”了。

2. llm_output

当模型返回结果后,插件会继续补充输出信息。

这里重点会上报:

assistant 的回复内容

token 使用情况

输入输出 token 统计

cacheRead、cacheWrite、total 等 usage 信息

这一步对应 Langfuse 里的 generation-update 。

也就是说,这时候就能在 Langfuse 里看到这次模型到底说了什么、花了多少 token。

3. agent_end

当整个 Agent 执行结束后,再做最后一次收尾。

这里会记录:

这次执行是否成功

总耗时

是否有报错

错误信息是什么

如果失败了,还会把错误状态同步到 Langfuse,避免出现“有开始、没结束”的脏数据。

4.写入配置

在plugins.entries.langfuse 里写入配置

接入完成后,最大的感受就是:模型调用终于不是黑盒了。
现在在 Langfuse 里,我可以直接看到:
  • 一次请求是什么时候发起的
  • 用的是哪个模型
  • 输入 prompt 是什么
  • 历史消息长什么样
  • 输出结果是什么
  • token 花了多少
  • 总耗时是多少
  • 如果失败,失败原因是什么
对开发和排查来说,这个提升非常直接。
以前遇到“这次回答为什么不对”时,可能要翻很多日志;
现在直接打开 Langfuse,看 trace 和 generation,就能快速定位问题是在输入、输出、模型表现,还是执行流程收尾上。