@@ -26,19 +26,19 @@ describe('Vercel AI integration', () => {
26
26
'gen_ai.usage.output_tokens' : 20 ,
27
27
'gen_ai.usage.total_tokens' : 30 ,
28
28
'operation.name' : 'ai.generateText' ,
29
- 'sentry.op' : 'ai.pipeline.generateText ' ,
29
+ 'sentry.op' : 'ai.pipeline.generate_text ' ,
30
30
'sentry.origin' : 'auto.vercelai.otel' ,
31
31
} ,
32
32
description : 'generateText' ,
33
- op : 'ai.pipeline.generateText ' ,
33
+ op : 'ai.pipeline.generate_text ' ,
34
34
origin : 'auto.vercelai.otel' ,
35
35
status : 'ok' ,
36
36
} ) ,
37
37
// Second span - explicitly enabled telemetry but recordInputs/recordOutputs not set, should not record when sendDefaultPii: false
38
38
expect . objectContaining ( {
39
39
data : {
40
40
'sentry.origin' : 'auto.vercelai.otel' ,
41
- 'sentry.op' : 'ai.run.doGenerate ' ,
41
+ 'sentry.op' : 'gen_ai.generate_text ' ,
42
42
'operation.name' : 'ai.generateText.doGenerate' ,
43
43
'ai.operationId' : 'ai.generateText.doGenerate' ,
44
44
'ai.model.provider' : 'mock-provider' ,
@@ -59,8 +59,8 @@ describe('Vercel AI integration', () => {
59
59
'gen_ai.response.model' : 'mock-model-id' ,
60
60
'gen_ai.usage.total_tokens' : 30 ,
61
61
} ,
62
- description : 'generateText.doGenerate ' ,
63
- op : 'ai.run.doGenerate ' ,
62
+ description : 'generate_text mock-model-id ' ,
63
+ op : 'gen_ai.generate_text ' ,
64
64
origin : 'auto.vercelai.otel' ,
65
65
status : 'ok' ,
66
66
} ) ,
@@ -83,19 +83,19 @@ describe('Vercel AI integration', () => {
83
83
'gen_ai.usage.output_tokens' : 20 ,
84
84
'gen_ai.usage.total_tokens' : 30 ,
85
85
'operation.name' : 'ai.generateText' ,
86
- 'sentry.op' : 'ai.pipeline.generateText ' ,
86
+ 'sentry.op' : 'ai.pipeline.generate_text ' ,
87
87
'sentry.origin' : 'auto.vercelai.otel' ,
88
88
} ,
89
89
description : 'generateText' ,
90
- op : 'ai.pipeline.generateText ' ,
90
+ op : 'ai.pipeline.generate_text ' ,
91
91
origin : 'auto.vercelai.otel' ,
92
92
status : 'ok' ,
93
93
} ) ,
94
94
// Fourth span - doGenerate for explicit telemetry enabled call
95
95
expect . objectContaining ( {
96
96
data : {
97
97
'sentry.origin' : 'auto.vercelai.otel' ,
98
- 'sentry.op' : 'ai.run.doGenerate ' ,
98
+ 'sentry.op' : 'gen_ai.generate_text ' ,
99
99
'operation.name' : 'ai.generateText.doGenerate' ,
100
100
'ai.operationId' : 'ai.generateText.doGenerate' ,
101
101
'ai.model.provider' : 'mock-provider' ,
@@ -119,8 +119,77 @@ describe('Vercel AI integration', () => {
119
119
'gen_ai.response.model' : 'mock-model-id' ,
120
120
'gen_ai.usage.total_tokens' : 30 ,
121
121
} ,
122
- description : 'generateText.doGenerate' ,
123
- op : 'ai.run.doGenerate' ,
122
+ description : 'generate_text mock-model-id' ,
123
+ op : 'gen_ai.generate_text' ,
124
+ origin : 'auto.vercelai.otel' ,
125
+ status : 'ok' ,
126
+ } ) ,
127
+ // Fifth span - tool call generateText span
128
+ expect . objectContaining ( {
129
+ data : {
130
+ 'ai.model.id' : 'mock-model-id' ,
131
+ 'ai.model.provider' : 'mock-provider' ,
132
+ 'ai.operationId' : 'ai.generateText' ,
133
+ 'ai.pipeline.name' : 'generateText' ,
134
+ 'ai.response.finishReason' : 'tool-calls' ,
135
+ 'ai.settings.maxRetries' : 2 ,
136
+ 'ai.settings.maxSteps' : 1 ,
137
+ 'ai.streaming' : false ,
138
+ 'gen_ai.response.model' : 'mock-model-id' ,
139
+ 'gen_ai.usage.input_tokens' : 15 ,
140
+ 'gen_ai.usage.output_tokens' : 25 ,
141
+ 'gen_ai.usage.total_tokens' : 40 ,
142
+ 'operation.name' : 'ai.generateText' ,
143
+ 'sentry.op' : 'ai.pipeline.generate_text' ,
144
+ 'sentry.origin' : 'auto.vercelai.otel' ,
145
+ } ,
146
+ description : 'generateText' ,
147
+ op : 'ai.pipeline.generate_text' ,
148
+ origin : 'auto.vercelai.otel' ,
149
+ status : 'ok' ,
150
+ } ) ,
151
+ // Sixth span - tool call doGenerate span
152
+ expect . objectContaining ( {
153
+ data : {
154
+ 'ai.model.id' : 'mock-model-id' ,
155
+ 'ai.model.provider' : 'mock-provider' ,
156
+ 'ai.operationId' : 'ai.generateText.doGenerate' ,
157
+ 'ai.pipeline.name' : 'generateText.doGenerate' ,
158
+ 'ai.response.finishReason' : 'tool-calls' ,
159
+ 'ai.response.id' : expect . any ( String ) ,
160
+ 'ai.response.model' : 'mock-model-id' ,
161
+ 'ai.response.timestamp' : expect . any ( String ) ,
162
+ 'ai.settings.maxRetries' : 2 ,
163
+ 'ai.streaming' : false ,
164
+ 'gen_ai.request.model' : 'mock-model-id' ,
165
+ 'gen_ai.response.finish_reasons' : [ 'tool-calls' ] ,
166
+ 'gen_ai.response.id' : expect . any ( String ) ,
167
+ 'gen_ai.response.model' : 'mock-model-id' ,
168
+ 'gen_ai.system' : 'mock-provider' ,
169
+ 'gen_ai.usage.input_tokens' : 15 ,
170
+ 'gen_ai.usage.output_tokens' : 25 ,
171
+ 'gen_ai.usage.total_tokens' : 40 ,
172
+ 'operation.name' : 'ai.generateText.doGenerate' ,
173
+ 'sentry.op' : 'gen_ai.generate_text' ,
174
+ 'sentry.origin' : 'auto.vercelai.otel' ,
175
+ } ,
176
+ description : 'generate_text mock-model-id' ,
177
+ op : 'gen_ai.generate_text' ,
178
+ origin : 'auto.vercelai.otel' ,
179
+ status : 'ok' ,
180
+ } ) ,
181
+ // Seventh span - tool call execution span
182
+ expect . objectContaining ( {
183
+ data : {
184
+ 'ai.operationId' : 'ai.toolCall' ,
185
+ 'ai.toolCall.id' : 'call-1' ,
186
+ 'ai.toolCall.name' : 'getWeather' ,
187
+ 'operation.name' : 'ai.toolCall' ,
188
+ 'sentry.op' : 'gen_ai.execute_tool' ,
189
+ 'sentry.origin' : 'auto.vercelai.otel' ,
190
+ } ,
191
+ description : 'execute_tool getWeather' ,
192
+ op : 'gen_ai.execute_tool' ,
124
193
origin : 'auto.vercelai.otel' ,
125
194
status : 'ok' ,
126
195
} ) ,
@@ -149,11 +218,11 @@ describe('Vercel AI integration', () => {
149
218
'gen_ai.usage.output_tokens' : 20 ,
150
219
'gen_ai.usage.total_tokens' : 30 ,
151
220
'operation.name' : 'ai.generateText' ,
152
- 'sentry.op' : 'ai.pipeline.generateText ' ,
221
+ 'sentry.op' : 'ai.pipeline.generate_text ' ,
153
222
'sentry.origin' : 'auto.vercelai.otel' ,
154
223
} ,
155
224
description : 'generateText' ,
156
- op : 'ai.pipeline.generateText ' ,
225
+ op : 'ai.pipeline.generate_text ' ,
157
226
origin : 'auto.vercelai.otel' ,
158
227
status : 'ok' ,
159
228
} ) ,
@@ -182,11 +251,11 @@ describe('Vercel AI integration', () => {
182
251
'gen_ai.usage.output_tokens' : 20 ,
183
252
'gen_ai.usage.total_tokens' : 30 ,
184
253
'operation.name' : 'ai.generateText.doGenerate' ,
185
- 'sentry.op' : 'ai.run.doGenerate ' ,
254
+ 'sentry.op' : 'gen_ai.generate_text ' ,
186
255
'sentry.origin' : 'auto.vercelai.otel' ,
187
256
} ,
188
- description : 'generateText.doGenerate ' ,
189
- op : 'ai.run.doGenerate ' ,
257
+ description : 'generate_text mock-model-id ' ,
258
+ op : 'gen_ai.generate_text ' ,
190
259
origin : 'auto.vercelai.otel' ,
191
260
status : 'ok' ,
192
261
} ) ,
@@ -209,19 +278,19 @@ describe('Vercel AI integration', () => {
209
278
'gen_ai.usage.output_tokens' : 20 ,
210
279
'gen_ai.usage.total_tokens' : 30 ,
211
280
'operation.name' : 'ai.generateText' ,
212
- 'sentry.op' : 'ai.pipeline.generateText ' ,
281
+ 'sentry.op' : 'ai.pipeline.generate_text ' ,
213
282
'sentry.origin' : 'auto.vercelai.otel' ,
214
283
} ,
215
284
description : 'generateText' ,
216
- op : 'ai.pipeline.generateText ' ,
285
+ op : 'ai.pipeline.generate_text ' ,
217
286
origin : 'auto.vercelai.otel' ,
218
287
status : 'ok' ,
219
288
} ) ,
220
289
// Fourth span - doGenerate for explicitly enabled telemetry call
221
290
expect . objectContaining ( {
222
291
data : {
223
292
'sentry.origin' : 'auto.vercelai.otel' ,
224
- 'sentry.op' : 'ai.run.doGenerate ' ,
293
+ 'sentry.op' : 'gen_ai.generate_text ' ,
225
294
'operation.name' : 'ai.generateText.doGenerate' ,
226
295
'ai.operationId' : 'ai.generateText.doGenerate' ,
227
296
'ai.model.provider' : 'mock-provider' ,
@@ -245,8 +314,89 @@ describe('Vercel AI integration', () => {
245
314
'gen_ai.response.model' : 'mock-model-id' ,
246
315
'gen_ai.usage.total_tokens' : 30 ,
247
316
} ,
248
- description : 'generateText.doGenerate' ,
249
- op : 'ai.run.doGenerate' ,
317
+ description : 'generate_text mock-model-id' ,
318
+ op : 'gen_ai.generate_text' ,
319
+ origin : 'auto.vercelai.otel' ,
320
+ status : 'ok' ,
321
+ } ) ,
322
+ // Fifth span - tool call generateText span (should include prompts when sendDefaultPii: true)
323
+ expect . objectContaining ( {
324
+ data : {
325
+ 'ai.model.id' : 'mock-model-id' ,
326
+ 'ai.model.provider' : 'mock-provider' ,
327
+ 'ai.operationId' : 'ai.generateText' ,
328
+ 'ai.pipeline.name' : 'generateText' ,
329
+ 'ai.prompt' : '{"prompt":"What is the weather in San Francisco?"}' ,
330
+ 'ai.response.finishReason' : 'tool-calls' ,
331
+ 'ai.response.text' : 'Tool call completed!' ,
332
+ 'ai.response.toolCalls' : expect . any ( String ) ,
333
+ 'ai.settings.maxRetries' : 2 ,
334
+ 'ai.settings.maxSteps' : 1 ,
335
+ 'ai.streaming' : false ,
336
+ 'gen_ai.prompt' : '{"prompt":"What is the weather in San Francisco?"}' ,
337
+ 'gen_ai.response.model' : 'mock-model-id' ,
338
+ 'gen_ai.usage.input_tokens' : 15 ,
339
+ 'gen_ai.usage.output_tokens' : 25 ,
340
+ 'gen_ai.usage.total_tokens' : 40 ,
341
+ 'operation.name' : 'ai.generateText' ,
342
+ 'sentry.op' : 'ai.pipeline.generate_text' ,
343
+ 'sentry.origin' : 'auto.vercelai.otel' ,
344
+ } ,
345
+ description : 'generateText' ,
346
+ op : 'ai.pipeline.generate_text' ,
347
+ origin : 'auto.vercelai.otel' ,
348
+ status : 'ok' ,
349
+ } ) ,
350
+ // Sixth span - tool call doGenerate span (should include prompts when sendDefaultPii: true)
351
+ expect . objectContaining ( {
352
+ data : {
353
+ 'ai.model.id' : 'mock-model-id' ,
354
+ 'ai.model.provider' : 'mock-provider' ,
355
+ 'ai.operationId' : 'ai.generateText.doGenerate' ,
356
+ 'ai.pipeline.name' : 'generateText.doGenerate' ,
357
+ 'ai.prompt.format' : expect . any ( String ) ,
358
+ 'ai.prompt.messages' : expect . any ( String ) ,
359
+ 'ai.prompt.toolChoice' : expect . any ( String ) ,
360
+ 'ai.prompt.tools' : expect . any ( Array ) ,
361
+ 'ai.response.finishReason' : 'tool-calls' ,
362
+ 'ai.response.id' : expect . any ( String ) ,
363
+ 'ai.response.model' : 'mock-model-id' ,
364
+ 'ai.response.text' : 'Tool call completed!' ,
365
+ 'ai.response.timestamp' : expect . any ( String ) ,
366
+ 'ai.response.toolCalls' : expect . any ( String ) ,
367
+ 'ai.settings.maxRetries' : 2 ,
368
+ 'ai.streaming' : false ,
369
+ 'gen_ai.request.model' : 'mock-model-id' ,
370
+ 'gen_ai.response.finish_reasons' : [ 'tool-calls' ] ,
371
+ 'gen_ai.response.id' : expect . any ( String ) ,
372
+ 'gen_ai.response.model' : 'mock-model-id' ,
373
+ 'gen_ai.system' : 'mock-provider' ,
374
+ 'gen_ai.usage.input_tokens' : 15 ,
375
+ 'gen_ai.usage.output_tokens' : 25 ,
376
+ 'gen_ai.usage.total_tokens' : 40 ,
377
+ 'operation.name' : 'ai.generateText.doGenerate' ,
378
+ 'sentry.op' : 'gen_ai.generate_text' ,
379
+ 'sentry.origin' : 'auto.vercelai.otel' ,
380
+ } ,
381
+ description : 'generate_text mock-model-id' ,
382
+ op : 'gen_ai.generate_text' ,
383
+ origin : 'auto.vercelai.otel' ,
384
+ status : 'ok' ,
385
+ } ) ,
386
+ // Seventh span - tool call execution span
387
+ expect . objectContaining ( {
388
+ data : {
389
+ 'ai.operationId' : 'ai.toolCall' ,
390
+ 'ai.toolCall.args' : expect . any ( String ) ,
391
+ 'ai.toolCall.id' : 'call-1' ,
392
+ 'ai.toolCall.name' : 'getWeather' ,
393
+ 'ai.toolCall.result' : expect . any ( String ) ,
394
+ 'operation.name' : 'ai.toolCall' ,
395
+ 'sentry.op' : 'gen_ai.execute_tool' ,
396
+ 'sentry.origin' : 'auto.vercelai.otel' ,
397
+ } ,
398
+ description : 'execute_tool getWeather' ,
399
+ op : 'gen_ai.execute_tool' ,
250
400
origin : 'auto.vercelai.otel' ,
251
401
status : 'ok' ,
252
402
} ) ,
0 commit comments