Skip to content

Commit 638c436

Browse files
committed
agentic chat metrics
1 parent 8e00eef commit 638c436

File tree

5 files changed

+141
-3
lines changed

5 files changed

+141
-3
lines changed

packages/core/src/codewhispererChat/controllers/chat/controller.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
PromptInputOptionChange,
3636
TabBarButtonClick,
3737
SaveChatMessage,
38+
AgenticChatInteractionType,
3839
} from './model'
3940
import {
4041
AppToWebViewMessageDispatcher,
@@ -410,6 +411,7 @@ export class ChatController {
410411
session.tokenSource.cancel()
411412
this.messenger.sendEmptyMessage(message.tabID, '', undefined)
412413
this.chatHistoryStorage.getTabHistory(message.tabID).clearRecentHistory()
414+
this.telemetryHelper.recordInteractionWithAgenticChat(AgenticChatInteractionType.StopChat, message)
413415
}
414416

415417
private async processTriggerTabIDReceived(message: TriggerTabIDReceived) {
@@ -823,13 +825,20 @@ export class ChatController {
823825
case 'run-shell-command':
824826
case 'generic-tool-execution':
825827
await this.processToolUseMessage(message)
828+
if (message.action.id === 'run-shell-command') {
829+
this.telemetryHelper.recordInteractionWithAgenticChat(
830+
AgenticChatInteractionType.AcceptCommand,
831+
message
832+
)
833+
}
826834
break
827835
case 'accept-code-diff':
828836
await this.closeDiffView()
829837
break
830838
case 'reject-code-diff':
831839
await this.restoreBackup(message)
832840
await this.closeDiffView()
841+
this.telemetryHelper.recordInteractionWithAgenticChat(AgenticChatInteractionType.RejectDiff, message)
833842
break
834843
case 'reject-shell-command':
835844
await this.rejectShellCommand(message)

packages/core/src/codewhispererChat/controllers/chat/messenger/messenger.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import { ChatMessage, ErrorMessage, FollowUp, Suggestion } from '../../../view/c
3333
import { ChatSession } from '../../../clients/chat/v0/chat'
3434
import { ChatException } from './model'
3535
import { CWCTelemetryHelper } from '../telemetryHelper'
36-
import { ChatPromptCommandType, DocumentReference, TriggerPayload } from '../model'
36+
import { AgenticChatInteractionType, ChatPromptCommandType, DocumentReference, TriggerPayload } from '../model'
3737
import { ToolkitError } from '../../../../shared/errors'
3838
import { keys } from '../../../../shared/utilities/tsUtils'
3939
import { getLogger } from '../../../../shared/logger/logger'
@@ -305,6 +305,20 @@ export class Messenger {
305305
})
306306
)
307307
}
308+
} else {
309+
if (tool.type === ToolType.ExecuteBash) {
310+
this.telemetryHelper.recordInteractionWithAgenticChat(
311+
AgenticChatInteractionType.GeneratedCommand,
312+
{ tabID }
313+
)
314+
}
315+
}
316+
317+
if (tool.type === ToolType.FsWrite) {
318+
this.telemetryHelper.recordInteractionWithAgenticChat(
319+
AgenticChatInteractionType.GeneratedDiff,
320+
{ tabID }
321+
)
308322
}
309323
} else {
310324
toolError = new Error('Tool not found')
@@ -495,7 +509,7 @@ export class Messenger {
495509
this.telemetryHelper.setResponseStreamTotalTime(tabID)
496510

497511
const responseCode = response?.$metadata.httpStatusCode ?? 0
498-
this.telemetryHelper.recordAddMessage(triggerPayload, {
512+
const promptAnswer = {
499513
followUpCount: followUps.length,
500514
suggestionCount: relatedSuggestions.length,
501515
tabID: tabID,
@@ -504,7 +518,13 @@ export class Messenger {
504518
responseCode,
505519
codeReferenceCount: codeReference.length,
506520
totalNumberOfCodeBlocksInResponse: await this.countTotalNumberOfCodeBlocks(message),
507-
})
521+
}
522+
523+
this.telemetryHelper.recordAddMessage(triggerPayload, promptAnswer)
524+
525+
if (message.length) {
526+
this.telemetryHelper.recordMessageReceived(triggerPayload, promptAnswer)
527+
}
508528
})
509529
}
510530

packages/core/src/codewhispererChat/controllers/chat/model.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,18 @@ export enum ChatTriggerType {
198198
InlineChatMessage = 'InlineChatMessage',
199199
}
200200

