@ai-sdk/otel 1.0.0-beta.2 → 1.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @ai-sdk/otel
2
2
 
3
+ ## 1.0.0-beta.4
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [2e17091]
8
+ - ai@7.0.0-beta.58
9
+
10
+ ## 1.0.0-beta.3
11
+
12
+ ### Patch Changes
13
+
14
+ - Updated dependencies [986c6fd]
15
+ - Updated dependencies [493295c]
16
+ - ai@7.0.0-beta.57
17
+
3
18
  ## 1.0.0-beta.2
4
19
 
5
20
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { LanguageModelV4Prompt } from '@ai-sdk/provider';
2
2
  import { Tracer } from '@opentelemetry/api';
3
- import { TelemetryIntegration, OnStartEvent, ToolSet, OutputInterface, ObjectOnStartEvent, EmbedOnStartEvent, RerankOnStartEvent, ObjectOnStepStartEvent, ObjectOnStepFinishEvent, OnStepStartEvent, OnToolCallStartEvent, OnToolCallFinishEvent, OnStepFinishEvent, OnFinishEvent, ObjectOnFinishEvent, EmbedOnFinishEvent, RerankOnFinishEvent, EmbedStartEvent, EmbedFinishEvent, RerankStartEvent, RerankFinishEvent, OnChunkEvent } from 'ai';
3
+ import { TelemetryIntegration, OnStartEvent, ToolSet, OutputInterface, ObjectOnStartEvent, EmbedOnStartEvent, RerankOnStartEvent, ObjectOnStepStartEvent, ObjectOnStepFinishEvent, GenerationContext, OnStepStartEvent, OnToolCallStartEvent, OnToolCallFinishEvent, OnStepFinishEvent, OnFinishEvent, ObjectOnFinishEvent, EmbedOnFinishEvent, RerankOnFinishEvent, EmbedStartEvent, EmbedFinishEvent, RerankStartEvent, RerankFinishEvent, OnChunkEvent } from 'ai';
4
4
 
