@ai-sdk/otel 1.0.0-beta.57 → 1.0.0-beta.59
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 +48 -0
- package/dist/index.d.ts +29 -32
- package/dist/index.js +121 -73
- package/dist/index.js.map +1 -1
- package/package.json +9 -7
- package/src/index.ts +1 -1
- package/src/{gen-ai-open-telemetry.ts → legacy-open-telemetry.ts} +462 -282
- package/src/open-telemetry.ts +379 -485
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,53 @@
|
|
|
1
1
|
# @ai-sdk/otel
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.59
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 9f0e36c: trigger release for all packages after provenance setup
|
|
8
|
+
- Updated dependencies [9f0e36c]
|
|
9
|
+
- ai@7.0.0-beta.113
|
|
10
|
+
- @ai-sdk/provider@4.0.0-beta.13
|
|
11
|
+
|
|
12
|
+
## 1.0.0-beta.58
|
|
13
|
+
|
|
14
|
+
### Major Changes
|
|
15
|
+
|
|
16
|
+
- cf93359: feat(ai): remove/refactor event data sent via callbacks
|
|
17
|
+
- 8284dfa: feat(otel): rename OpenTelemetry to LegacyOpenTelemetry
|
|
18
|
+
- 116c89f: feat(ai): remove telemetry data from the user-facing event data
|
|
19
|
+
|
|
20
|
+
### Patch Changes
|
|
21
|
+
|
|
22
|
+
- 29d8cf4: feat(ai): rename the core-event types
|
|
23
|
+
- 1043274: feat(ai): add a ModelCall start/end event
|
|
24
|
+
- 152c67c: feat(otel): add a step level span
|
|
25
|
+
- e1bfb9c: feat(ai): remove unnecessary data from events
|
|
26
|
+
- 64de016: feat(otel): rename GenAIOpenTelemetry to OpenTelemetry
|
|
27
|
+
- Updated dependencies [5f3749c]
|
|
28
|
+
- Updated dependencies [0a51f7d]
|
|
29
|
+
- Updated dependencies [71d3022]
|
|
30
|
+
- Updated dependencies [67df0a0]
|
|
31
|
+
- Updated dependencies [4181cfe]
|
|
32
|
+
- Updated dependencies [51ce232]
|
|
33
|
+
- Updated dependencies [cf93359]
|
|
34
|
+
- Updated dependencies [befb78c]
|
|
35
|
+
- Updated dependencies [29d8cf4]
|
|
36
|
+
- Updated dependencies [58a2ad7]
|
|
37
|
+
- Updated dependencies [37d69b2]
|
|
38
|
+
- Updated dependencies [1043274]
|
|
39
|
+
- Updated dependencies [7f59f04]
|
|
40
|
+
- Updated dependencies [7677c1e]
|
|
41
|
+
- Updated dependencies [116c89f]
|
|
42
|
+
- Updated dependencies [f58f9bc]
|
|
43
|
+
- Updated dependencies [e1bfb9c]
|
|
44
|
+
- Updated dependencies [e87d71b]
|
|
45
|
+
- Updated dependencies [9d486aa]
|
|
46
|
+
- Updated dependencies [9b0bc8a]
|
|
47
|
+
- Updated dependencies [fc92055]
|
|
48
|
+
- Updated dependencies [4e095b0]
|
|
49
|
+
- ai@7.0.0-beta.112
|
|
50
|
+
|
|
3
51
|
## 1.0.0-beta.57
|
|
4
52
|
|
|
5
53
|
### 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
|
-
|
|
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:
|
|
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:
|
|
23
|
+
onObjectStepStart(event: GenerateObjectStepStartEvent): void;
|
|
29
24
|
/** @deprecated */
|
|
30
|
-
onObjectStepFinish(event:
|
|
25
|
+
onObjectStepFinish(event: GenerateObjectStepEndEvent): void;
|
|
31
26
|
private onEmbedOperationStart;
|
|
32
|
-
onStepStart(event:
|
|
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:
|
|
36
|
-
onFinish(event:
|
|
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:
|
|
41
|
-
onEmbedFinish(event:
|
|
37
|
+
onEmbedStart(event: EmbeddingModelCallStartEvent): void;
|
|
38
|
+
onEmbedFinish(event: EmbeddingModelCallEndEvent): void;
|
|
42
39
|
private onRerankOperationStart;
|
|
43
40
|
private onRerankOperationFinish;
|
|
44
|
-
onRerankStart(event:
|
|
45
|
-
onRerankFinish(event:
|
|
46
|
-
onChunk(_event:
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
72
|
+
onObjectStepStart(event: GenerateObjectStepStartEvent): void;
|
|
76
73
|
/** @deprecated */
|
|
77
|
-
onObjectStepFinish(event:
|
|
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:
|
|
83
|
-
onFinish(event:
|
|
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:
|
|
88
|
-
onEmbedFinish(event:
|
|
84
|
+
onEmbedStart(event: EmbeddingModelCallStartEvent): void;
|
|
85
|
+
onEmbedFinish(event: EmbeddingModelCallEndEvent): void;
|
|
89
86
|
private onRerankOperationStart;
|
|
90
87
|
private onRerankOperationFinish;
|
|
91
|
-
onRerankStart(event:
|
|
92
|
-
onRerankFinish(event:
|
|
93
|
-
onChunk(event:
|
|
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 {
|
|
94
|
+
export { LegacyOpenTelemetry, OpenTelemetry };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/
|
|
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/
|
|
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
|
|
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(
|
|
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(
|
|
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:
|
|
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.
|
|
656
|
+
state.inferenceSpan = this.tracer.startSpan(
|
|
652
657
|
spanName,
|
|
653
658
|
{ attributes, kind: SpanKind.CLIENT },
|
|
654
659
|
state.rootContext
|
|
655
660
|
);
|
|
656
|
-
state.
|
|
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.
|
|
669
|
+
if (!(state == null ? void 0 : state.inferenceSpan)) return;
|
|
662
670
|
const { telemetry } = state;
|
|
663
|
-
state.
|
|
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.
|
|
688
|
-
state.
|
|
689
|
-
state.
|
|
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
|
|
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: () =>
|
|
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.
|
|
778
|
+
input: () => event.tools ? JSON.stringify(event.tools) : void 0
|
|
750
779
|
}
|
|
751
780
|
});
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
860
|
+
output: () => JSON.stringify(toolOutput.output)
|
|
799
861
|
}
|
|
800
862
|
})
|
|
801
863
|
);
|
|
802
864
|
} catch (e) {
|
|
803
865
|
}
|
|
804
866
|
} else {
|
|
805
|
-
recordSpanError(span,
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
1585
|
+
output: () => JSON.stringify(toolOutput.output)
|
|
1537
1586
|
}
|
|
1538
1587
|
})
|
|
1539
1588
|
);
|
|
1540
1589
|
} catch (e) {
|
|
1541
1590
|
}
|
|
1542
1591
|
} else {
|
|
1543
|
-
recordSpanError2(span,
|
|
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
|
-
|
|
1944
|
+
LegacyOpenTelemetry,
|
|
1897
1945
|
OpenTelemetry
|
|
1898
1946
|
};
|
|
1899
1947
|
//# sourceMappingURL=index.js.map
|