bug: AI SDK 7 (@langfuse/vercel-ai-sdk) — generation `output` and tool input/output are null; `gen_ai.output.messages` and `gen_ai.tool.call

用户使用 @langfuse/vercel-ai-sdk@5.9.0 (依赖 @ai-sdk/otel@1.0.2 )、 ai@7.0.4 、Node.js 26,在 Langfuse Cloud (US) 环境中运行 generateText / streamText 或 ToolLoopAgen

bug: AI SDK 7 (@langfuse/vercel-ai-sdk) — generation `output` and tool input/output are null; `gen_ai.output.messages` and `gen_ai.tool.call

bug: AI SDK 7 (@langfuse/vercel-ai-sdk) — generation `output` and tool input/output are null; `gen_ai.output.messages` and `gen_ai.tool.call.arguments/result` attributes not mapped

快速结论:使用 @langfuse/vercel-ai-sdkLangfuseVercelAiSdkIntegration 并通过 registerTelemetry 注册时,AI SDK 7 的嵌套观测(generation/tool)在 Langfuse UI 中缺少 output 和 tool I/O。优先检查 @ai-sdk/otel@langfuse/vercel-ai-sdk 版本是否匹配,并确认 Span scope 是否为 "ai"

问题场景

用户使用 @langfuse/vercel-ai-sdk@5.9.0(依赖 @ai-sdk/otel@1.0.2)、ai@7.0.4、Node.js 26,在 Langfuse Cloud (US) 环境中运行 generateText/streamText 或 ToolLoopAgent 调用工具时触发。Spans 通过 provider.getTracer('ai') 发出,instrumentationScopeName"ai"

报错原文

GENERATION  chat claude-opus-4-8  | input=SET  | output=null
TOOL        queryDataV2           | input=null | output=null

但 span 属性中实际存在完整数据:

[AI_TRACE_DEBUG] chat claude-opus-4-8 | scope=ai | allKeys=[
  "gen_ai.operation.name","gen_ai.provider.name","gen_ai.request.model",
  "gen_ai.input.messages","gen_ai.tool.definitions","langfuse.environment",
  ...,"gen_ai.response.finish_reasons","gen_ai.response.id",
  "gen_ai.usage.input_tokens","gen_ai.usage.output_tokens",
  "gen_ai.usage.cache_read.input_tokens","gen_ai.usage.cache_creation.input_tokens",
  "gen_ai.output.messages"]

[AI_TRACE_DEBUG] execute_tool queryDataV2 | scope=ai | allKeys=[
  "gen_ai.operation.name","gen_ai.tool.name","gen_ai.tool.call.id",
  "gen_ai.tool.type","gen_ai.tool.call.arguments","langfuse.environment",
  "gen_ai.execute_tool.duration","gen_ai.tool.call.result"]

原因分析

可能原因(根据 Issue 讨论链):Langfuse OtelIngestionProcessor 的 extractInputAndOutput() 方法的优先级逻辑存在级联短路。当 instrumentationScopeName === "ai" 时,代码会进入 Vercel AI SDK 早期返回处理分支(第 1506–1545 行),该分支仅识别旧的 ai.* 属性(如 ai.prompt.messagesai.response.textai.toolCall.argsai.toolCall.result),找不到后直接返回 undefined永远不会执行后续的 gen_ai.* 属性映射(第 1808–1830 行)。AI SDK 7 已将 telemetry 属性格式从 ai.* 迁移到 gen_ai.*,但 ingestion 代码的早期返回分支未能处理新格式。

环境排查

  • ai: 7.0.4
  • @ai-sdk/otel: 1.0.2(由 @langfuse/vercel-ai-sdk 间接 pinned)
  • @langfuse/vercel-ai-sdk: 5.9.0
  • @langfuse/otel, @langfuse/tracing, @langfuse/client: 5.9.0
  • Langfuse: Cloud (US)
  • Node.js: 26
  • 确认 span instrumentation scope:必须是 "ai"(通过 provider.getTracer('ai') 发出)

解决步骤

  1. 更新 @langfuse/vercel-ai-sdk 到最新版本:确认 Issue 讨论中提到的修复是否已合并到 @langfuse/vercel-ai-sdk 的后续版本中。检查 release notes 或 Changelog 中有关 gen_ai.* 属性映射的修复。
  2. 验证 @ai-sdk/otel 版本兼容性:确保 @ai-sdk/otel 版本不早于 1.0.2,但也不应使用过新的未知版本,避免类似兼容性问题。
  3. 紧急替代方案:在 Issue 修复前,可优先尝试在工具调用后手动设置 langfuse.observation.inputlangfuse.observation.output 属性(Langfuse 的 OTel 映射优先级最高)。具体实现参考 Issue 中的用户建议:在 span 上直接添加 langfuse.observation.inputlangfuse.observation.output
  4. 检查 Ingestion 代码更新:查看 OtelIngestionProcessor.tsextractInputAndOutput() 方法的更新(特别是 instrumentationScopeName === "ai" 分支是否新增了对 gen_ai.* 属性的兼容处理)。
  5. 临时降级 AI SDK:如果以上均无效,可优先尝试临时降级到 AI SDK 6.x 并使用旧的事件驱动方式(即问题 #12657 中提到的 gen_ai.client.inference.operation.details 格式),但需确认其他依赖兼容性。

验证方法

修复后,重新运行原有 generateText/streamText 或 ToolLoopAgent 调用,检查 Langfuse UI 中:

  • Generation 观测的 output 字段不再为 null,应包含完整消息内容。
  • Tool 观测的 inputoutput 字段不再为 null,应分别包含工具调用参数和返回结果。

同时可通过 API 或自定义 span 处理器对比确认 gen_ai.output.messagesgen_ai.tool.call.argumentsgen_ai.tool.call.result 等属性已正确映射到观测的 I/O 字段。

参考来源

langfuse/langfuse #14633

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 10761

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注