
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-sdk 的 LangfuseVercelAiSdkIntegration 并通过 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.messages、ai.response.text、ai.toolCall.args、ai.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')发出)
解决步骤
- 更新
@langfuse/vercel-ai-sdk到最新版本:确认 Issue 讨论中提到的修复是否已合并到@langfuse/vercel-ai-sdk的后续版本中。检查 release notes 或 Changelog 中有关gen_ai.*属性映射的修复。 - 验证
@ai-sdk/otel版本兼容性:确保@ai-sdk/otel版本不早于 1.0.2,但也不应使用过新的未知版本,避免类似兼容性问题。 - 紧急替代方案:在 Issue 修复前,可优先尝试在工具调用后手动设置
langfuse.observation.input和langfuse.observation.output属性(Langfuse 的 OTel 映射优先级最高)。具体实现参考 Issue 中的用户建议:在 span 上直接添加langfuse.observation.input和langfuse.observation.output。 - 检查 Ingestion 代码更新:查看
OtelIngestionProcessor.ts中extractInputAndOutput()方法的更新(特别是instrumentationScopeName === "ai"分支是否新增了对gen_ai.*属性的兼容处理)。 - 临时降级 AI SDK:如果以上均无效,可优先尝试临时降级到 AI SDK 6.x 并使用旧的事件驱动方式(即问题 #12657 中提到的
gen_ai.client.inference.operation.details格式),但需确认其他依赖兼容性。
验证方法
修复后,重新运行原有 generateText/streamText 或 ToolLoopAgent 调用,检查 Langfuse UI 中:
- Generation 观测的
output字段不再为 null,应包含完整消息内容。 - Tool 观测的
input和output字段不再为 null,应分别包含工具调用参数和返回结果。
同时可通过 API 或自定义 span 处理器对比确认 gen_ai.output.messages、gen_ai.tool.call.arguments、gen_ai.tool.call.result 等属性已正确映射到观测的 I/O 字段。