201+
export enum AgenticChatInteractionType {
202+
RejectDiff = 'RejectDiff',
203+
GeneratedDiff = 'GeneratedDiff',
204+
AcceptCommand = 'AcceptCommand',
205+
GeneratedCommand = 'GeneratedCommand',
206+
StopChat = 'StopChat',
207+
}
208+
209+
export interface AcceptResponseMessage {
210+
tabID: string
211+
}
212+
201213
export interface TriggerPayload {
202214
readonly query: string | undefined
203215
readonly codeSelection: Selection | undefined

packages/core/src/codewhispererChat/controllers/chat/telemetryHelper.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ import {
3030
TriggerPayload,
3131
AdditionalContextLengths,
3232
AdditionalContextInfo,
33+
StopResponseMessage,
34+
AgenticChatInteractionType,
35+
AcceptResponseMessage,
3336
} from './model'
3437
import { TriggerEvent, TriggerEventsStorage } from '../../storages/triggerEvents'
3538
import globals from '../../../shared/extensionGlobals'
@@ -44,6 +47,7 @@ import { undefinedIfEmpty } from '../../../shared/utilities/textUtilities'
4447
import { AdditionalContextPrompt } from '../../../amazonq/lsp/types'
4548
import { getUserPromptsDirectory, promptFileExtension } from '../../constants'
4649
import { isInDirectory } from '../../../shared/filesystemUtilities'
50+
import { CustomFormActionMessage } from '../../view/connector/connector'
4751

4852
export function logSendTelemetryEventFailure(error: any) {
4953
let requestId: string | undefined
@@ -213,6 +217,37 @@ export class CWCTelemetryHelper {
213217
telemetry.feedback_result.emit({ result: feedbackResult })
214218
}
215219

220+
public recordInteractionWithAgenticChat(
221+
interactionType: AgenticChatInteractionType,
222+
message: AcceptResponseMessage | CustomFormActionMessage | StopResponseMessage
223+
) {
224+
telemetry.amazonq_interactWithAgenticChat.emit({
225+
cwsprAgenticChatInteractionType: interactionType,
226+
result: 'Succeeded',
227+
cwsprChatConversationId: this.getConversationId(message.tabID ?? '') ?? '',
228+
cwsprChatConversationType: 'Chat',
229+
credentialStartUrl: AuthUtil.instance.startUrl,
230+
})
231+
}
232+
233+
public recordMessageReceived(triggerPayload: TriggerPayload, message: PromptAnswer) {
234+
telemetry.amazonq_messageReceived.emit({
235+
result: 'Succeeded',
236+
cwsprChatConversationId: this.getConversationId(message.tabID) ?? '',
237+
cwsprChatMessageId: message.messageID,
238+
cwsprChatTimeToFirstChunk: this.getResponseStreamTimeToFirstChunk(message.tabID),
239+
cwsprChatTimeBetweenChunks: JSON.stringify(
240+
this.getTimeBetweenChunks(message.tabID, this.responseStreamTimeForChunks)
241+
),
242+
cwsprChatRequestLength: triggerPayload.message.length,
243+
cwsprChatResponseLength: message.messageLength,
244+
cwsprChatConversationType: 'Chat',
245+
cwsprChatResponseCode: message.responseCode,
246+
cwsprChatFullResponseLatency: this.responseStreamTotalTime.get(message.tabID) ?? 0,
247+
credentialStartUrl: AuthUtil.instance.startUrl,
248+
})
249+
}
250+
216251
public recordInteractWithMessage(
217252
message:
218253
| AcceptDiff

packages/core/src/shared/telemetry/vscodeTelemetry.json

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,12 @@
228228
"name": "executedCount",
229229
"type": "int",
230230
"description": "The number of executed operations"
231+
},
232+
{
233+
"name": "cwsprAgenticChatInteractionType",
234+
"type": "string",
235+
"allowedValues": ["RejectDiff", "GeneratedDiff", "AcceptCommand", "GeneratedCommand", "StopChat"],
236+
"description": "Type of interaction with agentic chat messages"
231237
}
232238
],
233239
"metrics": [
@@ -552,6 +558,62 @@
552558
"name": "amazonq_closeChat",
553559
"description": "When chat panel is closed"
554560
},
561+
{
562+
"name": "amazonq_interactWithAgenticChat",
563+
"description": "When a user interacts with a message in the agentic chat",
564+
"metadata": [
565+
{
566+
"type": "cwsprAgenticChatInteractionType"
567+
},
568+
{
569+
"type": "cwsprChatConversationId"
570+
},
571+
{
572+
"type": "cwsprChatConversationType"
573+
},
574+
{
575+
"type": "credentialStartUrl",
576+
"required": false
577+
}
578+
]
579+
},
580+
{
581+
"name": "amazonq_messageReceived",
582+
"description": "When a user receives a message",
583+
"metadata": [
584+
{
585+
"type": "cwsprChatConversationId"
586+
},
587+
{
588+
"type": "cwsprChatConversationType"
589+
},
590+
{
591+
"type": "cwsprChatFullResponseLatency"
592+
},
593+
{
594+
"type": "cwsprChatMessageId"
595+
},
596+
{
597+
"type": "cwsprChatRequestLength"
598+
},
599+
{
600+
"type": "cwsprChatResponseCode"
601+
},
602+
{
603+
"type": "cwsprChatResponseLength"
604+
},
605+
{
606+
"type": "cwsprChatTimeBetweenChunks"
607+
},
608+
{
609+
"type": "cwsprChatTimeToFirstChunk"
610+
},
611+
{
612+
"type": "credentialStartUrl",
613+
"required": false
614+
}
615+
]
616+
},
555617
{
556618
"name": "amazonq_startConversation",
557619
"description": "When user starts a new conversation",

0 commit comments

Comments
 (0)