@ai-sdk/otel 1.0.122 → 1.0.123

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/open-telemetry.ts","../src/gen-ai-format-messages.ts","../src/record-span.ts","../src/sanitize-attribute-value.ts","../src/select-attributes.ts","../src/supplemental-attributes.ts","../src/legacy-open-telemetry.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["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 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 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 { 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 ): void {\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 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 ): 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.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 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 {\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 };\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, 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 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 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 InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-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 ): void {\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 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 ): 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.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 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","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"],"mappings":"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","names":["context","sanitized","context","context","context","SpanStatusCode","trace","context","convertDataContentToBase64String","SpanStatusCode","shouldRecord","selectAttributes","sanitized","trace","context"]}
1
+ {"version":3,"file":"index.js","names":["_exhaustive","shouldRecord","selectAttributes","selectAttributes","selectAttributes"],"sources":["../src/gen-ai-format-messages.ts","../src/record-span.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 };\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, 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 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 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 { 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 ): void {\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 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 ): 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.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 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 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 InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-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 ): void {\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 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 ): 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.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 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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"}