Skip to content

Commit 1ddc2e8

Browse files
authored
telemetry(chat): agentic chat metrics (aws#6979)
## Problem - currently no metrics for agentic chat ## Solution Emit telemetry events when: - message shown to user (message sent from user already exists) - diff was generated - user rejected diff - command was generated - user accepted command - user pressed stop button - upstreamed metric to aws-toolkit-common: aws/aws-toolkit-common#1010 #### TODO: - additional telemetry events for: user interrupts Q while generating, thumbs up/down - see when user pressed stop (ex: chat, command execution, etc) --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent b1beba3 commit 1ddc2e8

File tree

6 files changed

+58
-6
lines changed

6 files changed

+58
-6
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"skippedTestReport": "ts-node ./scripts/skippedTestReport.ts ./packages/amazonq/test/e2e/"
4242
},
4343
"devDependencies": {
44-
"@aws-toolkits/telemetry": "^1.0.312",
44+
"@aws-toolkits/telemetry": "^1.0.313",
4545
"@playwright/browser-chromium": "^1.43.1",
4646
"@stylistic/eslint-plugin": "^2.11.0",
4747
"@types/he": "^1.2.3",

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,
@@ -417,6 +418,7 @@ export class ChatController {
417418
session.tokenSource.cancel()
418419
this.messenger.sendEmptyMessage(message.tabID, '', undefined)
419420
this.chatHistoryStorage.getTabHistory(message.tabID).clearRecentHistory()
421+
this.telemetryHelper.recordInteractionWithAgenticChat(AgenticChatInteractionType.StopChat, message)
420422
}
421423

422424
private async processTriggerTabIDReceived(message: TriggerTabIDReceived) {
@@ -842,13 +844,20 @@ export class ChatController {
842844
case 'run-shell-command':
843845
case 'generic-tool-execution':
844846
await this.processToolUseMessage(message)
847+
if (message.action.id === 'run-shell-command' && message.action.text === 'Run') {
848+
this.telemetryHelper.recordInteractionWithAgenticChat(
849+
AgenticChatInteractionType.RunCommand,
850+
message
851+
)
852+
}
845853
break
846854
case 'accept-code-diff':
847855
await this.closeDiffView(message)
848856
break
849857
case 'reject-code-diff':
850858
await this.restoreBackup(message)
851859
await this.closeDiffView(message)
860+
this.telemetryHelper.recordInteractionWithAgenticChat(AgenticChatInteractionType.RejectDiff, message)
852861
break
853862
case 'reject-shell-command':
854863
await this.rejectShellCommand(message)

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { ChatMessage, ErrorMessage, FollowUp, Suggestion } from '../../../view/c
3434
import { ChatSession } from '../../../clients/chat/v0/chat'
3535
import { ChatException } from './model'
3636
import { CWCTelemetryHelper } from '../telemetryHelper'
37-
import { ChatPromptCommandType, DocumentReference, TriggerPayload } from '../model'
37+
import { AgenticChatInteractionType, ChatPromptCommandType, DocumentReference, TriggerPayload } from '../model'
3838
import { ToolkitError } from '../../../../shared/errors'
3939
import { keys } from '../../../../shared/utilities/tsUtils'
4040
import { getLogger } from '../../../../shared/logger/logger'
@@ -321,6 +321,20 @@ export class Messenger {
321321
})
322322
)
323323
}
324+
} else {
325+
if (tool.type === ToolType.ExecuteBash) {
326+
this.telemetryHelper.recordInteractionWithAgenticChat(
327+
AgenticChatInteractionType.GeneratedCommand,
328+
{ tabID }
329+
)
330+
}
331+
}
332+
333+
if (tool.type === ToolType.FsWrite) {
334+
this.telemetryHelper.recordInteractionWithAgenticChat(
335+
AgenticChatInteractionType.GeneratedDiff,
336+
{ tabID }
337+
)
324338
}
325339
} else {
326340
throw new Error('Tool not found')

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

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

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

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

Lines changed: 17 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,19 @@ 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+
216233
public recordInteractWithMessage(
217234
message:
218235
| AcceptDiff

0 commit comments

Comments
 (0)