@@ -16,6 +16,8 @@ import software.amazon.awssdk.services.codewhisperer.model.GetCodeScanResponse
16
16
import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsRequest
17
17
import software.amazon.awssdk.services.codewhisperer.model.ListCodeScanFindingsResponse
18
18
import software.amazon.awssdk.services.codewhispererruntime.CodeWhispererRuntimeClient
19
+ import software.amazon.awssdk.services.codewhispererruntime.model.ChatInteractWithMessageEvent
20
+ import software.amazon.awssdk.services.codewhispererruntime.model.ChatMessageInteractionType
19
21
import software.amazon.awssdk.services.codewhispererruntime.model.CompletionType
20
22
import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlRequest
21
23
import software.amazon.awssdk.services.codewhispererruntime.model.CreateUploadUrlResponse
@@ -26,6 +28,7 @@ import software.amazon.awssdk.services.codewhispererruntime.model.ListAvailableC
26
28
import software.amazon.awssdk.services.codewhispererruntime.model.ListFeatureEvaluationsResponse
27
29
import software.amazon.awssdk.services.codewhispererruntime.model.SendTelemetryEventResponse
28
30
import software.amazon.awssdk.services.codewhispererruntime.model.SuggestionState
31
+ import software.amazon.awssdk.services.codewhispererruntime.model.UserIntent
29
32
import software.aws.toolkits.core.utils.debug
30
33
import software.aws.toolkits.core.utils.getLogger
31
34
import software.aws.toolkits.core.utils.warn
@@ -117,6 +120,38 @@ interface CodeWhispererClientAdaptor : Disposable {
117
120
118
121
fun sendMetricDataTelemetry (eventName : String , metadata : Map <String , Any ?>): SendTelemetryEventResponse
119
122
123
+ fun sendChatAddMessageTelemetry (
124
+ sessionId : String ,
125
+ requestId : String ,
126
+ userIntent : UserIntent ? ,
127
+ hasCodeSnippet : Boolean? ,
128
+ programmingLanguage : String? ,
129
+ activeEditorTotalCharacters : Int? ,
130
+ timeToFirstChunkMilliseconds : Double? ,
131
+ timeBetweenChunks : List <Double >? ,
132
+ fullResponselatency : Double? ,
133
+ requestLength : Int? ,
134
+ responseLength : Int? ,
135
+ ): SendTelemetryEventResponse
136
+
137
+ fun sendChatInteractWithMessageTelemetry (
138
+ sessionId : String ,
139
+ requestId : String ,
140
+ interactionType : ChatMessageInteractionType ? ,
141
+ interactionTarget : String? ,
142
+ acceptedCharacterCount : Int? ,
143
+ acceptedSnippetHasReference : Boolean?
144
+ ): SendTelemetryEventResponse
145
+
146
+ fun sendChatInteractWithMessageTelemetry (event : ChatInteractWithMessageEvent ): SendTelemetryEventResponse
147
+
148
+ fun sendChatUserModificationTelemetry (
149
+ sessionId : String ,
150
+ requestId : String ,
151
+ language : String? ,
152
+ modificationPercentage : Double
153
+ ): SendTelemetryEventResponse
154
+
120
155
companion object {
121
156
fun getInstance (project : Project ): CodeWhispererClientAdaptor = project.service()
122
157
@@ -335,6 +370,83 @@ open class CodeWhispererClientAdaptorImpl(override val project: Project) : CodeW
335
370
requestBuilder.userContext(ClientMetadata .DEFAULT_METADATA .codeWhispererUserContext)
336
371
}
337
372
373
+ override fun sendChatAddMessageTelemetry (
374
+ sessionId : String ,
375
+ requestId : String ,
376
+ userIntent : UserIntent ? ,
377
+ hasCodeSnippet : Boolean? ,
378
+ programmingLanguage : String? ,
379
+ activeEditorTotalCharacters : Int? ,
380
+ timeToFirstChunkMilliseconds : Double? ,
381
+ timeBetweenChunks : List <Double >? ,
382
+ fullResponselatency : Double? ,
383
+ requestLength : Int? ,
384
+ responseLength : Int?
385
+ ): SendTelemetryEventResponse = bearerClient().sendTelemetryEvent { requestBuilder ->
386
+ requestBuilder.telemetryEvent { telemetryEventBuilder ->
387
+ telemetryEventBuilder.chatAddMessageEvent {
388
+ it.conversationId(sessionId)
389
+ it.messageId(requestId)
390
+ it.userIntent(userIntent)
391
+ it.hasCodeSnippet(hasCodeSnippet)
392
+ if (programmingLanguage != null ) it.programmingLanguage { langBuilder -> langBuilder.languageName(programmingLanguage) }
393
+ it.activeEditorTotalCharacters(activeEditorTotalCharacters)
394
+ it.timeToFirstChunkMilliseconds(timeToFirstChunkMilliseconds)
395
+ it.timeBetweenChunks(timeBetweenChunks)
396
+ it.fullResponselatency(fullResponselatency)
397
+ it.requestLength(requestLength)
398
+ it.responseLength(responseLength)
399
+ }
400
+ }
401
+ requestBuilder.optOutPreference(getTelemetryOptOutPreference())
402
+ requestBuilder.userContext(ClientMetadata .DEFAULT_METADATA .codeWhispererUserContext)
403
+ }
404
+
405
+ override fun sendChatInteractWithMessageTelemetry (
406
+ sessionId : String ,
407
+ requestId : String ,
408
+ interactionType : ChatMessageInteractionType ? ,
409
+ interactionTarget : String? ,
410
+ acceptedCharacterCount : Int? ,
411
+ acceptedSnippetHasReference : Boolean?
412
+ ): SendTelemetryEventResponse = sendChatInteractWithMessageTelemetry(
413
+ ChatInteractWithMessageEvent .builder().apply {
414
+ conversationId(sessionId)
415
+ messageId(requestId)
416
+ interactionType(interactionType)
417
+ interactionTarget(interactionTarget)
418
+ acceptedCharacterCount(acceptedCharacterCount)
419
+ acceptedSnippetHasReference(acceptedSnippetHasReference)
420
+ }.build()
421
+ )
422
+
423
+ override fun sendChatInteractWithMessageTelemetry (event : ChatInteractWithMessageEvent ): SendTelemetryEventResponse =
424
+ bearerClient().sendTelemetryEvent { requestBuilder ->
425
+ requestBuilder.telemetryEvent { telemetryEventBuilder ->
426
+ telemetryEventBuilder.chatInteractWithMessageEvent(event)
427
+ }
428
+ requestBuilder.optOutPreference(getTelemetryOptOutPreference())
429
+ requestBuilder.userContext(ClientMetadata .DEFAULT_METADATA .codeWhispererUserContext)
430
+ }
431
+
432
+ override fun sendChatUserModificationTelemetry (
433
+ sessionId : String ,
434
+ requestId : String ,
435
+ language : String? ,
436
+ modificationPercentage : Double
437
+ ): SendTelemetryEventResponse = bearerClient().sendTelemetryEvent { requestBuilder ->
438
+ requestBuilder.telemetryEvent { telemetryEventBuilder ->
439
+ telemetryEventBuilder.chatUserModificationEvent {
440
+ it.conversationId(sessionId)
441
+ it.messageId(requestId)
442
+ it.programmingLanguage { langBuilder -> langBuilder.languageName(language) }
443
+ it.modificationPercentage(modificationPercentage)
444
+ }
445
+ }
446
+ requestBuilder.optOutPreference(getTelemetryOptOutPreference())
447
+ requestBuilder.userContext(ClientMetadata .DEFAULT_METADATA .codeWhispererUserContext)
448
+ }
449
+
338
450
override fun dispose () {
339
451
if (this ::mySigv4Client.isLazyInitialized) {
340
452
mySigv4Client.close()
0 commit comments