On SDK v10, vercelAIIntegration recorded experimental_telemetry.metadata as vercel.ai.telemetry.metadata.<key> span attributes. The data came from the AI SDK's own OTel spans (ai.telemetry.metadata.*), and the integration renamed every ai.* attribute to vercel.ai.*.
On v11, ai 4 to 6 go through the orchestrion subscriber (packages/server-utils/src/integrations/vercel-ai/vercel-ai-orchestrion-subscriber.ts) instead of OTel. That subscriber reads experimental_telemetry.isEnabled, functionId, recordInputs and recordOutputs, but never metadata. The channel subscriber that builds the spans (vercel-ai-dc-subscriber.ts) doesn't set any metadata attributes either. So the metadata is dropped, and apps lose request-level context (user, tenant, request id, ...) on gen_ai spans after they upgrade.
Reproduction
await generateText({
model,
prompt: 'Hi',
experimental_telemetry: {
isEnabled: true,
functionId: 'support-chat',
metadata: { requestId: 'req_123', tenantId: 'acme' },
},
});
- Expected:
invoke_agent support-chat and its generate_content child carry vercel.ai.telemetry.metadata.requestId and vercel.ai.telemetry.metadata.tenantId, as on v10.
- Actual (11.0.0,
ai 6): neither span has any vercel.ai.telemetry.metadata.* attribute. All other attributes (function id, messages, tokens, model) are present.
A failing integration test covers this: dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v6/scenario-telemetry-metadata.mjs, test "records experimental_telemetry.metadata as span attributes". I only checked ai 6. ai 4 and 5 use the same subscriber, so they are probably affected too.
Proposed fix
- Pass
experimental_telemetry.metadata through the orchestrion message builder.
- In the channel subscriber, set
vercel.ai.telemetry.metadata.<key> on the invoke_agent span.
- Copy the same attributes to child
generate_content spans through a callId map, the same way as operationIdByCallId.
Open question: v10 may also have put metadata on tool call spans. If it did, execute_tool should get it too.
Related
On SDK v10,
vercelAIIntegrationrecordedexperimental_telemetry.metadataasvercel.ai.telemetry.metadata.<key>span attributes. The data came from the AI SDK's own OTel spans (ai.telemetry.metadata.*), and the integration renamed everyai.*attribute tovercel.ai.*.On v11,
ai4 to 6 go through the orchestrion subscriber (packages/server-utils/src/integrations/vercel-ai/vercel-ai-orchestrion-subscriber.ts) instead of OTel. That subscriber readsexperimental_telemetry.isEnabled,functionId,recordInputsandrecordOutputs, but nevermetadata. The channel subscriber that builds the spans (vercel-ai-dc-subscriber.ts) doesn't set any metadata attributes either. So the metadata is dropped, and apps lose request-level context (user, tenant, request id, ...) on gen_ai spans after they upgrade.Reproduction
invoke_agent support-chatand itsgenerate_contentchild carryvercel.ai.telemetry.metadata.requestIdandvercel.ai.telemetry.metadata.tenantId, as on v10.ai6): neither span has anyvercel.ai.telemetry.metadata.*attribute. All other attributes (function id, messages, tokens, model) are present.A failing integration test covers this:
dev-packages/node-integration-tests/suites/tracing/vercelai/span-streaming-v6/scenario-telemetry-metadata.mjs, test "records experimental_telemetry.metadata as span attributes". I only checkedai6.ai4 and 5 use the same subscriber, so they are probably affected too.Proposed fix
experimental_telemetry.metadatathrough the orchestrion message builder.vercel.ai.telemetry.metadata.<key>on theinvoke_agentspan.generate_contentspans through acallIdmap, the same way asoperationIdByCallId.Open question: v10 may also have put metadata on tool call spans. If it did,
execute_toolshould get it too.Related
ai7, where metadata moved toruntimeContext.@cloudflare/think#24660 notes that neither subscriber readsexperimental_telemetry.metadataorruntimeContext.