@ai-sdk/otel 1.0.127 → 1.0.128
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/index.d.ts +33 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +106 -65
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/legacy-open-telemetry.ts +79 -38
- package/src/open-telemetry.ts +93 -47
- package/src/supplemental-attributes.ts +9 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_exhaustive","shouldRecord","selectAttributes","selectAttributes","selectAttributes"],"sources":["../src/gen-ai-format-messages.ts","../src/record-span.ts","../src/provider-usage-attributes.ts","../src/sanitize-attribute-value.ts","../src/select-attributes.ts","../src/supplemental-attributes.ts","../src/open-telemetry.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts","../src/legacy-open-telemetry.ts"],"sourcesContent":["import type {\n LanguageModelV4CustomPart,\n LanguageModelV4FilePart,\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n LanguageModelV4ReasoningFilePart,\n LanguageModelV4ReasoningPart,\n LanguageModelV4TextPart,\n LanguageModelV4ToolApprovalResponsePart,\n LanguageModelV4ToolCallPart,\n LanguageModelV4ToolResultPart,\n} from '@ai-sdk/provider';\nimport type { ModelMessage } from '@ai-sdk/provider-utils';\nimport { convertDataContentToBase64String } from 'ai';\n\ntype LanguageModelV4ContentPart =\n | LanguageModelV4TextPart\n | LanguageModelV4FilePart\n | LanguageModelV4CustomPart\n | LanguageModelV4ReasoningPart\n | LanguageModelV4ReasoningFilePart\n | LanguageModelV4ToolCallPart\n | LanguageModelV4ToolResultPart\n | LanguageModelV4ToolApprovalResponsePart;\n\ntype SemConvPart =\n | { type: 'text'; content: string }\n | { type: 'reasoning'; content: string }\n | {\n type: 'tool_call';\n id: string | null;\n name: string;\n arguments?: unknown;\n }\n | {\n type: 'tool_call_response';\n id: string | null;\n response: unknown;\n }\n | {\n type: 'blob';\n modality: string;\n mime_type: string | null;\n content: string;\n }\n | { type: string; [key: string]: unknown };\n\ninterface SemConvInputMessage {\n role: string;\n parts: SemConvPart[];\n}\n\ninterface SemConvOutputMessage {\n role: string;\n parts: SemConvPart[];\n finish_reason: string;\n}\n\ninterface SemConvSystemInstruction {\n type: string;\n content?: string;\n [key: string]: unknown;\n}\n\n/**\n * Maps an AI SDK provider string (e.g. \"anthropic.messages\", \"openai.chat\")\n * to a well-known gen_ai.provider.name value per the OTel GenAI SemConv.\n *\n * Provider strings come in formats like:\n * \"openai.chat\", \"google.generative-ai\", \"google.vertex.chat\",\n * \"google-vertex\", \"amazon-bedrock.chat\", \"azure.chat\"\n *\n * We match against longest-prefix-first to handle multi-segment prefixes\n * like \"google.vertex\" and \"google.generative-ai\" before the single-segment \"google\".\n */\nexport function mapProviderName(provider: string): string {\n const lower = provider.toLowerCase();\n\n const wellKnownPrefixes: Array<[string, string]> = [\n ['google.vertex', 'gcp.vertex_ai'],\n ['google.generative-ai', 'gcp.gemini'],\n ['google-vertex', 'gcp.vertex_ai'],\n ['amazon-bedrock', 'aws.bedrock'],\n ['azure-openai', 'azure.ai.openai'],\n ['anthropic', 'anthropic'],\n ['openai', 'openai'],\n ['azure', 'azure.ai.inference'],\n ['google', 'gcp.gemini'],\n ['mistral', 'mistral_ai'],\n ['cohere', 'cohere'],\n ['bedrock', 'aws.bedrock'],\n ['groq', 'groq'],\n ['deepseek', 'deepseek'],\n ['perplexity', 'perplexity'],\n ['xai', 'x_ai'],\n ];\n\n for (const [prefix, mapped] of wellKnownPrefixes) {\n if (\n lower === prefix ||\n lower.startsWith(prefix + '.') ||\n lower.startsWith(prefix + '-')\n ) {\n return mapped;\n }\n }\n\n return provider;\n}\n\n/**\n * Maps an AI SDK operationId to a gen_ai.operation.name value.\n */\nexport function mapOperationName(operationId: string): string {\n const mapping: Record<string, string> = {\n 'ai.generateText': 'invoke_agent',\n 'ai.streamText': 'invoke_agent',\n 'ai.generateObject': 'invoke_agent',\n 'ai.streamObject': 'invoke_agent',\n 'ai.embed': 'embeddings',\n 'ai.embedMany': 'embeddings',\n 'ai.rerank': 'rerank',\n 'ai.generateSpeech': 'ai.generateSpeech',\n 'ai.transcribe': 'ai.transcribe',\n 'ai.streamTranscribe': 'ai.streamTranscribe',\n };\n return mapping[operationId] ?? operationId;\n}\n\n/**\n * Converts a system value to the gen_ai.system_instructions SemConv format.\n * Accepts a plain string, a single SystemModelMessage, or an array of them.\n * Schema: array of parts, each with at least { type, content }.\n */\nexport function formatSystemInstructions(\n system:\n | string\n | { role: 'system'; content: string }\n | Array<{ role: 'system'; content: string }>,\n): SemConvSystemInstruction[] {\n if (typeof system === 'string') {\n return [{ type: 'text', content: system }];\n }\n if (Array.isArray(system)) {\n return system.map(msg => ({ type: 'text', content: msg.content }));\n }\n return [{ type: 'text', content: system.content }];\n}\n\nfunction convertMessagePartToSemConv(\n part: LanguageModelV4ContentPart,\n): SemConvPart {\n switch (part.type) {\n case 'text':\n return { type: 'text', content: part.text };\n\n case 'reasoning':\n return { type: 'reasoning', content: part.text };\n\n case 'tool-call':\n return {\n type: 'tool_call',\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response',\n id: part.toolCallId ?? null,\n response,\n };\n }\n\n case 'file': {\n const rawData = part.data as\n | string\n | Uint8Array\n | URL\n | ArrayBuffer\n | { type: 'data'; data: string | Uint8Array | ArrayBuffer }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n\n const data: string | Uint8Array | URL | ArrayBuffer = (() => {\n if (\n typeof rawData === 'object' &&\n rawData !== null &&\n !(rawData instanceof URL) &&\n !(rawData instanceof Uint8Array) &&\n !(rawData instanceof ArrayBuffer) &&\n 'type' in rawData\n ) {\n switch (rawData.type) {\n case 'data':\n return rawData.data;\n case 'url':\n return rawData.url;\n case 'text':\n return rawData.text;\n default:\n return '';\n }\n }\n return rawData as string | Uint8Array | URL | ArrayBuffer;\n })();\n\n let content: string;\n if (data instanceof Uint8Array) {\n content = convertDataContentToBase64String(data);\n } else if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n content = data;\n } else if (data instanceof URL) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n } else {\n content = String(data);\n }\n return {\n type: 'blob',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content,\n };\n }\n\n case 'tool-approval-response':\n return {\n type: 'tool_approval_response',\n approval_id: part.approvalId,\n approved: part.approved,\n reason: part.reason,\n };\n\n case 'custom':\n return { type: 'custom', kind: part.kind };\n\n case 'reasoning-file':\n return { type: String(part.type) };\n\n default: {\n const _exhaustive: never = part;\n return { type: String((_exhaustive as { type: string }).type) };\n }\n }\n}\n\nfunction getModality(mediaType: string | undefined): string {\n if (!mediaType) return 'image';\n if (mediaType.startsWith('image/')) return 'image';\n if (mediaType.startsWith('video/')) return 'video';\n if (mediaType.startsWith('audio/')) return 'audio';\n return 'image';\n}\n\n/**\n * Converts a LanguageModelV4Prompt to the gen_ai.input.messages SemConv format.\n * Messages are preserved in the order they were sent to the model.\n */\nexport function formatInputMessages(\n prompt: LanguageModelV4Prompt,\n): SemConvInputMessage[] {\n return prompt.map((message: LanguageModelV4Message) => {\n if (message.role === 'system') {\n return {\n role: 'system',\n parts: [{ type: 'text', content: message.content }],\n };\n }\n\n const parts = message.content.map(convertMessagePartToSemConv);\n return { role: message.role, parts };\n });\n}\n\n/**\n * Converts user-facing ModelMessage[] (and optional prompt string) to the\n * gen_ai.input.messages SemConv format while preserving message order.\n */\nexport function formatModelMessages({\n prompt,\n messages,\n}: {\n prompt: string | Array<ModelMessage> | undefined;\n messages: Array<ModelMessage> | undefined;\n}): SemConvInputMessage[] {\n const result: SemConvInputMessage[] = [];\n\n if (typeof prompt === 'string') {\n result.push({\n role: 'user',\n parts: [{ type: 'text', content: prompt }],\n });\n } else if (Array.isArray(prompt)) {\n for (const msg of prompt) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n if (messages) {\n for (const msg of messages) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n return result;\n}\n\nfunction convertModelMessageToSemConv(msg: ModelMessage): SemConvInputMessage {\n if (msg.role === 'system') {\n return {\n role: 'system',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n\n if (msg.role === 'user') {\n if (typeof msg.content === 'string') {\n return {\n role: 'user',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'image': {\n const data = part.image;\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n case 'file': {\n const rawData = part.data as\n | string\n | Uint8Array\n | URL\n | ArrayBuffer\n | { type: 'data'; data: string | Uint8Array | ArrayBuffer }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n\n const data: string | Uint8Array | URL | ArrayBuffer = (() => {\n if (\n typeof rawData === 'object' &&\n rawData !== null &&\n !(rawData instanceof URL) &&\n !(rawData instanceof Uint8Array) &&\n !(rawData instanceof ArrayBuffer) &&\n 'type' in rawData\n ) {\n switch (rawData.type) {\n case 'data':\n return rawData.data;\n case 'url':\n return rawData.url;\n case 'text':\n return rawData.text;\n default:\n return '';\n }\n }\n return rawData as string | Uint8Array | URL | ArrayBuffer;\n })();\n\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'user', parts };\n }\n\n if (msg.role === 'assistant') {\n if (typeof msg.content === 'string') {\n return {\n role: 'assistant',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'reasoning':\n return { type: 'reasoning' as const, content: part.text };\n case 'tool-call':\n return {\n type: 'tool_call' as const,\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'assistant', parts };\n }\n\n if (msg.role === 'tool') {\n const parts: SemConvPart[] = msg.content.map(part => {\n if (part.type === 'tool-result') {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n return { type: String((part as { type: string }).type) };\n });\n return { role: 'tool', parts };\n }\n\n const _exhaustive: never = msg;\n return _exhaustive;\n}\n\n/**\n * Extracts the system instruction from a LanguageModelV4Prompt if present.\n */\nexport function extractSystemFromPrompt(\n prompt: LanguageModelV4Prompt,\n): string | undefined {\n const systemMsg = prompt.find(msg => msg.role === 'system');\n if (systemMsg && systemMsg.role === 'system') {\n return systemMsg.content;\n }\n}\n\n/**\n * Converts step result data to the gen_ai.output.messages SemConv format.\n */\nexport function formatOutputMessages({\n text,\n reasoning,\n toolCalls,\n toolResults,\n files,\n finishReason,\n}: {\n text?: string;\n reasoning?: ReadonlyArray<{ text?: string }>;\n toolCalls?: ReadonlyArray<{\n toolCallId: string;\n toolName: string;\n input: unknown;\n }>;\n toolResults?: ReadonlyArray<{\n toolCallId: string;\n output: unknown;\n }>;\n files?: ReadonlyArray<{ mediaType: string; base64: string }>;\n finishReason: string;\n}): SemConvOutputMessage[] {\n const parts: SemConvPart[] = [];\n\n if (reasoning) {\n for (const r of reasoning) {\n if ('text' in r && r.text) {\n parts.push({ type: 'reasoning', content: r.text });\n }\n }\n }\n\n if (text != null && text.length > 0) {\n parts.push({ type: 'text', content: text });\n }\n\n if (toolCalls) {\n for (const tc of toolCalls) {\n parts.push({\n type: 'tool_call',\n id: tc.toolCallId,\n name: tc.toolName,\n arguments: tc.input,\n });\n }\n }\n\n if (toolResults) {\n for (const toolResult of toolResults) {\n parts.push({\n type: 'tool_call_response',\n id: toolResult.toolCallId,\n response: toolResult.output,\n });\n }\n }\n\n if (files) {\n for (const file of files) {\n parts.push({\n type: 'blob',\n modality: getModality(file.mediaType),\n mime_type: file.mediaType,\n content: file.base64,\n });\n }\n }\n\n return [\n {\n role: 'assistant',\n parts,\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\n/**\n * Converts generateObject result to the gen_ai.output.messages SemConv format.\n */\nexport function formatObjectOutputMessages({\n objectText,\n finishReason,\n}: {\n objectText: string;\n finishReason: string;\n}): SemConvOutputMessage[] {\n return [\n {\n role: 'assistant',\n parts: [{ type: 'text', content: objectText }],\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\nfunction mapFinishReason(reason: string): string {\n const mapping: Record<string, string> = {\n stop: 'stop',\n length: 'length',\n 'content-filter': 'content_filter',\n 'tool-calls': 'tool_call',\n error: 'error',\n other: 'stop',\n unknown: 'stop',\n };\n return mapping[reason] ?? reason;\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport {\n SpanStatusCode,\n context,\n type Attributes,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport { RetryError } from 'ai';\n\nexport async function recordSpan<T>({\n name,\n tracer,\n attributes,\n fn,\n endWhenDone = true,\n}: {\n name: string;\n tracer: Tracer;\n attributes: Attributes | PromiseLike<Attributes>;\n fn: (span: Span) => Promise<T>;\n endWhenDone?: boolean;\n}) {\n return tracer.startActiveSpan(\n name,\n { attributes: await attributes },\n async span => {\n // Capture the current context to maintain it across async generator yields\n const ctx = context.active();\n\n try {\n // Execute within the captured context to ensure async generators\n // don't lose the active span when they yield\n const result = await context.with(ctx, () => fn(span));\n\n if (endWhenDone) {\n span.end();\n }\n\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n // always stop the span when there is an error:\n span.end();\n }\n\n throw error;\n }\n },\n );\n}\n\n/**\n * Record an error on a span. Sets the span status to error. If the error is\n * an instance of Error, an exception event with name, message, and stack\n * will also be recorded.\n *\n * @param span - The span to record the error on.\n * @param error - The error to record on the span.\n */\nexport function recordErrorOnSpan(span: Span, error: unknown) {\n const apiCallError = RetryError.isInstance(error) ? error.lastError : error;\n\n if (\n APICallError.isInstance(apiCallError) &&\n apiCallError.statusCode != null\n ) {\n span.setAttribute('http.response.status_code', apiCallError.statusCode);\n }\n\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n","import type { Attributes } from '@opentelemetry/api';\nimport type { JSONObject, JSONValue } from '@ai-sdk/provider';\n\nconst usageKeyAliases: Record<string, string> = {\n inputtokens: 'input_tokens',\n prompttokens: 'input_tokens',\n prompttokencount: 'input_tokens',\n totalinputtokens: 'input_tokens',\n outputtokens: 'output_tokens',\n completiontokens: 'output_tokens',\n completiontokencount: 'output_tokens',\n candidatestokencount: 'output_tokens',\n totaltokens: 'total_tokens',\n totaltokencount: 'total_tokens',\n};\n\nfunction normalizeUsageKey(key: string): string {\n const aliasKey = key.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n const alias = usageKeyAliases[aliasKey];\n\n if (alias != null) {\n return alias;\n }\n\n return key\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toLowerCase();\n}\n\n/**\n * Converts provider-native usage objects into numeric span attributes.\n *\n * Usage units such as tokens, characters, and seconds remain distinct so\n * observability backends can apply the provider/model-specific price unit.\n */\nexport function getProviderUsageAttributes({\n usage,\n prefix,\n}: {\n usage: JSONObject | undefined;\n prefix: string;\n}): Attributes {\n const attributes: Attributes = {};\n\n const addValue = (value: JSONValue | undefined, path: string[]) => {\n if (typeof value === 'number') {\n if (Number.isFinite(value) && path.length > 0) {\n attributes[`${prefix}.${path.join('.')}`] = value;\n }\n return;\n }\n\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return;\n }\n\n for (const [key, nestedValue] of Object.entries(value)) {\n const normalizedKey = normalizeUsageKey(key);\n if (normalizedKey !== '') {\n addValue(nestedValue, [...path, normalizedKey]);\n }\n }\n };\n\n addValue(usage, []);\n return attributes;\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\n\nfunction isPrimitiveAttributeValue(\n value: unknown,\n): value is string | number | boolean {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n );\n}\n\nexport function sanitizeAttributeValue(\n value: AttributeValue,\n): AttributeValue | undefined {\n if (!Array.isArray(value)) {\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return undefined;\n }\n\n return value;\n }\n\n const primitiveTypes = new Set(\n value.filter(isPrimitiveAttributeValue).map(item => typeof item),\n );\n\n if (primitiveTypes.size !== 1) {\n return undefined;\n }\n\n const [primitiveType] = primitiveTypes;\n\n if (primitiveType === 'string') {\n return value.filter((item): item is string => typeof item === 'string');\n }\n\n if (primitiveType === 'number') {\n const numbers = value.filter(\n (item): item is number => typeof item === 'number',\n );\n\n return numbers.every(Number.isFinite) ? numbers : undefined;\n }\n\n return value.filter((item): item is boolean => typeof item === 'boolean');\n}\n\nexport function sanitizeAttributes(\n attributes: Attributes | undefined,\n): Attributes {\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes ?? {})) {\n if (value == null) continue;\n const sanitized = sanitizeAttributeValue(value);\n if (sanitized != null) result[key] = sanitized;\n }\n\n return result;\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { TelemetryOptions } from 'ai';\nimport { sanitizeAttributeValue } from './sanitize-attribute-value';\n\nexport type AttributeSpec =\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined;\n\nexport type AttributeSpecMap = Record<string, AttributeSpec>;\n\nfunction shouldRecord(\n telemetry: TelemetryOptions | undefined,\n): telemetry is TelemetryOptions {\n return telemetry?.isEnabled !== false;\n}\n\nexport function selectAttributes(\n telemetry: TelemetryOptions | undefined,\n attributes: AttributeSpecMap,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) {\n const sanitized = sanitizeAttributeValue(resolved);\n if (sanitized != null) result[key] = sanitized;\n }\n continue;\n }\n\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n if (telemetry?.recordOutputs === false) continue;\n const resolved = value.output();\n if (resolved != null) {\n const sanitized = sanitizeAttributeValue(resolved);\n if (sanitized != null) result[key] = sanitized;\n }\n continue;\n }\n\n const sanitized = sanitizeAttributeValue(value as AttributeValue);\n if (sanitized != null) result[key] = sanitized;\n }\n\n return result;\n}\n","import type { Attributes, Tracer } from '@opentelemetry/api';\nimport type { TelemetryOptions } from 'ai';\nimport {\n selectAttributes,\n type AttributeSpec,\n type AttributeSpecMap,\n} from './select-attributes';\n\ntype SupplementalAttributeOption =\n | 'usage'\n | 'providerMetadata'\n | 'embedding'\n | 'reranking'\n | 'experimental_evaluation'\n | 'runtimeContext'\n | 'headers'\n | 'toolChoice'\n | 'schema';\n\nexport type SupplementalAttributeOptions = Record<\n SupplementalAttributeOption,\n boolean\n>;\n\nexport type OpenTelemetrySpanType =\n | 'operation'\n | 'step'\n | 'languageModel'\n | 'tool'\n | 'embedding'\n | 'reranking'\n | 'experimental_evaluation';\n\nexport type EnrichSpan = (options: {\n spanType: OpenTelemetrySpanType;\n operationId: string;\n callId: string;\n runtimeContext: Record<string, unknown> | undefined;\n}) => Attributes | undefined;\n\nexport type OpenTelemetryOptions = {\n /**\n * The tracer to use for the telemetry data.\n */\n tracer?: Tracer;\n\n /**\n * Adds custom attributes to spans when they are created. These attributes are\n * not AI SDK-owned semantics and are intended for observability integrations.\n */\n enrichSpan?: EnrichSpan;\n\n /**\n * Emit AI SDK usage details that are not represented by GenAI SemConv.\n */\n usage?: boolean;\n\n /**\n * Emit provider metadata on response spans.\n */\n providerMetadata?: boolean;\n\n /**\n * Emit embedding input and output values.\n */\n embedding?: boolean;\n\n /**\n * Emit reranking input documents and output ranking.\n */\n reranking?: boolean;\n\n /**\n * Emit evaluation state, questions, and answers.\n */\n experimental_evaluation?: boolean;\n\n /**\n * Emit runtime context values.\n */\n runtimeContext?: boolean;\n\n /**\n * Emit request headers.\n */\n headers?: boolean;\n\n /**\n * Emit selected tool choice information.\n */\n toolChoice?: boolean;\n\n /**\n * Emit object generation schema information.\n */\n schema?: boolean;\n};\n\nconst disabledSupplementalAttributes: SupplementalAttributeOptions = {\n usage: false,\n providerMetadata: false,\n embedding: false,\n reranking: false,\n experimental_evaluation: false,\n runtimeContext: false,\n headers: false,\n toolChoice: false,\n schema: false,\n};\n\nexport function normalizeSupplementalAttributes(\n options: OpenTelemetryOptions,\n): SupplementalAttributeOptions {\n return {\n ...disabledSupplementalAttributes,\n usage: options.usage ?? false,\n providerMetadata: options.providerMetadata ?? false,\n embedding: options.embedding ?? false,\n reranking: options.reranking ?? false,\n experimental_evaluation: options.experimental_evaluation ?? false,\n runtimeContext: options.runtimeContext ?? false,\n headers: options.headers ?? false,\n toolChoice: options.toolChoice ?? false,\n schema: options.schema ?? false,\n };\n}\n\nexport function getRuntimeContextAttributes(\n context: Record<string, unknown> | undefined,\n): AttributeSpecMap {\n const attributes: AttributeSpecMap = {};\n\n for (const [key, value] of Object.entries(context ?? {})) {\n addRuntimeContextAttribute(attributes, `ai.settings.context.${key}`, value);\n }\n\n return attributes;\n}\n\n/**\n * Flattens nested runtime context objects into OTel-compatible attribute keys.\n * Arrays are preserved because OTel supports primitive array attribute values.\n */\nfunction addRuntimeContextAttribute(\n attributes: AttributeSpecMap,\n key: string,\n value: unknown,\n): void {\n if (value == null) {\n return;\n }\n\n if (Array.isArray(value) || typeof value !== 'object') {\n attributes[key] = value as AttributeSpec;\n return;\n }\n\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n addRuntimeContextAttribute(attributes, `${key}.${nestedKey}`, nestedValue);\n }\n}\n\nexport function getHeaderAttributes(\n headers: Record<string, string | undefined> | undefined,\n): AttributeSpecMap {\n return Object.fromEntries(\n Object.entries(headers ?? {})\n .filter(([, value]) => value != null)\n .map(([key, value]) => [`ai.request.headers.${key}`, value]),\n ) as AttributeSpecMap;\n}\n\nexport function getDetailedUsageAttributes(usage: {\n inputTokenDetails?: {\n noCacheTokens?: number | undefined;\n };\n outputTokenDetails?: {\n textTokens?: number | undefined;\n reasoningTokens?: number | undefined;\n };\n}): AttributeSpecMap {\n return {\n 'ai.usage.inputTokenDetails.noCacheTokens':\n usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n usage.outputTokenDetails?.reasoningTokens,\n };\n}\n\nexport function selectSupplementalAttributes(\n telemetry: TelemetryOptions | undefined,\n enabledAttributes: SupplementalAttributeOptions,\n attributes: Partial<Record<SupplementalAttributeOption, AttributeSpecMap>>,\n): Attributes {\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes) as Array<\n [SupplementalAttributeOption, AttributeSpecMap | undefined]\n >) {\n if (!enabledAttributes[key] || value == null) {\n continue;\n }\n\n Object.assign(result, selectAttributes(telemetry, value));\n }\n\n return result;\n}\n","import {\n context,\n SpanKind,\n trace,\n type Attributes,\n type Context as OpenTelemetryContext,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbeddingModelCallEndEvent,\n EmbedEndEvent,\n EmbedStartEvent,\n LanguageModelCallEndEvent,\n LanguageModelCallStartEvent,\n EmbeddingModelCallStartEvent,\n GenerateObjectEndEvent,\n GenerateObjectStartEvent,\n GenerateObjectStepEndEvent,\n GenerateObjectStepStartEvent,\n GenerateTextAbortEvent,\n GenerateTextEndEvent,\n GenerateTextStartEvent,\n GenerateTextStepEndEvent,\n GenerateTextStepStartEvent,\n GenerateSpeechEndEvent,\n GenerateSpeechStartEvent,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n Experimental_EvaluateEndEvent as EvaluateEndEvent,\n Experimental_EvaluateStartEvent as EvaluateStartEvent,\n Experimental_EvaluationModelCallEndEvent as EvaluationModelCallEndEvent,\n Experimental_EvaluationModelCallStartEvent as EvaluationModelCallStartEvent,\n RerankingModelCallEndEvent,\n RerankEndEvent,\n RerankStartEvent,\n RerankingModelCallStartEvent,\n TranscriptionEndEvent,\n TranscriptionStartEvent,\n Experimental_StreamTranscriptionEndEvent as StreamTranscriptionEndEvent,\n Experimental_StreamTranscriptionStartEvent as StreamTranscriptionStartEvent,\n InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport {\n formatInputMessages,\n formatModelMessages,\n formatObjectOutputMessages,\n formatOutputMessages,\n formatSystemInstructions,\n mapOperationName,\n mapProviderName,\n} from './gen-ai-format-messages';\nimport { recordErrorOnSpan } from './record-span';\nimport { getProviderUsageAttributes } from './provider-usage-attributes';\nimport { sanitizeAttributes } from './sanitize-attribute-value';\nimport { selectAttributes } from './select-attributes';\nimport {\n getDetailedUsageAttributes,\n getHeaderAttributes,\n getRuntimeContextAttributes,\n normalizeSupplementalAttributes,\n selectSupplementalAttributes,\n type EnrichSpan,\n type OpenTelemetryOptions,\n type OpenTelemetrySpanType,\n type SupplementalAttributeOptions,\n} from './supplemental-attributes';\n\nexport type {\n EnrichSpan,\n OpenTelemetryOptions,\n OpenTelemetrySpanType,\n} from './supplemental-attributes';\n\ninterface OtelStepStartEvent extends GenerateTextStepStartEvent<ToolSet> {\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetryOptions | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n inferenceSpan: Span | undefined;\n inferenceContext: OpenTelemetryContext | undefined;\n inferenceToolDefinitions?: ReadonlyArray<Record<string, unknown>>;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n evaluationSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n settings: Record<string, unknown>;\n provider: string;\n modelId: string;\n runtimeContext: Record<string, unknown> | undefined;\n baseSupplementalAttributes: Attributes;\n objectSystemInstructions?: GenerateObjectStartEvent['system'];\n}\n\nfunction msToSeconds(durationMs: number | undefined): number | undefined {\n return durationMs == null ? undefined : durationMs / 1000;\n}\n\nfunction getGenAIClientPerformanceAttributes(\n performance: LanguageModelCallEndEvent<ToolSet>['performance'],\n): Attributes {\n return {\n 'gen_ai.client.operation.duration': msToSeconds(performance.responseTimeMs),\n 'gen_ai.client.operation.time_to_first_chunk': msToSeconds(\n performance.timeToFirstOutputMs,\n ),\n 'gen_ai.client.operation.time_per_output_chunk': msToSeconds(\n performance.timeBetweenOutputChunksMs?.avg,\n ),\n };\n}\n\nexport class OpenTelemetry implements Telemetry {\n private readonly callStates = new Map<string, CallState>();\n\n private readonly tracer: Tracer;\n private readonly supplementalAttributes: SupplementalAttributeOptions;\n private readonly enrichSpan: EnrichSpan | undefined;\n\n constructor(options: OpenTelemetryOptions = {}) {\n this.tracer = options.tracer ?? trace.getTracer('gen_ai');\n this.supplementalAttributes = normalizeSupplementalAttributes(options);\n this.enrichSpan = options.enrichSpan;\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n private getSpanAttributes({\n attributes,\n spanType,\n operationId,\n callId,\n runtimeContext,\n }: {\n attributes: Attributes;\n spanType: OpenTelemetrySpanType;\n operationId: string;\n callId: string;\n runtimeContext: Record<string, unknown> | undefined;\n }): Attributes {\n let customAttributes: Attributes | undefined;\n\n try {\n customAttributes = this.enrichSpan?.({\n spanType,\n operationId,\n callId,\n runtimeContext,\n });\n } catch {\n customAttributes = undefined;\n }\n\n return {\n ...sanitizeAttributes(customAttributes),\n ...attributes,\n };\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n /**\n * Runs the provider `doGenerate`/`doStream` call with the active model-call\n * context.\n */\n executeLanguageModelCall<T>({\n callId,\n execute,\n }: {\n callId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const state = this.getCallState(callId);\n const modelCallContext = state?.inferenceContext ?? state?.stepContext;\n\n if (modelCallContext == null) {\n return execute();\n }\n\n return context.with(modelCallContext, execute);\n }\n\n onStart(\n event:\n | InferTelemetryEvent<GenerateTextStartEvent>\n | InferTelemetryEvent<GenerateObjectStartEvent>\n | InferTelemetryEvent<EmbedStartEvent>\n | InferTelemetryEvent<RerankStartEvent>\n | InferTelemetryEvent<GenerateSpeechStartEvent>\n | InferTelemetryEvent<TranscriptionStartEvent>,\n ): void {\n if (event.operationId === 'ai.generateSpeech') {\n this.onAudioOperationStart(\n event as InferTelemetryEvent<GenerateSpeechStartEvent>,\n );\n return;\n }\n\n if (event.operationId === 'ai.transcribe') {\n this.onAudioOperationStart(\n event as InferTelemetryEvent<TranscriptionStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as InferTelemetryEvent<EmbedStartEvent>);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(\n event as InferTelemetryEvent<RerankStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(\n event as InferTelemetryEvent<GenerateObjectStartEvent>,\n );\n return;\n }\n\n this.onGenerateStart(event as InferTelemetryEvent<GenerateTextStartEvent>);\n }\n\n experimental_onStreamTranscriptionStart(\n event: InferTelemetryEvent<StreamTranscriptionStartEvent>,\n ): void {\n this.onAudioOperationStart(event);\n }\n\n private onAudioOperationStart(\n event: InferTelemetryEvent<\n | GenerateSpeechStartEvent\n | TranscriptionStartEvent\n | StreamTranscriptionStartEvent\n >,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const audio = 'audio' in event ? event.audio : undefined;\n const text = 'text' in event ? event.text : undefined;\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.output.type':\n event.operationId === 'ai.generateSpeech' ? 'speech' : 'text',\n 'gen_ai.request.stream': event.operationId === 'ai.streamTranscribe',\n 'gen_ai.input.messages':\n text == null\n ? undefined\n : {\n input: () =>\n JSON.stringify([\n {\n role: 'user',\n parts: [{ type: 'text', content: text }],\n },\n ]),\n },\n 'ai.request.text': text == null ? undefined : { input: () => text },\n 'ai.request.audio.size':\n audio?.byteLength == null\n ? undefined\n : { input: () => audio.byteLength },\n 'ai.request.audio.media_type':\n audio == null ? undefined : { input: () => audio.mediaType },\n ...baseSupplementalAttributes,\n });\n\n const rootSpan = this.tracer.startSpan(\n `${operationName} ${event.modelId}`,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.CLIENT,\n },\n );\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n settings: {},\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n });\n }\n\n private onGenerateStart(\n event: InferTelemetryEvent<GenerateTextStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const runtimeContext = event.runtimeContext as\n | Record<string, unknown>\n | undefined;\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.stop_sequences': event.stopSequences,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions':\n event.instructions != null\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.instructions!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: undefined,\n messages: event.messages,\n }),\n ),\n },\n ...baseSupplementalAttributes,\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n private onObjectOperationStart(\n event: InferTelemetryEvent<GenerateObjectStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions': event.system\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.system!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: event.prompt,\n messages: event.messages,\n }),\n ),\n },\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n schema: {\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n },\n }),\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n objectSystemInstructions: event.system,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: GenerateObjectStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n const systemInstructionCount =\n state.objectSystemInstructions == null\n ? 0\n : formatSystemInstructions(state.objectSystemInstructions).length;\n const inputMessages = event.promptMessages?.slice(systemInstructionCount);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.system_instructions':\n state.objectSystemInstructions != null\n ? {\n input: () =>\n JSON.stringify(\n formatSystemInstructions(state.objectSystemInstructions!),\n ),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n inputMessages\n ? JSON.stringify(formatInputMessages(inputMessages))\n : undefined,\n },\n ...state.baseSupplementalAttributes,\n });\n\n const spanName = `chat ${event.modelId}`;\n state.inferenceSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'languageModel',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n state.inferenceContext = trace.setSpan(\n state.rootContext,\n state.inferenceSpan,\n );\n }\n\n /** @deprecated */\n onObjectStepEnd(event: GenerateObjectStepEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.inferenceSpan) return;\n\n const { telemetry } = state;\n\n state.inferenceSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.output.messages': {\n output: () => {\n try {\n return JSON.stringify(\n formatObjectOutputMessages({\n objectText: event.objectText,\n finishReason: event.finishReason,\n }),\n );\n } catch {\n return event.objectText;\n }\n },\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n private onEmbedOperationStart(\n event: InferTelemetryEvent<EmbedStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const runtimeContext = event.runtimeContext;\n const providerName = mapProviderName(event.provider);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n const value = event.value;\n const isMany = event.operationId === 'ai.embedMany';\n const operationName = mapOperationName(event.operationId);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n embedding: isMany\n ? {\n 'ai.values': {\n input: () => (value as string[]).map(v => JSON.stringify(v)),\n },\n }\n : {\n 'ai.value': {\n input: () => JSON.stringify(value),\n },\n },\n }),\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n onStepStart(event: OtelStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n state.runtimeContext = event.runtimeContext as\n | Record<string, unknown>\n | undefined;\n const stepAttributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'agent_step',\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n toolChoice: {\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n },\n }),\n });\n\n state.stepSpan = this.tracer.startSpan(\n `step ${event.steps.length + 1}`,\n {\n attributes: this.getSpanAttributes({\n attributes: stepAttributes,\n spanType: 'step',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onLanguageModelCallStart(event: LanguageModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n state.inferenceToolDefinitions = event.tools;\n\n const inferenceAttributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.system_instructions':\n event.instructions != null\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.instructions!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () => {\n const formattedMessages = formatModelMessages({\n prompt: undefined,\n messages: event.messages,\n });\n\n return formattedMessages.length > 0\n ? JSON.stringify(formattedMessages)\n : undefined;\n },\n },\n 'gen_ai.tool.definitions': {\n input: () => (event.tools ? JSON.stringify(event.tools) : undefined),\n },\n });\n\n state.inferenceSpan = this.tracer.startSpan(\n `chat ${event.modelId}`,\n {\n attributes: this.getSpanAttributes({\n attributes: inferenceAttributes,\n spanType: 'languageModel',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.stepContext,\n );\n state.inferenceContext = trace.setSpan(\n state.stepContext,\n state.inferenceSpan,\n );\n }\n\n onLanguageModelCallEnd(event: LanguageModelCallEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.inferenceSpan) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n const toolDefinitions = [...(state.inferenceToolDefinitions ?? [])];\n const definedToolNames = new Set(\n toolDefinitions.flatMap(tool =>\n typeof tool.name === 'string' ? [tool.name] : [],\n ),\n );\n let hasObservedProviderTools = false;\n\n for (const part of event.content) {\n if (\n part.type !== 'tool-call' ||\n !part.providerExecuted ||\n definedToolNames.has(part.toolName)\n ) {\n continue;\n }\n\n toolDefinitions.push({\n type: 'extension',\n name: part.toolName,\n });\n definedToolNames.add(part.toolName);\n hasObservedProviderTools = true;\n }\n\n state.inferenceSpan.setAttributes(\n selectAttributes(telemetry, {\n ...getGenAIClientPerformanceAttributes(event.performance),\n 'gen_ai.provider.name': providerName,\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.responseId,\n 'gen_ai.response.model': event.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text:\n event.content\n .filter(p => p.type === 'text')\n .map(p => p.text)\n .join('') || undefined,\n reasoning: event.content.filter(p => p.type === 'reasoning'),\n toolCalls: event.content.filter(p => p.type === 'tool-call'),\n toolResults: event.content.filter(\n p => p.type === 'tool-result',\n ),\n files: event.content\n .filter(p => p.type === 'file')\n .map(p => p.file),\n finishReason: event.finishReason,\n }),\n ),\n },\n 'gen_ai.tool.definitions': hasObservedProviderTools\n ? {\n input: () => JSON.stringify(toolDefinitions),\n }\n : undefined,\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n const finalToolOutputs = new Map<\n string,\n Extract<\n (typeof event.content)[number],\n { type: 'tool-result' | 'tool-error' }\n >\n >();\n for (const part of event.content) {\n if (\n part.type === 'tool-error' ||\n (part.type === 'tool-result' && part.preliminary !== true)\n ) {\n finalToolOutputs.set(part.toolCallId, part);\n }\n }\n\n const recordedToolCallIds = new Set<string>();\n for (const part of event.content) {\n if (\n part.type !== 'tool-call' ||\n !part.providerExecuted ||\n recordedToolCallIds.has(part.toolCallId)\n ) {\n continue;\n }\n recordedToolCallIds.add(part.toolCallId);\n\n const toolSpan = this.tracer.startSpan(\n `execute_tool ${part.toolName}`,\n {\n attributes: this.getSpanAttributes({\n attributes: selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'execute_tool',\n 'gen_ai.tool.name': part.toolName,\n 'gen_ai.tool.call.id': part.toolCallId,\n 'gen_ai.tool.type': 'extension',\n 'gen_ai.tool.call.arguments': {\n input: () => JSON.stringify(part.input),\n },\n }),\n spanType: 'tool',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n state.inferenceContext,\n );\n\n const toolOutput = finalToolOutputs.get(part.toolCallId);\n if (toolOutput?.type === 'tool-result') {\n try {\n toolSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.tool.call.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else if (toolOutput?.type === 'tool-error') {\n recordErrorOnSpan(toolSpan, toolOutput.error);\n }\n\n toolSpan.end();\n }\n\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n state.inferenceToolDefinitions = undefined;\n }\n\n onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n const parentContext = state?.stepContext ?? state?.rootContext;\n if (!state || !parentContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'execute_tool',\n 'gen_ai.tool.name': toolCall.toolName,\n 'gen_ai.tool.call.id': toolCall.toolCallId,\n 'gen_ai.tool.type': toolCall.providerExecuted ? 'extension' : 'function',\n 'gen_ai.tool.call.arguments': {\n input: () => JSON.stringify(toolCall.input),\n },\n });\n\n const spanName = `execute_tool ${toolCall.toolName}`;\n const toolSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'tool',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n parentContext,\n );\n const toolContext = trace.setSpan(parentContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n const { toolOutput } = event;\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.execute_tool.duration': msToSeconds(event.toolExecutionMs),\n }),\n );\n\n if (toolOutput.type === 'tool-result') {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.tool.call.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordErrorOnSpan(span, toolOutput.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepEnd(event: GenerateTextStepEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n /** @deprecated Use `onStepEnd` instead. */\n onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void {\n this.onStepEnd(event);\n }\n\n onEnd(\n event:\n | GenerateTextEndEvent<ToolSet>\n | GenerateObjectEndEvent<unknown>\n | EmbedEndEvent\n | RerankEndEvent\n | GenerateSpeechEndEvent\n | TranscriptionEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationEnd(event as EmbedEndEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationEnd(event as RerankEndEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateSpeech' ||\n state.operationId === 'ai.transcribe'\n ) {\n this.onAudioOperationEnd(\n event as GenerateSpeechEndEvent | TranscriptionEndEvent,\n );\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationEnd(event as GenerateObjectEndEvent<unknown>);\n return;\n }\n\n this.onGenerateEnd(event as GenerateTextEndEvent<ToolSet>);\n }\n\n experimental_onStreamTranscriptionEnd(\n event: InferTelemetryEvent<StreamTranscriptionEndEvent>,\n ): void {\n this.onAudioOperationEnd(event);\n }\n\n private onAudioOperationEnd(\n event:\n | GenerateSpeechEndEvent\n | TranscriptionEndEvent\n | StreamTranscriptionEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const outputAudio =\n event.operationId === 'ai.generateSpeech' ? event.audio : undefined;\n const inputAudio =\n event.operationId === 'ai.generateSpeech' ? undefined : event.audio;\n const transcript = 'segments' in event ? event.text : undefined;\n\n state.rootSpan.setAttributes(\n selectAttributes(state.telemetry, {\n 'ai.request.audio.size':\n inputAudio == null\n ? undefined\n : { input: () => inputAudio.byteLength },\n 'ai.request.audio.media_type':\n inputAudio == null\n ? undefined\n : { input: () => inputAudio.mediaType },\n 'ai.response.text':\n transcript == null ? undefined : { output: () => transcript },\n 'gen_ai.output.messages':\n transcript == null\n ? undefined\n : {\n output: () =>\n JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: transcript }],\n },\n ]),\n },\n 'ai.response.audio.size':\n outputAudio == null\n ? undefined\n : { output: () => outputAudio.byteLength },\n 'ai.response.audio.media_type':\n outputAudio == null\n ? undefined\n : { output: () => outputAudio.mediaType },\n 'ai.response.audio.format':\n outputAudio == null || !('format' in outputAudio)\n ? undefined\n : { output: () => String(outputAudio.format) },\n ...getProviderUsageAttributes({\n usage: event.usage,\n prefix: 'gen_ai.usage',\n }),\n ...selectSupplementalAttributes(\n state.telemetry,\n this.supplementalAttributes,\n {\n usage: {\n 'ai.response.usage':\n event.usage == null ? undefined : JSON.stringify(event.usage),\n },\n providerMetadata: {\n 'ai.response.providerMetadata':\n event.providerMetadata == null\n ? undefined\n : JSON.stringify(event.providerMetadata),\n },\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onGenerateEnd(event: GenerateTextEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text: event.text ?? undefined,\n reasoning: event.finalStep.reasoning as ReadonlyArray<{\n text?: string;\n }>,\n toolCalls: event.toolCalls,\n toolResults: event.toolResults,\n files: event.files,\n finishReason: event.finishReason,\n }),\n ),\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.finalStep.providerMetadata\n ? JSON.stringify(event.finalStep.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationEnd(event: GenerateObjectEndEvent<unknown>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.output.messages': {\n output: () =>\n event.object != null\n ? JSON.stringify(\n formatObjectOutputMessages({\n objectText: JSON.stringify(event.object),\n finishReason: event.finishReason,\n }),\n )\n : undefined,\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationEnd(event: EmbedEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n embedding: isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e =>\n JSON.stringify(e),\n ),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n },\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbeddingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'embeddings',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n embedding: {\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n },\n }),\n });\n\n const spanName = `embeddings ${state.modelId}`;\n const embedSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'embedding',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedEnd(event: EmbeddingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.usage.input_tokens': event.usage.tokens,\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n embedding: {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n },\n },\n ),\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(\n event: InferTelemetryEvent<RerankStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const runtimeContext = event.runtimeContext;\n const providerName = mapProviderName(event.provider);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n },\n }),\n });\n\n const spanName = `rerank ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n private onRerankOperationEnd(event: RerankEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n },\n }),\n });\n\n const spanName = `rerank ${state.modelId}`;\n const rerankSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'reranking',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankEnd(event: RerankingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n private onEvaluateOperationStart(\n event: InferTelemetryEvent<EvaluateStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n const runtimeContext = event.runtimeContext;\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'evaluate',\n 'gen_ai.provider.name': mapProviderName(event.provider),\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n experimental_evaluation: {\n 'ai.evaluation.state': {\n input: () => JSON.stringify(event.state),\n },\n 'ai.evaluation.questions': {\n input: () => JSON.stringify(event.questions),\n },\n },\n }),\n });\n const rootSpan = this.tracer.startSpan(`evaluate ${event.modelId}`, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n private onEvaluateOperationEnd(event: EvaluateEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.setAttributes(\n selectSupplementalAttributes(\n state.telemetry,\n this.supplementalAttributes,\n {\n experimental_evaluation: {\n 'ai.evaluation.answers': {\n output: () => JSON.stringify(event.answers),\n },\n },\n },\n ),\n );\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n experimental_onEvaluateStart(\n event: InferTelemetryEvent<EvaluateStartEvent>,\n ): void {\n this.onEvaluateOperationStart(event);\n }\n\n experimental_onEvaluateEnd(event: EvaluateEndEvent): void {\n this.onEvaluateOperationEnd(event);\n }\n\n experimental_onEvaluationModelCallStart(\n event: EvaluationModelCallStartEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const attributes = selectAttributes(state.telemetry, {\n 'gen_ai.operation.name': 'evaluate',\n 'gen_ai.provider.name': mapProviderName(state.provider),\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(\n state.telemetry,\n this.supplementalAttributes,\n {\n experimental_evaluation: {\n 'ai.evaluation.state': {\n input: () => JSON.stringify(event.state),\n },\n 'ai.evaluation.questions': {\n input: () => JSON.stringify(event.questions),\n },\n },\n },\n ),\n });\n const span = this.tracer.startSpan(\n `evaluate ${state.modelId}`,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'experimental_evaluation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n\n state.evaluationSpan = {\n span,\n context: trace.setSpan(state.rootContext, span),\n };\n }\n\n experimental_onEvaluationModelCallEnd(\n event: EvaluationModelCallEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.evaluationSpan) return;\n\n state.evaluationSpan.span.setAttributes(\n selectAttributes(state.telemetry, {\n 'gen_ai.usage.input_tokens': event.usage?.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage?.outputTokens,\n ...selectSupplementalAttributes(\n state.telemetry,\n this.supplementalAttributes,\n {\n experimental_evaluation: {\n 'ai.evaluation.answers': {\n output: () => JSON.stringify(event.answers),\n },\n },\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n },\n ),\n }),\n );\n state.evaluationSpan.span.end();\n state.evaluationSpan = undefined;\n }\n\n onAbort(event: GenerateTextAbortEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n for (const { span: toolSpan } of state.toolSpans.values()) {\n toolSpan.end();\n }\n state.toolSpans.clear();\n\n if (state.inferenceSpan) {\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n if (state.stepSpan) {\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n if (state.evaluationSpan) {\n state.evaluationSpan.span.end();\n state.evaluationSpan = undefined;\n }\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n for (const { span: toolSpan } of state.toolSpans.values()) {\n recordErrorOnSpan(toolSpan, actualError);\n toolSpan.end();\n }\n state.toolSpans.clear();\n\n if (state.inferenceSpan) {\n recordErrorOnSpan(state.inferenceSpan, actualError);\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n if (state.stepSpan) {\n recordErrorOnSpan(state.stepSpan, actualError);\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordErrorOnSpan(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordErrorOnSpan(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n if (state.evaluationSpan) {\n recordErrorOnSpan(state.evaluationSpan.span, actualError);\n state.evaluationSpan.span.end();\n state.evaluationSpan = undefined;\n }\n\n recordErrorOnSpan(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type { TelemetryOptions } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetryOptions;\n}) {\n return {\n // standardized operation and resource name:\n 'operation.name': `${operationId}${\n telemetry?.functionId != null ? ` ${telemetry.functionId}` : ''\n }`,\n 'resource.name': telemetry?.functionId,\n\n // detailed, AI SDK specific data:\n 'ai.operationId': operationId,\n 'ai.telemetry.functionId': telemetry?.functionId,\n };\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { LanguageModelCallOptions } from 'ai';\nimport { getRuntimeContextAttributes } from './supplemental-attributes';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n headers,\n context,\n}: {\n model: { modelId: string; provider: string };\n settings: LanguageModelCallOptions;\n headers: Record<string, string | undefined> | undefined;\n context: Record<string, unknown> | undefined;\n}): Attributes {\n return {\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n attributes[`ai.settings.${key}`] = value as AttributeValue;\n return attributes;\n }, {} as Attributes),\n\n // add context as attributes:\n ...(getRuntimeContextAttributes(context) as Attributes),\n\n // request headers\n ...Object.entries(headers ?? {}).reduce((attributes, [key, value]) => {\n if (value !== undefined) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {} as Attributes),\n };\n}\n","import type {\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport { convertDataContentToBase64String } from 'ai';\n\n/**\n * Helper utility to serialize prompt content for OpenTelemetry tracing.\n * It is initially created because normalized LanguageModelV4Prompt carries\n * images as Uint8Arrays, on which JSON.stringify acts weirdly, converting\n * them to objects with stringified indices as keys, e.g. {\"0\": 42, \"1\": 69 }.\n */\nexport function stringifyForTelemetry(prompt: LanguageModelV4Prompt): string {\n return JSON.stringify(\n prompt.map((message: LanguageModelV4Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data: serializeFileData(part.data),\n }\n : part,\n ),\n })),\n );\n}\n\nfunction serializeFileData(\n data:\n | { type: 'data'; data: string | Uint8Array }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string },\n): unknown {\n switch (data.type) {\n case 'data':\n return data.data instanceof Uint8Array\n ? convertDataContentToBase64String(data.data)\n : data.data;\n case 'url':\n return data.url.toString();\n case 'reference':\n return data.reference;\n case 'text':\n return data.text;\n }\n}\n","import type { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport type { Context as AISDKContext } from '@ai-sdk/provider-utils';\nimport {\n context,\n SpanStatusCode,\n trace,\n type Attributes,\n type AttributeValue,\n type Context as OpenTelemetryContext,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbeddingModelCallEndEvent,\n EmbedEndEvent,\n EmbedStartEvent,\n EmbeddingModelCallStartEvent,\n GenerateObjectEndEvent,\n GenerateObjectStartEvent,\n GenerateObjectStepEndEvent,\n GenerateObjectStepStartEvent,\n GenerateTextAbortEvent,\n GenerateTextEndEvent,\n GenerateTextStartEvent,\n GenerateTextStepEndEvent,\n GenerateTextStepStartEvent,\n GenerateSpeechEndEvent,\n GenerateSpeechStartEvent,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n Experimental_EvaluateEndEvent as EvaluateEndEvent,\n Experimental_EvaluateStartEvent as EvaluateStartEvent,\n Experimental_EvaluationModelCallEndEvent as EvaluationModelCallEndEvent,\n Experimental_EvaluationModelCallStartEvent as EvaluationModelCallStartEvent,\n Output,\n RerankingModelCallEndEvent,\n RerankEndEvent,\n RerankStartEvent,\n RerankingModelCallStartEvent,\n TranscriptionEndEvent,\n TranscriptionStartEvent,\n Experimental_StreamTranscriptionEndEvent as StreamTranscriptionEndEvent,\n Experimental_StreamTranscriptionStartEvent as StreamTranscriptionStartEvent,\n InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\nimport { getProviderUsageAttributes } from './provider-usage-attributes';\nimport { sanitizeAttributeValue } from './sanitize-attribute-value';\nimport { stringifyForTelemetry } from './stringify-for-telemetry';\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction shouldRecord(\n telemetry: TelemetryOptions | undefined,\n): telemetry is TelemetryOptions {\n return telemetry?.isEnabled !== false;\n}\n\nfunction selectAttributes(\n telemetry: TelemetryOptions | undefined,\n attributes: Record<\n string,\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined\n >,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) {\n const sanitized = sanitizeAttributeValue(resolved);\n if (sanitized != null) result[key] = sanitized;\n }\n continue;\n }\n\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n if (telemetry?.recordOutputs === false) continue;\n const resolved = value.output();\n if (resolved != null) {\n const sanitized = sanitizeAttributeValue(resolved);\n if (sanitized != null) result[key] = sanitized;\n }\n continue;\n }\n\n const sanitized = sanitizeAttributeValue(value as AttributeValue);\n if (sanitized != null) result[key] = sanitized;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n RUNTIME_CONTEXT extends AISDKContext = AISDKContext,\n OUTPUT extends Output.Output = Output.Output,\n> extends GenerateTextStepStartEvent<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n readonly promptMessages?: LanguageModelV4Prompt;\n readonly stepTools?: ReadonlyArray<Record<string, unknown>>;\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetryOptions | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n evaluationSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class LegacyOpenTelemetry implements Telemetry {\n private readonly callStates = new Map<string, CallState>();\n\n /**\n * The tracer to use for the telemetry data.\n */\n private readonly tracer: Tracer;\n\n constructor(\n options: {\n tracer?: Tracer;\n } = {},\n ) {\n this.tracer = options.tracer ?? trace.getTracer('ai');\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n /**\n * Runs the provider `doGenerate`/`doStream` call with the active legacy\n * model-call context.\n */\n executeLanguageModelCall<T>({\n callId,\n execute,\n }: {\n callId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const stepContext = this.getCallState(callId)?.stepContext;\n\n if (stepContext == null) {\n return execute();\n }\n\n return context.with(stepContext, execute);\n }\n\n onStart(\n event:\n | InferTelemetryEvent<GenerateTextStartEvent>\n | InferTelemetryEvent<GenerateObjectStartEvent>\n | InferTelemetryEvent<EmbedStartEvent>\n | InferTelemetryEvent<RerankStartEvent>\n | InferTelemetryEvent<GenerateSpeechStartEvent>\n | InferTelemetryEvent<TranscriptionStartEvent>,\n ): void {\n if (event.operationId === 'ai.generateSpeech') {\n this.onAudioOperationStart(\n event as InferTelemetryEvent<GenerateSpeechStartEvent>,\n );\n return;\n }\n\n if (event.operationId === 'ai.transcribe') {\n this.onAudioOperationStart(\n event as InferTelemetryEvent<TranscriptionStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as InferTelemetryEvent<EmbedStartEvent>);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(\n event as InferTelemetryEvent<RerankStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(\n event as InferTelemetryEvent<GenerateObjectStartEvent>,\n );\n return;\n }\n\n this.onGenerateStart(event as InferTelemetryEvent<GenerateTextStartEvent>);\n }\n\n experimental_onStreamTranscriptionStart(\n event: InferTelemetryEvent<StreamTranscriptionStartEvent>,\n ): void {\n this.onAudioOperationStart(event);\n }\n\n private onAudioOperationStart(\n event: InferTelemetryEvent<\n | GenerateSpeechStartEvent\n | TranscriptionStartEvent\n | StreamTranscriptionStartEvent\n >,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n const audio = 'audio' in event ? event.audio : undefined;\n const text = 'text' in event ? event.text : undefined;\n const baseTelemetryAttributes: Attributes = {\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n ...Object.fromEntries(\n Object.entries(event.headers ?? {}).map(([key, value]) => [\n `ai.request.headers.${key}`,\n value,\n ]),\n ),\n };\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.request.text': text == null ? undefined : { input: () => text },\n 'ai.request.audio.size':\n audio?.byteLength == null\n ? undefined\n : { input: () => audio.byteLength },\n 'ai.request.audio.mediaType':\n audio == null ? undefined : { input: () => audio.mediaType },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings: {},\n });\n }\n\n private onGenerateStart(\n event: InferTelemetryEvent<GenerateTextStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext as Record<string, unknown> | undefined,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.instructions,\n messages: event.messages,\n }),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(\n event: InferTelemetryEvent<GenerateObjectStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: undefined,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.system,\n prompt: event.prompt,\n messages: event.messages,\n }),\n },\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: GenerateObjectStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamObject'\n ? 'ai.streamObject.doStream'\n : 'ai.generateObject.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n /** @deprecated */\n onObjectStepEnd(event: GenerateObjectStepEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () => {\n try {\n return JSON.stringify(JSON.parse(event.objectText));\n } catch {\n return event.objectText;\n }\n },\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n if (event.msToFirstChunk != null) {\n state.stepSpan.addEvent('ai.stream.firstChunk', {\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n state.stepSpan.setAttributes({\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n }\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n private onEmbedOperationStart(\n event: InferTelemetryEvent<EmbedStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext,\n });\n\n const value = event.value;\n const isMany = event.operationId === 'ai.embedMany';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n ...(isMany\n ? {\n 'ai.values': {\n input: () => (value as string[]).map(v => JSON.stringify(v)),\n },\n }\n : {\n 'ai.value': {\n input: () => JSON.stringify(value),\n },\n }),\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n onStepStart(event: OtelStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamText'\n ? 'ai.streamText.doStream'\n : 'ai.generateText.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n 'ai.prompt.tools': {\n input: () => event.stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n ...Object.fromEntries(\n Object.entries(state.baseTelemetryAttributes).filter(([key]) =>\n key.startsWith('ai.settings.context.'),\n ),\n ),\n 'ai.toolCall.name': toolCall.toolName,\n 'ai.toolCall.id': toolCall.toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(toolCall.input),\n },\n });\n\n const toolSpan = this.tracer.startSpan(\n 'ai.toolCall',\n { attributes },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n const { toolOutput } = event;\n if (toolOutput.type === 'tool-result') {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, toolOutput.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepEnd(event: GenerateTextStepEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n const isStreamText = state.operationId === 'ai.streamText';\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.reasoning.length > 0\n ? event.reasoning\n .filter(part => 'text' in part)\n .map(part => part.text)\n .join('\\n')\n : undefined,\n },\n 'ai.response.toolCalls': {\n output: () =>\n event.toolCalls.length > 0\n ? JSON.stringify(\n event.toolCalls.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n })),\n )\n : undefined,\n },\n 'ai.response.files': {\n output: () =>\n event.files.length > 0\n ? JSON.stringify(\n event.files.map(file => ({\n type: 'file',\n mediaType: file.mediaType,\n data: file.base64,\n })),\n )\n : undefined,\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n 'ai.response.msToFirstChunk': isStreamText\n ? event.performance.timeToFirstOutputMs\n : undefined,\n 'ai.response.msToFinish': isStreamText\n ? event.performance.responseTimeMs\n : undefined,\n 'ai.response.avgOutputTokensPerSecond': isStreamText\n ? event.performance.effectiveOutputTokensPerSecond\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n if (isStreamText && event.performance.timeToFirstOutputMs != null) {\n state.stepSpan.addEvent('ai.stream.firstChunk', {\n 'ai.response.msToFirstChunk': event.performance.timeToFirstOutputMs,\n });\n }\n\n if (isStreamText) {\n state.stepSpan.addEvent('ai.stream.finish', {\n 'ai.response.msToFinish': event.performance.responseTimeMs,\n 'ai.response.avgOutputTokensPerSecond':\n event.performance.effectiveOutputTokensPerSecond,\n });\n }\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n /** @deprecated Use `onStepEnd` instead. */\n onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void {\n this.onStepEnd(event);\n }\n\n onEnd(\n event:\n | GenerateTextEndEvent<ToolSet>\n | GenerateObjectEndEvent<unknown>\n | EmbedEndEvent\n | RerankEndEvent\n | GenerateSpeechEndEvent\n | TranscriptionEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationEnd(event as EmbedEndEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationEnd(event as RerankEndEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateSpeech' ||\n state.operationId === 'ai.transcribe'\n ) {\n this.onAudioOperationEnd(\n event as GenerateSpeechEndEvent | TranscriptionEndEvent,\n );\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationEnd(event as GenerateObjectEndEvent<unknown>);\n return;\n }\n\n this.onGenerateEnd(event as GenerateTextEndEvent<ToolSet>);\n }\n\n experimental_onStreamTranscriptionEnd(\n event: InferTelemetryEvent<StreamTranscriptionEndEvent>,\n ): void {\n this.onAudioOperationEnd(event);\n }\n\n private onAudioOperationEnd(\n event:\n | GenerateSpeechEndEvent\n | TranscriptionEndEvent\n | StreamTranscriptionEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const isSpeech = event.operationId === 'ai.generateSpeech';\n const audio = event.audio;\n state.rootSpan.setAttributes(\n selectAttributes(state.telemetry, {\n 'ai.request.audio.size': isSpeech\n ? undefined\n : { input: () => audio.byteLength },\n 'ai.request.audio.mediaType': isSpeech\n ? undefined\n : { input: () => audio.mediaType },\n 'ai.response.text':\n 'segments' in event ? { output: () => event.text } : undefined,\n 'ai.response.audio.size': isSpeech\n ? { output: () => audio.byteLength }\n : undefined,\n 'ai.response.audio.mediaType': isSpeech\n ? { output: () => audio.mediaType }\n : undefined,\n 'ai.response.audio.format':\n isSpeech && 'format' in audio\n ? { output: () => audio.format }\n : undefined,\n ...getProviderUsageAttributes({\n usage: event.usage,\n prefix: 'ai.usage',\n }),\n 'ai.response.usage':\n event.usage == null ? undefined : JSON.stringify(event.usage),\n 'ai.response.providerMetadata':\n event.providerMetadata == null\n ? undefined\n : JSON.stringify(event.providerMetadata),\n }),\n );\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onGenerateEnd(event: GenerateTextEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.finalStep.reasoning.length > 0\n ? event.finalStep.reasoning\n .filter(part => 'text' in part)\n .map(part => part.text)\n .join('\\n')\n : undefined,\n },\n 'ai.response.toolCalls': {\n output: () =>\n event.toolCalls.length > 0\n ? JSON.stringify(\n event.toolCalls.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n })),\n )\n : undefined,\n },\n 'ai.response.files': {\n output: () =>\n event.files.length > 0\n ? JSON.stringify(\n event.files.map(file => ({\n type: 'file',\n mediaType: file.mediaType,\n data: file.base64,\n })),\n )\n : undefined,\n },\n 'ai.response.providerMetadata': event.finalStep.providerMetadata\n ? JSON.stringify(event.finalStep.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationEnd(event: GenerateObjectEndEvent<unknown>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () =>\n event.object != null ? JSON.stringify(event.object) : undefined,\n },\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationEnd(event: EmbedEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n ...(isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e => JSON.stringify(e)),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n }),\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbeddingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n });\n\n const embedSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedEnd(event: EmbeddingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(\n event: InferTelemetryEvent<RerankStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onRerankOperationEnd(event: RerankEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rerankSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankEnd(event: RerankingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n private onEvaluateOperationStart(\n event: InferTelemetryEvent<EvaluateStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext,\n });\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({ operationId: event.operationId, telemetry }),\n ...baseTelemetryAttributes,\n 'ai.evaluation.state': {\n input: () => JSON.stringify(event.state),\n },\n 'ai.evaluation.questions': {\n input: () => JSON.stringify(event.questions),\n },\n });\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n evaluationSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onEvaluateOperationEnd(event: EvaluateEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.setAttributes(\n selectAttributes(state.telemetry, {\n 'ai.evaluation.answers': {\n output: () => JSON.stringify(event.answers),\n },\n }),\n );\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n experimental_onEvaluateStart(\n event: InferTelemetryEvent<EvaluateStartEvent>,\n ): void {\n this.onEvaluateOperationStart(event);\n }\n\n experimental_onEvaluateEnd(event: EvaluateEndEvent): void {\n this.onEvaluateOperationEnd(event);\n }\n\n experimental_onEvaluationModelCallStart(\n event: EvaluationModelCallStartEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const attributes = selectAttributes(state.telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry: state.telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.evaluation.state': {\n input: () => JSON.stringify(event.state),\n },\n 'ai.evaluation.questions': {\n input: () => JSON.stringify(event.questions),\n },\n });\n const span = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n state.evaluationSpan = {\n span,\n context: trace.setSpan(state.rootContext, span),\n };\n }\n\n experimental_onEvaluationModelCallEnd(\n event: EvaluationModelCallEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.evaluationSpan) return;\n\n state.evaluationSpan.span.setAttributes(\n selectAttributes(state.telemetry, {\n 'ai.evaluation.answers': {\n output: () => JSON.stringify(event.answers),\n },\n 'ai.usage.inputTokens': event.usage?.inputTokens,\n 'ai.usage.outputTokens': event.usage?.outputTokens,\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n }),\n );\n state.evaluationSpan.span.end();\n state.evaluationSpan = undefined;\n }\n\n onAbort(event: GenerateTextAbortEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n for (const { span: toolSpan } of state.toolSpans.values()) {\n toolSpan.end();\n }\n state.toolSpans.clear();\n\n if (state.stepSpan) {\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n if (state.evaluationSpan) {\n state.evaluationSpan.span.end();\n state.evaluationSpan = undefined;\n }\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n if (state.stepSpan) {\n recordSpanError(state.stepSpan, actualError);\n state.stepSpan.end();\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordSpanError(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordSpanError(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n if (state.evaluationSpan) {\n recordSpanError(state.evaluationSpan.span, actualError);\n state.evaluationSpan.span.end();\n state.evaluationSpan = undefined;\n }\n\n recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_exhaustive","shouldRecord","selectAttributes","selectAttributes","selectAttributes"],"sources":["../src/gen-ai-format-messages.ts","../src/record-span.ts","../src/provider-usage-attributes.ts","../src/sanitize-attribute-value.ts","../src/select-attributes.ts","../src/supplemental-attributes.ts","../src/open-telemetry.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts","../src/legacy-open-telemetry.ts"],"sourcesContent":["import type {\n LanguageModelV4CustomPart,\n LanguageModelV4FilePart,\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n LanguageModelV4ReasoningFilePart,\n LanguageModelV4ReasoningPart,\n LanguageModelV4TextPart,\n LanguageModelV4ToolApprovalResponsePart,\n LanguageModelV4ToolCallPart,\n LanguageModelV4ToolResultPart,\n} from '@ai-sdk/provider';\nimport type { ModelMessage } from '@ai-sdk/provider-utils';\nimport { convertDataContentToBase64String } from 'ai';\n\ntype LanguageModelV4ContentPart =\n | LanguageModelV4TextPart\n | LanguageModelV4FilePart\n | LanguageModelV4CustomPart\n | LanguageModelV4ReasoningPart\n | LanguageModelV4ReasoningFilePart\n | LanguageModelV4ToolCallPart\n | LanguageModelV4ToolResultPart\n | LanguageModelV4ToolApprovalResponsePart;\n\ntype SemConvPart =\n | { type: 'text'; content: string }\n | { type: 'reasoning'; content: string }\n | {\n type: 'tool_call';\n id: string | null;\n name: string;\n arguments?: unknown;\n }\n | {\n type: 'tool_call_response';\n id: string | null;\n response: unknown;\n }\n | {\n type: 'blob';\n modality: string;\n mime_type: string | null;\n content: string;\n }\n | { type: string; [key: string]: unknown };\n\ninterface SemConvInputMessage {\n role: string;\n parts: SemConvPart[];\n}\n\ninterface SemConvOutputMessage {\n role: string;\n parts: SemConvPart[];\n finish_reason: string;\n}\n\ninterface SemConvSystemInstruction {\n type: string;\n content?: string;\n [key: string]: unknown;\n}\n\n/**\n * Maps an AI SDK provider string (e.g. \"anthropic.messages\", \"openai.chat\")\n * to a well-known gen_ai.provider.name value per the OTel GenAI SemConv.\n *\n * Provider strings come in formats like:\n * \"openai.chat\", \"google.generative-ai\", \"google.vertex.chat\",\n * \"google-vertex\", \"amazon-bedrock.chat\", \"azure.chat\"\n *\n * We match against longest-prefix-first to handle multi-segment prefixes\n * like \"google.vertex\" and \"google.generative-ai\" before the single-segment \"google\".\n */\nexport function mapProviderName(provider: string): string {\n const lower = provider.toLowerCase();\n\n const wellKnownPrefixes: Array<[string, string]> = [\n ['google.vertex', 'gcp.vertex_ai'],\n ['google.generative-ai', 'gcp.gemini'],\n ['google-vertex', 'gcp.vertex_ai'],\n ['amazon-bedrock', 'aws.bedrock'],\n ['azure-openai', 'azure.ai.openai'],\n ['anthropic', 'anthropic'],\n ['openai', 'openai'],\n ['azure', 'azure.ai.inference'],\n ['google', 'gcp.gemini'],\n ['mistral', 'mistral_ai'],\n ['cohere', 'cohere'],\n ['bedrock', 'aws.bedrock'],\n ['groq', 'groq'],\n ['deepseek', 'deepseek'],\n ['perplexity', 'perplexity'],\n ['xai', 'x_ai'],\n ];\n\n for (const [prefix, mapped] of wellKnownPrefixes) {\n if (\n lower === prefix ||\n lower.startsWith(prefix + '.') ||\n lower.startsWith(prefix + '-')\n ) {\n return mapped;\n }\n }\n\n return provider;\n}\n\n/**\n * Maps an AI SDK operationId to a gen_ai.operation.name value.\n */\nexport function mapOperationName(operationId: string): string {\n const mapping: Record<string, string> = {\n 'ai.generateText': 'invoke_agent',\n 'ai.streamText': 'invoke_agent',\n 'ai.generateObject': 'invoke_agent',\n 'ai.streamObject': 'invoke_agent',\n 'ai.embed': 'embeddings',\n 'ai.embedMany': 'embeddings',\n 'ai.rerank': 'rerank',\n 'ai.generateSpeech': 'ai.generateSpeech',\n 'ai.transcribe': 'ai.transcribe',\n 'ai.streamTranscribe': 'ai.streamTranscribe',\n };\n return mapping[operationId] ?? operationId;\n}\n\n/**\n * Converts a system value to the gen_ai.system_instructions SemConv format.\n * Accepts a plain string, a single SystemModelMessage, or an array of them.\n * Schema: array of parts, each with at least { type, content }.\n */\nexport function formatSystemInstructions(\n system:\n | string\n | { role: 'system'; content: string }\n | Array<{ role: 'system'; content: string }>,\n): SemConvSystemInstruction[] {\n if (typeof system === 'string') {\n return [{ type: 'text', content: system }];\n }\n if (Array.isArray(system)) {\n return system.map(msg => ({ type: 'text', content: msg.content }));\n }\n return [{ type: 'text', content: system.content }];\n}\n\nfunction convertMessagePartToSemConv(\n part: LanguageModelV4ContentPart,\n): SemConvPart {\n switch (part.type) {\n case 'text':\n return { type: 'text', content: part.text };\n\n case 'reasoning':\n return { type: 'reasoning', content: part.text };\n\n case 'tool-call':\n return {\n type: 'tool_call',\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response',\n id: part.toolCallId ?? null,\n response,\n };\n }\n\n case 'file': {\n const rawData = part.data as\n | string\n | Uint8Array\n | URL\n | ArrayBuffer\n | { type: 'data'; data: string | Uint8Array | ArrayBuffer }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n\n const data: string | Uint8Array | URL | ArrayBuffer = (() => {\n if (\n typeof rawData === 'object' &&\n rawData !== null &&\n !(rawData instanceof URL) &&\n !(rawData instanceof Uint8Array) &&\n !(rawData instanceof ArrayBuffer) &&\n 'type' in rawData\n ) {\n switch (rawData.type) {\n case 'data':\n return rawData.data;\n case 'url':\n return rawData.url;\n case 'text':\n return rawData.text;\n default:\n return '';\n }\n }\n return rawData as string | Uint8Array | URL | ArrayBuffer;\n })();\n\n let content: string;\n if (data instanceof Uint8Array) {\n content = convertDataContentToBase64String(data);\n } else if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n content = data;\n } else if (data instanceof URL) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n } else {\n content = String(data);\n }\n return {\n type: 'blob',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content,\n };\n }\n\n case 'tool-approval-response':\n return {\n type: 'tool_approval_response',\n approval_id: part.approvalId,\n approved: part.approved,\n reason: part.reason,\n };\n\n case 'custom':\n return { type: 'custom', kind: part.kind };\n\n case 'reasoning-file':\n return { type: String(part.type) };\n\n default: {\n const _exhaustive: never = part;\n return { type: String((_exhaustive as { type: string }).type) };\n }\n }\n}\n\nfunction getModality(mediaType: string | undefined): string {\n if (!mediaType) return 'image';\n if (mediaType.startsWith('image/')) return 'image';\n if (mediaType.startsWith('video/')) return 'video';\n if (mediaType.startsWith('audio/')) return 'audio';\n return 'image';\n}\n\n/**\n * Converts a LanguageModelV4Prompt to the gen_ai.input.messages SemConv format.\n * Messages are preserved in the order they were sent to the model.\n */\nexport function formatInputMessages(\n prompt: LanguageModelV4Prompt,\n): SemConvInputMessage[] {\n return prompt.map((message: LanguageModelV4Message) => {\n if (message.role === 'system') {\n return {\n role: 'system',\n parts: [{ type: 'text', content: message.content }],\n };\n }\n\n const parts = message.content.map(convertMessagePartToSemConv);\n return { role: message.role, parts };\n });\n}\n\n/**\n * Converts user-facing ModelMessage[] (and optional prompt string) to the\n * gen_ai.input.messages SemConv format while preserving message order.\n */\nexport function formatModelMessages({\n prompt,\n messages,\n}: {\n prompt: string | Array<ModelMessage> | undefined;\n messages: Array<ModelMessage> | undefined;\n}): SemConvInputMessage[] {\n const result: SemConvInputMessage[] = [];\n\n if (typeof prompt === 'string') {\n result.push({\n role: 'user',\n parts: [{ type: 'text', content: prompt }],\n });\n } else if (Array.isArray(prompt)) {\n for (const msg of prompt) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n if (messages) {\n for (const msg of messages) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n return result;\n}\n\nfunction convertModelMessageToSemConv(msg: ModelMessage): SemConvInputMessage {\n if (msg.role === 'system') {\n return {\n role: 'system',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n\n if (msg.role === 'user') {\n if (typeof msg.content === 'string') {\n return {\n role: 'user',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'image': {\n const data = part.image;\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n case 'file': {\n const rawData = part.data as\n | string\n | Uint8Array\n | URL\n | ArrayBuffer\n | { type: 'data'; data: string | Uint8Array | ArrayBuffer }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n\n const data: string | Uint8Array | URL | ArrayBuffer = (() => {\n if (\n typeof rawData === 'object' &&\n rawData !== null &&\n !(rawData instanceof URL) &&\n !(rawData instanceof Uint8Array) &&\n !(rawData instanceof ArrayBuffer) &&\n 'type' in rawData\n ) {\n switch (rawData.type) {\n case 'data':\n return rawData.data;\n case 'url':\n return rawData.url;\n case 'text':\n return rawData.text;\n default:\n return '';\n }\n }\n return rawData as string | Uint8Array | URL | ArrayBuffer;\n })();\n\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'user', parts };\n }\n\n if (msg.role === 'assistant') {\n if (typeof msg.content === 'string') {\n return {\n role: 'assistant',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'reasoning':\n return { type: 'reasoning' as const, content: part.text };\n case 'tool-call':\n return {\n type: 'tool_call' as const,\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'assistant', parts };\n }\n\n if (msg.role === 'tool') {\n const parts: SemConvPart[] = msg.content.map(part => {\n if (part.type === 'tool-result') {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n return { type: String((part as { type: string }).type) };\n });\n return { role: 'tool', parts };\n }\n\n const _exhaustive: never = msg;\n return _exhaustive;\n}\n\n/**\n * Extracts the system instruction from a LanguageModelV4Prompt if present.\n */\nexport function extractSystemFromPrompt(\n prompt: LanguageModelV4Prompt,\n): string | undefined {\n const systemMsg = prompt.find(msg => msg.role === 'system');\n if (systemMsg && systemMsg.role === 'system') {\n return systemMsg.content;\n }\n}\n\n/**\n * Converts step result data to the gen_ai.output.messages SemConv format.\n */\nexport function formatOutputMessages({\n text,\n reasoning,\n toolCalls,\n toolResults,\n files,\n finishReason,\n}: {\n text?: string;\n reasoning?: ReadonlyArray<{ text?: string }>;\n toolCalls?: ReadonlyArray<{\n toolCallId: string;\n toolName: string;\n input: unknown;\n }>;\n toolResults?: ReadonlyArray<{\n toolCallId: string;\n output: unknown;\n }>;\n files?: ReadonlyArray<{ mediaType: string; base64: string }>;\n finishReason: string;\n}): SemConvOutputMessage[] {\n const parts: SemConvPart[] = [];\n\n if (reasoning) {\n for (const r of reasoning) {\n if ('text' in r && r.text) {\n parts.push({ type: 'reasoning', content: r.text });\n }\n }\n }\n\n if (text != null && text.length > 0) {\n parts.push({ type: 'text', content: text });\n }\n\n if (toolCalls) {\n for (const tc of toolCalls) {\n parts.push({\n type: 'tool_call',\n id: tc.toolCallId,\n name: tc.toolName,\n arguments: tc.input,\n });\n }\n }\n\n if (toolResults) {\n for (const toolResult of toolResults) {\n parts.push({\n type: 'tool_call_response',\n id: toolResult.toolCallId,\n response: toolResult.output,\n });\n }\n }\n\n if (files) {\n for (const file of files) {\n parts.push({\n type: 'blob',\n modality: getModality(file.mediaType),\n mime_type: file.mediaType,\n content: file.base64,\n });\n }\n }\n\n return [\n {\n role: 'assistant',\n parts,\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\n/**\n * Converts generateObject result to the gen_ai.output.messages SemConv format.\n */\nexport function formatObjectOutputMessages({\n objectText,\n finishReason,\n}: {\n objectText: string;\n finishReason: string;\n}): SemConvOutputMessage[] {\n return [\n {\n role: 'assistant',\n parts: [{ type: 'text', content: objectText }],\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\nfunction mapFinishReason(reason: string): string {\n const mapping: Record<string, string> = {\n stop: 'stop',\n length: 'length',\n 'content-filter': 'content_filter',\n 'tool-calls': 'tool_call',\n error: 'error',\n other: 'stop',\n unknown: 'stop',\n };\n return mapping[reason] ?? reason;\n}\n","import { APICallError } from '@ai-sdk/provider';\nimport {\n SpanStatusCode,\n context,\n type Attributes,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport { RetryError } from 'ai';\n\nexport async function recordSpan<T>({\n name,\n tracer,\n attributes,\n fn,\n endWhenDone = true,\n}: {\n name: string;\n tracer: Tracer;\n attributes: Attributes | PromiseLike<Attributes>;\n fn: (span: Span) => Promise<T>;\n endWhenDone?: boolean;\n}) {\n return tracer.startActiveSpan(\n name,\n { attributes: await attributes },\n async span => {\n // Capture the current context to maintain it across async generator yields\n const ctx = context.active();\n\n try {\n // Execute within the captured context to ensure async generators\n // don't lose the active span when they yield\n const result = await context.with(ctx, () => fn(span));\n\n if (endWhenDone) {\n span.end();\n }\n\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n // always stop the span when there is an error:\n span.end();\n }\n\n throw error;\n }\n },\n );\n}\n\n/**\n * Record an error on a span. Sets the span status to error. If the error is\n * an instance of Error, an exception event with name, message, and stack\n * will also be recorded.\n *\n * @param span - The span to record the error on.\n * @param error - The error to record on the span.\n */\nexport function recordErrorOnSpan(span: Span, error: unknown) {\n const apiCallError = RetryError.isInstance(error) ? error.lastError : error;\n\n if (\n APICallError.isInstance(apiCallError) &&\n apiCallError.statusCode != null\n ) {\n span.setAttribute('http.response.status_code', apiCallError.statusCode);\n }\n\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n","import type { Attributes } from '@opentelemetry/api';\nimport type { JSONObject, JSONValue } from '@ai-sdk/provider';\n\nconst usageKeyAliases: Record<string, string> = {\n inputtokens: 'input_tokens',\n prompttokens: 'input_tokens',\n prompttokencount: 'input_tokens',\n totalinputtokens: 'input_tokens',\n outputtokens: 'output_tokens',\n completiontokens: 'output_tokens',\n completiontokencount: 'output_tokens',\n candidatestokencount: 'output_tokens',\n totaltokens: 'total_tokens',\n totaltokencount: 'total_tokens',\n};\n\nfunction normalizeUsageKey(key: string): string {\n const aliasKey = key.replace(/[^a-zA-Z0-9]/g, '').toLowerCase();\n const alias = usageKeyAliases[aliasKey];\n\n if (alias != null) {\n return alias;\n }\n\n return key\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .toLowerCase();\n}\n\n/**\n * Converts provider-native usage objects into numeric span attributes.\n *\n * Usage units such as tokens, characters, and seconds remain distinct so\n * observability backends can apply the provider/model-specific price unit.\n */\nexport function getProviderUsageAttributes({\n usage,\n prefix,\n}: {\n usage: JSONObject | undefined;\n prefix: string;\n}): Attributes {\n const attributes: Attributes = {};\n\n const addValue = (value: JSONValue | undefined, path: string[]) => {\n if (typeof value === 'number') {\n if (Number.isFinite(value) && path.length > 0) {\n attributes[`${prefix}.${path.join('.')}`] = value;\n }\n return;\n }\n\n if (value == null || typeof value !== 'object' || Array.isArray(value)) {\n return;\n }\n\n for (const [key, nestedValue] of Object.entries(value)) {\n const normalizedKey = normalizeUsageKey(key);\n if (normalizedKey !== '') {\n addValue(nestedValue, [...path, normalizedKey]);\n }\n }\n };\n\n addValue(usage, []);\n return attributes;\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\n\nfunction isPrimitiveAttributeValue(\n value: unknown,\n): value is string | number | boolean {\n return (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n );\n}\n\nexport function sanitizeAttributeValue(\n value: AttributeValue,\n): AttributeValue | undefined {\n if (!Array.isArray(value)) {\n if (typeof value === 'number' && !Number.isFinite(value)) {\n return undefined;\n }\n\n return value;\n }\n\n const primitiveTypes = new Set(\n value.filter(isPrimitiveAttributeValue).map(item => typeof item),\n );\n\n if (primitiveTypes.size !== 1) {\n return undefined;\n }\n\n const [primitiveType] = primitiveTypes;\n\n if (primitiveType === 'string') {\n return value.filter((item): item is string => typeof item === 'string');\n }\n\n if (primitiveType === 'number') {\n const numbers = value.filter(\n (item): item is number => typeof item === 'number',\n );\n\n return numbers.every(Number.isFinite) ? numbers : undefined;\n }\n\n return value.filter((item): item is boolean => typeof item === 'boolean');\n}\n\nexport function sanitizeAttributes(\n attributes: Attributes | undefined,\n): Attributes {\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes ?? {})) {\n if (value == null) continue;\n const sanitized = sanitizeAttributeValue(value);\n if (sanitized != null) result[key] = sanitized;\n }\n\n return result;\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { TelemetryOptions } from 'ai';\nimport { sanitizeAttributeValue } from './sanitize-attribute-value';\n\nexport type AttributeSpec =\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined;\n\nexport type AttributeSpecMap = Record<string, AttributeSpec>;\n\nfunction shouldRecord(\n telemetry: TelemetryOptions | undefined,\n): telemetry is TelemetryOptions {\n return telemetry?.isEnabled !== false;\n}\n\nexport function selectAttributes(\n telemetry: TelemetryOptions | undefined,\n attributes: AttributeSpecMap,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) {\n const sanitized = sanitizeAttributeValue(resolved);\n if (sanitized != null) result[key] = sanitized;\n }\n continue;\n }\n\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n if (telemetry?.recordOutputs === false) continue;\n const resolved = value.output();\n if (resolved != null) {\n const sanitized = sanitizeAttributeValue(resolved);\n if (sanitized != null) result[key] = sanitized;\n }\n continue;\n }\n\n const sanitized = sanitizeAttributeValue(value as AttributeValue);\n if (sanitized != null) result[key] = sanitized;\n }\n\n return result;\n}\n","import type { Attributes, Tracer } from '@opentelemetry/api';\nimport type { TelemetryOptions } from 'ai';\nimport {\n selectAttributes,\n type AttributeSpec,\n type AttributeSpecMap,\n} from './select-attributes';\n\ntype SupplementalAttributeOption =\n | 'usage'\n | 'providerMetadata'\n | 'embedding'\n | 'reranking'\n | 'experimental_decision'\n | 'runtimeContext'\n | 'headers'\n | 'toolChoice'\n | 'schema';\n\nexport type SupplementalAttributeOptions = Record<\n SupplementalAttributeOption,\n boolean\n>;\n\nexport type OpenTelemetrySpanType =\n | 'operation'\n | 'step'\n | 'languageModel'\n | 'tool'\n | 'embedding'\n | 'reranking'\n | 'experimental_decision';\n\nexport type EnrichSpan = (options: {\n spanType: OpenTelemetrySpanType;\n operationId: string;\n callId: string;\n runtimeContext: Record<string, unknown> | undefined;\n}) => Attributes | undefined;\n\nexport type OpenTelemetryOptions = {\n /**\n * The tracer to use for the telemetry data.\n */\n tracer?: Tracer;\n\n /**\n * Adds custom attributes to spans when they are created. These attributes are\n * not AI SDK-owned semantics and are intended for observability integrations.\n */\n enrichSpan?: EnrichSpan;\n\n /**\n * Emit AI SDK usage details that are not represented by GenAI SemConv.\n */\n usage?: boolean;\n\n /**\n * Emit provider metadata on response spans.\n */\n providerMetadata?: boolean;\n\n /**\n * Emit embedding input and output values.\n */\n embedding?: boolean;\n\n /**\n * Emit reranking input documents and output ranking.\n */\n reranking?: boolean;\n\n /**\n * Emit decision state, questions, and answers.\n */\n experimental_decision?: boolean;\n\n /** @deprecated Use `experimental_decision` instead. */\n experimental_evaluation?: boolean;\n\n /**\n * Emit runtime context values.\n */\n runtimeContext?: boolean;\n\n /**\n * Emit request headers.\n */\n headers?: boolean;\n\n /**\n * Emit selected tool choice information.\n */\n toolChoice?: boolean;\n\n /**\n * Emit object generation schema information.\n */\n schema?: boolean;\n};\n\nconst disabledSupplementalAttributes: SupplementalAttributeOptions = {\n usage: false,\n providerMetadata: false,\n embedding: false,\n reranking: false,\n experimental_decision: false,\n runtimeContext: false,\n headers: false,\n toolChoice: false,\n schema: false,\n};\n\nexport function normalizeSupplementalAttributes(\n options: OpenTelemetryOptions,\n): SupplementalAttributeOptions {\n return {\n ...disabledSupplementalAttributes,\n usage: options.usage ?? false,\n providerMetadata: options.providerMetadata ?? false,\n embedding: options.embedding ?? false,\n reranking: options.reranking ?? false,\n experimental_decision:\n options.experimental_decision ?? options.experimental_evaluation ?? false,\n runtimeContext: options.runtimeContext ?? false,\n headers: options.headers ?? false,\n toolChoice: options.toolChoice ?? false,\n schema: options.schema ?? false,\n };\n}\n\nexport function getRuntimeContextAttributes(\n context: Record<string, unknown> | undefined,\n): AttributeSpecMap {\n const attributes: AttributeSpecMap = {};\n\n for (const [key, value] of Object.entries(context ?? {})) {\n addRuntimeContextAttribute(attributes, `ai.settings.context.${key}`, value);\n }\n\n return attributes;\n}\n\n/**\n * Flattens nested runtime context objects into OTel-compatible attribute keys.\n * Arrays are preserved because OTel supports primitive array attribute values.\n */\nfunction addRuntimeContextAttribute(\n attributes: AttributeSpecMap,\n key: string,\n value: unknown,\n): void {\n if (value == null) {\n return;\n }\n\n if (Array.isArray(value) || typeof value !== 'object') {\n attributes[key] = value as AttributeSpec;\n return;\n }\n\n for (const [nestedKey, nestedValue] of Object.entries(value)) {\n addRuntimeContextAttribute(attributes, `${key}.${nestedKey}`, nestedValue);\n }\n}\n\nexport function getHeaderAttributes(\n headers: Record<string, string | undefined> | undefined,\n): AttributeSpecMap {\n return Object.fromEntries(\n Object.entries(headers ?? {})\n .filter(([, value]) => value != null)\n .map(([key, value]) => [`ai.request.headers.${key}`, value]),\n ) as AttributeSpecMap;\n}\n\nexport function getDetailedUsageAttributes(usage: {\n inputTokenDetails?: {\n noCacheTokens?: number | undefined;\n };\n outputTokenDetails?: {\n textTokens?: number | undefined;\n reasoningTokens?: number | undefined;\n };\n}): AttributeSpecMap {\n return {\n 'ai.usage.inputTokenDetails.noCacheTokens':\n usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n usage.outputTokenDetails?.reasoningTokens,\n };\n}\n\nexport function selectSupplementalAttributes(\n telemetry: TelemetryOptions | undefined,\n enabledAttributes: SupplementalAttributeOptions,\n attributes: Partial<Record<SupplementalAttributeOption, AttributeSpecMap>>,\n): Attributes {\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes) as Array<\n [SupplementalAttributeOption, AttributeSpecMap | undefined]\n >) {\n if (!enabledAttributes[key] || value == null) {\n continue;\n }\n\n Object.assign(result, selectAttributes(telemetry, value));\n }\n\n return result;\n}\n","import {\n context,\n SpanKind,\n SpanStatusCode,\n trace,\n type Attributes,\n type Context as OpenTelemetryContext,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbeddingModelCallEndEvent,\n EmbedEndEvent,\n EmbedStartEvent,\n LanguageModelCallEndEvent,\n LanguageModelCallStartEvent,\n EmbeddingModelCallStartEvent,\n GenerateObjectEndEvent,\n GenerateObjectStartEvent,\n GenerateObjectStepEndEvent,\n GenerateObjectStepStartEvent,\n GenerateTextAbortEvent,\n GenerateTextEndEvent,\n GenerateTextStartEvent,\n GenerateTextStepEndEvent,\n GenerateTextStepStartEvent,\n GenerateSpeechEndEvent,\n GenerateSpeechStartEvent,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n Experimental_DecideEndEvent as DecideEndEvent,\n Experimental_DecideStartEvent as DecideStartEvent,\n Experimental_DecisionModelCallEndEvent as DecisionModelCallEndEvent,\n Experimental_DecisionModelCallStartEvent as DecisionModelCallStartEvent,\n RerankingModelCallEndEvent,\n RerankEndEvent,\n RerankStartEvent,\n RerankingModelCallStartEvent,\n TranscriptionEndEvent,\n TranscriptionStartEvent,\n Experimental_StreamTranscriptionEndEvent as StreamTranscriptionEndEvent,\n Experimental_StreamTranscriptionStartEvent as StreamTranscriptionStartEvent,\n InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport {\n formatInputMessages,\n formatModelMessages,\n formatObjectOutputMessages,\n formatOutputMessages,\n formatSystemInstructions,\n mapOperationName,\n mapProviderName,\n} from './gen-ai-format-messages';\nimport { recordErrorOnSpan } from './record-span';\nimport { getProviderUsageAttributes } from './provider-usage-attributes';\nimport { sanitizeAttributes } from './sanitize-attribute-value';\nimport { selectAttributes } from './select-attributes';\nimport {\n getDetailedUsageAttributes,\n getHeaderAttributes,\n getRuntimeContextAttributes,\n normalizeSupplementalAttributes,\n selectSupplementalAttributes,\n type EnrichSpan,\n type OpenTelemetryOptions,\n type OpenTelemetrySpanType,\n type SupplementalAttributeOptions,\n} from './supplemental-attributes';\n\nexport type {\n EnrichSpan,\n OpenTelemetryOptions,\n OpenTelemetrySpanType,\n} from './supplemental-attributes';\n\ninterface OtelStepStartEvent extends GenerateTextStepStartEvent<ToolSet> {\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetryOptions | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n inferenceSpan: Span | undefined;\n inferenceContext: OpenTelemetryContext | undefined;\n inferenceToolDefinitions?: ReadonlyArray<Record<string, unknown>>;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n decisionSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n settings: Record<string, unknown>;\n provider: string;\n modelId: string;\n runtimeContext: Record<string, unknown> | undefined;\n baseSupplementalAttributes: Attributes;\n objectSystemInstructions?: GenerateObjectStartEvent['system'];\n}\n\nfunction msToSeconds(durationMs: number | undefined): number | undefined {\n return durationMs == null ? undefined : durationMs / 1000;\n}\n\nfunction getGenAIClientPerformanceAttributes(\n performance: LanguageModelCallEndEvent<ToolSet>['performance'],\n): Attributes {\n return {\n 'gen_ai.client.operation.duration': msToSeconds(performance.responseTimeMs),\n 'gen_ai.client.operation.time_to_first_chunk': msToSeconds(\n performance.timeToFirstOutputMs,\n ),\n 'gen_ai.client.operation.time_per_output_chunk': msToSeconds(\n performance.timeBetweenOutputChunksMs?.avg,\n ),\n };\n}\n\nexport class OpenTelemetry implements Telemetry {\n private readonly callStates = new Map<string, CallState>();\n\n private readonly tracer: Tracer;\n private readonly supplementalAttributes: SupplementalAttributeOptions;\n private readonly enrichSpan: EnrichSpan | undefined;\n\n constructor(options: OpenTelemetryOptions = {}) {\n this.tracer = options.tracer ?? trace.getTracer('gen_ai');\n this.supplementalAttributes = normalizeSupplementalAttributes(options);\n this.enrichSpan = options.enrichSpan;\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n private getSpanAttributes({\n attributes,\n spanType,\n operationId,\n callId,\n runtimeContext,\n }: {\n attributes: Attributes;\n spanType: OpenTelemetrySpanType;\n operationId: string;\n callId: string;\n runtimeContext: Record<string, unknown> | undefined;\n }): Attributes {\n let customAttributes: Attributes | undefined;\n\n try {\n customAttributes = this.enrichSpan?.({\n spanType,\n operationId,\n callId,\n runtimeContext,\n });\n } catch {\n customAttributes = undefined;\n }\n\n return {\n ...sanitizeAttributes(customAttributes),\n ...attributes,\n };\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n /**\n * Runs the provider `doGenerate`/`doStream` call with the active model-call\n * context.\n */\n executeLanguageModelCall<T>({\n callId,\n execute,\n }: {\n callId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const state = this.getCallState(callId);\n const modelCallContext = state?.inferenceContext ?? state?.stepContext;\n\n if (modelCallContext == null) {\n return execute();\n }\n\n return context.with(modelCallContext, execute);\n }\n\n onStart(\n event:\n | InferTelemetryEvent<GenerateTextStartEvent>\n | InferTelemetryEvent<GenerateObjectStartEvent>\n | InferTelemetryEvent<EmbedStartEvent>\n | InferTelemetryEvent<RerankStartEvent>\n | InferTelemetryEvent<GenerateSpeechStartEvent>\n | InferTelemetryEvent<TranscriptionStartEvent>,\n ): void {\n if (event.operationId === 'ai.generateSpeech') {\n this.onAudioOperationStart(\n event as InferTelemetryEvent<GenerateSpeechStartEvent>,\n );\n return;\n }\n\n if (event.operationId === 'ai.transcribe') {\n this.onAudioOperationStart(\n event as InferTelemetryEvent<TranscriptionStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as InferTelemetryEvent<EmbedStartEvent>);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(\n event as InferTelemetryEvent<RerankStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(\n event as InferTelemetryEvent<GenerateObjectStartEvent>,\n );\n return;\n }\n\n this.onGenerateStart(event as InferTelemetryEvent<GenerateTextStartEvent>);\n }\n\n experimental_onStreamTranscriptionStart(\n event: InferTelemetryEvent<StreamTranscriptionStartEvent>,\n ): void {\n this.onAudioOperationStart(event);\n }\n\n private onAudioOperationStart(\n event: InferTelemetryEvent<\n | GenerateSpeechStartEvent\n | TranscriptionStartEvent\n | StreamTranscriptionStartEvent\n >,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const audio = 'audio' in event ? event.audio : undefined;\n const text = 'text' in event ? event.text : undefined;\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.output.type':\n event.operationId === 'ai.generateSpeech' ? 'speech' : 'text',\n 'gen_ai.request.stream': event.operationId === 'ai.streamTranscribe',\n 'gen_ai.input.messages':\n text == null\n ? undefined\n : {\n input: () =>\n JSON.stringify([\n {\n role: 'user',\n parts: [{ type: 'text', content: text }],\n },\n ]),\n },\n 'ai.request.text': text == null ? undefined : { input: () => text },\n 'ai.request.audio.size':\n audio?.byteLength == null\n ? undefined\n : { input: () => audio.byteLength },\n 'ai.request.audio.media_type':\n audio == null ? undefined : { input: () => audio.mediaType },\n ...baseSupplementalAttributes,\n });\n\n const rootSpan = this.tracer.startSpan(\n `${operationName} ${event.modelId}`,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.CLIENT,\n },\n );\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n settings: {},\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n });\n }\n\n private onGenerateStart(\n event: InferTelemetryEvent<GenerateTextStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const runtimeContext = event.runtimeContext as\n | Record<string, unknown>\n | undefined;\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.stop_sequences': event.stopSequences,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions':\n event.instructions != null\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.instructions!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: undefined,\n messages: event.messages,\n }),\n ),\n },\n ...baseSupplementalAttributes,\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n private onObjectOperationStart(\n event: InferTelemetryEvent<GenerateObjectStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions': event.system\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.system!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: event.prompt,\n messages: event.messages,\n }),\n ),\n },\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n schema: {\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n },\n }),\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n objectSystemInstructions: event.system,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: GenerateObjectStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n const systemInstructionCount =\n state.objectSystemInstructions == null\n ? 0\n : formatSystemInstructions(state.objectSystemInstructions).length;\n const inputMessages = event.promptMessages?.slice(systemInstructionCount);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.system_instructions':\n state.objectSystemInstructions != null\n ? {\n input: () =>\n JSON.stringify(\n formatSystemInstructions(state.objectSystemInstructions!),\n ),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n inputMessages\n ? JSON.stringify(formatInputMessages(inputMessages))\n : undefined,\n },\n ...state.baseSupplementalAttributes,\n });\n\n const spanName = `chat ${event.modelId}`;\n state.inferenceSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'languageModel',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n state.inferenceContext = trace.setSpan(\n state.rootContext,\n state.inferenceSpan,\n );\n }\n\n /** @deprecated */\n onObjectStepEnd(event: GenerateObjectStepEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.inferenceSpan) return;\n\n if (event.finishReason === 'error') {\n state.inferenceSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n\n state.inferenceSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.output.messages': {\n output: () => {\n try {\n return JSON.stringify(\n formatObjectOutputMessages({\n objectText: event.objectText,\n finishReason: event.finishReason,\n }),\n );\n } catch {\n return event.objectText;\n }\n },\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n private onEmbedOperationStart(\n event: InferTelemetryEvent<EmbedStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const runtimeContext = event.runtimeContext;\n const providerName = mapProviderName(event.provider);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n const value = event.value;\n const isMany = event.operationId === 'ai.embedMany';\n const operationName = mapOperationName(event.operationId);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n embedding: isMany\n ? {\n 'ai.values': {\n input: () => (value as string[]).map(v => JSON.stringify(v)),\n },\n }\n : {\n 'ai.value': {\n input: () => JSON.stringify(value),\n },\n },\n }),\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n onStepStart(event: OtelStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n state.runtimeContext = event.runtimeContext as\n | Record<string, unknown>\n | undefined;\n const stepAttributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'agent_step',\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n toolChoice: {\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n },\n }),\n });\n\n state.stepSpan = this.tracer.startSpan(\n `step ${event.steps.length + 1}`,\n {\n attributes: this.getSpanAttributes({\n attributes: stepAttributes,\n spanType: 'step',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onLanguageModelCallStart(event: LanguageModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n state.inferenceToolDefinitions = event.tools;\n\n const inferenceAttributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.system_instructions':\n event.instructions != null\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.instructions!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () => {\n const formattedMessages = formatModelMessages({\n prompt: undefined,\n messages: event.messages,\n });\n\n return formattedMessages.length > 0\n ? JSON.stringify(formattedMessages)\n : undefined;\n },\n },\n 'gen_ai.tool.definitions': {\n input: () => (event.tools ? JSON.stringify(event.tools) : undefined),\n },\n });\n\n state.inferenceSpan = this.tracer.startSpan(\n `chat ${event.modelId}`,\n {\n attributes: this.getSpanAttributes({\n attributes: inferenceAttributes,\n spanType: 'languageModel',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.stepContext,\n );\n state.inferenceContext = trace.setSpan(\n state.stepContext,\n state.inferenceSpan,\n );\n }\n\n onLanguageModelCallEnd(event: LanguageModelCallEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.inferenceSpan) return;\n\n if (event.finishReason === 'error') {\n state.inferenceSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n const toolDefinitions = [...(state.inferenceToolDefinitions ?? [])];\n const definedToolNames = new Set(\n toolDefinitions.flatMap(tool =>\n typeof tool.name === 'string' ? [tool.name] : [],\n ),\n );\n let hasObservedProviderTools = false;\n\n for (const part of event.content) {\n if (\n part.type !== 'tool-call' ||\n !part.providerExecuted ||\n definedToolNames.has(part.toolName)\n ) {\n continue;\n }\n\n toolDefinitions.push({\n type: 'extension',\n name: part.toolName,\n });\n definedToolNames.add(part.toolName);\n hasObservedProviderTools = true;\n }\n\n state.inferenceSpan.setAttributes(\n selectAttributes(telemetry, {\n ...getGenAIClientPerformanceAttributes(event.performance),\n 'gen_ai.provider.name': providerName,\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.responseId,\n 'gen_ai.response.model': event.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text:\n event.content\n .filter(p => p.type === 'text')\n .map(p => p.text)\n .join('') || undefined,\n reasoning: event.content.filter(p => p.type === 'reasoning'),\n toolCalls: event.content.filter(p => p.type === 'tool-call'),\n toolResults: event.content.filter(\n p => p.type === 'tool-result',\n ),\n files: event.content\n .filter(p => p.type === 'file')\n .map(p => p.file),\n finishReason: event.finishReason,\n }),\n ),\n },\n 'gen_ai.tool.definitions': hasObservedProviderTools\n ? {\n input: () => JSON.stringify(toolDefinitions),\n }\n : undefined,\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n const finalToolOutputs = new Map<\n string,\n Extract<\n (typeof event.content)[number],\n { type: 'tool-result' | 'tool-error' }\n >\n >();\n for (const part of event.content) {\n if (\n part.type === 'tool-error' ||\n (part.type === 'tool-result' && part.preliminary !== true)\n ) {\n finalToolOutputs.set(part.toolCallId, part);\n }\n }\n\n const recordedToolCallIds = new Set<string>();\n for (const part of event.content) {\n if (\n part.type !== 'tool-call' ||\n !part.providerExecuted ||\n recordedToolCallIds.has(part.toolCallId)\n ) {\n continue;\n }\n recordedToolCallIds.add(part.toolCallId);\n\n const toolSpan = this.tracer.startSpan(\n `execute_tool ${part.toolName}`,\n {\n attributes: this.getSpanAttributes({\n attributes: selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'execute_tool',\n 'gen_ai.tool.name': part.toolName,\n 'gen_ai.tool.call.id': part.toolCallId,\n 'gen_ai.tool.type': 'extension',\n 'gen_ai.tool.call.arguments': {\n input: () => JSON.stringify(part.input),\n },\n }),\n spanType: 'tool',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n state.inferenceContext,\n );\n\n const toolOutput = finalToolOutputs.get(part.toolCallId);\n if (toolOutput?.type === 'tool-result') {\n try {\n toolSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.tool.call.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else if (toolOutput?.type === 'tool-error') {\n recordErrorOnSpan(toolSpan, toolOutput.error);\n }\n\n toolSpan.end();\n }\n\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n state.inferenceToolDefinitions = undefined;\n }\n\n onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n const parentContext = state?.stepContext ?? state?.rootContext;\n if (!state || !parentContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'execute_tool',\n 'gen_ai.tool.name': toolCall.toolName,\n 'gen_ai.tool.call.id': toolCall.toolCallId,\n 'gen_ai.tool.type': toolCall.providerExecuted ? 'extension' : 'function',\n 'gen_ai.tool.call.arguments': {\n input: () => JSON.stringify(toolCall.input),\n },\n });\n\n const spanName = `execute_tool ${toolCall.toolName}`;\n const toolSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'tool',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n parentContext,\n );\n const toolContext = trace.setSpan(parentContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n const { toolOutput } = event;\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.execute_tool.duration': msToSeconds(event.toolExecutionMs),\n }),\n );\n\n if (toolOutput.type === 'tool-result') {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.tool.call.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordErrorOnSpan(span, toolOutput.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepEnd(event: GenerateTextStepEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n if (event.finishReason === 'error') {\n state.stepSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n /** @deprecated Use `onStepEnd` instead. */\n onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void {\n this.onStepEnd(event);\n }\n\n onEnd(\n event:\n | GenerateTextEndEvent<ToolSet>\n | GenerateObjectEndEvent<unknown>\n | EmbedEndEvent\n | RerankEndEvent\n | GenerateSpeechEndEvent\n | TranscriptionEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationEnd(event as EmbedEndEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationEnd(event as RerankEndEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateSpeech' ||\n state.operationId === 'ai.transcribe'\n ) {\n this.onAudioOperationEnd(\n event as GenerateSpeechEndEvent | TranscriptionEndEvent,\n );\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationEnd(event as GenerateObjectEndEvent<unknown>);\n return;\n }\n\n this.onGenerateEnd(event as GenerateTextEndEvent<ToolSet>);\n }\n\n experimental_onStreamTranscriptionEnd(\n event: InferTelemetryEvent<StreamTranscriptionEndEvent>,\n ): void {\n this.onAudioOperationEnd(event);\n }\n\n private onAudioOperationEnd(\n event:\n | GenerateSpeechEndEvent\n | TranscriptionEndEvent\n | StreamTranscriptionEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const outputAudio =\n event.operationId === 'ai.generateSpeech' ? event.audio : undefined;\n const inputAudio =\n event.operationId === 'ai.generateSpeech' ? undefined : event.audio;\n const transcript = 'segments' in event ? event.text : undefined;\n\n state.rootSpan.setAttributes(\n selectAttributes(state.telemetry, {\n 'ai.request.audio.size':\n inputAudio == null\n ? undefined\n : { input: () => inputAudio.byteLength },\n 'ai.request.audio.media_type':\n inputAudio == null\n ? undefined\n : { input: () => inputAudio.mediaType },\n 'ai.response.text':\n transcript == null ? undefined : { output: () => transcript },\n 'gen_ai.output.messages':\n transcript == null\n ? undefined\n : {\n output: () =>\n JSON.stringify([\n {\n role: 'assistant',\n parts: [{ type: 'text', content: transcript }],\n },\n ]),\n },\n 'ai.response.audio.size':\n outputAudio == null\n ? undefined\n : { output: () => outputAudio.byteLength },\n 'ai.response.audio.media_type':\n outputAudio == null\n ? undefined\n : { output: () => outputAudio.mediaType },\n 'ai.response.audio.format':\n outputAudio == null || !('format' in outputAudio)\n ? undefined\n : { output: () => String(outputAudio.format) },\n ...getProviderUsageAttributes({\n usage: event.usage,\n prefix: 'gen_ai.usage',\n }),\n ...selectSupplementalAttributes(\n state.telemetry,\n this.supplementalAttributes,\n {\n usage: {\n 'ai.response.usage':\n event.usage == null ? undefined : JSON.stringify(event.usage),\n },\n providerMetadata: {\n 'ai.response.providerMetadata':\n event.providerMetadata == null\n ? undefined\n : JSON.stringify(event.providerMetadata),\n },\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onGenerateEnd(event: GenerateTextEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (event.finishReason === 'error') {\n state.rootSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text: event.text ?? undefined,\n reasoning: event.finalStep.reasoning as ReadonlyArray<{\n text?: string;\n }>,\n toolCalls: event.toolCalls,\n toolResults: event.toolResults,\n files: event.files,\n finishReason: event.finishReason,\n }),\n ),\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.finalStep.providerMetadata\n ? JSON.stringify(event.finalStep.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationEnd(event: GenerateObjectEndEvent<unknown>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (event.finishReason === 'error') {\n state.rootSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.output.messages': {\n output: () =>\n event.object != null\n ? JSON.stringify(\n formatObjectOutputMessages({\n objectText: JSON.stringify(event.object),\n finishReason: event.finishReason,\n }),\n )\n : undefined,\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationEnd(event: EmbedEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n embedding: isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e =>\n JSON.stringify(e),\n ),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n },\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbeddingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'embeddings',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n embedding: {\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n },\n }),\n });\n\n const spanName = `embeddings ${state.modelId}`;\n const embedSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'embedding',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedEnd(event: EmbeddingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.usage.input_tokens': event.usage.tokens,\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n embedding: {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n },\n },\n ),\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(\n event: InferTelemetryEvent<RerankStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const runtimeContext = event.runtimeContext;\n const providerName = mapProviderName(event.provider);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n },\n }),\n });\n\n const spanName = `rerank ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n private onRerankOperationEnd(event: RerankEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n },\n }),\n });\n\n const spanName = `rerank ${state.modelId}`;\n const rerankSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'reranking',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankEnd(event: RerankingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n private onDecideOperationStart(\n event: InferTelemetryEvent<DecideStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n const runtimeContext = event.runtimeContext;\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'decide',\n 'gen_ai.provider.name': mapProviderName(event.provider),\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n experimental_decision: {\n 'ai.decision.state': {\n input: () => JSON.stringify(event.state),\n },\n 'ai.decision.questions': {\n input: () => JSON.stringify(event.questions),\n },\n },\n }),\n });\n const rootSpan = this.tracer.startSpan(`decide ${event.modelId}`, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n private onDecideOperationEnd(event: DecideEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.setAttributes(\n selectSupplementalAttributes(\n state.telemetry,\n this.supplementalAttributes,\n {\n experimental_decision: {\n 'ai.decision.answers': {\n output: () => JSON.stringify(event.answers),\n },\n },\n },\n ),\n );\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n // Route through deprecated hooks to preserve existing subclass overrides.\n experimental_onDecideStart(\n event: InferTelemetryEvent<DecideStartEvent>,\n ): void {\n this.experimental_onEvaluateStart(event);\n }\n\n experimental_onDecideEnd(event: DecideEndEvent): void {\n this.experimental_onEvaluateEnd(event);\n }\n\n experimental_onDecisionModelCallStart(\n event: DecisionModelCallStartEvent,\n ): void {\n this.experimental_onEvaluationModelCallStart(event);\n }\n\n experimental_onDecisionModelCallEnd(event: DecisionModelCallEndEvent): void {\n this.experimental_onEvaluationModelCallEnd(event);\n }\n\n /** @deprecated Use `experimental_onDecideStart` instead. */\n experimental_onEvaluateStart(\n event: InferTelemetryEvent<DecideStartEvent>,\n ): void {\n this.onDecideOperationStart(event);\n }\n\n /** @deprecated Use `experimental_onDecideEnd` instead. */\n experimental_onEvaluateEnd(event: DecideEndEvent): void {\n this.onDecideOperationEnd(event);\n }\n\n /** @deprecated Use `experimental_onDecisionModelCallStart` instead. */\n experimental_onEvaluationModelCallStart(\n event: InferTelemetryEvent<DecisionModelCallStartEvent>,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const attributes = selectAttributes(state.telemetry, {\n 'gen_ai.operation.name': 'decide',\n 'gen_ai.provider.name': mapProviderName(state.provider),\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(\n state.telemetry,\n this.supplementalAttributes,\n {\n experimental_decision: {\n 'ai.decision.state': {\n input: () => JSON.stringify(event.state),\n },\n 'ai.decision.questions': {\n input: () => JSON.stringify(event.questions),\n },\n },\n },\n ),\n });\n const span = this.tracer.startSpan(\n `decide ${state.modelId}`,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'experimental_decision',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n\n state.decisionSpan = {\n span,\n context: trace.setSpan(state.rootContext, span),\n };\n }\n\n /** @deprecated Use `experimental_onDecisionModelCallEnd` instead. */\n experimental_onEvaluationModelCallEnd(\n event: InferTelemetryEvent<DecisionModelCallEndEvent>,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.decisionSpan) return;\n\n state.decisionSpan.span.setAttributes(\n selectAttributes(state.telemetry, {\n 'gen_ai.usage.input_tokens': event.usage?.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage?.outputTokens,\n ...selectSupplementalAttributes(\n state.telemetry,\n this.supplementalAttributes,\n {\n experimental_decision: {\n 'ai.decision.answers': {\n output: () => JSON.stringify(event.answers),\n },\n },\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n },\n ),\n }),\n );\n state.decisionSpan.span.end();\n state.decisionSpan = undefined;\n }\n\n onAbort(event: GenerateTextAbortEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n for (const { span: toolSpan } of state.toolSpans.values()) {\n toolSpan.end();\n }\n state.toolSpans.clear();\n\n if (state.inferenceSpan) {\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n if (state.stepSpan) {\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n if (state.decisionSpan) {\n state.decisionSpan.span.end();\n state.decisionSpan = undefined;\n }\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n for (const { span: toolSpan } of state.toolSpans.values()) {\n recordErrorOnSpan(toolSpan, actualError);\n toolSpan.end();\n }\n state.toolSpans.clear();\n\n if (state.inferenceSpan) {\n recordErrorOnSpan(state.inferenceSpan, actualError);\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n if (state.stepSpan) {\n recordErrorOnSpan(state.stepSpan, actualError);\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordErrorOnSpan(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordErrorOnSpan(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n if (state.decisionSpan) {\n recordErrorOnSpan(state.decisionSpan.span, actualError);\n state.decisionSpan.span.end();\n state.decisionSpan = undefined;\n }\n\n recordErrorOnSpan(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type { TelemetryOptions } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetryOptions;\n}) {\n return {\n // standardized operation and resource name:\n 'operation.name': `${operationId}${\n telemetry?.functionId != null ? ` ${telemetry.functionId}` : ''\n }`,\n 'resource.name': telemetry?.functionId,\n\n // detailed, AI SDK specific data:\n 'ai.operationId': operationId,\n 'ai.telemetry.functionId': telemetry?.functionId,\n };\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { LanguageModelCallOptions } from 'ai';\nimport { getRuntimeContextAttributes } from './supplemental-attributes';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n headers,\n context,\n}: {\n model: { modelId: string; provider: string };\n settings: LanguageModelCallOptions;\n headers: Record<string, string | undefined> | undefined;\n context: Record<string, unknown> | undefined;\n}): Attributes {\n return {\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n attributes[`ai.settings.${key}`] = value as AttributeValue;\n return attributes;\n }, {} as Attributes),\n\n // add context as attributes:\n ...(getRuntimeContextAttributes(context) as Attributes),\n\n // request headers\n ...Object.entries(headers ?? {}).reduce((attributes, [key, value]) => {\n if (value !== undefined) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {} as Attributes),\n };\n}\n","import type {\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport { convertDataContentToBase64String } from 'ai';\n\n/**\n * Helper utility to serialize prompt content for OpenTelemetry tracing.\n * It is initially created because normalized LanguageModelV4Prompt carries\n * images as Uint8Arrays, on which JSON.stringify acts weirdly, converting\n * them to objects with stringified indices as keys, e.g. {\"0\": 42, \"1\": 69 }.\n */\nexport function stringifyForTelemetry(prompt: LanguageModelV4Prompt): string {\n return JSON.stringify(\n prompt.map((message: LanguageModelV4Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data: serializeFileData(part.data),\n }\n : part,\n ),\n })),\n );\n}\n\nfunction serializeFileData(\n data:\n | { type: 'data'; data: string | Uint8Array }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string },\n): unknown {\n switch (data.type) {\n case 'data':\n return data.data instanceof Uint8Array\n ? convertDataContentToBase64String(data.data)\n : data.data;\n case 'url':\n return data.url.toString();\n case 'reference':\n return data.reference;\n case 'text':\n return data.text;\n }\n}\n","import type { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport type { Context as AISDKContext } from '@ai-sdk/provider-utils';\nimport {\n context,\n SpanStatusCode,\n trace,\n type Attributes,\n type AttributeValue,\n type Context as OpenTelemetryContext,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbeddingModelCallEndEvent,\n EmbedEndEvent,\n EmbedStartEvent,\n EmbeddingModelCallStartEvent,\n GenerateObjectEndEvent,\n GenerateObjectStartEvent,\n GenerateObjectStepEndEvent,\n GenerateObjectStepStartEvent,\n GenerateTextAbortEvent,\n GenerateTextEndEvent,\n GenerateTextStartEvent,\n GenerateTextStepEndEvent,\n GenerateTextStepStartEvent,\n GenerateSpeechEndEvent,\n GenerateSpeechStartEvent,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n Experimental_DecideEndEvent as DecideEndEvent,\n Experimental_DecideStartEvent as DecideStartEvent,\n Experimental_DecisionModelCallEndEvent as DecisionModelCallEndEvent,\n Experimental_DecisionModelCallStartEvent as DecisionModelCallStartEvent,\n Output,\n RerankingModelCallEndEvent,\n RerankEndEvent,\n RerankStartEvent,\n RerankingModelCallStartEvent,\n TranscriptionEndEvent,\n TranscriptionStartEvent,\n Experimental_StreamTranscriptionEndEvent as StreamTranscriptionEndEvent,\n Experimental_StreamTranscriptionStartEvent as StreamTranscriptionStartEvent,\n InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\nimport { getProviderUsageAttributes } from './provider-usage-attributes';\nimport { sanitizeAttributeValue } from './sanitize-attribute-value';\nimport { stringifyForTelemetry } from './stringify-for-telemetry';\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction shouldRecord(\n telemetry: TelemetryOptions | undefined,\n): telemetry is TelemetryOptions {\n return telemetry?.isEnabled !== false;\n}\n\nfunction selectAttributes(\n telemetry: TelemetryOptions | undefined,\n attributes: Record<\n string,\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined\n >,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) {\n const sanitized = sanitizeAttributeValue(resolved);\n if (sanitized != null) result[key] = sanitized;\n }\n continue;\n }\n\n if (\n typeof value === 'object' &&\n 'output' in value &&\n typeof value.output === 'function'\n ) {\n if (telemetry?.recordOutputs === false) continue;\n const resolved = value.output();\n if (resolved != null) {\n const sanitized = sanitizeAttributeValue(resolved);\n if (sanitized != null) result[key] = sanitized;\n }\n continue;\n }\n\n const sanitized = sanitizeAttributeValue(value as AttributeValue);\n if (sanitized != null) result[key] = sanitized;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n RUNTIME_CONTEXT extends AISDKContext = AISDKContext,\n OUTPUT extends Output.Output = Output.Output,\n> extends GenerateTextStepStartEvent<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n readonly promptMessages?: LanguageModelV4Prompt;\n readonly stepTools?: ReadonlyArray<Record<string, unknown>>;\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetryOptions | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n decisionSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class LegacyOpenTelemetry implements Telemetry {\n private readonly callStates = new Map<string, CallState>();\n\n /**\n * The tracer to use for the telemetry data.\n */\n private readonly tracer: Tracer;\n\n constructor(\n options: {\n tracer?: Tracer;\n } = {},\n ) {\n this.tracer = options.tracer ?? trace.getTracer('ai');\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n /**\n * Runs the provider `doGenerate`/`doStream` call with the active legacy\n * model-call context.\n */\n executeLanguageModelCall<T>({\n callId,\n execute,\n }: {\n callId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const stepContext = this.getCallState(callId)?.stepContext;\n\n if (stepContext == null) {\n return execute();\n }\n\n return context.with(stepContext, execute);\n }\n\n onStart(\n event:\n | InferTelemetryEvent<GenerateTextStartEvent>\n | InferTelemetryEvent<GenerateObjectStartEvent>\n | InferTelemetryEvent<EmbedStartEvent>\n | InferTelemetryEvent<RerankStartEvent>\n | InferTelemetryEvent<GenerateSpeechStartEvent>\n | InferTelemetryEvent<TranscriptionStartEvent>,\n ): void {\n if (event.operationId === 'ai.generateSpeech') {\n this.onAudioOperationStart(\n event as InferTelemetryEvent<GenerateSpeechStartEvent>,\n );\n return;\n }\n\n if (event.operationId === 'ai.transcribe') {\n this.onAudioOperationStart(\n event as InferTelemetryEvent<TranscriptionStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as InferTelemetryEvent<EmbedStartEvent>);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(\n event as InferTelemetryEvent<RerankStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(\n event as InferTelemetryEvent<GenerateObjectStartEvent>,\n );\n return;\n }\n\n this.onGenerateStart(event as InferTelemetryEvent<GenerateTextStartEvent>);\n }\n\n experimental_onStreamTranscriptionStart(\n event: InferTelemetryEvent<StreamTranscriptionStartEvent>,\n ): void {\n this.onAudioOperationStart(event);\n }\n\n private onAudioOperationStart(\n event: InferTelemetryEvent<\n | GenerateSpeechStartEvent\n | TranscriptionStartEvent\n | StreamTranscriptionStartEvent\n >,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n const audio = 'audio' in event ? event.audio : undefined;\n const text = 'text' in event ? event.text : undefined;\n const baseTelemetryAttributes: Attributes = {\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n ...Object.fromEntries(\n Object.entries(event.headers ?? {}).map(([key, value]) => [\n `ai.request.headers.${key}`,\n value,\n ]),\n ),\n };\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.request.text': text == null ? undefined : { input: () => text },\n 'ai.request.audio.size':\n audio?.byteLength == null\n ? undefined\n : { input: () => audio.byteLength },\n 'ai.request.audio.mediaType':\n audio == null ? undefined : { input: () => audio.mediaType },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings: {},\n });\n }\n\n private onGenerateStart(\n event: InferTelemetryEvent<GenerateTextStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext as Record<string, unknown> | undefined,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.instructions,\n messages: event.messages,\n }),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(\n event: InferTelemetryEvent<GenerateObjectStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: undefined,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.system,\n prompt: event.prompt,\n messages: event.messages,\n }),\n },\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: GenerateObjectStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamObject'\n ? 'ai.streamObject.doStream'\n : 'ai.generateObject.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n /** @deprecated */\n onObjectStepEnd(event: GenerateObjectStepEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n if (event.finishReason === 'error') {\n state.stepSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () => {\n try {\n return JSON.stringify(JSON.parse(event.objectText));\n } catch {\n return event.objectText;\n }\n },\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n if (event.msToFirstChunk != null) {\n state.stepSpan.addEvent('ai.stream.firstChunk', {\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n state.stepSpan.setAttributes({\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n }\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n private onEmbedOperationStart(\n event: InferTelemetryEvent<EmbedStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext,\n });\n\n const value = event.value;\n const isMany = event.operationId === 'ai.embedMany';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n ...(isMany\n ? {\n 'ai.values': {\n input: () => (value as string[]).map(v => JSON.stringify(v)),\n },\n }\n : {\n 'ai.value': {\n input: () => JSON.stringify(value),\n },\n }),\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n onStepStart(event: OtelStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamText'\n ? 'ai.streamText.doStream'\n : 'ai.generateText.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n 'ai.prompt.tools': {\n input: () => event.stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n ...Object.fromEntries(\n Object.entries(state.baseTelemetryAttributes).filter(([key]) =>\n key.startsWith('ai.settings.context.'),\n ),\n ),\n 'ai.toolCall.name': toolCall.toolName,\n 'ai.toolCall.id': toolCall.toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(toolCall.input),\n },\n });\n\n const toolSpan = this.tracer.startSpan(\n 'ai.toolCall',\n { attributes },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n const { toolOutput } = event;\n if (toolOutput.type === 'tool-result') {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, toolOutput.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepEnd(event: GenerateTextStepEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n if (event.finishReason === 'error') {\n state.stepSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n const isStreamText = state.operationId === 'ai.streamText';\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.reasoning.length > 0\n ? event.reasoning\n .filter(part => 'text' in part)\n .map(part => part.text)\n .join('\\n')\n : undefined,\n },\n 'ai.response.toolCalls': {\n output: () =>\n event.toolCalls.length > 0\n ? JSON.stringify(\n event.toolCalls.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n })),\n )\n : undefined,\n },\n 'ai.response.files': {\n output: () =>\n event.files.length > 0\n ? JSON.stringify(\n event.files.map(file => ({\n type: 'file',\n mediaType: file.mediaType,\n data: file.base64,\n })),\n )\n : undefined,\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n 'ai.response.msToFirstChunk': isStreamText\n ? event.performance.timeToFirstOutputMs\n : undefined,\n 'ai.response.msToFinish': isStreamText\n ? event.performance.responseTimeMs\n : undefined,\n 'ai.response.avgOutputTokensPerSecond': isStreamText\n ? event.performance.effectiveOutputTokensPerSecond\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n if (isStreamText && event.performance.timeToFirstOutputMs != null) {\n state.stepSpan.addEvent('ai.stream.firstChunk', {\n 'ai.response.msToFirstChunk': event.performance.timeToFirstOutputMs,\n });\n }\n\n if (isStreamText) {\n state.stepSpan.addEvent('ai.stream.finish', {\n 'ai.response.msToFinish': event.performance.responseTimeMs,\n 'ai.response.avgOutputTokensPerSecond':\n event.performance.effectiveOutputTokensPerSecond,\n });\n }\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n /** @deprecated Use `onStepEnd` instead. */\n onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void {\n this.onStepEnd(event);\n }\n\n onEnd(\n event:\n | GenerateTextEndEvent<ToolSet>\n | GenerateObjectEndEvent<unknown>\n | EmbedEndEvent\n | RerankEndEvent\n | GenerateSpeechEndEvent\n | TranscriptionEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationEnd(event as EmbedEndEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationEnd(event as RerankEndEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateSpeech' ||\n state.operationId === 'ai.transcribe'\n ) {\n this.onAudioOperationEnd(\n event as GenerateSpeechEndEvent | TranscriptionEndEvent,\n );\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationEnd(event as GenerateObjectEndEvent<unknown>);\n return;\n }\n\n this.onGenerateEnd(event as GenerateTextEndEvent<ToolSet>);\n }\n\n experimental_onStreamTranscriptionEnd(\n event: InferTelemetryEvent<StreamTranscriptionEndEvent>,\n ): void {\n this.onAudioOperationEnd(event);\n }\n\n private onAudioOperationEnd(\n event:\n | GenerateSpeechEndEvent\n | TranscriptionEndEvent\n | StreamTranscriptionEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const isSpeech = event.operationId === 'ai.generateSpeech';\n const audio = event.audio;\n state.rootSpan.setAttributes(\n selectAttributes(state.telemetry, {\n 'ai.request.audio.size': isSpeech\n ? undefined\n : { input: () => audio.byteLength },\n 'ai.request.audio.mediaType': isSpeech\n ? undefined\n : { input: () => audio.mediaType },\n 'ai.response.text':\n 'segments' in event ? { output: () => event.text } : undefined,\n 'ai.response.audio.size': isSpeech\n ? { output: () => audio.byteLength }\n : undefined,\n 'ai.response.audio.mediaType': isSpeech\n ? { output: () => audio.mediaType }\n : undefined,\n 'ai.response.audio.format':\n isSpeech && 'format' in audio\n ? { output: () => audio.format }\n : undefined,\n ...getProviderUsageAttributes({\n usage: event.usage,\n prefix: 'ai.usage',\n }),\n 'ai.response.usage':\n event.usage == null ? undefined : JSON.stringify(event.usage),\n 'ai.response.providerMetadata':\n event.providerMetadata == null\n ? undefined\n : JSON.stringify(event.providerMetadata),\n }),\n );\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onGenerateEnd(event: GenerateTextEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (event.finishReason === 'error') {\n state.rootSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.finalStep.reasoning.length > 0\n ? event.finalStep.reasoning\n .filter(part => 'text' in part)\n .map(part => part.text)\n .join('\\n')\n : undefined,\n },\n 'ai.response.toolCalls': {\n output: () =>\n event.toolCalls.length > 0\n ? JSON.stringify(\n event.toolCalls.map(toolCall => ({\n toolCallId: toolCall.toolCallId,\n toolName: toolCall.toolName,\n input: toolCall.input,\n })),\n )\n : undefined,\n },\n 'ai.response.files': {\n output: () =>\n event.files.length > 0\n ? JSON.stringify(\n event.files.map(file => ({\n type: 'file',\n mediaType: file.mediaType,\n data: file.base64,\n })),\n )\n : undefined,\n },\n 'ai.response.providerMetadata': event.finalStep.providerMetadata\n ? JSON.stringify(event.finalStep.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationEnd(event: GenerateObjectEndEvent<unknown>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (event.finishReason === 'error') {\n state.rootSpan.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () =>\n event.object != null ? JSON.stringify(event.object) : undefined,\n },\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationEnd(event: EmbedEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n ...(isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e => JSON.stringify(e)),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n }),\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbeddingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n });\n\n const embedSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedEnd(event: EmbeddingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(\n event: InferTelemetryEvent<RerankStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onRerankOperationEnd(event: RerankEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rerankSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankEnd(event: RerankingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n private onDecideOperationStart(\n event: InferTelemetryEvent<DecideStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext,\n });\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({ operationId: event.operationId, telemetry }),\n ...baseTelemetryAttributes,\n 'ai.decision.state': {\n input: () => JSON.stringify(event.state),\n },\n 'ai.decision.questions': {\n input: () => JSON.stringify(event.questions),\n },\n });\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n decisionSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onDecideOperationEnd(event: DecideEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.setAttributes(\n selectAttributes(state.telemetry, {\n 'ai.decision.answers': {\n output: () => JSON.stringify(event.answers),\n },\n }),\n );\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n // Route through deprecated hooks to preserve existing subclass overrides.\n experimental_onDecideStart(\n event: InferTelemetryEvent<DecideStartEvent>,\n ): void {\n this.experimental_onEvaluateStart(event);\n }\n\n experimental_onDecideEnd(event: DecideEndEvent): void {\n this.experimental_onEvaluateEnd(event);\n }\n\n experimental_onDecisionModelCallStart(\n event: DecisionModelCallStartEvent,\n ): void {\n this.experimental_onEvaluationModelCallStart(event);\n }\n\n experimental_onDecisionModelCallEnd(event: DecisionModelCallEndEvent): void {\n this.experimental_onEvaluationModelCallEnd(event);\n }\n\n /** @deprecated Use `experimental_onDecideStart` instead. */\n experimental_onEvaluateStart(\n event: InferTelemetryEvent<DecideStartEvent>,\n ): void {\n this.onDecideOperationStart(event);\n }\n\n /** @deprecated Use `experimental_onDecideEnd` instead. */\n experimental_onEvaluateEnd(event: DecideEndEvent): void {\n this.onDecideOperationEnd(event);\n }\n\n /** @deprecated Use `experimental_onDecisionModelCallStart` instead. */\n experimental_onEvaluationModelCallStart(\n event: InferTelemetryEvent<DecisionModelCallStartEvent>,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const attributes = selectAttributes(state.telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry: state.telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.decision.state': {\n input: () => JSON.stringify(event.state),\n },\n 'ai.decision.questions': {\n input: () => JSON.stringify(event.questions),\n },\n });\n const span = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n state.decisionSpan = {\n span,\n context: trace.setSpan(state.rootContext, span),\n };\n }\n\n /** @deprecated Use `experimental_onDecisionModelCallEnd` instead. */\n experimental_onEvaluationModelCallEnd(\n event: InferTelemetryEvent<DecisionModelCallEndEvent>,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.decisionSpan) return;\n\n state.decisionSpan.span.setAttributes(\n selectAttributes(state.telemetry, {\n 'ai.decision.answers': {\n output: () => JSON.stringify(event.answers),\n },\n 'ai.usage.inputTokens': event.usage?.inputTokens,\n 'ai.usage.outputTokens': event.usage?.outputTokens,\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n }),\n );\n state.decisionSpan.span.end();\n state.decisionSpan = undefined;\n }\n\n onAbort(event: GenerateTextAbortEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n for (const { span: toolSpan } of state.toolSpans.values()) {\n toolSpan.end();\n }\n state.toolSpans.clear();\n\n if (state.stepSpan) {\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n if (state.decisionSpan) {\n state.decisionSpan.span.end();\n state.decisionSpan = undefined;\n }\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n if (state.stepSpan) {\n recordSpanError(state.stepSpan, actualError);\n state.stepSpan.end();\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordSpanError(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordSpanError(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n if (state.decisionSpan) {\n recordSpanError(state.decisionSpan.span, actualError);\n state.decisionSpan.span.end();\n state.decisionSpan = undefined;\n }\n\n recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n"],"mappings":"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"}
|