Skip to content

Commit 2978d7f

Browse files
committed
add feedback functionality with thumbs up/down
1 parent 5213237 commit 2978d7f

File tree

11 files changed

+96
-7
lines changed

11 files changed

+96
-7
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
@@ -40,7 +40,7 @@
4040
"mergeReports": "ts-node ./scripts/mergeReports.ts"
4141
},
4242
"devDependencies": {
43-
"@aws-toolkits/telemetry": "^1.0.295",
43+
"@aws-toolkits/telemetry": "^1.0.296",
4444
"@playwright/browser-chromium": "^1.43.1",
4545
"@stylistic/eslint-plugin": "^2.11.0",
4646
"@types/he": "^1.2.3",

packages/amazonq/src/app/amazonqScan/app.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export function init(appContext: AmazonQAppInitContext) {
3535
processResponseBodyLinkClick: new vscode.EventEmitter<any>(),
3636
fileClicked: new vscode.EventEmitter<any>(),
3737
scanCancelled: new vscode.EventEmitter<any>(),
38+
processChatItemVotedMessage: new vscode.EventEmitter<any>(),
3839
}
3940
const dispatcher = new AppToWebViewMessageDispatcher(appContext.getAppsToWebViewMessagePublisher())
4041
const messenger = new Messenger(dispatcher)

packages/amazonq/src/app/amazonqScan/chat/controller/controller.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import {
3232
scanSummaryMessage,
3333
} from '../../models/constants'
3434
import path from 'path'
35+
import { telemetry } from 'aws-core-vscode/telemetry'
3536

3637
export class ScanController {
3738
private readonly messenger: Messenger
@@ -98,6 +99,15 @@ export class ScanController {
9899
this.chatControllerMessageListeners.scanCancelled.event((data) => {
99100
return this.handleScanCancelled(data)
100101
})
102+
103+
this.chatControllerMessageListeners.processChatItemVotedMessage.event((data) => {
104+
telemetry.amazonq_feedback.emit({
105+
featureId: 'amazonQReview',
106+
amazonqConversationId: this.sessionStorage.getSession().scanUuid,
107+
credentialStartUrl: AuthUtil.instance.startUrl,
108+
interactionType: data.vote,
109+
})
110+
})
101111
}
102112

103113
private async tabOpened(message: any) {

packages/amazonq/src/app/amazonqScan/chat/views/actions/uiMessageListener.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ export class UIMessageListener {
5555
case 'file-click':
5656
this.processFileClick(msg)
5757
break
58+
case 'chat-item-voted':
59+
this.chatItemVoted(msg)
60+
break
5861
}
5962
}
6063

@@ -112,4 +115,13 @@ export class UIMessageListener {
112115
filePath: msg.filePath,
113116
})
114117
}
118+
119+
private chatItemVoted(msg: any) {
120+
this.scanControllerEventsEmitters?.processChatItemVotedMessage.fire({
121+
tabID: msg.tabID,
122+
command: msg.command,
123+
vote: msg.vote,
124+
messageId: msg.messageId,
125+
})
126+
}
115127
}

