@ai-sdk/otel 1.0.152 → 1.0.154
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 +20 -0
- package/README.md +2 -90
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/legacy-open-telemetry.ts +11 -0
- package/src/open-telemetry.ts +18 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @ai-sdk/otel
|
|
2
2
|
|
|
3
|
+
## 1.0.154
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 47236dd: add onStepError callback to generateText, streamText, ToolLoopAgent and telemetry integrations, and onError and onAbort to ToolLoopAgent
|
|
8
|
+
- Updated dependencies [47236dd]
|
|
9
|
+
- Updated dependencies [c8e8866]
|
|
10
|
+
- Updated dependencies [1cf95c6]
|
|
11
|
+
- ai@7.0.154
|
|
12
|
+
|
|
13
|
+
## 1.0.153
|
|
14
|
+
|
|
15
|
+
### Patch Changes
|
|
16
|
+
|
|
17
|
+
- e729d58: chore(docs): update `README.md` for consistent format and to avoid duplication
|
|
18
|
+
- Updated dependencies [5475347]
|
|
19
|
+
- Updated dependencies [e729d58]
|
|
20
|
+
- @ai-sdk/provider@4.0.34
|
|
21
|
+
- ai@7.0.153
|
|
22
|
+
|
|
3
23
|
## 1.0.152
|
|
4
24
|
|
|
5
25
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -6,11 +6,8 @@ OpenTelemetry setup.
|
|
|
6
6
|
|
|
7
7
|
## Setup
|
|
8
8
|
|
|
9
|
-
The OpenTelemetry integration is available in the `@ai-sdk/otel` module. You can
|
|
10
|
-
install it with
|
|
11
|
-
|
|
12
9
|
```bash
|
|
13
|
-
npm i @ai-sdk/otel
|
|
10
|
+
npm i ai @ai-sdk/otel
|
|
14
11
|
```
|
|
15
12
|
|
|
16
13
|
## Skill for Coding Agents
|
|
@@ -24,9 +21,6 @@ npx skills add vercel/ai
|
|
|
24
21
|
|
|
25
22
|
## Usage
|
|
26
23
|
|
|
27
|
-
Register the telemetry integration once at application startup with
|
|
28
|
-
`registerTelemetry()`:
|
|
29
|
-
|
|
30
24
|
```ts
|
|
31
25
|
import { OpenTelemetry } from '@ai-sdk/otel';
|
|
32
26
|
import { registerTelemetry } from 'ai';
|
|
@@ -34,86 +28,4 @@ import { registerTelemetry } from 'ai';
|
|
|
34
28
|
registerTelemetry(new OpenTelemetry());
|
|
35
29
|
```
|
|
36
30
|
|
|
37
|
-
|
|
38
|
-
OpenTelemetry provider setup. For Node.js applications, register it at the top
|
|
39
|
-
level of your entry file.
|
|
40
|
-
|
|
41
|
-
Once registered, AI SDK calls emit telemetry events by default:
|
|
42
|
-
|
|
43
|
-
```ts
|
|
44
|
-
import { generateText } from 'ai';
|
|
45
|
-
|
|
46
|
-
const result = await generateText({
|
|
47
|
-
model: 'openai/gpt-6-astra',
|
|
48
|
-
prompt: 'Write a vegetarian lasagna recipe for 4 people.',
|
|
49
|
-
telemetry: {
|
|
50
|
-
functionId: 'recipe-generator',
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
You can opt out for an individual call with `telemetry.isEnabled`:
|
|
56
|
-
|
|
57
|
-
```ts
|
|
58
|
-
const result = await generateText({
|
|
59
|
-
model: 'openai/gpt-6-astra',
|
|
60
|
-
prompt: 'Write a vegetarian lasagna recipe for 4 people.',
|
|
61
|
-
telemetry: {
|
|
62
|
-
isEnabled: false,
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## OpenTelemetry
|
|
68
|
-
|
|
69
|
-
`OpenTelemetry` is the recommended integration. It emits spans that follow the
|
|
70
|
-
[OpenTelemetry GenAI Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/).
|
|
71
|
-
|
|
72
|
-
You can pass a custom tracer when you want to use a specific `TracerProvider`:
|
|
73
|
-
|
|
74
|
-
```ts
|
|
75
|
-
import { OpenTelemetry } from '@ai-sdk/otel';
|
|
76
|
-
import { registerTelemetry } from 'ai';
|
|
77
|
-
|
|
78
|
-
registerTelemetry(
|
|
79
|
-
new OpenTelemetry({
|
|
80
|
-
tracer: tracerProvider.getTracer('gen_ai'),
|
|
81
|
-
}),
|
|
82
|
-
);
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
You can also add custom attributes to spans with `enrichSpan`:
|
|
86
|
-
|
|
87
|
-
```ts
|
|
88
|
-
import { OpenTelemetry } from '@ai-sdk/otel';
|
|
89
|
-
import { registerTelemetry } from 'ai';
|
|
90
|
-
|
|
91
|
-
registerTelemetry(
|
|
92
|
-
new OpenTelemetry({
|
|
93
|
-
enrichSpan: ({ spanType, operationId, callId }) => ({
|
|
94
|
-
'my_app.span_type': spanType,
|
|
95
|
-
'my_app.operation_id': operationId,
|
|
96
|
-
'my_app.call_id': callId,
|
|
97
|
-
}),
|
|
98
|
-
}),
|
|
99
|
-
);
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Legacy Telemetry
|
|
103
|
-
|
|
104
|
-
`LegacyOpenTelemetry` emits the older AI SDK-specific span format with `ai.*`
|
|
105
|
-
attributes. Use it when an existing observability integration depends on the
|
|
106
|
-
legacy span shape:
|
|
107
|
-
|
|
108
|
-
```ts
|
|
109
|
-
import { LegacyOpenTelemetry } from '@ai-sdk/otel';
|
|
110
|
-
import { registerTelemetry } from 'ai';
|
|
111
|
-
|
|
112
|
-
registerTelemetry(new LegacyOpenTelemetry());
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
## Documentation
|
|
116
|
-
|
|
117
|
-
Please check out the
|
|
118
|
-
[AI SDK telemetry documentation](https://ai-sdk.dev/docs/ai-sdk-core/telemetry)
|
|
119
|
-
for more information.
|
|
31
|
+
See the [OpenTelemetry documentation](https://ai-sdk.dev/docs/ai-sdk-core/telemetry) for more information.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Attributes, Tracer } from "@opentelemetry/api";
|
|
2
|
-
import { EmbedEndEvent, EmbedStartEvent, EmbeddingModelCallEndEvent, EmbeddingModelCallStartEvent, Experimental_DecideEndEvent, Experimental_DecideStartEvent, Experimental_DecisionModelCallEndEvent, Experimental_DecisionModelCallStartEvent, Experimental_StreamTranscriptionEndEvent, Experimental_StreamTranscriptionStartEvent, GenerateObjectEndEvent, GenerateObjectStartEvent, GenerateObjectStepEndEvent, GenerateObjectStepStartEvent, GenerateSpeechEndEvent, GenerateSpeechStartEvent, GenerateTextAbortEvent, GenerateTextEndEvent, GenerateTextStartEvent, GenerateTextStepEndEvent, GenerateTextStepStartEvent, InferTelemetryEvent, LanguageModelCallEndEvent, LanguageModelCallStartEvent, Output, RerankEndEvent, RerankStartEvent, RerankingModelCallEndEvent, RerankingModelCallStartEvent, Telemetry, ToolExecutionEndEvent, ToolExecutionStartEvent, ToolSet, TranscriptionEndEvent, TranscriptionStartEvent } from "ai";
|
|
2
|
+
import { EmbedEndEvent, EmbedStartEvent, EmbeddingModelCallEndEvent, EmbeddingModelCallStartEvent, Experimental_DecideEndEvent, Experimental_DecideStartEvent, Experimental_DecisionModelCallEndEvent, Experimental_DecisionModelCallStartEvent, Experimental_StreamTranscriptionEndEvent, Experimental_StreamTranscriptionStartEvent, GenerateObjectEndEvent, GenerateObjectStartEvent, GenerateObjectStepEndEvent, GenerateObjectStepStartEvent, GenerateSpeechEndEvent, GenerateSpeechStartEvent, GenerateTextAbortEvent, GenerateTextEndEvent, GenerateTextStartEvent, GenerateTextStepEndEvent, GenerateTextStepErrorEvent, GenerateTextStepStartEvent, InferTelemetryEvent, LanguageModelCallEndEvent, LanguageModelCallStartEvent, Output, RerankEndEvent, RerankStartEvent, RerankingModelCallEndEvent, RerankingModelCallStartEvent, Telemetry, ToolExecutionEndEvent, ToolExecutionStartEvent, ToolSet, TranscriptionEndEvent, TranscriptionStartEvent } from "ai";
|
|
3
3
|
import { APICallError, LanguageModelV4Prompt } from "@ai-sdk/provider";
|
|
4
4
|
//#region src/supplemental-attributes.d.ts
|
|
5
5
|
type OpenTelemetrySpanType = 'operation' | 'step' | 'languageModel' | 'tool' | 'embedding' | 'reranking' | 'experimental_decision';
|
|
@@ -119,6 +119,7 @@ export declare class OpenTelemetry implements Telemetry {
|
|
|
119
119
|
onStepEnd(event: GenerateTextStepEndEvent<ToolSet>): void;
|
|
120
120
|
/** @deprecated Use `onStepEnd` instead. */
|
|
121
121
|
onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void;
|
|
122
|
+
onStepError(event: GenerateTextStepErrorEvent<ToolSet>): void;
|
|
122
123
|
onEnd(event: GenerateTextEndEvent<ToolSet> | GenerateObjectEndEvent<unknown> | EmbedEndEvent | RerankEndEvent | GenerateSpeechEndEvent | TranscriptionEndEvent): void;
|
|
123
124
|
experimental_onStreamTranscriptionEnd(event: InferTelemetryEvent<Experimental_StreamTranscriptionEndEvent>): void;
|
|
124
125
|
private onAudioOperationEnd;
|
|
@@ -208,6 +209,7 @@ export declare class LegacyOpenTelemetry implements Telemetry {
|
|
|
208
209
|
onStepEnd(event: GenerateTextStepEndEvent<ToolSet>): void;
|
|
209
210
|
/** @deprecated Use `onStepEnd` instead. */
|
|
210
211
|
onStepFinish(event: GenerateTextStepEndEvent<ToolSet>): void;
|
|
212
|
+
onStepError(event: GenerateTextStepErrorEvent<ToolSet>): void;
|
|
211
213
|
onEnd(event: GenerateTextEndEvent<ToolSet> | GenerateObjectEndEvent<unknown> | EmbedEndEvent | RerankEndEvent | GenerateSpeechEndEvent | TranscriptionEndEvent): void;
|
|
212
214
|
experimental_onStreamTranscriptionEnd(event: InferTelemetryEvent<Experimental_StreamTranscriptionEndEvent>): void;
|
|
213
215
|
private onAudioOperationEnd;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["OtelStepStartEvent","StreamTranscriptionStartEvent","StreamTranscriptionEndEvent","DecideStartEvent","DecideEndEvent","DecisionModelCallStartEvent","DecisionModelCallEndEvent","AISDKContext","StreamTranscriptionStartEvent","StreamTranscriptionEndEvent","DecideStartEvent","DecideEndEvent","DecisionModelCallStartEvent","DecisionModelCallEndEvent"],"sources":["../src/supplemental-attributes.ts","../src/open-telemetry.ts","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/schemas.d.cts","../../provider-utils/dist/index.d.ts","../src/legacy-open-telemetry.ts"],"x_google_ignoreList":[2],"mappings":";;;;KAwBY;KASA,cAAc;EACxB,UAAU;EACV;EACA;EACA,gBAAgB;MACZ;KAEM;;;;EAIV,SAAS;;;;;;;;;;;EAYT,6CAGM;IACA;IACA;;;;;;EAON,aAAa;;;;EAKb;;;;EAKA;;;;EAKA;;;;EAKA;;;;EAKA;;EAGA;;;;EAKA;;;;EAKA;;;;EAKA;;;;EAKA;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["OtelStepStartEvent","StreamTranscriptionStartEvent","StreamTranscriptionEndEvent","DecideStartEvent","DecideEndEvent","DecisionModelCallStartEvent","DecisionModelCallEndEvent","AISDKContext","StreamTranscriptionStartEvent","StreamTranscriptionEndEvent","DecideStartEvent","DecideEndEvent","DecisionModelCallStartEvent","DecisionModelCallEndEvent"],"sources":["../src/supplemental-attributes.ts","../src/open-telemetry.ts","../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/schemas.d.cts","../../provider-utils/dist/index.d.ts","../src/legacy-open-telemetry.ts"],"x_google_ignoreList":[2],"mappings":";;;;KAwBY;KASA,cAAc;EACxB,UAAU;EACV;EACA;EACA,gBAAgB;MACZ;KAEM;;;;EAIV,SAAS;;;;;;;;;;;EAYT,6CAGM;IACA;IACA;;;;;;EAON,aAAa;;;;EAKb;;;;EAKA;;;;EAKA;;;;EAKA;;;;EAKA;;EAGA;;;;EAKA;;;;EAKA;;;;EAKA;;;;EAKA;;;;UCpCQA,6BAA2B,2BAA2B;WACrD;;qBA2CE,yBAAyB;mBACnB;mBAEA;mBACA;mBACA;mBACA;EAEL,YAAA,UAAS;UAOb;UAIA;UAIA;UA+BA;EAgCR,YAAY,KACV,QACA,YACA;IAEA;IACA;IACA,eAAe,YAAY;MACzB,YAAY;;;;;EAchB,yBAAyB,KACvB,QACA;IAEA;IACA,eAAe,YAAY;MACzB,YAAY;EAWhB,QACE,OACI,oBAAoB,0BACpB,oBAAoB,4BACpB,oBAAoB,mBACpB,oBAAoB,oBACpB,oBAAoB,4BACpB,oBAAoB;EA4C1B,wCACE,OAAO,oBAAoBC;UAKrB;UA0FA;UA2GA;;EAiHR,kBAAkB,OAAO;;EAuEzB,gBAAgB,OAAO;UAqDf;EA6ER,YAAY,OAAOD;EAwCnB,yBAAyB,OAAO;EAyEhC,uBAAuB,OAAO,0BAA0B;EAqKxD,qBAAqB,OAAO,wBAAwB;EAyCpD,mBAAmB,OAAO,sBAAsB;EAqChD,UAAU,OAAO,yBAAyB;;EA2B1C,aAAa,OAAO,yBAAyB;EAI7C,YAAY,OAAO,2BAA2B;EAiB9C,MACE,OACI,qBAAqB,WACrB,kCACA,gBACA,iBACA,yBACA;EAuCN,sCACE,OAAO,oBAAoBE;UAKrB;UA8EA;UAqDA;UA+CA;EAoCR,aAAa,OAAO;EA4CpB,WAAW,OAAO;UAgCV;UAoEA;EAQR,cAAc,OAAO;EAyCrB,YAAY,OAAO;UAsBX;UAkEA;EAsBR,2BACE,OAAO,oBAAoBC;EAK7B,yBAAyB,OAAOC;EAIhC,sCACE,OAAOC;EAKT,oCAAoC,OAAOC;;EAK3C,6BACE,OAAO,oBAAoBH;;EAM7B,2BAA2B,OAAOC;;EAKlC,wCACE,OAAO,oBAAoBC;;EA+C7B,sCACE,OAAO,oBAAoBC;EAiC7B,QAAQ,OAAO,uBAAuB;EAwCtC,QAAQ;;;;QC9pCF;YACM;;;;;;;;;KCi4BT,UAAU;;;UCv/CL,mBACR,cAAc,UAAU,SACxB,wBAAwBC,UAAeA,SACvC,eAAe,OAAO,SAAS,OAAO,gBAC9B,2BAA2B,OAAO,iBAAiB;WAClD,iBAAiB;WACjB,YAAY,cAAc;WAC1B;;qBAkBE,+BAA+B;mBACzB;;;;mBAKA;EAGf,YAAA;IACE,SAAS;;UAML;UAIA;EAIR,YAAY,KACV,QACA,YACA;IAEA;IACA;IACA,eAAe,YAAY;MACzB,YAAY;;;;;EAchB,yBAAyB,KACvB,QACA;IAEA;IACA,eAAe,YAAY;MACzB,YAAY;EAUhB,QACE,OACI,oBAAoB,0BACpB,oBAAoB,4BACpB,oBAAoB,mBACpB,oBAAoB,oBACpB,oBAAoB,4BACpB,oBAAoB;EA4C1B,wCACE,OAAO,oBAAoBC;UAKrB;UAyDA;UAgEA;;EAqER,kBAAkB,OAAO;;EAmDzB,gBAAgB,OAAO;UA2Df;EA6DR,YAAY,OAAO;EAiEnB,qBAAqB,OAAO,wBAAwB;EAqCpD,mBAAmB,OAAO,sBAAsB;EA+BhD,UAAU,OAAO,yBAAyB;;EAgH1C,aAAa,OAAO,yBAAyB;EAI7C,YAAY,OAAO,2BAA2B;EAU9C,MACE,OACI,qBAAqB,WACrB,kCACA,gBACA,iBACA,yBACA;EAuCN,sCACE,OAAO,oBAAoBC;UAKrB;UA+CA;UA6EA;UAmCA;EA6BR,aAAa,OAAO;EA8BpB,WAAW,OAAO;UAwBV;UAkDA;EAQR,cAAc,OAAO;EA2BrB,YAAY,OAAO;UAoBX;UA8CA;EAgBR,2BACE,OAAO,oBAAoBC;EAK7B,yBAAyB,OAAOC;EAIhC,sCACE,OAAOC;EAKT,oCAAoC,OAAOC;;EAK3C,6BACE,OAAO,oBAAoBH;;EAM7B,2BAA2B,OAAOC;;EAKlC,wCACE,OAAO,oBAAoBC;;EA8B7B,sCACE,OAAO,oBAAoBC;EAqB7B,QAAQ,OAAO,uBAAuB;EAkCtC,QAAQ"}
|
package/dist/index.js
CHANGED
|
@@ -1310,6 +1310,20 @@ var OpenTelemetry = class {
|
|
|
1310
1310
|
onStepFinish(event) {
|
|
1311
1311
|
this.onStepEnd(event);
|
|
1312
1312
|
}
|
|
1313
|
+
onStepError(event) {
|
|
1314
|
+
const state = this.getCallState(event.callId);
|
|
1315
|
+
if (!state?.stepSpan) return;
|
|
1316
|
+
if (state.inferenceSpan) {
|
|
1317
|
+
recordErrorOnSpan(state.inferenceSpan, event.error);
|
|
1318
|
+
state.inferenceSpan.end();
|
|
1319
|
+
state.inferenceSpan = void 0;
|
|
1320
|
+
state.inferenceContext = void 0;
|
|
1321
|
+
}
|
|
1322
|
+
recordErrorOnSpan(state.stepSpan, event.error);
|
|
1323
|
+
state.stepSpan.end();
|
|
1324
|
+
state.stepSpan = void 0;
|
|
1325
|
+
state.stepContext = void 0;
|
|
1326
|
+
}
|
|
1313
1327
|
onEnd(event) {
|
|
1314
1328
|
const state = this.getCallState(event.callId);
|
|
1315
1329
|
if (!state?.rootSpan) return;
|
|
@@ -2264,6 +2278,14 @@ var LegacyOpenTelemetry = class {
|
|
|
2264
2278
|
onStepFinish(event) {
|
|
2265
2279
|
this.onStepEnd(event);
|
|
2266
2280
|
}
|
|
2281
|
+
onStepError(event) {
|
|
2282
|
+
const state = this.getCallState(event.callId);
|
|
2283
|
+
if (!state?.stepSpan) return;
|
|
2284
|
+
recordSpanError(state.stepSpan, event.error);
|
|
2285
|
+
state.stepSpan.end();
|
|
2286
|
+
state.stepSpan = void 0;
|
|
2287
|
+
state.stepContext = void 0;
|
|
2288
|
+
}
|
|
2267
2289
|
onEnd(event) {
|
|
2268
2290
|
const state = this.getCallState(event.callId);
|
|
2269
2291
|
if (!state?.rootSpan) return;
|