@@ -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,79 @@ 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
+ 'gen_ai.tool.call.id' : 'call-1' ,
188
+ 'gen_ai.tool.name' : 'getWeather' ,
189
+ 'operation.name' : 'ai.toolCall' ,
190
+ 'sentry.op' : 'gen_ai.execute_tool' ,
191
+ 'sentry.origin' : 'auto.vercelai.otel' ,
192
+ } ,
193
+ description : 'execute_tool getWeather' ,
194
+ op : 'gen_ai.execute_tool' ,
124
195
origin : 'auto.vercelai.otel' ,
125
196
status : 'ok' ,
126
197
} ) ,
@@ -149,11 +220,11 @@ describe('Vercel AI integration', () => {
149
220
'gen_ai.usage.output_tokens' : 20 ,
150
221
'gen_ai.usage.total_tokens' : 30 ,
151
222
'operation.name' : 'ai.generateText' ,
152
- 'sentry.op' : 'ai.pipeline.generateText ' ,
223
+ 'sentry.op' : 'ai.pipeline.generate_text ' ,
153
224
'sentry.origin' : 'auto.vercelai.otel' ,
154
225
} ,
155
226
description : 'generateText' ,
156
- op : 'ai.pipeline.generateText ' ,
227
+ op : 'ai.pipeline.generate_text ' ,
157
228
origin : 'auto.vercelai.otel' ,
158
229
status : 'ok' ,
159
230
} ) ,
@@ -182,11 +253,11 @@ describe('Vercel AI integration', () => {
182
253
'gen_ai.usage.output_tokens' : 20 ,
183
254
'gen_ai.usage.total_tokens' : 30 ,
184
255
'operation.name' : 'ai.generateText.doGenerate' ,
185
- 'sentry.op' : 'ai.run.doGenerate ' ,
256
+ 'sentry.op' : 'gen_ai.generate_text ' ,
186
257
'sentry.origin' : 'auto.vercelai.otel' ,
187
258
} ,
188
- description : 'generateText.doGenerate ' ,
189
- op : 'ai.run.doGenerate ' ,
259
+ description : 'generate_text mock-model-id ' ,
260
+ op : 'gen_ai.generate_text ' ,
190
261
origin : 'auto.vercelai.otel' ,
191
262
status : 'ok' ,
192
263
} ) ,
@@ -209,19 +280,19 @@ describe('Vercel AI integration', () => {
209
280
'gen_ai.usage.output_tokens' : 20 ,
210
281
'gen_ai.usage.total_tokens' : 30 ,
211
282
'operation.name' : 'ai.generateText' ,
212
- 'sentry.op' : 'ai.pipeline.generateText ' ,
283
+ 'sentry.op' : 'ai.pipeline.generate_text ' ,
213
284
'sentry.origin' : 'auto.vercelai.otel' ,
214
285
} ,
215
286
description : 'generateText' ,
216
- op : 'ai.pipeline.generateText ' ,
287
+ op : 'ai.pipeline.generate_text ' ,
217
288
origin : 'auto.vercelai.otel' ,
218
289
status : 'ok' ,
219
290
} ) ,
220
291
// Fourth span - doGenerate for explicitly enabled telemetry call
221
292
expect . objectContaining ( {
222
293
data : {
223
294
'sentry.origin' : 'auto.vercelai.otel' ,
224
- 'sentry.op' : 'ai.run.doGenerate ' ,
295
+ 'sentry.op' : 'gen_ai.generate_text ' ,
225
296
'operation.name' : 'ai.generateText.doGenerate' ,
226
297
'ai.operationId' : 'ai.generateText.doGenerate' ,
227
298
'ai.model.provider' : 'mock-provider' ,
@@ -245,8 +316,91 @@ describe('Vercel AI integration', () => {
245
316
'gen_ai.response.model' : 'mock-model-id' ,
246
317
'gen_ai.usage.total_tokens' : 30 ,
247
318
} ,
248
- description : 'generateText.doGenerate' ,
249
- op : 'ai.run.doGenerate' ,
319
+ description : 'generate_text mock-model-id' ,
320
+ op : 'gen_ai.generate_text' ,
321
+ origin : 'auto.vercelai.otel' ,
322
+ status : 'ok' ,
323
+ } ) ,
324
+ // Fifth span - tool call generateText span (should include prompts when sendDefaultPii: true)
325
+ expect . objectContaining ( {
326
+ data : {
327
+ 'ai.model.id' : 'mock-model-id' ,
328
+ 'ai.model.provider' : 'mock-provider' ,
329
+ 'ai.operationId' : 'ai.generateText' ,
330
+ 'ai.pipeline.name' : 'generateText' ,
331
+ 'ai.prompt' : '{"prompt":"What is the weather in San Francisco?"}' ,
332
+ 'ai.response.finishReason' : 'tool-calls' ,
333
+ 'ai.response.text' : 'Tool call completed!' ,
334
+ 'ai.response.toolCalls' : expect . any ( String ) ,
335
+ 'ai.settings.maxRetries' : 2 ,
336
+ 'ai.settings.maxSteps' : 1 ,
337
+ 'ai.streaming' : false ,
338
+ 'gen_ai.prompt' : '{"prompt":"What is the weather in San Francisco?"}' ,
339
+ 'gen_ai.response.model' : 'mock-model-id' ,
340
+ 'gen_ai.usage.input_tokens' : 15 ,
341
+ 'gen_ai.usage.output_tokens' : 25 ,
342
+ 'gen_ai.usage.total_tokens' : 40 ,
343
+ 'operation.name' : 'ai.generateText' ,
344
+ 'sentry.op' : 'ai.pipeline.generate_text' ,
345
+ 'sentry.origin' : 'auto.vercelai.otel' ,
346
+ } ,
347
+ description : 'generateText' ,
348
+ op : 'ai.pipeline.generate_text' ,
349
+ origin : 'auto.vercelai.otel' ,
350
+ status : 'ok' ,
351
+ } ) ,
352
+ // Sixth span - tool call doGenerate span (should include prompts when sendDefaultPii: true)
353
+ expect . objectContaining ( {
354
+ data : {
355
+ 'ai.model.id' : 'mock-model-id' ,
356
+ 'ai.model.provider' : 'mock-provider' ,
357
+ 'ai.operationId' : 'ai.generateText.doGenerate' ,
358
+ 'ai.pipeline.name' : 'generateText.doGenerate' ,
359
+ 'ai.prompt.format' : expect . any ( String ) ,
360
+ 'ai.prompt.messages' : expect . any ( String ) ,
361
+ 'ai.prompt.toolChoice' : expect . any ( String ) ,
362
+ 'ai.prompt.tools' : expect . any ( Array ) ,
363
+ 'ai.response.finishReason' : 'tool-calls' ,
364
+ 'ai.response.id' : expect . any ( String ) ,
365
+ 'ai.response.model' : 'mock-model-id' ,
366
+ 'ai.response.text' : 'Tool call completed!' ,
367
+ 'ai.response.timestamp' : expect . any ( String ) ,
368
+ 'ai.response.toolCalls' : expect . any ( String ) ,
369
+ 'ai.settings.maxRetries' : 2 ,
370
+ 'ai.streaming' : false ,
371
+ 'gen_ai.request.model' : 'mock-model-id' ,
372
+ 'gen_ai.response.finish_reasons' : [ 'tool-calls' ] ,
373
+ 'gen_ai.response.id' : expect . any ( String ) ,
374
+ 'gen_ai.response.model' : 'mock-model-id' ,
375
+ 'gen_ai.system' : 'mock-provider' ,
376
+ 'gen_ai.usage.input_tokens' : 15 ,
377
+ 'gen_ai.usage.output_tokens' : 25 ,
378
+ 'gen_ai.usage.total_tokens' : 40 ,
379
+ 'operation.name' : 'ai.generateText.doGenerate' ,
380
+ 'sentry.op' : 'gen_ai.generate_text' ,
381
+ 'sentry.origin' : 'auto.vercelai.otel' ,
382
+ } ,
383
+ description : 'generate_text mock-model-id' ,
384
+ op : 'gen_ai.generate_text' ,
385
+ origin : 'auto.vercelai.otel' ,
386
+ status : 'ok' ,
387
+ } ) ,
388
+ // Seventh span - tool call execution span
389
+ expect . objectContaining ( {
390
+ data : {
391
+ 'ai.operationId' : 'ai.toolCall' ,
392
+ 'ai.toolCall.args' : expect . any ( String ) ,
393
+ 'ai.toolCall.id' : 'call-1' ,
394
+ 'ai.toolCall.name' : 'getWeather' ,
395
+ 'ai.toolCall.result' : expect . any ( String ) ,
396
+ 'gen_ai.tool.call.id' : 'call-1' ,
397
+ 'gen_ai.tool.name' : 'getWeather' ,
398
+ 'operation.name' : 'ai.toolCall' ,
399
+ 'sentry.op' : 'gen_ai.execute_tool' ,
400
+ 'sentry.origin' : 'auto.vercelai.otel' ,
401
+ } ,
402
+ description : 'execute_tool getWeather' ,
403
+ op : 'gen_ai.execute_tool' ,
250
404
origin : 'auto.vercelai.otel' ,
251
405
status : 'ok' ,
252
406
} ) ,
0 commit comments