packages/core/src/amazonq/webview/ui/connector.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,9 @@ export class Connector {
602602
case 'featuredev':
603603
this.featureDevChatConnector.sendFeedback(tabId, feedbackPayload)
604604
break
605+
case 'testgen':
606+
this.testChatConnector.onSendFeedback(tabId, feedbackPayload)
607+
break
605608
case 'cwc':
606609
this.cwChatConnector.onSendFeedback(tabId, feedbackPayload)
607610
break

packages/core/src/amazonqScan/controller.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@ export interface ScanChatControllerEventEmitters {
3030
readonly processResponseBodyLinkClick: vscode.EventEmitter<any>
3131
readonly fileClicked: vscode.EventEmitter<any>
3232
readonly scanCancelled: vscode.EventEmitter<any>
33+
readonly processChatItemVotedMessage: vscode.EventEmitter<any>
3334
}

packages/core/src/amazonqTest/app.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ export function init(appContext: AmazonQAppInitContext) {
3232
errorThrown: new vscode.EventEmitter<any>(),
3333
insertCodeAtCursorPosition: new vscode.EventEmitter<any>(),
3434
processResponseBodyLinkClick: new vscode.EventEmitter<any>(),
35+
processChatItemVotedMessage: new vscode.EventEmitter<any>(),
36+
processChatItemFeedbackMessage: new vscode.EventEmitter<any>(),
3537
}
3638
const dispatcher = new AppToWebViewMessageDispatcher(appContext.getAppsToWebViewMessagePublisher())
3739
const messenger = new Messenger(dispatcher)

packages/core/src/amazonqTest/chat/controller/controller.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,14 +58,15 @@ import {
5858
import { UserIntent } from '@amzn/codewhisperer-streaming'
5959
import { getSelectedCustomization } from '../../../codewhisperer/util/customizationUtil'
6060
import { createCodeWhispererChatStreamingClient } from '../../../shared/clients/codewhispererChatClient'
61-
import { ChatTriggerType } from '../../../codewhispererChat/controllers/chat/model'
61+
import { ChatItemVotedMessage, ChatTriggerType } from '../../../codewhispererChat/controllers/chat/model'
6262
import { triggerPayloadToChatRequest } from '../../../codewhispererChat/controllers/chat/chatRequest/converter'
6363
import { EditorContentController } from '../../../amazonq/commons/controllers/contentController'
6464
import { amazonQTabSuffix } from '../../../shared/constants'
6565
import { applyChanges } from '../../../shared/utilities/textDocumentUtilities'
6666
import { telemetry } from '../../../shared/telemetry/telemetry'
6767
import { CodeReference } from '../../../amazonq'
6868
import { CodeWhispererSettings } from '../../../codewhisperer/util/codewhispererSettings'
69+
import globals from '../../../shared/extensionGlobals'
6970

7071
export interface TestChatControllerEventEmitters {
7172
readonly tabOpened: vscode.EventEmitter<any>
@@ -82,6 +83,8 @@ export interface TestChatControllerEventEmitters {
8283
readonly errorThrown: vscode.EventEmitter<any>
8384
readonly insertCodeAtCursorPosition: vscode.EventEmitter<any>
8485
readonly processResponseBodyLinkClick: vscode.EventEmitter<any>
86+
readonly processChatItemVotedMessage: vscode.EventEmitter<any>
87+
readonly processChatItemFeedbackMessage: vscode.EventEmitter<any>
8588
}
8689

8790
type OpenDiffMessage = {
@@ -160,6 +163,18 @@ export class TestController {
160163
return this.processLink(data)
161164
})
162165

166+
this.chatControllerMessageListeners.processChatItemVotedMessage.event((data) => {
167+
this.processChatItemVotedMessage(data).catch((e) => {
168+
getLogger().error('processChatItemVotedMessage failed: %s', (e as Error).message)
169+
})
170+
})
171+
172+
this.chatControllerMessageListeners.processChatItemFeedbackMessage.event((data) => {
173+
this.processChatItemFeedbackMessage(data).catch((e) => {
174+
getLogger().error('processChatItemFeedbackMessage failed: %s', (e as Error).message)
175+
})
176+
})
177+
163178
this.chatControllerMessageListeners.followUpClicked.event((data) => {
164179
switch (data.followUp.type) {
165180
case FollowUpTypes.ViewDiff:
@@ -209,6 +224,32 @@ export class TestController {
209224
}
210225
}
211226

227+
private async processChatItemVotedMessage(message: ChatItemVotedMessage) {
228+
const session = this.sessionStorage.getSession()
229+
230+
telemetry.amazonq_feedback.emit({
231+
featureId: 'amazonQTest',
232+
amazonqConversationId: session.startTestGenerationRequestId,
233+
credentialStartUrl: AuthUtil.instance.startUrl,
234+
interactionType: message.vote,
235+
})
236+
}
237+
238+
private async processChatItemFeedbackMessage(message: any) {
239+
const session = this.sessionStorage.getSession()
240+
241+
await globals.telemetry.postFeedback({
242+
comment: `${JSON.stringify({
243+
type: 'testgen-chat-answer-feedback',
244+
amazonqConversationId: session.startTestGenerationRequestId,
245+
messageId: message?.messageId,
246+
reason: message?.selectedOption,
247+
userComment: message?.comment,
248+
})}`,
249+
sentiment: 'Negative',
250+
})
251+
}
252+
212253
private async tabClosed(data: any) {
213254
getLogger().debug('Tab closed with data tab id: %s', data.tabID)
214255
await this.sessionCleanUp()

packages/core/src/amazonqTest/chat/views/actions/uiMessageListener.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ export class UIMessageListener {
6262
case 'response-body-link-click':
6363
this.processResponseBodyLinkClick(msg)
6464
break
65+
case 'chat-item-voted':
66+
this.chatItemVoted(msg)
67+
break
68+
case 'chat-item-feedback':
69+
this.chatItemFeedback(msg)
70+
break
6571
}
6672
}
6773

@@ -140,4 +146,17 @@ export class UIMessageListener {
140146
link: msg.link,
141147
})
142148
}
149+
150+
private chatItemVoted(msg: any) {
151+
this.testControllerEventsEmitters?.processChatItemVotedMessage.fire({
152+
tabID: msg.tabID,
153+
command: msg.command,
154+
vote: msg.vote,
155+
messageId: msg.messageId,
156+
})
157+
}
158+
159+
private chatItemFeedback(msg: any) {
160+
this.testControllerEventsEmitters?.processChatItemFeedbackMessage.fire(msg)
161+
}
143162
}

0 commit comments

Comments
 (0)