@@ -12,7 +12,7 @@ describe('Vercel AI integration', () => {
12
12
spans : expect . arrayContaining ( [
13
13
// First span - no telemetry config, should enable telemetry but not record inputs/outputs when sendDefaultPii: false
14
14
expect . objectContaining ( {
15
- data : expect . objectContaining ( {
15
+ data : {
16
16
'ai.model.id' : 'mock-model-id' ,
17
17
'ai.model.provider' : 'mock-provider' ,
18
18
'ai.operationId' : 'ai.generateText' ,
@@ -28,15 +28,15 @@ describe('Vercel AI integration', () => {
28
28
'operation.name' : 'ai.generateText' ,
29
29
'sentry.op' : 'ai.pipeline.generateText' ,
30
30
'sentry.origin' : 'auto.vercelai.otel' ,
31
- } ) ,
31
+ } ,
32
32
description : 'generateText' ,
33
33
op : 'ai.pipeline.generateText' ,
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
- data : expect . objectContaining ( {
39
+ data : {
40
40
'sentry.origin' : 'auto.vercelai.otel' ,
41
41
'sentry.op' : 'ai.run.doGenerate' ,
42
42
'operation.name' : 'ai.generateText.doGenerate' ,
@@ -58,12 +58,72 @@ describe('Vercel AI integration', () => {
58
58
'gen_ai.response.id' : expect . any ( String ) ,
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' ,
64
+ origin : 'auto.vercelai.otel' ,
65
+ status : 'ok' ,
66
+ } ) ,
67
+ // Third span - explicit telemetry enabled, should record inputs/outputs regardless of sendDefaultPii
68
+ expect . objectContaining ( {
69
+ data : {
70
+ 'ai.model.id' : 'mock-model-id' ,
71
+ 'ai.model.provider' : 'mock-provider' ,
72
+ 'ai.operationId' : 'ai.generateText' ,
73
+ 'ai.pipeline.name' : 'generateText' ,
74
+ 'ai.prompt' : '{"prompt":"Where is the second span?"}' ,
75
+ 'ai.response.finishReason' : 'stop' ,
76
+ 'ai.response.text' : expect . any ( String ) ,
77
+ 'ai.settings.maxRetries' : 2 ,
78
+ 'ai.settings.maxSteps' : 1 ,
79
+ 'ai.streaming' : false ,
80
+ 'gen_ai.prompt' : '{"prompt":"Where is the second span?"}' ,
81
+ 'gen_ai.response.model' : 'mock-model-id' ,
82
+ 'gen_ai.usage.input_tokens' : 10 ,
83
+ 'gen_ai.usage.output_tokens' : 20 ,
84
+ 'gen_ai.usage.total_tokens' : 30 ,
85
+ 'operation.name' : 'ai.generateText' ,
86
+ 'sentry.op' : 'ai.pipeline.generateText' ,
87
+ 'sentry.origin' : 'auto.vercelai.otel' ,
88
+ } ,
62
89
description : 'generateText' ,
63
90
op : 'ai.pipeline.generateText' ,
64
91
origin : 'auto.vercelai.otel' ,
65
92
status : 'ok' ,
66
93
} ) ,
94
+ // Fourth span - doGenerate for explicit telemetry enabled call
95
+ expect . objectContaining ( {
96
+ data : {
97
+ 'sentry.origin' : 'auto.vercelai.otel' ,
98
+ 'sentry.op' : 'ai.run.doGenerate' ,
99
+ 'operation.name' : 'ai.generateText.doGenerate' ,
100
+ 'ai.operationId' : 'ai.generateText.doGenerate' ,
101
+ 'ai.model.provider' : 'mock-provider' ,
102
+ 'ai.model.id' : 'mock-model-id' ,
103
+ 'ai.settings.maxRetries' : 2 ,
104
+ 'gen_ai.system' : 'mock-provider' ,
105
+ 'gen_ai.request.model' : 'mock-model-id' ,
106
+ 'ai.pipeline.name' : 'generateText.doGenerate' ,
107
+ 'ai.streaming' : false ,
108
+ 'ai.response.finishReason' : 'stop' ,
109
+ 'ai.response.model' : 'mock-model-id' ,
110
+ 'ai.response.id' : expect . any ( String ) ,
111
+ 'ai.response.text' : expect . any ( String ) ,
112
+ 'ai.response.timestamp' : expect . any ( String ) ,
113
+ 'ai.prompt.format' : expect . any ( String ) ,
114
+ 'ai.prompt.messages' : expect . any ( String ) ,
115
+ 'gen_ai.response.finish_reasons' : [ 'stop' ] ,
116
+ 'gen_ai.usage.input_tokens' : 10 ,
117
+ 'gen_ai.usage.output_tokens' : 20 ,
118
+ 'gen_ai.response.id' : expect . any ( String ) ,
119
+ 'gen_ai.response.model' : 'mock-model-id' ,
120
+ 'gen_ai.usage.total_tokens' : 30 ,
121
+ } ,
122
+ description : 'generateText.doGenerate' ,
123
+ op : 'ai.run.doGenerate' ,
124
+ origin : 'auto.vercelai.otel' ,
125
+ status : 'ok' ,
126
+ } ) ,
67
127
] ) ,
68
128
} ;
69
129
@@ -72,35 +132,67 @@ describe('Vercel AI integration', () => {
72
132
spans : expect . arrayContaining ( [
73
133
// First span - no telemetry config, should enable telemetry AND record inputs/outputs when sendDefaultPii: true
74
134
expect . objectContaining ( {
75
- data : expect . objectContaining ( {
76
- 'ai.completion_tokens.used' : 20 ,
135
+ data : {
77
136
'ai.model.id' : 'mock-model-id' ,
78
137
'ai.model.provider' : 'mock-provider' ,
79
- 'ai.model_id' : 'mock-model-id' ,
80
- 'ai.prompt' : '{"prompt":"Where is the first span?"}' ,
81
138
'ai.operationId' : 'ai.generateText' ,
82
139
'ai.pipeline.name' : 'generateText' ,
83
- 'ai.prompt_tokens.used ' : 10 ,
140
+ 'ai.prompt ' : '{"prompt":"Where is the first span?"}' ,
84
141
'ai.response.finishReason' : 'stop' ,
85
- 'ai.input_messages ' : '{"prompt":"Where is the first span?"} ' ,
142
+ 'ai.response.text ' : 'First span here! ' ,
86
143
'ai.settings.maxRetries' : 2 ,
87
144
'ai.settings.maxSteps' : 1 ,
88
145
'ai.streaming' : false ,
89
- 'ai.total_tokens.used' : 30 ,
90
- 'ai.usage.completionTokens' : 20 ,
91
- 'ai.usage.promptTokens' : 10 ,
146
+ 'gen_ai.prompt' : '{"prompt":"Where is the first span?"}' ,
147
+ 'gen_ai.response.model' : 'mock-model-id' ,
148
+ 'gen_ai.usage.input_tokens' : 10 ,
149
+ 'gen_ai.usage.output_tokens' : 20 ,
150
+ 'gen_ai.usage.total_tokens' : 30 ,
92
151
'operation.name' : 'ai.generateText' ,
93
152
'sentry.op' : 'ai.pipeline.generateText' ,
94
153
'sentry.origin' : 'auto.vercelai.otel' ,
95
- } ) ,
154
+ } ,
96
155
description : 'generateText' ,
97
156
op : 'ai.pipeline.generateText' ,
98
157
origin : 'auto.vercelai.otel' ,
99
158
status : 'ok' ,
100
159
} ) ,
101
- // Second span - explicitly enabled telemetry, should record inputs/outputs regardless of sendDefaultPii
160
+ // Second span - doGenerate for first call, should also include input/output fields when sendDefaultPii: true
161
+ expect . objectContaining ( {
162
+ data : {
163
+ 'ai.model.id' : 'mock-model-id' ,
164
+ 'ai.model.provider' : 'mock-provider' ,
165
+ 'ai.operationId' : 'ai.generateText.doGenerate' ,
166
+ 'ai.pipeline.name' : 'generateText.doGenerate' ,
167
+ 'ai.prompt.format' : 'prompt' ,
168
+ 'ai.prompt.messages' : '[{"role":"user","content":[{"type":"text","text":"Where is the first span?"}]}]' ,
169
+ 'ai.response.finishReason' : 'stop' ,
170
+ 'ai.response.id' : expect . any ( String ) ,
171
+ 'ai.response.model' : 'mock-model-id' ,
172
+ 'ai.response.text' : 'First span here!' ,
173
+ 'ai.response.timestamp' : expect . any ( String ) ,
174
+ 'ai.settings.maxRetries' : 2 ,
175
+ 'ai.streaming' : false ,
176
+ 'gen_ai.request.model' : 'mock-model-id' ,
177
+ 'gen_ai.response.finish_reasons' : [ 'stop' ] ,
178
+ 'gen_ai.response.id' : expect . any ( String ) ,
179
+ 'gen_ai.response.model' : 'mock-model-id' ,
180
+ 'gen_ai.system' : 'mock-provider' ,
181
+ 'gen_ai.usage.input_tokens' : 10 ,
182
+ 'gen_ai.usage.output_tokens' : 20 ,
183
+ 'gen_ai.usage.total_tokens' : 30 ,
184
+ 'operation.name' : 'ai.generateText.doGenerate' ,
185
+ 'sentry.op' : 'ai.run.doGenerate' ,
186
+ 'sentry.origin' : 'auto.vercelai.otel' ,
187
+ } ,
188
+ description : 'generateText.doGenerate' ,
189
+ op : 'ai.run.doGenerate' ,
190
+ origin : 'auto.vercelai.otel' ,
191
+ status : 'ok' ,
192
+ } ) ,
193
+ // Third span - explicitly enabled telemetry, should record inputs/outputs regardless of sendDefaultPii
102
194
expect . objectContaining ( {
103
- data : expect . objectContaining ( {
195
+ data : {
104
196
'ai.model.id' : 'mock-model-id' ,
105
197
'ai.model.provider' : 'mock-provider' ,
106
198
'ai.operationId' : 'ai.generateText' ,
@@ -119,14 +211,15 @@ describe('Vercel AI integration', () => {
119
211
'operation.name' : 'ai.generateText' ,
120
212
'sentry.op' : 'ai.pipeline.generateText' ,
121
213
'sentry.origin' : 'auto.vercelai.otel' ,
122
- } ) ,
214
+ } ,
123
215
description : 'generateText' ,
124
216
op : 'ai.pipeline.generateText' ,
125
217
origin : 'auto.vercelai.otel' ,
126
218
status : 'ok' ,
127
219
} ) ,
220
+ // Fourth span - doGenerate for explicitly enabled telemetry call
128
221
expect . objectContaining ( {
129
- data : expect . objectContaining ( {
222
+ data : {
130
223
'sentry.origin' : 'auto.vercelai.otel' ,
131
224
'sentry.op' : 'ai.run.doGenerate' ,
132
225
'operation.name' : 'ai.generateText.doGenerate' ,
@@ -151,7 +244,7 @@ describe('Vercel AI integration', () => {
151
244
'gen_ai.response.id' : expect . any ( String ) ,
152
245
'gen_ai.response.model' : 'mock-model-id' ,
153
246
'gen_ai.usage.total_tokens' : 30 ,
154
- } ) ,
247
+ } ,
155
248
description : 'generateText.doGenerate' ,
156
249
op : 'ai.run.doGenerate' ,
157
250
origin : 'auto.vercelai.otel' ,
0 commit comments