5
- interface OtelStepStartEvent<TOOLS extends ToolSet = ToolSet, OUTPUT extends OutputInterface = OutputInterface> extends OnStepStartEvent<TOOLS, OUTPUT> {
5
+ interface OtelStepStartEvent<TOOLS extends ToolSet = ToolSet, CONTEXT extends GenerationContext<TOOLS> = GenerationContext<TOOLS>, OUTPUT extends OutputInterface = OutputInterface> extends OnStepStartEvent<TOOLS, CONTEXT, OUTPUT> {
6
6
  readonly promptMessages?: LanguageModelV4Prompt;
7
7
  readonly stepTools?: ReadonlyArray<Record<string, unknown>>;
8
8
  readonly stepToolChoice?: unknown;
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { LanguageModelV4Prompt } from '@ai-sdk/provider';
2
2
  import { Tracer } from '@opentelemetry/api';
3
- import { TelemetryIntegration, OnStartEvent, ToolSet, OutputInterface, ObjectOnStartEvent, EmbedOnStartEvent, RerankOnStartEvent, ObjectOnStepStartEvent, ObjectOnStepFinishEvent, OnStepStartEvent, OnToolCallStartEvent, OnToolCallFinishEvent, OnStepFinishEvent, OnFinishEvent, ObjectOnFinishEvent, EmbedOnFinishEvent, RerankOnFinishEvent, EmbedStartEvent, EmbedFinishEvent, RerankStartEvent, RerankFinishEvent, OnChunkEvent } from 'ai';
3
+ import { TelemetryIntegration, OnStartEvent, ToolSet, OutputInterface, ObjectOnStartEvent, EmbedOnStartEvent, RerankOnStartEvent, ObjectOnStepStartEvent, ObjectOnStepFinishEvent, GenerationContext, OnStepStartEvent, OnToolCallStartEvent, OnToolCallFinishEvent, OnStepFinishEvent, OnFinishEvent, ObjectOnFinishEvent, EmbedOnFinishEvent, RerankOnFinishEvent, EmbedStartEvent, EmbedFinishEvent, RerankStartEvent, RerankFinishEvent, OnChunkEvent } from 'ai';
4
4
 
5
- interface OtelStepStartEvent<TOOLS extends ToolSet = ToolSet, OUTPUT extends OutputInterface = OutputInterface> extends OnStepStartEvent<TOOLS, OUTPUT> {
5
+ interface OtelStepStartEvent<TOOLS extends ToolSet = ToolSet, CONTEXT extends GenerationContext<TOOLS> = GenerationContext<TOOLS>, OUTPUT extends OutputInterface = OutputInterface> extends OnStepStartEvent<TOOLS, CONTEXT, OUTPUT> {
6
6
  readonly promptMessages?: LanguageModelV4Prompt;
7
7
  readonly stepTools?: ReadonlyArray<Record<string, unknown>>;
8
8
  readonly stepToolChoice?: unknown;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/open-telemetry-integration.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["export { OpenTelemetryIntegration } from './open-telemetry-integration';\n","import { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport {\n context,\n trace,\n Span,\n Context,\n Attributes,\n AttributeValue,\n SpanStatusCode,\n Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbedOnStartEvent,\n EmbedOnFinishEvent,\n EmbedStartEvent,\n EmbedFinishEvent,\n RerankOnStartEvent,\n RerankOnFinishEvent,\n RerankStartEvent,\n RerankFinishEvent,\n OnChunkEvent,\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n ObjectOnStartEvent,\n ObjectOnFinishEvent,\n ObjectOnStepStartEvent,\n ObjectOnStepFinishEvent,\n TelemetryIntegration,\n TelemetrySettings,\n ToolSet,\n} from 'ai';\nimport type { OutputInterface as Output } from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\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: TelemetrySettings | undefined,\n): telemetry is TelemetrySettings {\n return telemetry?.isEnabled === true;\n}\n\nfunction selectAttributes(\n telemetry: TelemetrySettings | 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) result[key] = resolved;\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) result[key] = resolved;\n continue;\n }\n\n result[key] = value as AttributeValue;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n OUTPUT extends Output = Output,\n> extends OnStepStartEvent<TOOLS, 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: TelemetrySettings | undefined;\n rootSpan: Span | undefined;\n rootContext: Context | undefined;\n stepSpan: Span | undefined;\n stepContext: Context | undefined;\n embedSpans: Map<string, { span: Span; context: Context }>;\n rerankSpan: { span: Span; context: Context } | undefined;\n toolSpans: Map<string, { span: Span; context: Context }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class OpenTelemetryIntegration implements TelemetryIntegration {\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 onStart(\n event:\n | OnStartEvent<ToolSet, Output>\n | ObjectOnStartEvent\n | EmbedOnStartEvent\n | RerankOnStartEvent,\n ): void {\n if (event.isEnabled !== true) return;\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as EmbedOnStartEvent);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(event as RerankOnStartEvent);\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(event as ObjectOnStartEvent);\n return;\n }\n\n this.onGenerateStart(event as OnStartEvent<ToolSet, Output>);\n }\n\n private onGenerateStart(event: OnStartEvent<ToolSet, Output>): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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.system,\n prompt: event.prompt,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(event: ObjectOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: ObjectOnStepStartEvent): 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 onObjectStepFinish(event: ObjectOnStepFinishEvent): 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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\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(event: EmbedOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n onStepStart(event: OtelStepStartEvent<ToolSet, Output>): 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 onToolCallStart(event: OnToolCallStartEvent<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 '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 onToolCallFinish(event: OnToolCallFinishEvent<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 if (event.success) {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(event.output),\n },\n }),\n );\n } catch (_ignored) {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, event.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: OnStepFinishEvent<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 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\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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\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 state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | OnFinishEvent<ToolSet>\n | ObjectOnFinishEvent<unknown>\n | EmbedOnFinishEvent\n | RerankOnFinishEvent,\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.onEmbedOperationFinish(event as EmbedOnFinishEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankOnFinishEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as ObjectOnFinishEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as OnFinishEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: OnFinishEvent<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.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.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.totalUsage.inputTokens,\n 'ai.usage.outputTokens': event.totalUsage.outputTokens,\n 'ai.usage.totalTokens': event.totalUsage.totalTokens,\n 'ai.usage.reasoningTokens': event.totalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.totalUsage.cachedInputTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.totalUsage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.totalUsage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.totalUsage.outputTokenDetails?.reasoningTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(event: ObjectOnFinishEvent<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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedOnFinishEvent): 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: EmbedStartEvent): 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 onEmbedFinish(event: EmbedFinishEvent): 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(event: RerankOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onRerankOperationFinish(event: RerankOnFinishEvent): 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: RerankStartEvent): 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 onRerankFinish(event: RerankFinishEvent): 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 onChunk(event: OnChunkEvent<ToolSet>): void {\n const chunk = event.chunk as {\n type: string;\n callId?: unknown;\n attributes?: unknown;\n };\n\n if (typeof chunk.callId !== 'string') {\n return;\n }\n\n if (\n chunk.type !== 'ai.stream.firstChunk' &&\n chunk.type !== 'ai.stream.finish'\n ) {\n return;\n }\n\n const state = this.getCallState(chunk.callId);\n if (!state?.stepSpan) return;\n\n const attributes = Object.fromEntries(\n Object.entries(\n (chunk.attributes as Record<string, unknown>) ?? {},\n ).filter(([, value]) => value != null),\n ) as Attributes;\n\n state.stepSpan.addEvent(chunk.type, attributes);\n if (Object.keys(attributes).length > 0) {\n state.stepSpan.setAttributes(attributes);\n }\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 recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type { TelemetrySettings } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetrySettings;\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 { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { CallSettings, TelemetrySettings } from 'ai';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers,\n}: {\n model: { modelId: string; provider: string };\n settings: Omit<CallSettings, 'abortSignal' | 'headers' | 'temperature'>;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | 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 metadata as attributes:\n ...Object.entries(telemetry?.metadata ?? {}).reduce(\n (attributes, [key, value]) => {\n if (value != undefined) {\n attributes[`ai.telemetry.metadata.${key}`] = value as AttributeValue;\n }\n return attributes;\n },\n {} as Attributes,\n ),\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 {\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:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/open-telemetry-integration.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["export { OpenTelemetryIntegration } from './open-telemetry-integration';\n","import { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport {\n Attributes,\n AttributeValue,\n context,\n Context,\n Span,\n SpanStatusCode,\n trace,\n Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbedFinishEvent,\n EmbedOnFinishEvent,\n EmbedOnStartEvent,\n EmbedStartEvent,\n GenerationContext,\n ObjectOnFinishEvent,\n ObjectOnStartEvent,\n ObjectOnStepFinishEvent,\n ObjectOnStepStartEvent,\n OnChunkEvent,\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n OutputInterface as Output,\n RerankFinishEvent,\n RerankOnFinishEvent,\n RerankOnStartEvent,\n RerankStartEvent,\n TelemetryIntegration,\n TelemetrySettings,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\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: TelemetrySettings | undefined,\n): telemetry is TelemetrySettings {\n return telemetry?.isEnabled === true;\n}\n\nfunction selectAttributes(\n telemetry: TelemetrySettings | 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) result[key] = resolved;\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) result[key] = resolved;\n continue;\n }\n\n result[key] = value as AttributeValue;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n CONTEXT extends GenerationContext<TOOLS> = GenerationContext<TOOLS>,\n OUTPUT extends Output = Output,\n> extends OnStepStartEvent<TOOLS, 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: TelemetrySettings | undefined;\n rootSpan: Span | undefined;\n rootContext: Context | undefined;\n stepSpan: Span | undefined;\n stepContext: Context | undefined;\n embedSpans: Map<string, { span: Span; context: Context }>;\n rerankSpan: { span: Span; context: Context } | undefined;\n toolSpans: Map<string, { span: Span; context: Context }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class OpenTelemetryIntegration implements TelemetryIntegration {\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 onStart(\n event:\n | OnStartEvent<ToolSet, Output>\n | ObjectOnStartEvent\n | EmbedOnStartEvent\n | RerankOnStartEvent,\n ): void {\n if (event.isEnabled !== true) return;\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as EmbedOnStartEvent);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(event as RerankOnStartEvent);\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(event as ObjectOnStartEvent);\n return;\n }\n\n this.onGenerateStart(event as OnStartEvent<ToolSet, Output>);\n }\n\n private onGenerateStart(event: OnStartEvent<ToolSet, Output>): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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.system,\n prompt: event.prompt,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(event: ObjectOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: ObjectOnStepStartEvent): 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 onObjectStepFinish(event: ObjectOnStepFinishEvent): 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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\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(event: EmbedOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n onStepStart(event: OtelStepStartEvent<ToolSet, Output>): 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 onToolCallStart(event: OnToolCallStartEvent<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 '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 onToolCallFinish(event: OnToolCallFinishEvent<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 if (event.success) {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(event.output),\n },\n }),\n );\n } catch (_ignored) {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, event.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: OnStepFinishEvent<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 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\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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\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 state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | OnFinishEvent<ToolSet>\n | ObjectOnFinishEvent<unknown>\n | EmbedOnFinishEvent\n | RerankOnFinishEvent,\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.onEmbedOperationFinish(event as EmbedOnFinishEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankOnFinishEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as ObjectOnFinishEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as OnFinishEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: OnFinishEvent<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.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.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.totalUsage.inputTokens,\n 'ai.usage.outputTokens': event.totalUsage.outputTokens,\n 'ai.usage.totalTokens': event.totalUsage.totalTokens,\n 'ai.usage.reasoningTokens': event.totalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.totalUsage.cachedInputTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.totalUsage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.totalUsage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.totalUsage.outputTokenDetails?.reasoningTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(event: ObjectOnFinishEvent<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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedOnFinishEvent): 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: EmbedStartEvent): 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 onEmbedFinish(event: EmbedFinishEvent): 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(event: RerankOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onRerankOperationFinish(event: RerankOnFinishEvent): 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: RerankStartEvent): 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 onRerankFinish(event: RerankFinishEvent): 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 onChunk(event: OnChunkEvent<ToolSet>): void {\n const chunk = event.chunk as {\n type: string;\n callId?: unknown;\n attributes?: unknown;\n };\n\n if (typeof chunk.callId !== 'string') {\n return;\n }\n\n if (\n chunk.type !== 'ai.stream.firstChunk' &&\n chunk.type !== 'ai.stream.finish'\n ) {\n return;\n }\n\n const state = this.getCallState(chunk.callId);\n if (!state?.stepSpan) return;\n\n const attributes = Object.fromEntries(\n Object.entries(\n (chunk.attributes as Record<string, unknown>) ?? {},\n ).filter(([, value]) => value != null),\n ) as Attributes;\n\n state.stepSpan.addEvent(chunk.type, attributes);\n if (Object.keys(attributes).length > 0) {\n state.stepSpan.setAttributes(attributes);\n }\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 recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type { TelemetrySettings } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetrySettings;\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 { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { CallSettings, TelemetrySettings } from 'ai';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers,\n}: {\n model: { modelId: string; provider: string };\n settings: Omit<CallSettings, 'abortSignal' | 'headers' | 'temperature'>;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | 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 metadata as attributes:\n ...Object.entries(telemetry?.metadata ?? {}).reduce(\n (attributes, [key, value]) => {\n if (value != undefined) {\n attributes[`ai.telemetry.metadata.${key}`] = value as AttributeValue;\n }\n return attributes;\n },\n {} as Attributes,\n ),\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 {\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:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n}\n"],"mappings":"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","names":["_a"]}
package/dist/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  // src/open-telemetry-integration.ts
2
2
  import {
3
3
  context,
4
- trace,
5
- SpanStatusCode
4
+ SpanStatusCode,
5
+ trace
6
6
  } from "@opentelemetry/api";
7
7
 
8
8
  // src/assemble-operation-name.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/open-telemetry-integration.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["import { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport {\n context,\n trace,\n Span,\n Context,\n Attributes,\n AttributeValue,\n SpanStatusCode,\n Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbedOnStartEvent,\n EmbedOnFinishEvent,\n EmbedStartEvent,\n EmbedFinishEvent,\n RerankOnStartEvent,\n RerankOnFinishEvent,\n RerankStartEvent,\n RerankFinishEvent,\n OnChunkEvent,\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n ObjectOnStartEvent,\n ObjectOnFinishEvent,\n ObjectOnStepStartEvent,\n ObjectOnStepFinishEvent,\n TelemetryIntegration,\n TelemetrySettings,\n ToolSet,\n} from 'ai';\nimport type { OutputInterface as Output } from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\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: TelemetrySettings | undefined,\n): telemetry is TelemetrySettings {\n return telemetry?.isEnabled === true;\n}\n\nfunction selectAttributes(\n telemetry: TelemetrySettings | 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) result[key] = resolved;\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) result[key] = resolved;\n continue;\n }\n\n result[key] = value as AttributeValue;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n OUTPUT extends Output = Output,\n> extends OnStepStartEvent<TOOLS, 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: TelemetrySettings | undefined;\n rootSpan: Span | undefined;\n rootContext: Context | undefined;\n stepSpan: Span | undefined;\n stepContext: Context | undefined;\n embedSpans: Map<string, { span: Span; context: Context }>;\n rerankSpan: { span: Span; context: Context } | undefined;\n toolSpans: Map<string, { span: Span; context: Context }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class OpenTelemetryIntegration implements TelemetryIntegration {\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 onStart(\n event:\n | OnStartEvent<ToolSet, Output>\n | ObjectOnStartEvent\n | EmbedOnStartEvent\n | RerankOnStartEvent,\n ): void {\n if (event.isEnabled !== true) return;\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as EmbedOnStartEvent);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(event as RerankOnStartEvent);\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(event as ObjectOnStartEvent);\n return;\n }\n\n this.onGenerateStart(event as OnStartEvent<ToolSet, Output>);\n }\n\n private onGenerateStart(event: OnStartEvent<ToolSet, Output>): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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.system,\n prompt: event.prompt,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(event: ObjectOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: ObjectOnStepStartEvent): 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 onObjectStepFinish(event: ObjectOnStepFinishEvent): 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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\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(event: EmbedOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n onStepStart(event: OtelStepStartEvent<ToolSet, Output>): 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 onToolCallStart(event: OnToolCallStartEvent<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 '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 onToolCallFinish(event: OnToolCallFinishEvent<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 if (event.success) {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(event.output),\n },\n }),\n );\n } catch (_ignored) {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, event.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: OnStepFinishEvent<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 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\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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\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 state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | OnFinishEvent<ToolSet>\n | ObjectOnFinishEvent<unknown>\n | EmbedOnFinishEvent\n | RerankOnFinishEvent,\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.onEmbedOperationFinish(event as EmbedOnFinishEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankOnFinishEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as ObjectOnFinishEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as OnFinishEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: OnFinishEvent<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.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.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.totalUsage.inputTokens,\n 'ai.usage.outputTokens': event.totalUsage.outputTokens,\n 'ai.usage.totalTokens': event.totalUsage.totalTokens,\n 'ai.usage.reasoningTokens': event.totalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.totalUsage.cachedInputTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.totalUsage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.totalUsage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.totalUsage.outputTokenDetails?.reasoningTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(event: ObjectOnFinishEvent<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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedOnFinishEvent): 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: EmbedStartEvent): 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 onEmbedFinish(event: EmbedFinishEvent): 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(event: RerankOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onRerankOperationFinish(event: RerankOnFinishEvent): 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: RerankStartEvent): 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 onRerankFinish(event: RerankFinishEvent): 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 onChunk(event: OnChunkEvent<ToolSet>): void {\n const chunk = event.chunk as {\n type: string;\n callId?: unknown;\n attributes?: unknown;\n };\n\n if (typeof chunk.callId !== 'string') {\n return;\n }\n\n if (\n chunk.type !== 'ai.stream.firstChunk' &&\n chunk.type !== 'ai.stream.finish'\n ) {\n return;\n }\n\n const state = this.getCallState(chunk.callId);\n if (!state?.stepSpan) return;\n\n const attributes = Object.fromEntries(\n Object.entries(\n (chunk.attributes as Record<string, unknown>) ?? {},\n ).filter(([, value]) => value != null),\n ) as Attributes;\n\n state.stepSpan.addEvent(chunk.type, attributes);\n if (Object.keys(attributes).length > 0) {\n state.stepSpan.setAttributes(attributes);\n }\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 recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type { TelemetrySettings } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetrySettings;\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 { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { CallSettings, TelemetrySettings } from 'ai';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers,\n}: {\n model: { modelId: string; provider: string };\n settings: Omit<CallSettings, 'abortSignal' | 'headers' | 'temperature'>;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | 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 metadata as attributes:\n ...Object.entries(telemetry?.metadata ?? {}).reduce(\n (attributes, [key, value]) => {\n if (value != undefined) {\n attributes[`ai.telemetry.metadata.${key}`] = value as AttributeValue;\n }\n return attributes;\n },\n {} as Attributes,\n ),\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 {\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:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n}\n"],"mappings":"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","names":["_a"]}
1
+ {"version":3,"sources":["../src/open-telemetry-integration.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["import { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport {\n Attributes,\n AttributeValue,\n context,\n Context,\n Span,\n SpanStatusCode,\n trace,\n Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbedFinishEvent,\n EmbedOnFinishEvent,\n EmbedOnStartEvent,\n EmbedStartEvent,\n GenerationContext,\n ObjectOnFinishEvent,\n ObjectOnStartEvent,\n ObjectOnStepFinishEvent,\n ObjectOnStepStartEvent,\n OnChunkEvent,\n OnFinishEvent,\n OnStartEvent,\n OnStepFinishEvent,\n OnStepStartEvent,\n OnToolCallFinishEvent,\n OnToolCallStartEvent,\n OutputInterface as Output,\n RerankFinishEvent,\n RerankOnFinishEvent,\n RerankOnStartEvent,\n RerankStartEvent,\n TelemetryIntegration,\n TelemetrySettings,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\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: TelemetrySettings | undefined,\n): telemetry is TelemetrySettings {\n return telemetry?.isEnabled === true;\n}\n\nfunction selectAttributes(\n telemetry: TelemetrySettings | 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) result[key] = resolved;\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) result[key] = resolved;\n continue;\n }\n\n result[key] = value as AttributeValue;\n }\n\n return result;\n}\n\ninterface OtelStepStartEvent<\n TOOLS extends ToolSet = ToolSet,\n CONTEXT extends GenerationContext<TOOLS> = GenerationContext<TOOLS>,\n OUTPUT extends Output = Output,\n> extends OnStepStartEvent<TOOLS, 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: TelemetrySettings | undefined;\n rootSpan: Span | undefined;\n rootContext: Context | undefined;\n stepSpan: Span | undefined;\n stepContext: Context | undefined;\n embedSpans: Map<string, { span: Span; context: Context }>;\n rerankSpan: { span: Span; context: Context } | undefined;\n toolSpans: Map<string, { span: Span; context: Context }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class OpenTelemetryIntegration implements TelemetryIntegration {\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 onStart(\n event:\n | OnStartEvent<ToolSet, Output>\n | ObjectOnStartEvent\n | EmbedOnStartEvent\n | RerankOnStartEvent,\n ): void {\n if (event.isEnabled !== true) return;\n\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as EmbedOnStartEvent);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(event as RerankOnStartEvent);\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(event as ObjectOnStartEvent);\n return;\n }\n\n this.onGenerateStart(event as OnStartEvent<ToolSet, Output>);\n }\n\n private onGenerateStart(event: OnStartEvent<ToolSet, Output>): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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.system,\n prompt: event.prompt,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(event: ObjectOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: ObjectOnStepStartEvent): 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 onObjectStepFinish(event: ObjectOnStepFinishEvent): 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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\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(event: EmbedOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n onStepStart(event: OtelStepStartEvent<ToolSet, Output>): 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 onToolCallStart(event: OnToolCallStartEvent<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 '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 onToolCallFinish(event: OnToolCallFinishEvent<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 if (event.success) {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(event.output),\n },\n }),\n );\n } catch (_ignored) {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, event.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: OnStepFinishEvent<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 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\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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\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 state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | OnFinishEvent<ToolSet>\n | ObjectOnFinishEvent<unknown>\n | EmbedOnFinishEvent\n | RerankOnFinishEvent,\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.onEmbedOperationFinish(event as EmbedOnFinishEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankOnFinishEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as ObjectOnFinishEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as OnFinishEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: OnFinishEvent<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.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.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.totalUsage.inputTokens,\n 'ai.usage.outputTokens': event.totalUsage.outputTokens,\n 'ai.usage.totalTokens': event.totalUsage.totalTokens,\n 'ai.usage.reasoningTokens': event.totalUsage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.totalUsage.cachedInputTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.totalUsage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.totalUsage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.totalUsage.outputTokenDetails?.reasoningTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(event: ObjectOnFinishEvent<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': event.usage.reasoningTokens,\n 'ai.usage.cachedInputTokens': event.usage.cachedInputTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedOnFinishEvent): 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: EmbedStartEvent): 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 onEmbedFinish(event: EmbedFinishEvent): 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(event: RerankOnStartEvent): void {\n const telemetry: TelemetrySettings = {\n isEnabled: event.isEnabled,\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n metadata: event.metadata,\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 telemetry,\n headers: event.headers,\n settings,\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 toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onRerankOperationFinish(event: RerankOnFinishEvent): 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: RerankStartEvent): 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 onRerankFinish(event: RerankFinishEvent): 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 onChunk(event: OnChunkEvent<ToolSet>): void {\n const chunk = event.chunk as {\n type: string;\n callId?: unknown;\n attributes?: unknown;\n };\n\n if (typeof chunk.callId !== 'string') {\n return;\n }\n\n if (\n chunk.type !== 'ai.stream.firstChunk' &&\n chunk.type !== 'ai.stream.finish'\n ) {\n return;\n }\n\n const state = this.getCallState(chunk.callId);\n if (!state?.stepSpan) return;\n\n const attributes = Object.fromEntries(\n Object.entries(\n (chunk.attributes as Record<string, unknown>) ?? {},\n ).filter(([, value]) => value != null),\n ) as Attributes;\n\n state.stepSpan.addEvent(chunk.type, attributes);\n if (Object.keys(attributes).length > 0) {\n state.stepSpan.setAttributes(attributes);\n }\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 recordSpanError(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type { TelemetrySettings } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetrySettings;\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 { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { CallSettings, TelemetrySettings } from 'ai';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n telemetry,\n headers,\n}: {\n model: { modelId: string; provider: string };\n settings: Omit<CallSettings, 'abortSignal' | 'headers' | 'temperature'>;\n telemetry: TelemetrySettings | undefined;\n headers: Record<string, string | undefined> | 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 metadata as attributes:\n ...Object.entries(telemetry?.metadata ?? {}).reduce(\n (attributes, [key, value]) => {\n if (value != undefined) {\n attributes[`ai.telemetry.metadata.${key}`] = value as AttributeValue;\n }\n return attributes;\n },\n {} as Attributes,\n ),\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 {\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:\n part.data instanceof Uint8Array\n ? convertDataContentToBase64String(part.data)\n : part.data,\n }\n : part,\n ),\n })),\n );\n}\n"],"mappings":"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","names":["_a"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/otel",
3
- "version": "1.0.0-beta.2",
3
+ "version": "1.0.0-beta.4",
4
4
  "license": "Apache-2.0",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.js",
@@ -28,14 +28,14 @@
28
28
  "dependencies": {
29
29
  "@opentelemetry/api": "1.9.0",
30
30
  "@ai-sdk/provider": "4.0.0-beta.5",
31
- "ai": "7.0.0-beta.56"
31
+ "ai": "7.0.0-beta.58"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@types/node": "20.17.24",
35
35
  "tsup": "^8",
36
36
  "typescript": "5.8.3",
37
37
  "zod": "3.25.76",
38
- "@ai-sdk/provider-utils": "5.0.0-beta.7",
38
+ "@ai-sdk/provider-utils": "5.0.0-beta.9",
39
39
  "@vercel/ai-tsconfig": "0.0.0"
40
40
  },
41
41
  "engines": {
@@ -1,23 +1,24 @@
1
1
  import { LanguageModelV4Prompt } from '@ai-sdk/provider';
2
2
  import {
3
- context,
4
- trace,
5
- Span,
6
- Context,
7
3
  Attributes,
8
4
  AttributeValue,
5
+ context,
6
+ Context,
7
+ Span,
9
8
  SpanStatusCode,
9
+ trace,
10
10
  Tracer,
11
11
  } from '@opentelemetry/api';
12
12
  import type {
13
- EmbedOnStartEvent,
13
+ EmbedFinishEvent,
14
14
  EmbedOnFinishEvent,
15
+ EmbedOnStartEvent,
15
16
  EmbedStartEvent,
16
- EmbedFinishEvent,
17
- RerankOnStartEvent,
18
- RerankOnFinishEvent,
19
- RerankStartEvent,
20
- RerankFinishEvent,
17
+ GenerationContext,
18
+ ObjectOnFinishEvent,
19
+ ObjectOnStartEvent,
20
+ ObjectOnStepFinishEvent,
21
+ ObjectOnStepStartEvent,
21
22
  OnChunkEvent,
22
23
  OnFinishEvent,
23
24
  OnStartEvent,
@@ -25,15 +26,15 @@ import type {
25
26
  OnStepStartEvent,
26
27
  OnToolCallFinishEvent,
27
28
  OnToolCallStartEvent,
28
- ObjectOnStartEvent,
29
- ObjectOnFinishEvent,
30
- ObjectOnStepStartEvent,
31
- ObjectOnStepFinishEvent,
29
+ OutputInterface as Output,
30
+ RerankFinishEvent,
31
+ RerankOnFinishEvent,
32
+ RerankOnStartEvent,
33
+ RerankStartEvent,
32
34
  TelemetryIntegration,
33
35
  TelemetrySettings,
34
36
  ToolSet,
35
37
  } from 'ai';
36
- import type { OutputInterface as Output } from 'ai';
37
38
  import { assembleOperationName } from './assemble-operation-name';
38
39
  import { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';
39
40
  import { stringifyForTelemetry } from './stringify-for-telemetry';
@@ -109,8 +110,9 @@ function selectAttributes(
109
110
 
110
111
  interface OtelStepStartEvent<
111
112
  TOOLS extends ToolSet = ToolSet,
113
+ CONTEXT extends GenerationContext<TOOLS> = GenerationContext<TOOLS>,
112
114
  OUTPUT extends Output = Output,
113
- > extends OnStepStartEvent<TOOLS, OUTPUT> {
115
+ > extends OnStepStartEvent<TOOLS, CONTEXT, OUTPUT> {
114
116
  readonly promptMessages?: LanguageModelV4Prompt;
115
117
  readonly stepTools?: ReadonlyArray<Record<string, unknown>>;
116
118
  readonly stepToolChoice?: unknown;