@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 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
- For Next.js applications, place this in `instrumentation.ts` alongside your
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;
@@ -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;;;;UCrCQA,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,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;;;;QC5oCF;YACM;;;;;;;;;KCi4BT,UAAU;;;UCx/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,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"}
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":"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"}
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;