@ai-sdk/otel 1.0.0-beta.57 → 1.0.0-beta.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,44 @@
1
1
  # @ai-sdk/otel
2
2
 
3
+ ## 1.0.0-beta.58
4
+
5
+ ### Major Changes
6
+
7
+ - cf93359: feat(ai): remove/refactor event data sent via callbacks
8
+ - 8284dfa: feat(otel): rename OpenTelemetry to LegacyOpenTelemetry
9
+ - 116c89f: feat(ai): remove telemetry data from the user-facing event data
10
+
11
+ ### Patch Changes
12
+
13
+ - 29d8cf4: feat(ai): rename the core-event types
14
+ - 1043274: feat(ai): add a ModelCall start/end event
15
+ - 152c67c: feat(otel): add a step level span
16
+ - e1bfb9c: feat(ai): remove unnecessary data from events
17
+ - 64de016: feat(otel): rename GenAIOpenTelemetry to OpenTelemetry
18
+ - Updated dependencies [5f3749c]
19
+ - Updated dependencies [0a51f7d]
20
+ - Updated dependencies [71d3022]
21
+ - Updated dependencies [67df0a0]
22
+ - Updated dependencies [4181cfe]
23
+ - Updated dependencies [51ce232]
24
+ - Updated dependencies [cf93359]
25
+ - Updated dependencies [befb78c]
26
+ - Updated dependencies [29d8cf4]
27
+ - Updated dependencies [58a2ad7]
28
+ - Updated dependencies [37d69b2]
29
+ - Updated dependencies [1043274]
30
+ - Updated dependencies [7f59f04]
31
+ - Updated dependencies [7677c1e]
32
+ - Updated dependencies [116c89f]
33
+ - Updated dependencies [f58f9bc]
34
+ - Updated dependencies [e1bfb9c]
35
+ - Updated dependencies [e87d71b]
36
+ - Updated dependencies [9d486aa]
37
+ - Updated dependencies [9b0bc8a]
38
+ - Updated dependencies [fc92055]
39
+ - Updated dependencies [4e095b0]
40
+ - ai@7.0.0-beta.112
41
+
3
42
  ## 1.0.0-beta.57
4
43
 
5
44
  ### Major Changes
package/dist/index.d.ts CHANGED
@@ -1,14 +1,9 @@
1
+ import { Tracer } from '@opentelemetry/api';
2
+ import { Telemetry, InferTelemetryEvent, GenerateTextStartEvent, GenerateObjectStartEvent, EmbedStartEvent, RerankStartEvent, GenerateObjectStepStartEvent, GenerateObjectStepEndEvent, GenerateTextStepStartEvent, ToolSet, LanguageModelCallStartEvent, LanguageModelCallEndEvent, ToolExecutionStartEvent, ToolExecutionEndEvent, GenerateTextStepEndEvent, GenerateTextEndEvent, GenerateObjectEndEvent, EmbedEndEvent, RerankEndEvent, EmbeddingModelCallStartEvent, EmbeddingModelCallEndEvent, RerankingModelCallStartEvent, RerankingModelCallEndEvent, StreamTextChunkEvent, OutputInterface } from 'ai';
1
3
  import { LanguageModelV4Prompt } from '@ai-sdk/provider';
2
4
  import { Context } from '@ai-sdk/provider-utils';
3
- import { Tracer } from '@opentelemetry/api';
4
- import { Telemetry, OnStartEvent, ObjectOnStartEvent, EmbedOnStartEvent, RerankOnStartEvent, ObjectOnStepStartEvent, ObjectOnStepFinishEvent, ToolSet, OutputInterface, OnStepStartEvent, ToolExecutionStartEvent, ToolExecutionEndEvent, OnStepFinishEvent, OnFinishEvent, ObjectOnFinishEvent, EmbedOnFinishEvent, RerankOnFinishEvent, EmbedStartEvent, EmbedFinishEvent, RerankStartEvent, RerankFinishEvent, OnChunkEvent } from 'ai';
5
5
 
