@@ -67,16 +67,19 @@ export interface AIProvider<Provider extends AIProviders = AIProviders> extends
6767 model : AIModel < Provider , AIModels < Provider > > ,
6868 message : string ,
6969 diff : string ,
70+ reporting : TelemetryEvents [ 'ai/explain' ] ,
7071 options ?: { cancellation ?: CancellationToken } ,
7172 ) : Promise < string | undefined > ;
7273 generateCommitMessage (
7374 model : AIModel < Provider , AIModels < Provider > > ,
7475 diff : string ,
76+ reporting : TelemetryEvents [ 'ai/generate' ] ,
7577 options ?: { cancellation ?: CancellationToken ; context ?: string } ,
7678 ) : Promise < string | undefined > ;
7779 generateDraftMessage (
7880 model : AIModel < Provider , AIModels < Provider > > ,
7981 diff : string ,
82+ reporting : TelemetryEvents [ 'ai/generate' ] ,
8083 options ?: { cancellation ?: CancellationToken ; context ?: string ; codeSuggestion ?: boolean } ,
8184 ) : Promise < string | undefined > ;
8285}
@@ -232,32 +235,31 @@ export class AIProviderService implements Disposable {
232235
233236 const payload : TelemetryEvents [ 'ai/generate' ] = {
234237 type : 'commitMessage' ,
235- model : { id : model . id , provider : { id : model . provider . id , name : model . provider . name } } ,
238+ 'model.id' : model . id ,
239+ 'model.provider.id' : model . provider . id ,
240+ 'model.provider.name' : model . provider . name ,
241+ 'retry.count' : 0 ,
236242 } ;
237243 const source : Parameters < TelemetryService [ 'sendEvent' ] > [ 2 ] = { source : sourceContext . source } ;
238244
239245 const confirmed = await confirmAIProviderToS ( model , this . container . storage ) ;
240246 if ( ! confirmed ) {
241- this . container . telemetry . sendEvent (
242- 'ai/generate' ,
243- { ...payload , failed : { reason : 'user-declined' } } ,
244- source ,
245- ) ;
247+ this . container . telemetry . sendEvent ( 'ai/generate' , { ...payload , 'failed.reason' : 'user-declined' } , source ) ;
246248
247249 return undefined ;
248250 }
249251
250252 if ( options ?. cancellation ?. isCancellationRequested ) {
251253 this . container . telemetry . sendEvent (
252254 'ai/generate' ,
253- { ...payload , failed : { reason : 'user-cancelled' } } ,
255+ { ...payload , ' failed. reason' : 'user-cancelled' } ,
254256 source ,
255257 ) ;
256258
257259 return undefined ;
258260 }
259261
260- const promise = provider . generateCommitMessage ( model , changes , {
262+ const promise = provider . generateCommitMessage ( model , changes , payload , {
261263 cancellation : options ?. cancellation ,
262264 context : options ?. context ,
263265 } ) ;
@@ -268,6 +270,7 @@ export class AIProviderService implements Disposable {
268270 ? window . withProgress ( options . progress , ( ) => promise )
269271 : promise ) ;
270272
273+ payload [ 'output.length' ] = result ?. length ;
271274 this . container . telemetry . sendEvent ( 'ai/generate' , { ...payload , duration : Date . now ( ) - start } , source ) ;
272275
273276 return result ;
@@ -277,10 +280,9 @@ export class AIProviderService implements Disposable {
277280 {
278281 ...payload ,
279282 duration : Date . now ( ) - start ,
280- failed :
281- ex instanceof CancellationError
282- ? { reason : 'user-cancelled' }
283- : { reason : 'error' , error : String ( ex ) } ,
283+ ...( ex instanceof CancellationError
284+ ? { 'failed.reason' : 'user-cancelled' }
285+ : { 'failed.reason' : 'error' , 'failed.error' : String ( ex ) } ) ,
284286 } ,
285287 source ,
286288 ) ;
@@ -310,32 +312,31 @@ export class AIProviderService implements Disposable {
310312 const payload : TelemetryEvents [ 'ai/generate' ] = {
311313 type : 'draftMessage' ,
312314 draftType : sourceContext . type ,
313- model : { id : model . id , provider : { id : model . provider . id , name : model . provider . name } } ,
315+ 'model.id' : model . id ,
316+ 'model.provider.id' : model . provider . id ,
317+ 'model.provider.name' : model . provider . name ,
318+ 'retry.count' : 0 ,
314319 } ;
315320 const source : Parameters < TelemetryService [ 'sendEvent' ] > [ 2 ] = { source : sourceContext . source } ;
316321
317322 const confirmed = await confirmAIProviderToS ( model , this . container . storage ) ;
318323 if ( ! confirmed ) {
319- this . container . telemetry . sendEvent (
320- 'ai/generate' ,
321- { ...payload , failed : { reason : 'user-declined' } } ,
322- source ,
323- ) ;
324+ this . container . telemetry . sendEvent ( 'ai/generate' , { ...payload , 'failed.reason' : 'user-declined' } , source ) ;
324325
325326 return undefined ;
326327 }
327328
328329 if ( options ?. cancellation ?. isCancellationRequested ) {
329330 this . container . telemetry . sendEvent (
330331 'ai/generate' ,
331- { ...payload , failed : { reason : 'user-cancelled' } } ,
332+ { ...payload , ' failed. reason' : 'user-cancelled' } ,
332333 source ,
333334 ) ;
334335
335336 return undefined ;
336337 }
337338
338- const promise = provider . generateDraftMessage ( model , changes , {
339+ const promise = provider . generateDraftMessage ( model , changes , payload , {
339340 cancellation : options ?. cancellation ,
340341 context : options ?. context ,
341342 codeSuggestion : options ?. codeSuggestion ,
@@ -347,6 +348,7 @@ export class AIProviderService implements Disposable {
347348 ? window . withProgress ( options . progress , ( ) => promise )
348349 : promise ) ;
349350
351+ payload [ 'output.length' ] = result ?. length ;
350352 this . container . telemetry . sendEvent ( 'ai/generate' , { ...payload , duration : Date . now ( ) - start } , source ) ;
351353
352354 return result ;
@@ -356,10 +358,9 @@ export class AIProviderService implements Disposable {
356358 {
357359 ...payload ,
358360 duration : Date . now ( ) - start ,
359- failed :
360- ex instanceof CancellationError
361- ? { reason : 'user-cancelled' }
362- : { reason : 'error' , error : String ( ex ) } ,
361+ ...( ex instanceof CancellationError
362+ ? { 'failed.reason' : 'user-cancelled' }
363+ : { 'failed.reason' : 'error' , 'failed.error' : String ( ex ) } ) ,
363364 } ,
364365 source ,
365366 ) ;
@@ -410,17 +411,16 @@ export class AIProviderService implements Disposable {
410411 const payload : TelemetryEvents [ 'ai/explain' ] = {
411412 type : 'change' ,
412413 changeType : sourceContext . type ,
413- model : { id : model . id , provider : { id : model . provider . id , name : model . provider . name } } ,
414+ 'model.id' : model . id ,
415+ 'model.provider.id' : model . provider . id ,
416+ 'model.provider.name' : model . provider . name ,
417+ 'retry.count' : 0 ,
414418 } ;
415419 const source : Parameters < TelemetryService [ 'sendEvent' ] > [ 2 ] = { source : sourceContext . source } ;
416420
417421 const confirmed = await confirmAIProviderToS ( model , this . container . storage ) ;
418422 if ( ! confirmed ) {
419- this . container . telemetry . sendEvent (
420- 'ai/explain' ,
421- { ...payload , failed : { reason : 'user-declined' } } ,
422- source ,
423- ) ;
423+ this . container . telemetry . sendEvent ( 'ai/explain' , { ...payload , 'failed.reason' : 'user-declined' } , source ) ;
424424
425425 return undefined ;
426426 }
@@ -436,16 +436,12 @@ export class AIProviderService implements Disposable {
436436 }
437437
438438 if ( options ?. cancellation ?. isCancellationRequested ) {
439- this . container . telemetry . sendEvent (
440- 'ai/explain' ,
441- { ...payload , failed : { reason : 'user-cancelled' } } ,
442- source ,
443- ) ;
439+ this . container . telemetry . sendEvent ( 'ai/explain' , { ...payload , 'failed.reason' : 'user-cancelled' } , source ) ;
444440
445441 return undefined ;
446442 }
447443
448- const promise = provider . explainChanges ( model , commit . message , diff . contents , {
444+ const promise = provider . explainChanges ( model , commit . message , diff . contents , payload , {
449445 cancellation : options ?. cancellation ,
450446 } ) ;
451447
@@ -455,6 +451,7 @@ export class AIProviderService implements Disposable {
455451 ? window . withProgress ( options . progress , ( ) => promise )
456452 : promise ) ;
457453
454+ payload [ 'output.length' ] = result ?. length ;
458455 this . container . telemetry . sendEvent ( 'ai/explain' , { ...payload , duration : Date . now ( ) - start } , source ) ;
459456
460457 return result ;
@@ -464,10 +461,9 @@ export class AIProviderService implements Disposable {
464461 {
465462 ...payload ,
466463 duration : Date . now ( ) - start ,
467- failed :
468- ex instanceof CancellationError
469- ? { reason : 'user-cancelled' }
470- : { reason : 'error' , error : String ( ex ) } ,
464+ ...( ex instanceof CancellationError
465+ ? { 'failed.reason' : 'user-cancelled' }
466+ : { 'failed.reason' : 'error' , 'failed.error' : String ( ex ) } ) ,
471467 } ,
472468 source ,
473469 ) ;
0 commit comments