@ai-sdk/otel 1.0.0-canary.76 → 1.0.0-canary.78
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 +19 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/src/legacy-open-telemetry.ts +2 -2
- package/src/open-telemetry.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @ai-sdk/otel
|
|
2
2
|
|
|
3
|
+
## 1.0.0-canary.78
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- eaf849f: Rename rerank telemetry finish callback to `onRerankEnd`.
|
|
8
|
+
- 8565dcb: fix: rename onEmbedFinish to onEmbedEnd
|
|
9
|
+
- Updated dependencies [eaf849f]
|
|
10
|
+
- Updated dependencies [8565dcb]
|
|
11
|
+
- ai@7.0.0-canary.132
|
|
12
|
+
|
|
13
|
+
## 1.0.0-canary.77
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- Updated dependencies [b67525f]
|
|
18
|
+
- Updated dependencies [ca446f8]
|
|
19
|
+
- Updated dependencies [bcacd48]
|
|
20
|
+
- ai@7.0.0-canary.131
|
|
21
|
+
|
|
3
22
|
## 1.0.0-canary.76
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -90,11 +90,11 @@ declare class OpenTelemetry implements Telemetry {
|
|
|
90
90
|
private onObjectOperationFinish;
|
|
91
91
|
private onEmbedOperationFinish;
|
|
92
92
|
onEmbedStart(event: EmbeddingModelCallStartEvent): void;
|
|
93
|
-
|
|
93
|
+
onEmbedEnd(event: EmbeddingModelCallEndEvent): void;
|
|
94
94
|
private onRerankOperationStart;
|
|
95
95
|
private onRerankOperationFinish;
|
|
96
96
|
onRerankStart(event: RerankingModelCallStartEvent): void;
|
|
97
|
-
|
|
97
|
+
onRerankEnd(event: RerankingModelCallEndEvent): void;
|
|
98
98
|
onChunk(_event: StreamTextChunkEvent<ToolSet>): void;
|
|
99
99
|
onError(error: unknown): void;
|
|
100
100
|
}
|
|
@@ -137,11 +137,11 @@ declare class LegacyOpenTelemetry implements Telemetry {
|
|
|
137
137
|
private onObjectOperationFinish;
|
|
138
138
|
private onEmbedOperationFinish;
|
|
139
139
|
onEmbedStart(event: EmbeddingModelCallStartEvent): void;
|
|
140
|
-
|
|
140
|
+
onEmbedEnd(event: EmbeddingModelCallEndEvent): void;
|
|
141
141
|
private onRerankOperationStart;
|
|
142
142
|
private onRerankOperationFinish;
|
|
143
143
|
onRerankStart(event: RerankingModelCallStartEvent): void;
|
|
144
|
-
|
|
144
|
+
onRerankEnd(event: RerankingModelCallEndEvent): void;
|
|
145
145
|
onChunk(event: StreamTextChunkEvent<ToolSet>): void;
|
|
146
146
|
onError(error: unknown): void;
|
|
147
147
|
}
|
package/dist/index.js
CHANGED
|
@@ -1302,7 +1302,7 @@ var OpenTelemetry = class {
|
|
|
1302
1302
|
context: embedContext
|
|
1303
1303
|
});
|
|
1304
1304
|
}
|
|
1305
|
-
|
|
1305
|
+
onEmbedEnd(event) {
|
|
1306
1306
|
const state = this.getCallState(event.callId);
|
|
1307
1307
|
if (!state) return;
|
|
1308
1308
|
const embedSpanEntry = state.embedSpans.get(event.embedCallId);
|
|
@@ -1428,7 +1428,7 @@ var OpenTelemetry = class {
|
|
|
1428
1428
|
const rerankContext = trace.setSpan(state.rootContext, rerankSpan);
|
|
1429
1429
|
state.rerankSpan = { span: rerankSpan, context: rerankContext };
|
|
1430
1430
|
}
|
|
1431
|
-
|
|
1431
|
+
onRerankEnd(event) {
|
|
1432
1432
|
const state = this.getCallState(event.callId);
|
|
1433
1433
|
if (!(state == null ? void 0 : state.rerankSpan)) return;
|
|
1434
1434
|
const { span } = state.rerankSpan;
|
|
@@ -2184,7 +2184,7 @@ var LegacyOpenTelemetry = class {
|
|
|
2184
2184
|
context: embedContext
|
|
2185
2185
|
});
|
|
2186
2186
|
}
|
|
2187
|
-
|
|
2187
|
+
onEmbedEnd(event) {
|
|
2188
2188
|
const state = this.getCallState(event.callId);
|
|
2189
2189
|
if (!state) return;
|
|
2190
2190
|
const embedSpanEntry = state.embedSpans.get(event.embedCallId);
|
|
@@ -2271,7 +2271,7 @@ var LegacyOpenTelemetry = class {
|
|
|
2271
2271
|
const rerankContext = trace2.setSpan(state.rootContext, rerankSpan);
|
|
2272
2272
|
state.rerankSpan = { span: rerankSpan, context: rerankContext };
|
|
2273
2273
|
}
|
|
2274
|
-
|
|
2274
|
+
onRerankEnd(event) {
|
|
2275
2275
|
const state = this.getCallState(event.callId);
|
|
2276
2276
|
if (!(state == null ? void 0 : state.rerankSpan)) return;
|
|
2277
2277
|
const { span } = state.rerankSpan;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/open-telemetry.ts","../src/gen-ai-format-messages.ts","../src/record-span.ts","../src/select-attributes.ts","../src/supplemental-attributes.ts","../src/legacy-open-telemetry.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["import {\n context,\n SpanKind,\n trace,\n type Attributes,\n type Context as OpenTelemetryContext,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbeddingModelCallEndEvent,\n EmbedEndEvent,\n EmbedStartEvent,\n LanguageModelCallEndEvent,\n LanguageModelCallStartEvent,\n EmbeddingModelCallStartEvent,\n GenerateObjectEndEvent,\n GenerateObjectStartEvent,\n GenerateObjectStepEndEvent,\n GenerateObjectStepStartEvent,\n StreamTextChunkEvent,\n GenerateTextEndEvent,\n GenerateTextStartEvent,\n GenerateTextStepEndEvent,\n GenerateTextStepStartEvent,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n RerankingModelCallEndEvent,\n RerankEndEvent,\n RerankStartEvent,\n RerankingModelCallStartEvent,\n InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport {\n formatInputMessages,\n formatModelMessages,\n formatObjectOutputMessages,\n formatOutputMessages,\n formatSystemInstructions,\n mapOperationName,\n mapProviderName,\n} from './gen-ai-format-messages';\nimport { recordErrorOnSpan } from './record-span';\nimport { selectAttributes } from './select-attributes';\nimport {\n getDetailedUsageAttributes,\n getHeaderAttributes,\n getRuntimeContextAttributes,\n normalizeSupplementalAttributes,\n selectSupplementalAttributes,\n type EnrichSpan,\n type OpenTelemetryOptions,\n type OpenTelemetrySpanType,\n type SupplementalAttributeOptions,\n} from './supplemental-attributes';\n\nexport type {\n EnrichSpan,\n OpenTelemetryOptions,\n OpenTelemetrySpanType,\n} from './supplemental-attributes';\n\ninterface OtelStepStartEvent extends GenerateTextStepStartEvent<ToolSet> {\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetryOptions | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n inferenceSpan: Span | undefined;\n inferenceContext: OpenTelemetryContext | undefined;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n settings: Record<string, unknown>;\n provider: string;\n modelId: string;\n runtimeContext: Record<string, unknown> | undefined;\n baseSupplementalAttributes: Attributes;\n}\n\nexport class OpenTelemetry implements Telemetry {\n private readonly callStates = new Map<string, CallState>();\n\n private readonly tracer: Tracer;\n private readonly supplementalAttributes: SupplementalAttributeOptions;\n private readonly enrichSpan: EnrichSpan | undefined;\n\n constructor(options: OpenTelemetryOptions = {}) {\n this.tracer = options.tracer ?? trace.getTracer('gen_ai');\n this.supplementalAttributes = normalizeSupplementalAttributes(options);\n this.enrichSpan = options.enrichSpan;\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n private getSpanAttributes({\n attributes,\n spanType,\n operationId,\n callId,\n runtimeContext,\n }: {\n attributes: Attributes;\n spanType: OpenTelemetrySpanType;\n operationId: string;\n callId: string;\n runtimeContext: Record<string, unknown> | undefined;\n }): Attributes {\n let customAttributes: Attributes | undefined;\n\n try {\n customAttributes = this.enrichSpan?.({\n spanType,\n operationId,\n callId,\n runtimeContext,\n });\n } catch {\n customAttributes = undefined;\n }\n\n return {\n ...customAttributes,\n ...attributes,\n };\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n onStart(\n event:\n | InferTelemetryEvent<GenerateTextStartEvent>\n | InferTelemetryEvent<GenerateObjectStartEvent>\n | InferTelemetryEvent<EmbedStartEvent>\n | InferTelemetryEvent<RerankStartEvent>,\n ): void {\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as InferTelemetryEvent<EmbedStartEvent>);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(\n event as InferTelemetryEvent<RerankStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(\n event as InferTelemetryEvent<GenerateObjectStartEvent>,\n );\n return;\n }\n\n this.onGenerateStart(event as InferTelemetryEvent<GenerateTextStartEvent>);\n }\n\n private onGenerateStart(\n event: InferTelemetryEvent<GenerateTextStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const runtimeContext = event.runtimeContext as\n | Record<string, unknown>\n | undefined;\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.stop_sequences': event.stopSequences,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions': event.instructions\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.instructions!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: undefined,\n messages: event.messages,\n }),\n ),\n },\n ...baseSupplementalAttributes,\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n private onObjectOperationStart(\n event: InferTelemetryEvent<GenerateObjectStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions': event.system\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.system!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: event.prompt,\n messages: event.messages,\n }),\n ),\n },\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n schema: {\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n },\n }),\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: GenerateObjectStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.input.messages': {\n input: () =>\n event.promptMessages\n ? JSON.stringify(formatInputMessages(event.promptMessages))\n : undefined,\n },\n ...state.baseSupplementalAttributes,\n });\n\n const spanName = `chat ${event.modelId}`;\n state.inferenceSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'languageModel',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n state.inferenceContext = trace.setSpan(\n state.rootContext,\n state.inferenceSpan,\n );\n }\n\n /** @deprecated */\n onObjectStepFinish(event: GenerateObjectStepEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.inferenceSpan) return;\n\n const { telemetry } = state;\n\n state.inferenceSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.output.messages': {\n output: () => {\n try {\n return JSON.stringify(\n formatObjectOutputMessages({\n objectText: event.objectText,\n finishReason: event.finishReason,\n }),\n );\n } catch {\n return event.objectText;\n }\n },\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n private onEmbedOperationStart(\n event: InferTelemetryEvent<EmbedStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const providerName = mapProviderName(event.provider);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n const value = event.value;\n const isMany = event.operationId === 'ai.embedMany';\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'embeddings',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n embedding: isMany\n ? {\n 'ai.values': {\n input: () => (value as string[]).map(v => JSON.stringify(v)),\n },\n }\n : {\n 'ai.value': {\n input: () => JSON.stringify(value),\n },\n },\n }),\n });\n\n const spanName = `embeddings ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n });\n }\n\n onStepStart(event: OtelStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n state.runtimeContext = event.runtimeContext as\n | Record<string, unknown>\n | undefined;\n const stepAttributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'agent_step',\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n toolChoice: {\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n },\n }),\n });\n\n state.stepSpan = this.tracer.startSpan(\n `step ${event.steps.length + 1}`,\n {\n attributes: this.getSpanAttributes({\n attributes: stepAttributes,\n spanType: 'step',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onLanguageModelCallStart(event: LanguageModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n\n const inferenceAttributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.input.messages': {\n input: () => {\n const formattedMessages = formatModelMessages({\n prompt: undefined,\n messages: event.messages,\n });\n\n return formattedMessages.length > 0\n ? JSON.stringify(formattedMessages)\n : undefined;\n },\n },\n 'gen_ai.tool.definitions': {\n input: () => (event.tools ? JSON.stringify(event.tools) : undefined),\n },\n });\n\n state.inferenceSpan = this.tracer.startSpan(\n `chat ${event.modelId}`,\n {\n attributes: this.getSpanAttributes({\n attributes: inferenceAttributes,\n spanType: 'languageModel',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.stepContext,\n );\n state.inferenceContext = trace.setSpan(\n state.stepContext,\n state.inferenceSpan,\n );\n }\n\n onLanguageModelCallEnd(event: LanguageModelCallEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.inferenceSpan) return;\n\n const { telemetry } = state;\n\n state.inferenceSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.responseId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text:\n event.content\n .filter(p => p.type === 'text')\n .map(p => p.text)\n .join('') || undefined,\n reasoning: event.content.filter(p => p.type === 'reasoning'),\n toolCalls: event.content.filter(p => p.type === 'tool-call'),\n files: event.content\n .filter(p => p.type === 'file')\n .map(p => p.file),\n finishReason: event.finishReason,\n }),\n ),\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'execute_tool',\n 'gen_ai.tool.name': toolCall.toolName,\n 'gen_ai.tool.call.id': toolCall.toolCallId,\n 'gen_ai.tool.type': 'function',\n 'gen_ai.tool.call.arguments': {\n input: () => JSON.stringify(toolCall.input),\n },\n });\n\n const spanName = `execute_tool ${toolCall.toolName}`;\n const toolSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'tool',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n const { toolOutput } = event;\n if (toolOutput.type === 'tool-result') {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.tool.call.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordErrorOnSpan(span, toolOutput.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | GenerateTextEndEvent<ToolSet>\n | GenerateObjectEndEvent<unknown>\n | EmbedEndEvent\n | RerankEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationFinish(event as EmbedEndEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankEndEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as GenerateObjectEndEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as GenerateTextEndEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: GenerateTextEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.totalUsage.inputTokens,\n 'gen_ai.usage.output_tokens': event.totalUsage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text: event.text ?? undefined,\n reasoning: event.reasoning as ReadonlyArray<{ text?: string }>,\n toolCalls: event.toolCalls,\n files: event.files,\n finishReason: event.finishReason,\n }),\n ),\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.totalUsage),\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(\n event: GenerateObjectEndEvent<unknown>,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.output.messages': {\n output: () =>\n event.object != null\n ? JSON.stringify(\n formatObjectOutputMessages({\n objectText: JSON.stringify(event.object),\n finishReason: event.finishReason,\n }),\n )\n : undefined,\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.usage.input_tokens': event.usage.tokens,\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n embedding: isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e =>\n JSON.stringify(e),\n ),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n },\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbeddingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'embeddings',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n embedding: {\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n },\n }),\n });\n\n const spanName = `embeddings ${state.modelId}`;\n const embedSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'embedding',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedFinish(event: EmbeddingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.usage.input_tokens': event.usage.tokens,\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n embedding: {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n },\n },\n ),\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(\n event: InferTelemetryEvent<RerankStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const providerName = mapProviderName(event.provider);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n },\n }),\n });\n\n const spanName = `rerank ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n });\n }\n\n private onRerankOperationFinish(event: RerankEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n },\n }),\n });\n\n const spanName = `rerank ${state.modelId}`;\n const rerankSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'reranking',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankFinish(event: RerankingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n onChunk(_event: StreamTextChunkEvent<ToolSet>): void {\n // No-op: streaming chunk events are not part of the GenAI SemConv.\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n for (const { span: toolSpan } of state.toolSpans.values()) {\n recordErrorOnSpan(toolSpan, actualError);\n toolSpan.end();\n }\n state.toolSpans.clear();\n\n if (state.inferenceSpan) {\n recordErrorOnSpan(state.inferenceSpan, actualError);\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n if (state.stepSpan) {\n recordErrorOnSpan(state.stepSpan, actualError);\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordErrorOnSpan(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordErrorOnSpan(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n recordErrorOnSpan(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type {\n LanguageModelV4CustomPart,\n LanguageModelV4FilePart,\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n LanguageModelV4ReasoningFilePart,\n LanguageModelV4ReasoningPart,\n LanguageModelV4TextPart,\n LanguageModelV4ToolApprovalResponsePart,\n LanguageModelV4ToolCallPart,\n LanguageModelV4ToolResultPart,\n} from '@ai-sdk/provider';\nimport type { ModelMessage } from '@ai-sdk/provider-utils';\nimport { convertDataContentToBase64String } from 'ai';\n\ntype LanguageModelV4ContentPart =\n | LanguageModelV4TextPart\n | LanguageModelV4FilePart\n | LanguageModelV4CustomPart\n | LanguageModelV4ReasoningPart\n | LanguageModelV4ReasoningFilePart\n | LanguageModelV4ToolCallPart\n | LanguageModelV4ToolResultPart\n | LanguageModelV4ToolApprovalResponsePart;\n\ntype SemConvPart =\n | { type: 'text'; content: string }\n | { type: 'reasoning'; content: string }\n | {\n type: 'tool_call';\n id: string | null;\n name: string;\n arguments?: unknown;\n }\n | {\n type: 'tool_call_response';\n id: string | null;\n response: unknown;\n }\n | {\n type: 'blob';\n modality: string;\n mime_type: string | null;\n content: string;\n }\n | { type: string; [key: string]: unknown };\n\ninterface SemConvInputMessage {\n role: string;\n parts: SemConvPart[];\n}\n\ninterface SemConvOutputMessage {\n role: string;\n parts: SemConvPart[];\n finish_reason: string;\n}\n\ninterface SemConvSystemInstruction {\n type: string;\n content?: string;\n [key: string]: unknown;\n}\n\n/**\n * Maps an AI SDK provider string (e.g. \"anthropic.messages\", \"openai.chat\")\n * to a well-known gen_ai.provider.name value per the OTel GenAI SemConv.\n *\n * Provider strings come in formats like:\n * \"openai.chat\", \"google.generative-ai\", \"google.vertex.chat\",\n * \"google-vertex\", \"amazon-bedrock.chat\", \"azure.chat\"\n *\n * We match against longest-prefix-first to handle multi-segment prefixes\n * like \"google.vertex\" and \"google.generative-ai\" before the single-segment \"google\".\n */\nexport function mapProviderName(provider: string): string {\n const lower = provider.toLowerCase();\n\n const wellKnownPrefixes: Array<[string, string]> = [\n ['google.vertex', 'gcp.vertex_ai'],\n ['google.generative-ai', 'gcp.gemini'],\n ['google-vertex', 'gcp.vertex_ai'],\n ['amazon-bedrock', 'aws.bedrock'],\n ['azure-openai', 'azure.ai.openai'],\n ['anthropic', 'anthropic'],\n ['openai', 'openai'],\n ['azure', 'azure.ai.inference'],\n ['google', 'gcp.gemini'],\n ['mistral', 'mistral_ai'],\n ['cohere', 'cohere'],\n ['bedrock', 'aws.bedrock'],\n ['groq', 'groq'],\n ['deepseek', 'deepseek'],\n ['perplexity', 'perplexity'],\n ['xai', 'x_ai'],\n ];\n\n for (const [prefix, mapped] of wellKnownPrefixes) {\n if (\n lower === prefix ||\n lower.startsWith(prefix + '.') ||\n lower.startsWith(prefix + '-')\n ) {\n return mapped;\n }\n }\n\n return provider;\n}\n\n/**\n * Maps an AI SDK operationId to a gen_ai.operation.name value.\n */\nexport function mapOperationName(operationId: string): string {\n const mapping: Record<string, string> = {\n 'ai.generateText': 'invoke_agent',\n 'ai.streamText': 'invoke_agent',\n 'ai.generateObject': 'invoke_agent',\n 'ai.streamObject': 'invoke_agent',\n 'ai.embed': 'embeddings',\n 'ai.embedMany': 'embeddings',\n 'ai.rerank': 'rerank',\n };\n return mapping[operationId] ?? operationId;\n}\n\n/**\n * Converts a system value to the gen_ai.system_instructions SemConv format.\n * Accepts a plain string, a single SystemModelMessage, or an array of them.\n * Schema: array of parts, each with at least { type, content }.\n */\nexport function formatSystemInstructions(\n system:\n | string\n | { role: 'system'; content: string }\n | Array<{ role: 'system'; content: string }>,\n): SemConvSystemInstruction[] {\n if (typeof system === 'string') {\n return [{ type: 'text', content: system }];\n }\n if (Array.isArray(system)) {\n return system.map(msg => ({ type: 'text', content: msg.content }));\n }\n return [{ type: 'text', content: system.content }];\n}\n\nfunction convertMessagePartToSemConv(\n part: LanguageModelV4ContentPart,\n): SemConvPart {\n switch (part.type) {\n case 'text':\n return { type: 'text', content: part.text };\n\n case 'reasoning':\n return { type: 'reasoning', content: part.text };\n\n case 'tool-call':\n return {\n type: 'tool_call',\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response',\n id: part.toolCallId ?? null,\n response,\n };\n }\n\n case 'file': {\n const rawData = part.data as\n | string\n | Uint8Array\n | URL\n | ArrayBuffer\n | { type: 'data'; data: string | Uint8Array | ArrayBuffer }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n\n const data: string | Uint8Array | URL | ArrayBuffer = (() => {\n if (\n typeof rawData === 'object' &&\n rawData !== null &&\n !(rawData instanceof URL) &&\n !(rawData instanceof Uint8Array) &&\n !(rawData instanceof ArrayBuffer) &&\n 'type' in rawData\n ) {\n switch (rawData.type) {\n case 'data':\n return rawData.data;\n case 'url':\n return rawData.url;\n case 'text':\n return rawData.text;\n default:\n return '';\n }\n }\n return rawData as string | Uint8Array | URL | ArrayBuffer;\n })();\n\n let content: string;\n if (data instanceof Uint8Array) {\n content = convertDataContentToBase64String(data);\n } else if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n content = data;\n } else if (data instanceof URL) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n } else {\n content = String(data);\n }\n return {\n type: 'blob',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content,\n };\n }\n\n case 'tool-approval-response':\n return {\n type: 'tool_approval_response',\n approval_id: part.approvalId,\n approved: part.approved,\n reason: part.reason,\n };\n\n case 'custom':\n return { type: 'custom', kind: part.kind };\n\n case 'reasoning-file':\n return { type: String(part.type) };\n\n default: {\n const _exhaustive: never = part;\n return { type: String((_exhaustive as { type: string }).type) };\n }\n }\n}\n\nfunction getModality(mediaType: string | undefined): string {\n if (!mediaType) return 'image';\n if (mediaType.startsWith('image/')) return 'image';\n if (mediaType.startsWith('video/')) return 'video';\n if (mediaType.startsWith('audio/')) return 'audio';\n return 'image';\n}\n\n/**\n * Converts a LanguageModelV4Prompt to the gen_ai.input.messages SemConv format.\n * System messages are excluded (they go into gen_ai.system_instructions).\n */\nexport function formatInputMessages(\n prompt: LanguageModelV4Prompt,\n): SemConvInputMessage[] {\n return prompt\n .filter(msg => msg.role !== 'system')\n .map((message: LanguageModelV4Message) => {\n if (message.role === 'system') {\n return {\n role: 'system',\n parts: [{ type: 'text', content: message.content }],\n };\n }\n\n const parts = message.content.map(convertMessagePartToSemConv);\n return { role: message.role, parts };\n });\n}\n\n/**\n * Converts user-facing ModelMessage[] (and optional prompt string) to the\n * gen_ai.input.messages SemConv format. System messages are excluded\n * (they belong in gen_ai.system_instructions).\n */\nexport function formatModelMessages({\n prompt,\n messages,\n}: {\n prompt: string | Array<ModelMessage> | undefined;\n messages: Array<ModelMessage> | undefined;\n}): SemConvInputMessage[] {\n const result: SemConvInputMessage[] = [];\n\n if (typeof prompt === 'string') {\n result.push({\n role: 'user',\n parts: [{ type: 'text', content: prompt }],\n });\n } else if (Array.isArray(prompt)) {\n for (const msg of prompt) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n if (messages) {\n for (const msg of messages) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n return result;\n}\n\nfunction convertModelMessageToSemConv(\n msg: ModelMessage,\n): SemConvInputMessage | undefined {\n if (msg.role === 'system') return undefined;\n\n if (msg.role === 'user') {\n if (typeof msg.content === 'string') {\n return {\n role: 'user',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'image': {\n const data = part.image;\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n case 'file': {\n const rawData = part.data as\n | string\n | Uint8Array\n | URL\n | ArrayBuffer\n | { type: 'data'; data: string | Uint8Array | ArrayBuffer }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n\n const data: string | Uint8Array | URL | ArrayBuffer = (() => {\n if (\n typeof rawData === 'object' &&\n rawData !== null &&\n !(rawData instanceof URL) &&\n !(rawData instanceof Uint8Array) &&\n !(rawData instanceof ArrayBuffer) &&\n 'type' in rawData\n ) {\n switch (rawData.type) {\n case 'data':\n return rawData.data;\n case 'url':\n return rawData.url;\n case 'text':\n return rawData.text;\n default:\n return '';\n }\n }\n return rawData as string | Uint8Array | URL | ArrayBuffer;\n })();\n\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'user', parts };\n }\n\n if (msg.role === 'assistant') {\n if (typeof msg.content === 'string') {\n return {\n role: 'assistant',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'reasoning':\n return { type: 'reasoning' as const, content: part.text };\n case 'tool-call':\n return {\n type: 'tool_call' as const,\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'assistant', parts };\n }\n\n if (msg.role === 'tool') {\n const parts: SemConvPart[] = msg.content.map(part => {\n if (part.type === 'tool-result') {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n return { type: String((part as { type: string }).type) };\n });\n return { role: 'tool', parts };\n }\n\n return undefined;\n}\n\n/**\n * Extracts the system instruction from a LanguageModelV4Prompt if present.\n */\nexport function extractSystemFromPrompt(\n prompt: LanguageModelV4Prompt,\n): string | undefined {\n const systemMsg = prompt.find(msg => msg.role === 'system');\n if (systemMsg && systemMsg.role === 'system') {\n return systemMsg.content;\n }\n return undefined;\n}\n\n/**\n * Converts step result data to the gen_ai.output.messages SemConv format.\n */\nexport function formatOutputMessages({\n text,\n reasoning,\n toolCalls,\n files,\n finishReason,\n}: {\n text?: string;\n reasoning?: ReadonlyArray<{ text?: string }>;\n toolCalls?: ReadonlyArray<{\n toolCallId: string;\n toolName: string;\n input: unknown;\n }>;\n files?: ReadonlyArray<{ mediaType: string; base64: string }>;\n finishReason: string;\n}): SemConvOutputMessage[] {\n const parts: SemConvPart[] = [];\n\n if (reasoning) {\n for (const r of reasoning) {\n if ('text' in r && r.text) {\n parts.push({ type: 'reasoning', content: r.text });\n }\n }\n }\n\n if (text != null && text.length > 0) {\n parts.push({ type: 'text', content: text });\n }\n\n if (toolCalls) {\n for (const tc of toolCalls) {\n parts.push({\n type: 'tool_call',\n id: tc.toolCallId,\n name: tc.toolName,\n arguments: tc.input,\n });\n }\n }\n\n if (files) {\n for (const file of files) {\n parts.push({\n type: 'blob',\n modality: getModality(file.mediaType),\n mime_type: file.mediaType,\n content: file.base64,\n });\n }\n }\n\n return [\n {\n role: 'assistant',\n parts,\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\n/**\n * Converts generateObject result to the gen_ai.output.messages SemConv format.\n */\nexport function formatObjectOutputMessages({\n objectText,\n finishReason,\n}: {\n objectText: string;\n finishReason: string;\n}): SemConvOutputMessage[] {\n return [\n {\n role: 'assistant',\n parts: [{ type: 'text', content: objectText }],\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\nfunction mapFinishReason(reason: string): string {\n const mapping: Record<string, string> = {\n stop: 'stop',\n length: 'length',\n 'content-filter': 'content_filter',\n 'tool-calls': 'tool_call',\n error: 'error',\n other: 'stop',\n unknown: 'stop',\n };\n return mapping[reason] ?? reason;\n}\n","import {\n SpanStatusCode,\n context,\n type Attributes,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nexport async function recordSpan<T>({\n name,\n tracer,\n attributes,\n fn,\n endWhenDone = true,\n}: {\n name: string;\n tracer: Tracer;\n attributes: Attributes | PromiseLike<Attributes>;\n fn: (span: Span) => Promise<T>;\n endWhenDone?: boolean;\n}) {\n return tracer.startActiveSpan(\n name,\n { attributes: await attributes },\n async span => {\n // Capture the current context to maintain it across async generator yields\n const ctx = context.active();\n\n try {\n // Execute within the captured context to ensure async generators\n // don't lose the active span when they yield\n const result = await context.with(ctx, () => fn(span));\n\n if (endWhenDone) {\n span.end();\n }\n\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n // always stop the span when there is an error:\n span.end();\n }\n\n throw error;\n }\n },\n );\n}\n\n/**\n * Record an error on a span. Sets the span status to error. If the error is\n * an instance of Error, an exception event with name, message, and stack\n * will also be recorded.\n *\n * @param span - The span to record the error on.\n * @param error - The error to record on the span.\n */\nexport function recordErrorOnSpan(span: Span, error: unknown) {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { TelemetryOptions } from 'ai';\n\nexport type AttributeSpec =\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined;\n\nexport type AttributeSpecMap = Record<string, AttributeSpec>;\n\nfunction shouldRecord(\n telemetry: TelemetryOptions | undefined,\n): telemetry is TelemetryOptions {\n return telemetry?.isEnabled !== false;\n}\n\nexport function selectAttributes(\n telemetry: TelemetryOptions | undefined,\n attributes: AttributeSpecMap,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) 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","import type { Attributes, Tracer } from '@opentelemetry/api';\nimport type { TelemetryOptions } from 'ai';\nimport { selectAttributes, type AttributeSpecMap } from './select-attributes';\n\ntype SupplementalAttributeOption =\n | 'usage'\n | 'providerMetadata'\n | 'embedding'\n | 'reranking'\n | 'runtimeContext'\n | 'headers'\n | 'toolChoice'\n | 'schema';\n\nexport type SupplementalAttributeOptions = Record<\n SupplementalAttributeOption,\n boolean\n>;\n\nexport type OpenTelemetrySpanType =\n | 'operation'\n | 'step'\n | 'languageModel'\n | 'tool'\n | 'embedding'\n | 'reranking';\n\nexport type EnrichSpan = (options: {\n spanType: OpenTelemetrySpanType;\n operationId: string;\n callId: string;\n runtimeContext: Record<string, unknown> | undefined;\n}) => Attributes | undefined;\n\nexport type OpenTelemetryOptions = {\n /**\n * The tracer to use for the telemetry data.\n */\n tracer?: Tracer;\n\n /**\n * Adds custom attributes to spans when they are created. These attributes are\n * not AI SDK-owned semantics and are intended for observability integrations.\n */\n enrichSpan?: EnrichSpan;\n\n /**\n * Emit AI SDK usage details that are not represented by GenAI SemConv.\n */\n usage?: boolean;\n\n /**\n * Emit provider metadata on response spans.\n */\n providerMetadata?: boolean;\n\n /**\n * Emit embedding input and output values.\n */\n embedding?: boolean;\n\n /**\n * Emit reranking input documents and output ranking.\n */\n reranking?: boolean;\n\n /**\n * Emit runtime context values.\n */\n runtimeContext?: boolean;\n\n /**\n * Emit request headers.\n */\n headers?: boolean;\n\n /**\n * Emit selected tool choice information.\n */\n toolChoice?: boolean;\n\n /**\n * Emit object generation schema information.\n */\n schema?: boolean;\n};\n\nconst disabledSupplementalAttributes: SupplementalAttributeOptions = {\n usage: false,\n providerMetadata: false,\n embedding: false,\n reranking: false,\n runtimeContext: false,\n headers: false,\n toolChoice: false,\n schema: false,\n};\n\nexport function normalizeSupplementalAttributes(\n options: OpenTelemetryOptions,\n): SupplementalAttributeOptions {\n return {\n ...disabledSupplementalAttributes,\n usage: options.usage ?? false,\n providerMetadata: options.providerMetadata ?? false,\n embedding: options.embedding ?? false,\n reranking: options.reranking ?? false,\n runtimeContext: options.runtimeContext ?? false,\n headers: options.headers ?? false,\n toolChoice: options.toolChoice ?? false,\n schema: options.schema ?? false,\n };\n}\n\nexport function getRuntimeContextAttributes(\n context: Record<string, unknown> | undefined,\n): AttributeSpecMap {\n return Object.fromEntries(\n Object.entries(context ?? {})\n .filter(([, value]) => value != null)\n .map(([key, value]) => [`ai.settings.context.${key}`, value]),\n ) as AttributeSpecMap;\n}\n\nexport function getHeaderAttributes(\n headers: Record<string, string | undefined> | undefined,\n): AttributeSpecMap {\n return Object.fromEntries(\n Object.entries(headers ?? {})\n .filter(([, value]) => value != null)\n .map(([key, value]) => [`ai.request.headers.${key}`, value]),\n ) as AttributeSpecMap;\n}\n\nexport function getDetailedUsageAttributes(usage: {\n inputTokenDetails?: {\n noCacheTokens?: number | undefined;\n };\n outputTokenDetails?: {\n textTokens?: number | undefined;\n reasoningTokens?: number | undefined;\n };\n}): AttributeSpecMap {\n return {\n 'ai.usage.inputTokenDetails.noCacheTokens':\n usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n usage.outputTokenDetails?.reasoningTokens,\n };\n}\n\nexport function selectSupplementalAttributes(\n telemetry: TelemetryOptions | undefined,\n enabledAttributes: SupplementalAttributeOptions,\n attributes: Partial<Record<SupplementalAttributeOption, AttributeSpecMap>>,\n): Attributes {\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes) as Array<\n [SupplementalAttributeOption, AttributeSpecMap | undefined]\n >) {\n if (!enabledAttributes[key] || value == null) {\n continue;\n }\n\n Object.assign(result, selectAttributes(telemetry, value));\n }\n\n return result;\n}\n","import type { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport type { Context as AISDKContext } from '@ai-sdk/provider-utils';\nimport {\n context,\n SpanStatusCode,\n trace,\n type Attributes,\n type AttributeValue,\n type Context as OpenTelemetryContext,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbeddingModelCallEndEvent,\n EmbedEndEvent,\n EmbedStartEvent,\n EmbeddingModelCallStartEvent,\n GenerateObjectEndEvent,\n GenerateObjectStartEvent,\n GenerateObjectStepEndEvent,\n GenerateObjectStepStartEvent,\n StreamTextChunkEvent,\n GenerateTextEndEvent,\n GenerateTextStartEvent,\n GenerateTextStepEndEvent,\n GenerateTextStepStartEvent,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n OutputInterface as Output,\n RerankingModelCallEndEvent,\n RerankEndEvent,\n RerankStartEvent,\n RerankingModelCallStartEvent,\n InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\nimport { stringifyForTelemetry } from './stringify-for-telemetry';\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction shouldRecord(\n telemetry: TelemetryOptions | undefined,\n): telemetry is TelemetryOptions {\n return telemetry?.isEnabled !== false;\n}\n\nfunction selectAttributes(\n telemetry: TelemetryOptions | undefined,\n attributes: Record<\n string,\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined\n >,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) 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 RUNTIME_CONTEXT extends AISDKContext = AISDKContext,\n OUTPUT extends Output = Output,\n> extends GenerateTextStepStartEvent<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n readonly promptMessages?: LanguageModelV4Prompt;\n readonly stepTools?: ReadonlyArray<Record<string, unknown>>;\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetryOptions | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class LegacyOpenTelemetry implements Telemetry {\n private readonly callStates = new Map<string, CallState>();\n\n /**\n * The tracer to use for the telemetry data.\n */\n private readonly tracer: Tracer;\n\n constructor(\n options: {\n tracer?: Tracer;\n } = {},\n ) {\n this.tracer = options.tracer ?? trace.getTracer('ai');\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n onStart(\n event:\n | InferTelemetryEvent<GenerateTextStartEvent>\n | InferTelemetryEvent<GenerateObjectStartEvent>\n | InferTelemetryEvent<EmbedStartEvent>\n | InferTelemetryEvent<RerankStartEvent>,\n ): void {\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as InferTelemetryEvent<EmbedStartEvent>);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(\n event as InferTelemetryEvent<RerankStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(\n event as InferTelemetryEvent<GenerateObjectStartEvent>,\n );\n return;\n }\n\n this.onGenerateStart(event as InferTelemetryEvent<GenerateTextStartEvent>);\n }\n\n private onGenerateStart(\n event: InferTelemetryEvent<GenerateTextStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext as Record<string, unknown> | undefined,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.instructions,\n messages: event.messages,\n }),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(\n event: InferTelemetryEvent<GenerateObjectStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: undefined,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.system,\n prompt: event.prompt,\n messages: event.messages,\n }),\n },\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: GenerateObjectStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamObject'\n ? 'ai.streamObject.doStream'\n : 'ai.generateObject.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n /** @deprecated */\n onObjectStepFinish(event: GenerateObjectStepEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () => {\n try {\n return JSON.stringify(JSON.parse(event.objectText));\n } catch {\n return event.objectText;\n }\n },\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n if (event.msToFirstChunk != null) {\n state.stepSpan.addEvent('ai.stream.firstChunk', {\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n state.stepSpan.setAttributes({\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n }\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n private onEmbedOperationStart(\n event: InferTelemetryEvent<EmbedStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: undefined,\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): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamText'\n ? 'ai.streamText.doStream'\n : 'ai.generateText.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n 'ai.prompt.tools': {\n input: () => event.stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n 'ai.toolCall.name': toolCall.toolName,\n 'ai.toolCall.id': toolCall.toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(toolCall.input),\n },\n });\n\n const toolSpan = this.tracer.startSpan(\n 'ai.toolCall',\n { attributes },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n const { toolOutput } = event;\n if (toolOutput.type === 'tool-result') {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, toolOutput.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n 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':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | GenerateTextEndEvent<ToolSet>\n | GenerateObjectEndEvent<unknown>\n | EmbedEndEvent\n | RerankEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationFinish(event as EmbedEndEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankEndEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as GenerateObjectEndEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as GenerateTextEndEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: GenerateTextEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.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':\n event.totalUsage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\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(\n event: GenerateObjectEndEvent<unknown>,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () =>\n event.object != null ? JSON.stringify(event.object) : undefined,\n },\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n ...(isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e => JSON.stringify(e)),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n }),\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbeddingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n });\n\n const embedSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedFinish(event: EmbeddingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(\n event: InferTelemetryEvent<RerankStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: undefined,\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: RerankEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rerankSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankFinish(event: RerankingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n onChunk(event: StreamTextChunkEvent<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 { TelemetryOptions } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetryOptions;\n}) {\n return {\n // standardized operation and resource name:\n 'operation.name': `${operationId}${\n telemetry?.functionId != null ? ` ${telemetry.functionId}` : ''\n }`,\n 'resource.name': telemetry?.functionId,\n\n // detailed, AI SDK specific data:\n 'ai.operationId': operationId,\n 'ai.telemetry.functionId': telemetry?.functionId,\n };\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { LanguageModelCallOptions } from 'ai';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n headers,\n context,\n}: {\n model: { modelId: string; provider: string };\n settings: LanguageModelCallOptions;\n headers: Record<string, string | undefined> | undefined;\n context: Record<string, unknown> | undefined;\n}): Attributes {\n return {\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n attributes[`ai.settings.${key}`] = value as AttributeValue;\n return attributes;\n }, {} as Attributes),\n\n // add context as attributes:\n ...Object.entries(context ?? {}).reduce((attributes, [key, value]) => {\n if (value != undefined) {\n attributes[`ai.settings.context.${key}`] = value as AttributeValue;\n }\n return attributes;\n }, {} as Attributes),\n\n // request headers\n ...Object.entries(headers ?? {}).reduce((attributes, [key, value]) => {\n if (value !== undefined) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {} as Attributes),\n };\n}\n","import type {\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport { convertDataContentToBase64String } from 'ai';\n\n/**\n * Helper utility to serialize prompt content for OpenTelemetry tracing.\n * It is initially created because normalized LanguageModelV4Prompt carries\n * images as Uint8Arrays, on which JSON.stringify acts weirdly, converting\n * them to objects with stringified indices as keys, e.g. {\"0\": 42, \"1\": 69 }.\n */\nexport function stringifyForTelemetry(prompt: LanguageModelV4Prompt): string {\n return JSON.stringify(\n prompt.map((message: LanguageModelV4Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data: serializeFileData(part.data),\n }\n : part,\n ),\n })),\n );\n}\n\nfunction serializeFileData(\n data:\n | { type: 'data'; data: string | Uint8Array }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string },\n): unknown {\n switch (data.type) {\n case 'data':\n return data.data instanceof Uint8Array\n ? convertDataContentToBase64String(data.data)\n : data.data;\n case 'url':\n return data.url.toString();\n case 'reference':\n return data.reference;\n case 'text':\n return data.text;\n }\n}\n"],"mappings":"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","names":["context","context","context","_a","context","SpanStatusCode","trace","context","convertDataContentToBase64String","SpanStatusCode","shouldRecord","selectAttributes","trace","context","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/open-telemetry.ts","../src/gen-ai-format-messages.ts","../src/record-span.ts","../src/select-attributes.ts","../src/supplemental-attributes.ts","../src/legacy-open-telemetry.ts","../src/assemble-operation-name.ts","../src/get-base-telemetry-attributes.ts","../src/stringify-for-telemetry.ts"],"sourcesContent":["import {\n context,\n SpanKind,\n trace,\n type Attributes,\n type Context as OpenTelemetryContext,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbeddingModelCallEndEvent,\n EmbedEndEvent,\n EmbedStartEvent,\n LanguageModelCallEndEvent,\n LanguageModelCallStartEvent,\n EmbeddingModelCallStartEvent,\n GenerateObjectEndEvent,\n GenerateObjectStartEvent,\n GenerateObjectStepEndEvent,\n GenerateObjectStepStartEvent,\n StreamTextChunkEvent,\n GenerateTextEndEvent,\n GenerateTextStartEvent,\n GenerateTextStepEndEvent,\n GenerateTextStepStartEvent,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n RerankingModelCallEndEvent,\n RerankEndEvent,\n RerankStartEvent,\n RerankingModelCallStartEvent,\n InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport {\n formatInputMessages,\n formatModelMessages,\n formatObjectOutputMessages,\n formatOutputMessages,\n formatSystemInstructions,\n mapOperationName,\n mapProviderName,\n} from './gen-ai-format-messages';\nimport { recordErrorOnSpan } from './record-span';\nimport { selectAttributes } from './select-attributes';\nimport {\n getDetailedUsageAttributes,\n getHeaderAttributes,\n getRuntimeContextAttributes,\n normalizeSupplementalAttributes,\n selectSupplementalAttributes,\n type EnrichSpan,\n type OpenTelemetryOptions,\n type OpenTelemetrySpanType,\n type SupplementalAttributeOptions,\n} from './supplemental-attributes';\n\nexport type {\n EnrichSpan,\n OpenTelemetryOptions,\n OpenTelemetrySpanType,\n} from './supplemental-attributes';\n\ninterface OtelStepStartEvent extends GenerateTextStepStartEvent<ToolSet> {\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetryOptions | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n inferenceSpan: Span | undefined;\n inferenceContext: OpenTelemetryContext | undefined;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n settings: Record<string, unknown>;\n provider: string;\n modelId: string;\n runtimeContext: Record<string, unknown> | undefined;\n baseSupplementalAttributes: Attributes;\n}\n\nexport class OpenTelemetry implements Telemetry {\n private readonly callStates = new Map<string, CallState>();\n\n private readonly tracer: Tracer;\n private readonly supplementalAttributes: SupplementalAttributeOptions;\n private readonly enrichSpan: EnrichSpan | undefined;\n\n constructor(options: OpenTelemetryOptions = {}) {\n this.tracer = options.tracer ?? trace.getTracer('gen_ai');\n this.supplementalAttributes = normalizeSupplementalAttributes(options);\n this.enrichSpan = options.enrichSpan;\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n private getSpanAttributes({\n attributes,\n spanType,\n operationId,\n callId,\n runtimeContext,\n }: {\n attributes: Attributes;\n spanType: OpenTelemetrySpanType;\n operationId: string;\n callId: string;\n runtimeContext: Record<string, unknown> | undefined;\n }): Attributes {\n let customAttributes: Attributes | undefined;\n\n try {\n customAttributes = this.enrichSpan?.({\n spanType,\n operationId,\n callId,\n runtimeContext,\n });\n } catch {\n customAttributes = undefined;\n }\n\n return {\n ...customAttributes,\n ...attributes,\n };\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n onStart(\n event:\n | InferTelemetryEvent<GenerateTextStartEvent>\n | InferTelemetryEvent<GenerateObjectStartEvent>\n | InferTelemetryEvent<EmbedStartEvent>\n | InferTelemetryEvent<RerankStartEvent>,\n ): void {\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as InferTelemetryEvent<EmbedStartEvent>);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(\n event as InferTelemetryEvent<RerankStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(\n event as InferTelemetryEvent<GenerateObjectStartEvent>,\n );\n return;\n }\n\n this.onGenerateStart(event as InferTelemetryEvent<GenerateTextStartEvent>);\n }\n\n private onGenerateStart(\n event: InferTelemetryEvent<GenerateTextStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const runtimeContext = event.runtimeContext as\n | Record<string, unknown>\n | undefined;\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n runtimeContext: getRuntimeContextAttributes(runtimeContext),\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.stop_sequences': event.stopSequences,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions': event.instructions\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.instructions!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: undefined,\n messages: event.messages,\n }),\n ),\n },\n ...baseSupplementalAttributes,\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext,\n baseSupplementalAttributes,\n });\n }\n\n private onObjectOperationStart(\n event: InferTelemetryEvent<GenerateObjectStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const providerName = mapProviderName(event.provider);\n const operationName = mapOperationName(event.operationId);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': operationName,\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.agent.name': telemetry.functionId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': event.frequencyPenalty,\n 'gen_ai.request.max_tokens': event.maxOutputTokens,\n 'gen_ai.request.presence_penalty': event.presencePenalty,\n 'gen_ai.request.temperature': (event.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': event.topK,\n 'gen_ai.request.top_p': event.topP,\n 'gen_ai.request.seed': event.seed,\n 'gen_ai.system_instructions': event.system\n ? {\n input: () =>\n JSON.stringify(formatSystemInstructions(event.system!)),\n }\n : undefined,\n 'gen_ai.input.messages': {\n input: () =>\n JSON.stringify(\n formatModelMessages({\n prompt: event.prompt,\n messages: event.messages,\n }),\n ),\n },\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n schema: {\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n },\n }),\n });\n\n const spanName = `${operationName} ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.INTERNAL,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings,\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: GenerateObjectStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.output.type': 'json',\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.input.messages': {\n input: () =>\n event.promptMessages\n ? JSON.stringify(formatInputMessages(event.promptMessages))\n : undefined,\n },\n ...state.baseSupplementalAttributes,\n });\n\n const spanName = `chat ${event.modelId}`;\n state.inferenceSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'languageModel',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n state.inferenceContext = trace.setSpan(\n state.rootContext,\n state.inferenceSpan,\n );\n }\n\n /** @deprecated */\n onObjectStepFinish(event: GenerateObjectStepEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.inferenceSpan) return;\n\n const { telemetry } = state;\n\n state.inferenceSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.output.messages': {\n output: () => {\n try {\n return JSON.stringify(\n formatObjectOutputMessages({\n objectText: event.objectText,\n finishReason: event.finishReason,\n }),\n );\n } catch {\n return event.objectText;\n }\n },\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n private onEmbedOperationStart(\n event: InferTelemetryEvent<EmbedStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const providerName = mapProviderName(event.provider);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n const value = event.value;\n const isMany = event.operationId === 'ai.embedMany';\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'embeddings',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n embedding: isMany\n ? {\n 'ai.values': {\n input: () => (value as string[]).map(v => JSON.stringify(v)),\n },\n }\n : {\n 'ai.value': {\n input: () => JSON.stringify(value),\n },\n },\n }),\n });\n\n const spanName = `embeddings ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n });\n }\n\n onStepStart(event: OtelStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n state.runtimeContext = event.runtimeContext as\n | Record<string, unknown>\n | undefined;\n const stepAttributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'agent_step',\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n toolChoice: {\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n },\n }),\n });\n\n state.stepSpan = this.tracer.startSpan(\n `step ${event.steps.length + 1}`,\n {\n attributes: this.getSpanAttributes({\n attributes: stepAttributes,\n spanType: 'step',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onLanguageModelCallStart(event: LanguageModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(event.provider);\n\n const inferenceAttributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'chat',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n 'gen_ai.input.messages': {\n input: () => {\n const formattedMessages = formatModelMessages({\n prompt: undefined,\n messages: event.messages,\n });\n\n return formattedMessages.length > 0\n ? JSON.stringify(formattedMessages)\n : undefined;\n },\n },\n 'gen_ai.tool.definitions': {\n input: () => (event.tools ? JSON.stringify(event.tools) : undefined),\n },\n });\n\n state.inferenceSpan = this.tracer.startSpan(\n `chat ${event.modelId}`,\n {\n attributes: this.getSpanAttributes({\n attributes: inferenceAttributes,\n spanType: 'languageModel',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.stepContext,\n );\n state.inferenceContext = trace.setSpan(\n state.stepContext,\n state.inferenceSpan,\n );\n }\n\n onLanguageModelCallEnd(event: LanguageModelCallEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.inferenceSpan) return;\n\n const { telemetry } = state;\n\n state.inferenceSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.responseId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text:\n event.content\n .filter(p => p.type === 'text')\n .map(p => p.text)\n .join('') || undefined,\n reasoning: event.content.filter(p => p.type === 'reasoning'),\n toolCalls: event.content.filter(p => p.type === 'tool-call'),\n files: event.content\n .filter(p => p.type === 'file')\n .map(p => p.file),\n finishReason: event.finishReason,\n }),\n ),\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'execute_tool',\n 'gen_ai.tool.name': toolCall.toolName,\n 'gen_ai.tool.call.id': toolCall.toolCallId,\n 'gen_ai.tool.type': 'function',\n 'gen_ai.tool.call.arguments': {\n input: () => JSON.stringify(toolCall.input),\n },\n });\n\n const spanName = `execute_tool ${toolCall.toolName}`;\n const toolSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'tool',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.INTERNAL,\n },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n const { toolOutput } = event;\n if (toolOutput.type === 'tool-result') {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.tool.call.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordErrorOnSpan(span, toolOutput.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | GenerateTextEndEvent<ToolSet>\n | GenerateObjectEndEvent<unknown>\n | EmbedEndEvent\n | RerankEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationFinish(event as EmbedEndEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankEndEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as GenerateObjectEndEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as GenerateTextEndEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: GenerateTextEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.totalUsage.inputTokens,\n 'gen_ai.usage.output_tokens': event.totalUsage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.usage.cache_creation.input_tokens':\n event.totalUsage.inputTokenDetails?.cacheWriteTokens,\n 'gen_ai.output.messages': {\n output: () =>\n JSON.stringify(\n formatOutputMessages({\n text: event.text ?? undefined,\n reasoning: event.reasoning as ReadonlyArray<{ text?: string }>,\n toolCalls: event.toolCalls,\n files: event.files,\n finishReason: event.finishReason,\n }),\n ),\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.totalUsage),\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onObjectOperationFinish(\n event: GenerateObjectEndEvent<unknown>,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n 'gen_ai.usage.cache_read.input_tokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'gen_ai.output.messages': {\n output: () =>\n event.object != null\n ? JSON.stringify(\n formatObjectOutputMessages({\n objectText: JSON.stringify(event.object),\n finishReason: event.finishReason,\n }),\n )\n : undefined,\n },\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n providerMetadata: {\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n },\n usage: getDetailedUsageAttributes(event.usage),\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.usage.input_tokens': event.usage.tokens,\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n embedding: isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e =>\n JSON.stringify(e),\n ),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n },\n },\n ),\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbeddingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'embeddings',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n embedding: {\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n },\n }),\n });\n\n const spanName = `embeddings ${state.modelId}`;\n const embedSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'embedding',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedEnd(event: EmbeddingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'gen_ai.usage.input_tokens': event.usage.tokens,\n ...selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n embedding: {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n },\n },\n ),\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(\n event: InferTelemetryEvent<RerankStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const providerName = mapProviderName(event.provider);\n const baseSupplementalAttributes = selectSupplementalAttributes(\n telemetry,\n this.supplementalAttributes,\n {\n headers: getHeaderAttributes(event.headers),\n },\n );\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': event.modelId,\n ...baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n },\n }),\n });\n\n const spanName = `rerank ${event.modelId}`;\n const rootSpan = this.tracer.startSpan(spanName, {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'operation',\n operationId: event.operationId,\n callId: event.callId,\n runtimeContext: undefined,\n }),\n kind: SpanKind.CLIENT,\n });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n inferenceSpan: undefined,\n inferenceContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n settings: { maxRetries: event.maxRetries },\n provider: event.provider,\n modelId: event.modelId,\n runtimeContext: undefined,\n baseSupplementalAttributes,\n });\n }\n\n private onRerankOperationFinish(event: RerankEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n const providerName = mapProviderName(state.provider);\n\n const attributes = selectAttributes(telemetry, {\n 'gen_ai.operation.name': 'rerank',\n 'gen_ai.provider.name': providerName,\n 'gen_ai.request.model': state.modelId,\n ...state.baseSupplementalAttributes,\n ...selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n },\n }),\n });\n\n const spanName = `rerank ${state.modelId}`;\n const rerankSpan = this.tracer.startSpan(\n spanName,\n {\n attributes: this.getSpanAttributes({\n attributes,\n spanType: 'reranking',\n operationId: state.operationId,\n callId: event.callId,\n runtimeContext: state.runtimeContext,\n }),\n kind: SpanKind.CLIENT,\n },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankEnd(event: RerankingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectSupplementalAttributes(telemetry, this.supplementalAttributes, {\n reranking: {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n onChunk(_event: StreamTextChunkEvent<ToolSet>): void {\n // No-op: streaming chunk events are not part of the GenAI SemConv.\n }\n\n onError(error: unknown): void {\n const event = error as { callId?: string; error?: unknown };\n if (!event?.callId) return;\n\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const actualError = event.error ?? error;\n\n for (const { span: toolSpan } of state.toolSpans.values()) {\n recordErrorOnSpan(toolSpan, actualError);\n toolSpan.end();\n }\n state.toolSpans.clear();\n\n if (state.inferenceSpan) {\n recordErrorOnSpan(state.inferenceSpan, actualError);\n state.inferenceSpan.end();\n state.inferenceSpan = undefined;\n state.inferenceContext = undefined;\n }\n\n if (state.stepSpan) {\n recordErrorOnSpan(state.stepSpan, actualError);\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n for (const { span: embedSpan } of state.embedSpans.values()) {\n recordErrorOnSpan(embedSpan, actualError);\n embedSpan.end();\n }\n state.embedSpans.clear();\n\n if (state.rerankSpan) {\n recordErrorOnSpan(state.rerankSpan.span, actualError);\n state.rerankSpan.span.end();\n state.rerankSpan = undefined;\n }\n\n recordErrorOnSpan(state.rootSpan, actualError);\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n}\n","import type {\n LanguageModelV4CustomPart,\n LanguageModelV4FilePart,\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n LanguageModelV4ReasoningFilePart,\n LanguageModelV4ReasoningPart,\n LanguageModelV4TextPart,\n LanguageModelV4ToolApprovalResponsePart,\n LanguageModelV4ToolCallPart,\n LanguageModelV4ToolResultPart,\n} from '@ai-sdk/provider';\nimport type { ModelMessage } from '@ai-sdk/provider-utils';\nimport { convertDataContentToBase64String } from 'ai';\n\ntype LanguageModelV4ContentPart =\n | LanguageModelV4TextPart\n | LanguageModelV4FilePart\n | LanguageModelV4CustomPart\n | LanguageModelV4ReasoningPart\n | LanguageModelV4ReasoningFilePart\n | LanguageModelV4ToolCallPart\n | LanguageModelV4ToolResultPart\n | LanguageModelV4ToolApprovalResponsePart;\n\ntype SemConvPart =\n | { type: 'text'; content: string }\n | { type: 'reasoning'; content: string }\n | {\n type: 'tool_call';\n id: string | null;\n name: string;\n arguments?: unknown;\n }\n | {\n type: 'tool_call_response';\n id: string | null;\n response: unknown;\n }\n | {\n type: 'blob';\n modality: string;\n mime_type: string | null;\n content: string;\n }\n | { type: string; [key: string]: unknown };\n\ninterface SemConvInputMessage {\n role: string;\n parts: SemConvPart[];\n}\n\ninterface SemConvOutputMessage {\n role: string;\n parts: SemConvPart[];\n finish_reason: string;\n}\n\ninterface SemConvSystemInstruction {\n type: string;\n content?: string;\n [key: string]: unknown;\n}\n\n/**\n * Maps an AI SDK provider string (e.g. \"anthropic.messages\", \"openai.chat\")\n * to a well-known gen_ai.provider.name value per the OTel GenAI SemConv.\n *\n * Provider strings come in formats like:\n * \"openai.chat\", \"google.generative-ai\", \"google.vertex.chat\",\n * \"google-vertex\", \"amazon-bedrock.chat\", \"azure.chat\"\n *\n * We match against longest-prefix-first to handle multi-segment prefixes\n * like \"google.vertex\" and \"google.generative-ai\" before the single-segment \"google\".\n */\nexport function mapProviderName(provider: string): string {\n const lower = provider.toLowerCase();\n\n const wellKnownPrefixes: Array<[string, string]> = [\n ['google.vertex', 'gcp.vertex_ai'],\n ['google.generative-ai', 'gcp.gemini'],\n ['google-vertex', 'gcp.vertex_ai'],\n ['amazon-bedrock', 'aws.bedrock'],\n ['azure-openai', 'azure.ai.openai'],\n ['anthropic', 'anthropic'],\n ['openai', 'openai'],\n ['azure', 'azure.ai.inference'],\n ['google', 'gcp.gemini'],\n ['mistral', 'mistral_ai'],\n ['cohere', 'cohere'],\n ['bedrock', 'aws.bedrock'],\n ['groq', 'groq'],\n ['deepseek', 'deepseek'],\n ['perplexity', 'perplexity'],\n ['xai', 'x_ai'],\n ];\n\n for (const [prefix, mapped] of wellKnownPrefixes) {\n if (\n lower === prefix ||\n lower.startsWith(prefix + '.') ||\n lower.startsWith(prefix + '-')\n ) {\n return mapped;\n }\n }\n\n return provider;\n}\n\n/**\n * Maps an AI SDK operationId to a gen_ai.operation.name value.\n */\nexport function mapOperationName(operationId: string): string {\n const mapping: Record<string, string> = {\n 'ai.generateText': 'invoke_agent',\n 'ai.streamText': 'invoke_agent',\n 'ai.generateObject': 'invoke_agent',\n 'ai.streamObject': 'invoke_agent',\n 'ai.embed': 'embeddings',\n 'ai.embedMany': 'embeddings',\n 'ai.rerank': 'rerank',\n };\n return mapping[operationId] ?? operationId;\n}\n\n/**\n * Converts a system value to the gen_ai.system_instructions SemConv format.\n * Accepts a plain string, a single SystemModelMessage, or an array of them.\n * Schema: array of parts, each with at least { type, content }.\n */\nexport function formatSystemInstructions(\n system:\n | string\n | { role: 'system'; content: string }\n | Array<{ role: 'system'; content: string }>,\n): SemConvSystemInstruction[] {\n if (typeof system === 'string') {\n return [{ type: 'text', content: system }];\n }\n if (Array.isArray(system)) {\n return system.map(msg => ({ type: 'text', content: msg.content }));\n }\n return [{ type: 'text', content: system.content }];\n}\n\nfunction convertMessagePartToSemConv(\n part: LanguageModelV4ContentPart,\n): SemConvPart {\n switch (part.type) {\n case 'text':\n return { type: 'text', content: part.text };\n\n case 'reasoning':\n return { type: 'reasoning', content: part.text };\n\n case 'tool-call':\n return {\n type: 'tool_call',\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response',\n id: part.toolCallId ?? null,\n response,\n };\n }\n\n case 'file': {\n const rawData = part.data as\n | string\n | Uint8Array\n | URL\n | ArrayBuffer\n | { type: 'data'; data: string | Uint8Array | ArrayBuffer }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n\n const data: string | Uint8Array | URL | ArrayBuffer = (() => {\n if (\n typeof rawData === 'object' &&\n rawData !== null &&\n !(rawData instanceof URL) &&\n !(rawData instanceof Uint8Array) &&\n !(rawData instanceof ArrayBuffer) &&\n 'type' in rawData\n ) {\n switch (rawData.type) {\n case 'data':\n return rawData.data;\n case 'url':\n return rawData.url;\n case 'text':\n return rawData.text;\n default:\n return '';\n }\n }\n return rawData as string | Uint8Array | URL | ArrayBuffer;\n })();\n\n let content: string;\n if (data instanceof Uint8Array) {\n content = convertDataContentToBase64String(data);\n } else if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n content = data;\n } else if (data instanceof URL) {\n return {\n type: 'uri',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n } else {\n content = String(data);\n }\n return {\n type: 'blob',\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content,\n };\n }\n\n case 'tool-approval-response':\n return {\n type: 'tool_approval_response',\n approval_id: part.approvalId,\n approved: part.approved,\n reason: part.reason,\n };\n\n case 'custom':\n return { type: 'custom', kind: part.kind };\n\n case 'reasoning-file':\n return { type: String(part.type) };\n\n default: {\n const _exhaustive: never = part;\n return { type: String((_exhaustive as { type: string }).type) };\n }\n }\n}\n\nfunction getModality(mediaType: string | undefined): string {\n if (!mediaType) return 'image';\n if (mediaType.startsWith('image/')) return 'image';\n if (mediaType.startsWith('video/')) return 'video';\n if (mediaType.startsWith('audio/')) return 'audio';\n return 'image';\n}\n\n/**\n * Converts a LanguageModelV4Prompt to the gen_ai.input.messages SemConv format.\n * System messages are excluded (they go into gen_ai.system_instructions).\n */\nexport function formatInputMessages(\n prompt: LanguageModelV4Prompt,\n): SemConvInputMessage[] {\n return prompt\n .filter(msg => msg.role !== 'system')\n .map((message: LanguageModelV4Message) => {\n if (message.role === 'system') {\n return {\n role: 'system',\n parts: [{ type: 'text', content: message.content }],\n };\n }\n\n const parts = message.content.map(convertMessagePartToSemConv);\n return { role: message.role, parts };\n });\n}\n\n/**\n * Converts user-facing ModelMessage[] (and optional prompt string) to the\n * gen_ai.input.messages SemConv format. System messages are excluded\n * (they belong in gen_ai.system_instructions).\n */\nexport function formatModelMessages({\n prompt,\n messages,\n}: {\n prompt: string | Array<ModelMessage> | undefined;\n messages: Array<ModelMessage> | undefined;\n}): SemConvInputMessage[] {\n const result: SemConvInputMessage[] = [];\n\n if (typeof prompt === 'string') {\n result.push({\n role: 'user',\n parts: [{ type: 'text', content: prompt }],\n });\n } else if (Array.isArray(prompt)) {\n for (const msg of prompt) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n if (messages) {\n for (const msg of messages) {\n const converted = convertModelMessageToSemConv(msg);\n if (converted) result.push(converted);\n }\n }\n\n return result;\n}\n\nfunction convertModelMessageToSemConv(\n msg: ModelMessage,\n): SemConvInputMessage | undefined {\n if (msg.role === 'system') return undefined;\n\n if (msg.role === 'user') {\n if (typeof msg.content === 'string') {\n return {\n role: 'user',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'image': {\n const data = part.image;\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: 'image',\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n case 'file': {\n const rawData = part.data as\n | string\n | Uint8Array\n | URL\n | ArrayBuffer\n | { type: 'data'; data: string | Uint8Array | ArrayBuffer }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string };\n\n const data: string | Uint8Array | URL | ArrayBuffer = (() => {\n if (\n typeof rawData === 'object' &&\n rawData !== null &&\n !(rawData instanceof URL) &&\n !(rawData instanceof Uint8Array) &&\n !(rawData instanceof ArrayBuffer) &&\n 'type' in rawData\n ) {\n switch (rawData.type) {\n case 'data':\n return rawData.data;\n case 'url':\n return rawData.url;\n case 'text':\n return rawData.text;\n default:\n return '';\n }\n }\n return rawData as string | Uint8Array | URL | ArrayBuffer;\n })();\n\n if (data instanceof URL) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data.toString(),\n };\n }\n if (typeof data === 'string') {\n if (data.startsWith('http://') || data.startsWith('https://')) {\n return {\n type: 'uri' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n uri: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: data,\n };\n }\n return {\n type: 'blob' as const,\n modality: getModality(part.mediaType),\n mime_type: part.mediaType ?? null,\n content: convertDataContentToBase64String(data as Uint8Array),\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'user', parts };\n }\n\n if (msg.role === 'assistant') {\n if (typeof msg.content === 'string') {\n return {\n role: 'assistant',\n parts: [{ type: 'text', content: msg.content }],\n };\n }\n const parts: SemConvPart[] = msg.content.map(part => {\n switch (part.type) {\n case 'text':\n return { type: 'text' as const, content: part.text };\n case 'reasoning':\n return { type: 'reasoning' as const, content: part.text };\n case 'tool-call':\n return {\n type: 'tool_call' as const,\n id: part.toolCallId ?? null,\n name: part.toolName,\n arguments: part.input,\n };\n case 'tool-result': {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n default:\n return { type: String((part as { type: string }).type) };\n }\n });\n return { role: 'assistant', parts };\n }\n\n if (msg.role === 'tool') {\n const parts: SemConvPart[] = msg.content.map(part => {\n if (part.type === 'tool-result') {\n const output = part.output;\n let response: unknown;\n if (output) {\n if (output.type === 'text' || output.type === 'error-text') {\n response = output.value;\n } else if (output.type === 'json' || output.type === 'error-json') {\n response = output.value;\n } else if (output.type === 'execution-denied') {\n response = { denied: true, reason: output.reason };\n } else {\n response = output;\n }\n }\n return {\n type: 'tool_call_response' as const,\n id: part.toolCallId ?? null,\n response,\n };\n }\n return { type: String((part as { type: string }).type) };\n });\n return { role: 'tool', parts };\n }\n\n return undefined;\n}\n\n/**\n * Extracts the system instruction from a LanguageModelV4Prompt if present.\n */\nexport function extractSystemFromPrompt(\n prompt: LanguageModelV4Prompt,\n): string | undefined {\n const systemMsg = prompt.find(msg => msg.role === 'system');\n if (systemMsg && systemMsg.role === 'system') {\n return systemMsg.content;\n }\n return undefined;\n}\n\n/**\n * Converts step result data to the gen_ai.output.messages SemConv format.\n */\nexport function formatOutputMessages({\n text,\n reasoning,\n toolCalls,\n files,\n finishReason,\n}: {\n text?: string;\n reasoning?: ReadonlyArray<{ text?: string }>;\n toolCalls?: ReadonlyArray<{\n toolCallId: string;\n toolName: string;\n input: unknown;\n }>;\n files?: ReadonlyArray<{ mediaType: string; base64: string }>;\n finishReason: string;\n}): SemConvOutputMessage[] {\n const parts: SemConvPart[] = [];\n\n if (reasoning) {\n for (const r of reasoning) {\n if ('text' in r && r.text) {\n parts.push({ type: 'reasoning', content: r.text });\n }\n }\n }\n\n if (text != null && text.length > 0) {\n parts.push({ type: 'text', content: text });\n }\n\n if (toolCalls) {\n for (const tc of toolCalls) {\n parts.push({\n type: 'tool_call',\n id: tc.toolCallId,\n name: tc.toolName,\n arguments: tc.input,\n });\n }\n }\n\n if (files) {\n for (const file of files) {\n parts.push({\n type: 'blob',\n modality: getModality(file.mediaType),\n mime_type: file.mediaType,\n content: file.base64,\n });\n }\n }\n\n return [\n {\n role: 'assistant',\n parts,\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\n/**\n * Converts generateObject result to the gen_ai.output.messages SemConv format.\n */\nexport function formatObjectOutputMessages({\n objectText,\n finishReason,\n}: {\n objectText: string;\n finishReason: string;\n}): SemConvOutputMessage[] {\n return [\n {\n role: 'assistant',\n parts: [{ type: 'text', content: objectText }],\n finish_reason: mapFinishReason(finishReason),\n },\n ];\n}\n\nfunction mapFinishReason(reason: string): string {\n const mapping: Record<string, string> = {\n stop: 'stop',\n length: 'length',\n 'content-filter': 'content_filter',\n 'tool-calls': 'tool_call',\n error: 'error',\n other: 'stop',\n unknown: 'stop',\n };\n return mapping[reason] ?? reason;\n}\n","import {\n SpanStatusCode,\n context,\n type Attributes,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nexport async function recordSpan<T>({\n name,\n tracer,\n attributes,\n fn,\n endWhenDone = true,\n}: {\n name: string;\n tracer: Tracer;\n attributes: Attributes | PromiseLike<Attributes>;\n fn: (span: Span) => Promise<T>;\n endWhenDone?: boolean;\n}) {\n return tracer.startActiveSpan(\n name,\n { attributes: await attributes },\n async span => {\n // Capture the current context to maintain it across async generator yields\n const ctx = context.active();\n\n try {\n // Execute within the captured context to ensure async generators\n // don't lose the active span when they yield\n const result = await context.with(ctx, () => fn(span));\n\n if (endWhenDone) {\n span.end();\n }\n\n return result;\n } catch (error) {\n try {\n recordErrorOnSpan(span, error);\n } finally {\n // always stop the span when there is an error:\n span.end();\n }\n\n throw error;\n }\n },\n );\n}\n\n/**\n * Record an error on a span. Sets the span status to error. If the error is\n * an instance of Error, an exception event with name, message, and stack\n * will also be recorded.\n *\n * @param span - The span to record the error on.\n * @param error - The error to record on the span.\n */\nexport function recordErrorOnSpan(span: Span, error: unknown) {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { TelemetryOptions } from 'ai';\n\nexport type AttributeSpec =\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined;\n\nexport type AttributeSpecMap = Record<string, AttributeSpec>;\n\nfunction shouldRecord(\n telemetry: TelemetryOptions | undefined,\n): telemetry is TelemetryOptions {\n return telemetry?.isEnabled !== false;\n}\n\nexport function selectAttributes(\n telemetry: TelemetryOptions | undefined,\n attributes: AttributeSpecMap,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) 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","import type { Attributes, Tracer } from '@opentelemetry/api';\nimport type { TelemetryOptions } from 'ai';\nimport { selectAttributes, type AttributeSpecMap } from './select-attributes';\n\ntype SupplementalAttributeOption =\n | 'usage'\n | 'providerMetadata'\n | 'embedding'\n | 'reranking'\n | 'runtimeContext'\n | 'headers'\n | 'toolChoice'\n | 'schema';\n\nexport type SupplementalAttributeOptions = Record<\n SupplementalAttributeOption,\n boolean\n>;\n\nexport type OpenTelemetrySpanType =\n | 'operation'\n | 'step'\n | 'languageModel'\n | 'tool'\n | 'embedding'\n | 'reranking';\n\nexport type EnrichSpan = (options: {\n spanType: OpenTelemetrySpanType;\n operationId: string;\n callId: string;\n runtimeContext: Record<string, unknown> | undefined;\n}) => Attributes | undefined;\n\nexport type OpenTelemetryOptions = {\n /**\n * The tracer to use for the telemetry data.\n */\n tracer?: Tracer;\n\n /**\n * Adds custom attributes to spans when they are created. These attributes are\n * not AI SDK-owned semantics and are intended for observability integrations.\n */\n enrichSpan?: EnrichSpan;\n\n /**\n * Emit AI SDK usage details that are not represented by GenAI SemConv.\n */\n usage?: boolean;\n\n /**\n * Emit provider metadata on response spans.\n */\n providerMetadata?: boolean;\n\n /**\n * Emit embedding input and output values.\n */\n embedding?: boolean;\n\n /**\n * Emit reranking input documents and output ranking.\n */\n reranking?: boolean;\n\n /**\n * Emit runtime context values.\n */\n runtimeContext?: boolean;\n\n /**\n * Emit request headers.\n */\n headers?: boolean;\n\n /**\n * Emit selected tool choice information.\n */\n toolChoice?: boolean;\n\n /**\n * Emit object generation schema information.\n */\n schema?: boolean;\n};\n\nconst disabledSupplementalAttributes: SupplementalAttributeOptions = {\n usage: false,\n providerMetadata: false,\n embedding: false,\n reranking: false,\n runtimeContext: false,\n headers: false,\n toolChoice: false,\n schema: false,\n};\n\nexport function normalizeSupplementalAttributes(\n options: OpenTelemetryOptions,\n): SupplementalAttributeOptions {\n return {\n ...disabledSupplementalAttributes,\n usage: options.usage ?? false,\n providerMetadata: options.providerMetadata ?? false,\n embedding: options.embedding ?? false,\n reranking: options.reranking ?? false,\n runtimeContext: options.runtimeContext ?? false,\n headers: options.headers ?? false,\n toolChoice: options.toolChoice ?? false,\n schema: options.schema ?? false,\n };\n}\n\nexport function getRuntimeContextAttributes(\n context: Record<string, unknown> | undefined,\n): AttributeSpecMap {\n return Object.fromEntries(\n Object.entries(context ?? {})\n .filter(([, value]) => value != null)\n .map(([key, value]) => [`ai.settings.context.${key}`, value]),\n ) as AttributeSpecMap;\n}\n\nexport function getHeaderAttributes(\n headers: Record<string, string | undefined> | undefined,\n): AttributeSpecMap {\n return Object.fromEntries(\n Object.entries(headers ?? {})\n .filter(([, value]) => value != null)\n .map(([key, value]) => [`ai.request.headers.${key}`, value]),\n ) as AttributeSpecMap;\n}\n\nexport function getDetailedUsageAttributes(usage: {\n inputTokenDetails?: {\n noCacheTokens?: number | undefined;\n };\n outputTokenDetails?: {\n textTokens?: number | undefined;\n reasoningTokens?: number | undefined;\n };\n}): AttributeSpecMap {\n return {\n 'ai.usage.inputTokenDetails.noCacheTokens':\n usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n usage.outputTokenDetails?.reasoningTokens,\n };\n}\n\nexport function selectSupplementalAttributes(\n telemetry: TelemetryOptions | undefined,\n enabledAttributes: SupplementalAttributeOptions,\n attributes: Partial<Record<SupplementalAttributeOption, AttributeSpecMap>>,\n): Attributes {\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes) as Array<\n [SupplementalAttributeOption, AttributeSpecMap | undefined]\n >) {\n if (!enabledAttributes[key] || value == null) {\n continue;\n }\n\n Object.assign(result, selectAttributes(telemetry, value));\n }\n\n return result;\n}\n","import type { LanguageModelV4Prompt } from '@ai-sdk/provider';\nimport type { Context as AISDKContext } from '@ai-sdk/provider-utils';\nimport {\n context,\n SpanStatusCode,\n trace,\n type Attributes,\n type AttributeValue,\n type Context as OpenTelemetryContext,\n type Span,\n type Tracer,\n} from '@opentelemetry/api';\nimport type {\n EmbeddingModelCallEndEvent,\n EmbedEndEvent,\n EmbedStartEvent,\n EmbeddingModelCallStartEvent,\n GenerateObjectEndEvent,\n GenerateObjectStartEvent,\n GenerateObjectStepEndEvent,\n GenerateObjectStepStartEvent,\n StreamTextChunkEvent,\n GenerateTextEndEvent,\n GenerateTextStartEvent,\n GenerateTextStepEndEvent,\n GenerateTextStepStartEvent,\n ToolExecutionEndEvent,\n ToolExecutionStartEvent,\n OutputInterface as Output,\n RerankingModelCallEndEvent,\n RerankEndEvent,\n RerankStartEvent,\n RerankingModelCallStartEvent,\n InferTelemetryEvent,\n Telemetry,\n TelemetryOptions,\n ToolSet,\n} from 'ai';\nimport { assembleOperationName } from './assemble-operation-name';\nimport { getBaseTelemetryAttributes } from './get-base-telemetry-attributes';\nimport { stringifyForTelemetry } from './stringify-for-telemetry';\n\nfunction recordSpanError(span: Span, error: unknown): void {\n if (error instanceof Error) {\n span.recordException({\n name: error.name,\n message: error.message,\n stack: error.stack,\n });\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error.message,\n });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n}\n\nfunction shouldRecord(\n telemetry: TelemetryOptions | undefined,\n): telemetry is TelemetryOptions {\n return telemetry?.isEnabled !== false;\n}\n\nfunction selectAttributes(\n telemetry: TelemetryOptions | undefined,\n attributes: Record<\n string,\n | AttributeValue\n | { input: () => AttributeValue | undefined }\n | { output: () => AttributeValue | undefined }\n | undefined\n >,\n): Attributes {\n if (!shouldRecord(telemetry)) {\n return {};\n }\n\n const result: Attributes = {};\n\n for (const [key, value] of Object.entries(attributes)) {\n if (value == null) continue;\n\n if (\n typeof value === 'object' &&\n 'input' in value &&\n typeof value.input === 'function'\n ) {\n if (telemetry?.recordInputs === false) continue;\n const resolved = value.input();\n if (resolved != null) 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 RUNTIME_CONTEXT extends AISDKContext = AISDKContext,\n OUTPUT extends Output = Output,\n> extends GenerateTextStepStartEvent<TOOLS, RUNTIME_CONTEXT, OUTPUT> {\n readonly promptMessages?: LanguageModelV4Prompt;\n readonly stepTools?: ReadonlyArray<Record<string, unknown>>;\n readonly stepToolChoice?: unknown;\n}\n\ninterface CallState {\n operationId: string;\n telemetry: TelemetryOptions | undefined;\n rootSpan: Span | undefined;\n rootContext: OpenTelemetryContext | undefined;\n stepSpan: Span | undefined;\n stepContext: OpenTelemetryContext | undefined;\n embedSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n rerankSpan: { span: Span; context: OpenTelemetryContext } | undefined;\n toolSpans: Map<string, { span: Span; context: OpenTelemetryContext }>;\n baseTelemetryAttributes: Attributes;\n settings: Record<string, unknown>;\n}\n\nexport class LegacyOpenTelemetry implements Telemetry {\n private readonly callStates = new Map<string, CallState>();\n\n /**\n * The tracer to use for the telemetry data.\n */\n private readonly tracer: Tracer;\n\n constructor(\n options: {\n tracer?: Tracer;\n } = {},\n ) {\n this.tracer = options.tracer ?? trace.getTracer('ai');\n }\n\n private getCallState(callId: string): CallState | undefined {\n return this.callStates.get(callId);\n }\n\n private cleanupCallState(callId: string): void {\n this.callStates.delete(callId);\n }\n\n executeTool<T>({\n callId,\n toolCallId,\n execute,\n }: {\n callId: string;\n toolCallId: string;\n execute: () => PromiseLike<T>;\n }): PromiseLike<T> {\n const toolSpanEntry = this.getCallState(callId)?.toolSpans.get(toolCallId);\n\n if (toolSpanEntry == null) {\n return execute();\n }\n\n return context.with(toolSpanEntry.context, execute);\n }\n\n onStart(\n event:\n | InferTelemetryEvent<GenerateTextStartEvent>\n | InferTelemetryEvent<GenerateObjectStartEvent>\n | InferTelemetryEvent<EmbedStartEvent>\n | InferTelemetryEvent<RerankStartEvent>,\n ): void {\n if (\n event.operationId === 'ai.embed' ||\n event.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationStart(event as InferTelemetryEvent<EmbedStartEvent>);\n return;\n }\n\n if (event.operationId === 'ai.rerank') {\n this.onRerankOperationStart(\n event as InferTelemetryEvent<RerankStartEvent>,\n );\n return;\n }\n\n if (\n event.operationId === 'ai.generateObject' ||\n event.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationStart(\n event as InferTelemetryEvent<GenerateObjectStartEvent>,\n );\n return;\n }\n\n this.onGenerateStart(event as InferTelemetryEvent<GenerateTextStartEvent>);\n }\n\n private onGenerateStart(\n event: InferTelemetryEvent<GenerateTextStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n stopSequences: event.stopSequences,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: event.runtimeContext as Record<string, unknown> | undefined,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.instructions,\n messages: event.messages,\n }),\n },\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n private onObjectOperationStart(\n event: InferTelemetryEvent<GenerateObjectStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxOutputTokens: event.maxOutputTokens,\n temperature: event.temperature,\n topP: event.topP,\n topK: event.topK,\n presencePenalty: event.presencePenalty,\n frequencyPenalty: event.frequencyPenalty,\n seed: event.seed,\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: undefined,\n });\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...baseTelemetryAttributes,\n 'ai.prompt': {\n input: () =>\n JSON.stringify({\n system: event.system,\n prompt: event.prompt,\n messages: event.messages,\n }),\n },\n 'ai.schema': event.schema\n ? { input: () => JSON.stringify(event.schema) }\n : undefined,\n 'ai.schema.name': event.schemaName,\n 'ai.schema.description': event.schemaDescription,\n 'ai.settings.output': event.output,\n });\n\n const rootSpan = this.tracer.startSpan(event.operationId, { attributes });\n const rootContext = trace.setSpan(context.active(), rootSpan);\n\n this.callStates.set(event.callId, {\n operationId: event.operationId,\n telemetry,\n rootSpan,\n rootContext,\n stepSpan: undefined,\n stepContext: undefined,\n embedSpans: new Map(),\n rerankSpan: undefined,\n toolSpans: new Map(),\n baseTelemetryAttributes,\n settings,\n });\n }\n\n /** @deprecated */\n onObjectStepStart(event: GenerateObjectStepStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamObject'\n ? 'ai.streamObject.doStream'\n : 'ai.generateObject.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n /** @deprecated */\n onObjectStepFinish(event: GenerateObjectStepEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () => {\n try {\n return JSON.stringify(JSON.parse(event.objectText));\n } catch {\n return event.objectText;\n }\n },\n },\n 'ai.response.id': event.response.id,\n 'ai.response.model': event.response.modelId,\n 'ai.response.timestamp': event.response.timestamp.toISOString(),\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n if (event.msToFirstChunk != null) {\n state.stepSpan.addEvent('ai.stream.firstChunk', {\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n state.stepSpan.setAttributes({\n 'ai.stream.msToFirstChunk': event.msToFirstChunk,\n });\n }\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n private onEmbedOperationStart(\n event: InferTelemetryEvent<EmbedStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: undefined,\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): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const stepOperationId =\n state.operationId === 'ai.streamText'\n ? 'ai.streamText.doStream'\n : 'ai.generateText.doGenerate';\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: stepOperationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.model.provider': event.provider,\n 'ai.model.id': event.modelId,\n\n 'ai.prompt.messages': {\n input: () =>\n event.promptMessages\n ? stringifyForTelemetry(event.promptMessages)\n : undefined,\n },\n 'ai.prompt.tools': {\n input: () => event.stepTools?.map(tool => JSON.stringify(tool)),\n },\n 'ai.prompt.toolChoice': {\n input: () =>\n event.stepToolChoice != null\n ? JSON.stringify(event.stepToolChoice)\n : undefined,\n },\n\n 'gen_ai.system': event.provider,\n 'gen_ai.request.model': event.modelId,\n 'gen_ai.request.frequency_penalty': state.settings.frequencyPenalty as\n | number\n | undefined,\n 'gen_ai.request.max_tokens': state.settings.maxOutputTokens as\n | number\n | undefined,\n 'gen_ai.request.presence_penalty': state.settings.presencePenalty as\n | number\n | undefined,\n 'gen_ai.request.stop_sequences': state.settings.stopSequences as\n | string[]\n | undefined,\n 'gen_ai.request.temperature': (state.settings.temperature ?? undefined) as\n | number\n | undefined,\n 'gen_ai.request.top_k': state.settings.topK as number | undefined,\n 'gen_ai.request.top_p': state.settings.topP as number | undefined,\n });\n\n state.stepSpan = this.tracer.startSpan(\n stepOperationId,\n { attributes },\n state.rootContext,\n );\n state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);\n }\n\n onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepContext) return;\n\n const { telemetry } = state;\n const { toolCall } = event;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: 'ai.toolCall',\n telemetry,\n }),\n 'ai.toolCall.name': toolCall.toolName,\n 'ai.toolCall.id': toolCall.toolCallId,\n 'ai.toolCall.args': {\n output: () => JSON.stringify(toolCall.input),\n },\n });\n\n const toolSpan = this.tracer.startSpan(\n 'ai.toolCall',\n { attributes },\n state.stepContext,\n );\n const toolContext = trace.setSpan(state.stepContext, toolSpan);\n\n state.toolSpans.set(toolCall.toolCallId, {\n span: toolSpan,\n context: toolContext,\n });\n }\n\n onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const toolSpanEntry = state.toolSpans.get(event.toolCall.toolCallId);\n if (!toolSpanEntry) return;\n\n const { span } = toolSpanEntry;\n const { telemetry } = state;\n\n const { toolOutput } = event;\n if (toolOutput.type === 'tool-result') {\n try {\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.toolCall.result': {\n output: () => JSON.stringify(toolOutput.output),\n },\n }),\n );\n } catch {\n // JSON.stringify might fail for non-serializable results\n }\n } else {\n recordSpanError(span, toolOutput.error);\n }\n\n span.end();\n state.toolSpans.delete(event.toolCall.toolCallId);\n }\n\n onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.stepSpan) return;\n\n const { telemetry } = state;\n\n state.stepSpan.setAttributes(\n 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':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.noCacheTokens':\n event.usage.inputTokenDetails?.noCacheTokens,\n 'ai.usage.inputTokenDetails.cacheReadTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n 'ai.usage.inputTokenDetails.cacheWriteTokens':\n event.usage.inputTokenDetails?.cacheWriteTokens,\n 'ai.usage.outputTokenDetails.textTokens':\n event.usage.outputTokenDetails?.textTokens,\n 'ai.usage.outputTokenDetails.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n\n 'gen_ai.response.finish_reasons': [event.finishReason],\n 'gen_ai.response.id': event.response.id,\n 'gen_ai.response.model': event.response.modelId,\n 'gen_ai.usage.input_tokens': event.usage.inputTokens,\n 'gen_ai.usage.output_tokens': event.usage.outputTokens,\n }),\n );\n\n state.stepSpan.end();\n state.stepSpan = undefined;\n state.stepContext = undefined;\n }\n\n onFinish(\n event:\n | GenerateTextEndEvent<ToolSet>\n | GenerateObjectEndEvent<unknown>\n | EmbedEndEvent\n | RerankEndEvent,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n if (\n state.operationId === 'ai.embed' ||\n state.operationId === 'ai.embedMany'\n ) {\n this.onEmbedOperationFinish(event as EmbedEndEvent);\n return;\n }\n\n if (state.operationId === 'ai.rerank') {\n this.onRerankOperationFinish(event as RerankEndEvent);\n return;\n }\n\n if (\n state.operationId === 'ai.generateObject' ||\n state.operationId === 'ai.streamObject'\n ) {\n this.onObjectOperationFinish(event as GenerateObjectEndEvent<unknown>);\n return;\n }\n\n this.onGenerateFinish(event as GenerateTextEndEvent<ToolSet>);\n }\n\n private onGenerateFinish(event: GenerateTextEndEvent<ToolSet>): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.text': {\n output: () => event.text ?? undefined,\n },\n 'ai.response.reasoning': {\n output: () =>\n event.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':\n event.totalUsage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.totalUsage.inputTokenDetails?.cacheReadTokens,\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(\n event: GenerateObjectEndEvent<unknown>,\n ): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n 'ai.response.finishReason': event.finishReason,\n 'ai.response.object': {\n output: () =>\n event.object != null ? JSON.stringify(event.object) : undefined,\n },\n 'ai.response.providerMetadata': event.providerMetadata\n ? JSON.stringify(event.providerMetadata)\n : undefined,\n\n 'ai.usage.inputTokens': event.usage.inputTokens,\n 'ai.usage.outputTokens': event.usage.outputTokens,\n 'ai.usage.totalTokens': event.usage.totalTokens,\n 'ai.usage.reasoningTokens':\n event.usage.outputTokenDetails?.reasoningTokens,\n 'ai.usage.cachedInputTokens':\n event.usage.inputTokenDetails?.cacheReadTokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n private onEmbedOperationFinish(event: EmbedEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n const { telemetry } = state;\n const isMany = state.operationId === 'ai.embedMany';\n\n state.rootSpan.setAttributes(\n selectAttributes(telemetry, {\n ...(isMany\n ? {\n 'ai.embeddings': {\n output: () =>\n (event.embedding as number[][]).map(e => JSON.stringify(e)),\n },\n }\n : {\n 'ai.embedding': {\n output: () => JSON.stringify(event.embedding),\n },\n }),\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onEmbedStart(event: EmbeddingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.values': {\n input: () => event.values.map(v => JSON.stringify(v)),\n },\n });\n\n const embedSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const embedContext = trace.setSpan(state.rootContext, embedSpan);\n\n state.embedSpans.set(event.embedCallId, {\n span: embedSpan,\n context: embedContext,\n });\n }\n\n onEmbedEnd(event: EmbeddingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state) return;\n\n const embedSpanEntry = state.embedSpans.get(event.embedCallId);\n if (!embedSpanEntry) return;\n\n const { span } = embedSpanEntry;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.embeddings': {\n output: () =>\n event.embeddings.map(embedding => JSON.stringify(embedding)),\n },\n 'ai.usage.tokens': event.usage.tokens,\n }),\n );\n\n span.end();\n state.embedSpans.delete(event.embedCallId);\n }\n\n private onRerankOperationStart(\n event: InferTelemetryEvent<RerankStartEvent>,\n ): void {\n const telemetry: TelemetryOptions = {\n recordInputs: event.recordInputs,\n recordOutputs: event.recordOutputs,\n functionId: event.functionId,\n };\n\n const settings: Record<string, unknown> = {\n maxRetries: event.maxRetries,\n };\n\n const baseTelemetryAttributes = getBaseTelemetryAttributes({\n model: { provider: event.provider, modelId: event.modelId },\n headers: event.headers,\n settings,\n context: undefined,\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: RerankEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan) return;\n\n state.rootSpan.end();\n this.cleanupCallState(event.callId);\n }\n\n onRerankStart(event: RerankingModelCallStartEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rootSpan || !state.rootContext) return;\n\n const { telemetry } = state;\n\n const attributes = selectAttributes(telemetry, {\n ...assembleOperationName({\n operationId: event.operationId,\n telemetry,\n }),\n ...state.baseTelemetryAttributes,\n 'ai.documents': {\n input: () => event.documents.map(d => JSON.stringify(d)),\n },\n });\n\n const rerankSpan = this.tracer.startSpan(\n event.operationId,\n { attributes },\n state.rootContext,\n );\n const rerankContext = trace.setSpan(state.rootContext, rerankSpan);\n\n state.rerankSpan = { span: rerankSpan, context: rerankContext };\n }\n\n onRerankEnd(event: RerankingModelCallEndEvent): void {\n const state = this.getCallState(event.callId);\n if (!state?.rerankSpan) return;\n\n const { span } = state.rerankSpan;\n const { telemetry } = state;\n\n span.setAttributes(\n selectAttributes(telemetry, {\n 'ai.ranking.type': event.documentsType,\n 'ai.ranking': {\n output: () => event.ranking.map(r => JSON.stringify(r)),\n },\n }),\n );\n\n span.end();\n state.rerankSpan = undefined;\n }\n\n onChunk(event: StreamTextChunkEvent<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 { TelemetryOptions } from 'ai';\n\nexport function assembleOperationName({\n operationId,\n telemetry,\n}: {\n operationId: string;\n telemetry?: TelemetryOptions;\n}) {\n return {\n // standardized operation and resource name:\n 'operation.name': `${operationId}${\n telemetry?.functionId != null ? ` ${telemetry.functionId}` : ''\n }`,\n 'resource.name': telemetry?.functionId,\n\n // detailed, AI SDK specific data:\n 'ai.operationId': operationId,\n 'ai.telemetry.functionId': telemetry?.functionId,\n };\n}\n","import type { Attributes, AttributeValue } from '@opentelemetry/api';\nimport type { LanguageModelCallOptions } from 'ai';\n\nexport function getBaseTelemetryAttributes({\n model,\n settings,\n headers,\n context,\n}: {\n model: { modelId: string; provider: string };\n settings: LanguageModelCallOptions;\n headers: Record<string, string | undefined> | undefined;\n context: Record<string, unknown> | undefined;\n}): Attributes {\n return {\n 'ai.model.provider': model.provider,\n 'ai.model.id': model.modelId,\n\n // settings:\n ...Object.entries(settings).reduce((attributes, [key, value]) => {\n attributes[`ai.settings.${key}`] = value as AttributeValue;\n return attributes;\n }, {} as Attributes),\n\n // add context as attributes:\n ...Object.entries(context ?? {}).reduce((attributes, [key, value]) => {\n if (value != undefined) {\n attributes[`ai.settings.context.${key}`] = value as AttributeValue;\n }\n return attributes;\n }, {} as Attributes),\n\n // request headers\n ...Object.entries(headers ?? {}).reduce((attributes, [key, value]) => {\n if (value !== undefined) {\n attributes[`ai.request.headers.${key}`] = value;\n }\n return attributes;\n }, {} as Attributes),\n };\n}\n","import type {\n LanguageModelV4Message,\n LanguageModelV4Prompt,\n} from '@ai-sdk/provider';\nimport { convertDataContentToBase64String } from 'ai';\n\n/**\n * Helper utility to serialize prompt content for OpenTelemetry tracing.\n * It is initially created because normalized LanguageModelV4Prompt carries\n * images as Uint8Arrays, on which JSON.stringify acts weirdly, converting\n * them to objects with stringified indices as keys, e.g. {\"0\": 42, \"1\": 69 }.\n */\nexport function stringifyForTelemetry(prompt: LanguageModelV4Prompt): string {\n return JSON.stringify(\n prompt.map((message: LanguageModelV4Message) => ({\n ...message,\n content:\n typeof message.content === 'string'\n ? message.content\n : message.content.map(part =>\n part.type === 'file'\n ? {\n ...part,\n data: serializeFileData(part.data),\n }\n : part,\n ),\n })),\n );\n}\n\nfunction serializeFileData(\n data:\n | { type: 'data'; data: string | Uint8Array }\n | { type: 'url'; url: URL }\n | { type: 'reference'; reference: Record<string, string> }\n | { type: 'text'; text: string },\n): unknown {\n switch (data.type) {\n case 'data':\n return data.data instanceof Uint8Array\n ? convertDataContentToBase64String(data.data)\n : data.data;\n case 'url':\n return data.url.toString();\n case 'reference':\n return data.reference;\n case 'text':\n return data.text;\n }\n}\n"],"mappings":"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","names":["context","context","context","_a","context","SpanStatusCode","trace","context","convertDataContentToBase64String","SpanStatusCode","shouldRecord","selectAttributes","trace","context","_a"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/otel",
|
|
3
|
-
"version": "1.0.0-canary.
|
|
3
|
+
"version": "1.0.0-canary.78",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@opentelemetry/api": "1.9.1",
|
|
30
30
|
"@ai-sdk/provider": "4.0.0-canary.16",
|
|
31
|
-
"ai": "7.0.0-canary.
|
|
31
|
+
"ai": "7.0.0-canary.132"
|
|
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-canary.
|
|
38
|
+
"@ai-sdk/provider-utils": "5.0.0-canary.38",
|
|
39
39
|
"@vercel/ai-tsconfig": "0.0.0"
|
|
40
40
|
},
|
|
41
41
|
"engines": {
|
|
@@ -917,7 +917,7 @@ export class LegacyOpenTelemetry implements Telemetry {
|
|
|
917
917
|
});
|
|
918
918
|
}
|
|
919
919
|
|
|
920
|
-
|
|
920
|
+
onEmbedEnd(event: EmbeddingModelCallEndEvent): void {
|
|
921
921
|
const state = this.getCallState(event.callId);
|
|
922
922
|
if (!state) return;
|
|
923
923
|
|
|
@@ -1025,7 +1025,7 @@ export class LegacyOpenTelemetry implements Telemetry {
|
|
|
1025
1025
|
state.rerankSpan = { span: rerankSpan, context: rerankContext };
|
|
1026
1026
|
}
|
|
1027
1027
|
|
|
1028
|
-
|
|
1028
|
+
onRerankEnd(event: RerankingModelCallEndEvent): void {
|
|
1029
1029
|
const state = this.getCallState(event.callId);
|
|
1030
1030
|
if (!state?.rerankSpan) return;
|
|
1031
1031
|
|
package/src/open-telemetry.ts
CHANGED
|
@@ -1032,7 +1032,7 @@ export class OpenTelemetry implements Telemetry {
|
|
|
1032
1032
|
});
|
|
1033
1033
|
}
|
|
1034
1034
|
|
|
1035
|
-
|
|
1035
|
+
onEmbedEnd(event: EmbeddingModelCallEndEvent): void {
|
|
1036
1036
|
const state = this.getCallState(event.callId);
|
|
1037
1037
|
if (!state) return;
|
|
1038
1038
|
|
|
@@ -1178,7 +1178,7 @@ export class OpenTelemetry implements Telemetry {
|
|
|
1178
1178
|
state.rerankSpan = { span: rerankSpan, context: rerankContext };
|
|
1179
1179
|
}
|
|
1180
1180
|
|
|
1181
|
-
|
|
1181
|
+
onRerankEnd(event: RerankingModelCallEndEvent): void {
|
|
1182
1182
|
const state = this.getCallState(event.callId);
|
|
1183
1183
|
if (!state?.rerankSpan) return;
|
|
1184
1184
|
|