6
- interface OtelStepStartEvent$1<TOOLS extends ToolSet = ToolSet, RUNTIME_CONTEXT extends Context = Context, OUTPUT extends OutputInterface = OutputInterface> extends OnStepStartEvent<TOOLS, RUNTIME_CONTEXT, OUTPUT> {
7
- readonly promptMessages?: LanguageModelV4Prompt;
8
- readonly stepTools?: ReadonlyArray<Record<string, unknown>>;
9
- readonly stepToolChoice?: unknown;
10
- }
11
- declare class GenAIOpenTelemetry implements Telemetry {
6
+ declare class OpenTelemetry implements Telemetry {
12
7
  private readonly callStates;
13
8
  private readonly tracer;
14
9
  constructor(options?: {
@@ -21,38 +16,40 @@ declare class GenAIOpenTelemetry implements Telemetry {
21
16
  toolCallId: string;
22
17
  execute: () => PromiseLike<T>;
23
18
  }): PromiseLike<T>;
24
- onStart(event: OnStartEvent | ObjectOnStartEvent | EmbedOnStartEvent | RerankOnStartEvent): void;
19
+ onStart(event: InferTelemetryEvent<GenerateTextStartEvent> | InferTelemetryEvent<GenerateObjectStartEvent> | InferTelemetryEvent<EmbedStartEvent> | InferTelemetryEvent<RerankStartEvent>): void;
25
20
  private onGenerateStart;
26
21
  private onObjectOperationStart;
27
22
  /** @deprecated */
28
- onObjectStepStart(event: ObjectOnStepStartEvent): void;
23
+ onObjectStepStart(event: GenerateObjectStepStartEvent): void;
29
24
  /** @deprecated */
30
- onObjectStepFinish(event: ObjectOnStepFinishEvent): void;
25
+ onObjectStepFinish(event: GenerateObjectStepEndEvent): void;
31
26
  private onEmbedOperationStart;
32
- onStepStart(event: OtelStepStartEvent$1): void;
27
+ onStepStart(event: GenerateTextStepStartEvent<ToolSet>): void;
28
+ onLanguageModelCallStart(event: LanguageModelCallStartEvent): void;
29
+ onLanguageModelCallEnd(event: LanguageModelCallEndEvent<ToolSet>): void;
33
30
  onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void;
34
31
  onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void;
35
- onStepFinish(event: OnStepFinishEvent<ToolSet>): void;
36
- onFinish(event: OnFinishEvent<ToolSet> | ObjectOnFinishEvent<unknown> | EmbedOnFinishEvent | RerankOnFinishEvent): void;
32
+ onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void;
33
+ onFinish(event: GenerateTextEndEvent<ToolSet> | GenerateObjectEndEvent<unknown> | EmbedEndEvent | RerankEndEvent): void;
37
34
  private onGenerateFinish;
38
35
  private onObjectOperationFinish;
39
36
  private onEmbedOperationFinish;
40
- onEmbedStart(event: EmbedStartEvent): void;
41
- onEmbedFinish(event: EmbedFinishEvent): void;
37
+ onEmbedStart(event: EmbeddingModelCallStartEvent): void;
38
+ onEmbedFinish(event: EmbeddingModelCallEndEvent): void;
42
39
  private onRerankOperationStart;
43
40
  private onRerankOperationFinish;
44
- onRerankStart(event: RerankStartEvent): void;
45
- onRerankFinish(event: RerankFinishEvent): void;
46
- onChunk(_event: OnChunkEvent<ToolSet>): void;
41
+ onRerankStart(event: RerankingModelCallStartEvent): void;
42
+ onRerankFinish(event: RerankingModelCallEndEvent): void;
43
+ onChunk(_event: StreamTextChunkEvent<ToolSet>): void;
47
44
  onError(error: unknown): void;
48
45
  }
49
46
 
50
- interface OtelStepStartEvent<TOOLS extends ToolSet = ToolSet, RUNTIME_CONTEXT extends Context = Context, OUTPUT extends OutputInterface = OutputInterface> extends OnStepStartEvent<TOOLS, RUNTIME_CONTEXT, OUTPUT> {
47
+ interface OtelStepStartEvent<TOOLS extends ToolSet = ToolSet, RUNTIME_CONTEXT extends Context = Context, OUTPUT extends OutputInterface = OutputInterface> extends GenerateTextStepStartEvent<TOOLS, RUNTIME_CONTEXT, OUTPUT> {
51
48
  readonly promptMessages?: LanguageModelV4Prompt;
52
49
  readonly stepTools?: ReadonlyArray<Record<string, unknown>>;
53
50
  readonly stepToolChoice?: unknown;
54
51
  }
55
- declare class OpenTelemetry implements Telemetry {
52
+ declare class LegacyOpenTelemetry implements Telemetry {
56
53
  private readonly callStates;
57
54
  /**
58
55
  * The tracer to use for the telemetry data.
@@ -68,30 +65,30 @@ declare class OpenTelemetry implements Telemetry {
68
65
  toolCallId: string;
69
66
  execute: () => PromiseLike<T>;
70
67
  }): PromiseLike<T>;
71
- onStart(event: OnStartEvent | ObjectOnStartEvent | EmbedOnStartEvent | RerankOnStartEvent): void;
68
+ onStart(event: InferTelemetryEvent<GenerateTextStartEvent> | InferTelemetryEvent<GenerateObjectStartEvent> | InferTelemetryEvent<EmbedStartEvent> | InferTelemetryEvent<RerankStartEvent>): void;
72
69
  private onGenerateStart;
73
70
  private onObjectOperationStart;
74
71
  /** @deprecated */
75
- onObjectStepStart(event: ObjectOnStepStartEvent): void;
72
+ onObjectStepStart(event: GenerateObjectStepStartEvent): void;
76
73
  /** @deprecated */
77
- onObjectStepFinish(event: ObjectOnStepFinishEvent): void;
74
+ onObjectStepFinish(event: GenerateObjectStepEndEvent): void;
78
75
  private onEmbedOperationStart;
79
76
  onStepStart(event: OtelStepStartEvent): void;
80
77
  onToolExecutionStart(event: ToolExecutionStartEvent<ToolSet>): void;
81
78
  onToolExecutionEnd(event: ToolExecutionEndEvent<ToolSet>): void;
82
- onStepFinish(event: OnStepFinishEvent<ToolSet>): void;
83
- onFinish(event: OnFinishEvent<ToolSet> | ObjectOnFinishEvent<unknown> | EmbedOnFinishEvent | RerankOnFinishEvent): void;
79
+ onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void;
80
+ onFinish(event: GenerateTextEndEvent<ToolSet> | GenerateObjectEndEvent<unknown> | EmbedEndEvent | RerankEndEvent): void;
84
81
  private onGenerateFinish;
85
82
  private onObjectOperationFinish;
86
83
  private onEmbedOperationFinish;
87
- onEmbedStart(event: EmbedStartEvent): void;
88
- onEmbedFinish(event: EmbedFinishEvent): void;
84
+ onEmbedStart(event: EmbeddingModelCallStartEvent): void;
85
+ onEmbedFinish(event: EmbeddingModelCallEndEvent): void;
89
86
  private onRerankOperationStart;
90
87
  private onRerankOperationFinish;
91
- onRerankStart(event: RerankStartEvent): void;
92
- onRerankFinish(event: RerankFinishEvent): void;
93
- onChunk(event: OnChunkEvent<ToolSet>): void;
88
+ onRerankStart(event: RerankingModelCallStartEvent): void;
89
+ onRerankFinish(event: RerankingModelCallEndEvent): void;
90
+ onChunk(event: StreamTextChunkEvent<ToolSet>): void;
94
91
  onError(error: unknown): void;
95
92
  }
96
93
 
97
- export { GenAIOpenTelemetry, OpenTelemetry };
94
+ export { LegacyOpenTelemetry, OpenTelemetry };
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- // src/gen-ai-open-telemetry.ts
1
+ // src/open-telemetry.ts
2
2
  import {
3
3
  context,
4
4
  SpanKind,
@@ -410,7 +410,7 @@ function mapFinishReason(reason) {
410
410
  return (_a = mapping[reason]) != null ? _a : reason;
411
411
  }
412
412
 
413
- // src/gen-ai-open-telemetry.ts
413
+ // src/open-telemetry.ts
414
414
  function recordSpanError(span, error) {
415
415
  if (error instanceof Error) {
416
416
  span.recordException({
@@ -452,7 +452,7 @@ function selectAttributes(telemetry, attributes) {
452
452
  }
453
453
  return result;
454
454
  }
455
- var GenAIOpenTelemetry = class {
455
+ var OpenTelemetry = class {
456
456
  constructor(options = {}) {
457
457
  this.callStates = /* @__PURE__ */ new Map();
458
458
  var _a;
@@ -477,17 +477,20 @@ var GenAIOpenTelemetry = class {
477
477
  return context.with(toolSpanEntry.context, execute);
478
478
  }
479
479
  onStart(event) {
480
- if (event.isEnabled === false) return;
481
480
  if (event.operationId === "ai.embed" || event.operationId === "ai.embedMany") {
482
481
  this.onEmbedOperationStart(event);
483
482
  return;
484
483
  }
485
484
  if (event.operationId === "ai.rerank") {
486
- this.onRerankOperationStart(event);
485
+ this.onRerankOperationStart(
486
+ event
487
+ );
487
488
  return;
488
489
  }
489
490
  if (event.operationId === "ai.generateObject" || event.operationId === "ai.streamObject") {
490
- this.onObjectOperationStart(event);
491
+ this.onObjectOperationStart(
492
+ event
493
+ );
491
494
  return;
492
495
  }
493
496
  this.onGenerateStart(event);
@@ -495,7 +498,6 @@ var GenAIOpenTelemetry = class {
495
498
  onGenerateStart(event) {
496
499
  var _a;
497
500
  const telemetry = {
498
- isEnabled: event.isEnabled,
499
501
  recordInputs: event.recordInputs,
500
502
  recordOutputs: event.recordOutputs,
501
503
  functionId: event.functionId
@@ -532,7 +534,7 @@ var GenAIOpenTelemetry = class {
532
534
  "gen_ai.input.messages": {
533
535
  input: () => JSON.stringify(
534
536
  formatModelMessages({
535
- prompt: event.prompt,
537
+ prompt: void 0,
536
538
  messages: event.messages
537
539
  })
538
540
  )
@@ -551,6 +553,8 @@ var GenAIOpenTelemetry = class {
551
553
  rootContext,
552
554
  stepSpan: void 0,
553
555
  stepContext: void 0,
556
+ inferenceSpan: void 0,
557
+ inferenceContext: void 0,
554
558
  embedSpans: /* @__PURE__ */ new Map(),
555
559
  rerankSpan: void 0,
556
560
  toolSpans: /* @__PURE__ */ new Map(),
@@ -562,7 +566,6 @@ var GenAIOpenTelemetry = class {
562
566
  onObjectOperationStart(event) {
563
567
  var _a;
564
568
  const telemetry = {
565
- isEnabled: event.isEnabled,
566
569
  recordInputs: event.recordInputs,
567
570
  recordOutputs: event.recordOutputs,
568
571
  functionId: event.functionId
@@ -617,6 +620,8 @@ var GenAIOpenTelemetry = class {
617
620
  rootContext,
618
621
  stepSpan: void 0,
619
622
  stepContext: void 0,
623
+ inferenceSpan: void 0,
624
+ inferenceContext: void 0,
620
625
  embedSpans: /* @__PURE__ */ new Map(),
621
626
  rerankSpan: void 0,
622
627
  toolSpans: /* @__PURE__ */ new Map(),
@@ -648,19 +653,22 @@ var GenAIOpenTelemetry = class {
648
653
  }
649
654
  });
650
655
  const spanName = `chat ${event.modelId}`;
651
- state.stepSpan = this.tracer.startSpan(
656
+ state.inferenceSpan = this.tracer.startSpan(
652
657
  spanName,
653
658
  { attributes, kind: SpanKind.CLIENT },
654
659
  state.rootContext
655
660
  );
656
- state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);
661
+ state.inferenceContext = trace.setSpan(
662
+ state.rootContext,
663
+ state.inferenceSpan
664
+ );
657
665
  }
658
666
  /** @deprecated */
659
667
  onObjectStepFinish(event) {
660
668
  const state = this.getCallState(event.callId);
661
- if (!(state == null ? void 0 : state.stepSpan)) return;
669
+ if (!(state == null ? void 0 : state.inferenceSpan)) return;
662
670
  const { telemetry } = state;
663
- state.stepSpan.setAttributes(
671
+ state.inferenceSpan.setAttributes(
664
672
  selectAttributes(telemetry, {
665
673
  "gen_ai.response.finish_reasons": [event.finishReason],
666
674
  "gen_ai.response.id": event.response.id,
@@ -684,13 +692,12 @@ var GenAIOpenTelemetry = class {
684
692
  }
685
693
  })
686
694
  );
687
- state.stepSpan.end();
688
- state.stepSpan = void 0;
689
- state.stepContext = void 0;
695
+ state.inferenceSpan.end();
696
+ state.inferenceSpan = void 0;
697
+ state.inferenceContext = void 0;
690
698
  }
691
699
  onEmbedOperationStart(event) {
692
700
  const telemetry = {
693
- isEnabled: event.isEnabled,
694
701
  recordInputs: event.recordInputs,
695
702
  recordOutputs: event.recordOutputs,
696
703
  functionId: event.functionId
@@ -717,6 +724,8 @@ var GenAIOpenTelemetry = class {
717
724
  rootContext,
718
725
  stepSpan: void 0,
719
726
  stepContext: void 0,
727
+ inferenceSpan: void 0,
728
+ inferenceContext: void 0,
720
729
  embedSpans: /* @__PURE__ */ new Map(),
721
730
  rerankSpan: void 0,
722
731
  toolSpans: /* @__PURE__ */ new Map(),
@@ -726,12 +735,26 @@ var GenAIOpenTelemetry = class {
726
735
  });
727
736
  }
728
737
  onStepStart(event) {
729
- var _a;
730
738
  const state = this.getCallState(event.callId);
731
739
  if (!(state == null ? void 0 : state.rootSpan) || !state.rootContext) return;
732
740
  const { telemetry } = state;
741
+ const stepAttributes = selectAttributes(telemetry, {
742
+ "gen_ai.operation.name": "agent_step"
743
+ });
744
+ state.stepSpan = this.tracer.startSpan(
745
+ `step ${event.steps.length + 1}`,
746
+ { attributes: stepAttributes, kind: SpanKind.INTERNAL },
747
+ state.rootContext
748
+ );
749
+ state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);
750
+ }
751
+ onLanguageModelCallStart(event) {
752
+ var _a;
753
+ const state = this.getCallState(event.callId);
754
+ if (!(state == null ? void 0 : state.stepContext)) return;
755
+ const { telemetry } = state;
733
756
  const providerName = mapProviderName(event.provider);
734
- const attributes = selectAttributes(telemetry, {
757
+ const inferenceAttributes = selectAttributes(telemetry, {
735
758
  "gen_ai.operation.name": "chat",
736
759
  "gen_ai.provider.name": providerName,
737
760
  "gen_ai.request.model": event.modelId,
@@ -743,19 +766,57 @@ var GenAIOpenTelemetry = class {
743
766
  "gen_ai.request.top_k": state.settings.topK,
744
767
  "gen_ai.request.top_p": state.settings.topP,
745
768
  "gen_ai.input.messages": {
746
- input: () => event.promptMessages ? JSON.stringify(formatInputMessages(event.promptMessages)) : void 0
769
+ input: () => {
770
+ const formattedMessages = formatModelMessages({
771
+ prompt: void 0,
772
+ messages: event.messages
773
+ });
774
+ return formattedMessages.length > 0 ? JSON.stringify(formattedMessages) : void 0;
775
+ }
747
776
  },
748
777
  "gen_ai.tool.definitions": {
749
- input: () => event.stepTools ? JSON.stringify(event.stepTools) : void 0
778
+ input: () => event.tools ? JSON.stringify(event.tools) : void 0
750
779
  }
751
780
  });
752
- const spanName = `chat ${event.modelId}`;
753
- state.stepSpan = this.tracer.startSpan(
754
- spanName,
755
- { attributes, kind: SpanKind.CLIENT },
756
- state.rootContext
781
+ state.inferenceSpan = this.tracer.startSpan(
782
+ `chat ${event.modelId}`,
783
+ { attributes: inferenceAttributes, kind: SpanKind.CLIENT },
784
+ state.stepContext
785
+ );
786
+ state.inferenceContext = trace.setSpan(
787
+ state.stepContext,
788
+ state.inferenceSpan
757
789
  );
758
- state.stepContext = trace.setSpan(state.rootContext, state.stepSpan);
790
+ }
791
+ onLanguageModelCallEnd(event) {
792
+ var _a, _b, _c;
793
+ const state = this.getCallState(event.callId);
794
+ if (!(state == null ? void 0 : state.inferenceSpan)) return;
795
+ const { telemetry } = state;
796
+ state.inferenceSpan.setAttributes(
797
+ selectAttributes(telemetry, {
798
+ "gen_ai.response.finish_reasons": [event.finishReason],
799
+ "gen_ai.response.id": event.responseId,
800
+ "gen_ai.usage.input_tokens": event.usage.inputTokens,
801
+ "gen_ai.usage.output_tokens": event.usage.outputTokens,
802
+ "gen_ai.usage.cache_read.input_tokens": (_b = (_a = event.usage.inputTokenDetails) == null ? void 0 : _a.cacheReadTokens) != null ? _b : event.usage.cachedInputTokens,
803
+ "gen_ai.usage.cache_creation.input_tokens": (_c = event.usage.inputTokenDetails) == null ? void 0 : _c.cacheWriteTokens,
804
+ "gen_ai.output.messages": {
805
+ output: () => JSON.stringify(
806
+ formatOutputMessages({
807
+ text: event.content.filter((p) => p.type === "text").map((p) => p.text).join("") || void 0,
808
+ reasoning: event.content.filter((p) => p.type === "reasoning"),
809
+ toolCalls: event.content.filter((p) => p.type === "tool-call"),
810
+ files: event.content.filter((p) => p.type === "file").map((p) => p.file),
811
+ finishReason: event.finishReason
812
+ })
813
+ )
814
+ }
815
+ })
816
+ );
817
+ state.inferenceSpan.end();
818
+ state.inferenceSpan = void 0;
819
+ state.inferenceContext = void 0;
759
820
  }
760
821
  onToolExecutionStart(event) {
761
822
  const state = this.getCallState(event.callId);
@@ -790,53 +851,27 @@ var GenAIOpenTelemetry = class {
790
851
  if (!toolSpanEntry) return;
791
852
  const { span } = toolSpanEntry;
792
853
  const { telemetry } = state;
793
- if (event.success) {
854
+ const { toolOutput } = event;
855
+ if (toolOutput.type === "tool-result") {
794
856
  try {
795
857
  span.setAttributes(
796
858
  selectAttributes(telemetry, {
797
859
  "gen_ai.tool.call.result": {
798
- output: () => JSON.stringify(event.output)
860
+ output: () => JSON.stringify(toolOutput.output)
799
861
  }
800
862
  })
801
863
  );
802
864
  } catch (e) {
803
865
  }
804
866
  } else {
805
- recordSpanError(span, event.error);
867
+ recordSpanError(span, toolOutput.error);
806
868
  }
807
869
  span.end();
808
870
  state.toolSpans.delete(event.toolCall.toolCallId);
809
871
  }
810
872
  onStepFinish(event) {
811
- var _a, _b, _c;
812
873
  const state = this.getCallState(event.callId);
813
874
  if (!(state == null ? void 0 : state.stepSpan)) return;
814
- const { telemetry } = state;
815
- state.stepSpan.setAttributes(
816
- selectAttributes(telemetry, {
817
- "gen_ai.response.finish_reasons": [event.finishReason],
818
- "gen_ai.response.id": event.response.id,
819
- "gen_ai.response.model": event.response.modelId,
820
- "gen_ai.usage.input_tokens": event.usage.inputTokens,
821
- "gen_ai.usage.output_tokens": event.usage.outputTokens,
822
- "gen_ai.usage.cache_read.input_tokens": (_b = (_a = event.usage.inputTokenDetails) == null ? void 0 : _a.cacheReadTokens) != null ? _b : event.usage.cachedInputTokens,
823
- "gen_ai.usage.cache_creation.input_tokens": (_c = event.usage.inputTokenDetails) == null ? void 0 : _c.cacheWriteTokens,
824
- "gen_ai.output.messages": {
825
- output: () => {
826
- var _a2;
827
- return JSON.stringify(
828
- formatOutputMessages({
829
- text: (_a2 = event.text) != null ? _a2 : void 0,
830
- reasoning: event.reasoning,
831
- toolCalls: event.toolCalls,
832
- files: event.files,
833
- finishReason: event.finishReason
834
- })
835
- );
836
- }
837
- }
838
- })
839
- );
840
875
  state.stepSpan.end();
841
876
  state.stepSpan = void 0;
842
877
  state.stepContext = void 0;
@@ -963,7 +998,6 @@ var GenAIOpenTelemetry = class {
963
998
  }
964
999
  onRerankOperationStart(event) {
965
1000
  const telemetry = {
966
- isEnabled: event.isEnabled,
967
1001
  recordInputs: event.recordInputs,
968
1002
  recordOutputs: event.recordOutputs,
969
1003
  functionId: event.functionId
@@ -990,6 +1024,8 @@ var GenAIOpenTelemetry = class {
990
1024
  rootContext,
991
1025
  stepSpan: void 0,
992
1026
  stepContext: void 0,
1027
+ inferenceSpan: void 0,
1028
+ inferenceContext: void 0,
993
1029
  embedSpans: /* @__PURE__ */ new Map(),
994
1030
  rerankSpan: void 0,
995
1031
  toolSpans: /* @__PURE__ */ new Map(),
@@ -1039,9 +1075,22 @@ var GenAIOpenTelemetry = class {
1039
1075
  const state = this.getCallState(event.callId);
1040
1076
  if (!(state == null ? void 0 : state.rootSpan)) return;
1041
1077
  const actualError = (_a = event.error) != null ? _a : error;
1078
+ for (const { span: toolSpan } of state.toolSpans.values()) {
1079
+ recordSpanError(toolSpan, actualError);
1080
+ toolSpan.end();
1081
+ }
1082
+ state.toolSpans.clear();
1083
+ if (state.inferenceSpan) {
1084
+ recordSpanError(state.inferenceSpan, actualError);
1085
+ state.inferenceSpan.end();
1086
+ state.inferenceSpan = void 0;
1087
+ state.inferenceContext = void 0;
1088
+ }
1042
1089
  if (state.stepSpan) {
1043
1090
  recordSpanError(state.stepSpan, actualError);
1044
1091
  state.stepSpan.end();
1092
+ state.stepSpan = void 0;
1093
+ state.stepContext = void 0;
1045
1094
  }
1046
1095
  for (const { span: embedSpan } of state.embedSpans.values()) {
1047
1096
  recordSpanError(embedSpan, actualError);
@@ -1059,7 +1108,7 @@ var GenAIOpenTelemetry = class {
1059
1108
  }
1060
1109
  };
1061
1110
 
1062
- // src/open-telemetry.ts
1111
+ // src/legacy-open-telemetry.ts
1063
1112
  import {
1064
1113
  context as context2,
1065
1114
  SpanStatusCode as SpanStatusCode2,
@@ -1129,7 +1178,7 @@ function stringifyForTelemetry(prompt) {
1129
1178
  );
1130
1179
  }
1131
1180
 
1132
- // src/open-telemetry.ts
1181
+ // src/legacy-open-telemetry.ts
1133
1182
  function recordSpanError2(span, error) {
1134
1183
  if (error instanceof Error) {
1135
1184
  span.recordException({
@@ -1171,7 +1220,7 @@ function selectAttributes2(telemetry, attributes) {
1171
1220
  }
1172
1221
  return result;
1173
1222
  }
1174
- var OpenTelemetry = class {
1223
+ var LegacyOpenTelemetry = class {
1175
1224
  constructor(options = {}) {
1176
1225
  this.callStates = /* @__PURE__ */ new Map();
1177
1226
  var _a;
@@ -1196,24 +1245,26 @@ var OpenTelemetry = class {
1196
1245
  return context2.with(toolSpanEntry.context, execute);
1197
1246
  }
1198
1247
  onStart(event) {
1199
- if (event.isEnabled === false) return;
1200
1248
  if (event.operationId === "ai.embed" || event.operationId === "ai.embedMany") {
1201
1249
  this.onEmbedOperationStart(event);
1202
1250
  return;
1203
1251
  }
1204
1252
  if (event.operationId === "ai.rerank") {
1205
- this.onRerankOperationStart(event);
1253
+ this.onRerankOperationStart(
1254
+ event
1255
+ );
1206
1256
  return;
1207
1257
  }
1208
1258
  if (event.operationId === "ai.generateObject" || event.operationId === "ai.streamObject") {
1209
- this.onObjectOperationStart(event);
1259
+ this.onObjectOperationStart(
1260
+ event
1261
+ );
1210
1262
  return;
1211
1263
  }
1212
1264
  this.onGenerateStart(event);
1213
1265
  }
1214
1266
  onGenerateStart(event) {
1215
1267
  const telemetry = {
1216
- isEnabled: event.isEnabled,
1217
1268
  recordInputs: event.recordInputs,
1218
1269
  recordOutputs: event.recordOutputs,
1219
1270
  functionId: event.functionId
@@ -1246,7 +1297,6 @@ var OpenTelemetry = class {
1246
1297
  "ai.prompt": {
1247
1298
  input: () => JSON.stringify({
1248
1299
  system: event.system,
1249
- prompt: event.prompt,
1250
1300
  messages: event.messages
1251
1301
  })
1252
1302
  }
@@ -1269,7 +1319,6 @@ var OpenTelemetry = class {
1269
1319
  }
1270
1320
  onObjectOperationStart(event) {
1271
1321
  const telemetry = {
1272
- isEnabled: event.isEnabled,
1273
1322
  recordInputs: event.recordInputs,
1274
1323
  recordOutputs: event.recordOutputs,
1275
1324
  functionId: event.functionId
@@ -1403,7 +1452,6 @@ var OpenTelemetry = class {
1403
1452
  }
1404
1453
  onEmbedOperationStart(event) {
1405
1454
  const telemetry = {
1406
- isEnabled: event.isEnabled,
1407
1455
  recordInputs: event.recordInputs,
1408
1456
  recordOutputs: event.recordOutputs,
1409
1457
  functionId: event.functionId
@@ -1528,19 +1576,20 @@ var OpenTelemetry = class {
1528
1576
  if (!toolSpanEntry) return;
1529
1577
  const { span } = toolSpanEntry;
1530
1578
  const { telemetry } = state;
1531
- if (event.success) {
1579
+ const { toolOutput } = event;
1580
+ if (toolOutput.type === "tool-result") {
1532
1581
  try {
1533
1582
  span.setAttributes(
1534
1583
  selectAttributes2(telemetry, {
1535
1584
  "ai.toolCall.result": {
1536
- output: () => JSON.stringify(event.output)
1585
+ output: () => JSON.stringify(toolOutput.output)
1537
1586
  }
1538
1587
  })
1539
1588
  );
1540
1589
  } catch (e) {
1541
1590
  }
1542
1591
  } else {
1543
- recordSpanError2(span, event.error);
1592
+ recordSpanError2(span, toolOutput.error);
1544
1593
  }
1545
1594
  span.end();
1546
1595
  state.toolSpans.delete(event.toolCall.toolCallId);
@@ -1761,7 +1810,6 @@ var OpenTelemetry = class {
1761
1810
  }
1762
1811
  onRerankOperationStart(event) {
1763
1812
  const telemetry = {
1764
- isEnabled: event.isEnabled,
1765
1813
  recordInputs: event.recordInputs,
1766
1814
  recordOutputs: event.recordOutputs,
1767
1815
  functionId: event.functionId
@@ -1893,7 +1941,7 @@ var OpenTelemetry = class {
1893
1941
  }
1894
1942
  };
1895
1943
  export {
1896
- GenAIOpenTelemetry,
1944
+ LegacyOpenTelemetry,
1897
1945
  OpenTelemetry
1898
1946
  };
1899
1947
  //# sourceMappingURL=index.js.map