Skip to content

Commit 64d9726

Browse files
authored
* drive inline chat feedback telemetry from CopilotInteractiveEditorResponse (#2435)
* `CopilotInteractiveEditorResponse.kind` is always 'ok' -> remove it fixes microsoft/vscode#280959
1 parent fe92ff1 commit 64d9726

File tree

5 files changed

+21
-34
lines changed

5 files changed

+21
-34
lines changed

src/extension/conversation/vscode-node/userActions.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
import * as vscode from 'vscode';
88
import { editsAgentName, getChatParticipantIdFromName } from '../../../platform/chat/common/chatAgents';
9-
import { ChatLocation } from '../../../platform/chat/common/commonTypes';
109
import { EditSurvivalResult } from '../../../platform/editSurvivalTracking/common/editSurvivalReporter';
1110
import { ILanguageDiagnosticsService } from '../../../platform/languages/common/languageDiagnosticsService';
1211
import { IMultiFileEditInternalTelemetryService } from '../../../platform/multiFileEdit/common/multiFileEditQualityTelemetry';
@@ -23,7 +22,6 @@ import { CopilotInteractiveEditorResponse, InteractionOutcome } from '../../inli
2322
import { participantIdToModeName } from '../../intents/common/intents';
2423
import { EditCodeStepTurnMetaData } from '../../intents/node/editCodeStep';
2524
import { Conversation, ICopilotChatResultIn } from '../../prompt/common/conversation';
26-
import { IntentInvocationMetadata } from '../../prompt/node/conversation';
2725
import { IFeedbackReporter } from '../../prompt/node/feedbackReporter';
2826
import { sendUserActionTelemetry } from '../../prompt/node/telemetry';
2927

@@ -55,7 +53,7 @@ export class UserFeedbackService implements IUserFeedbackService {
5553
const result = e.result as ICopilotChatResultIn;
5654
const conversation = result.metadata?.responseId && this.conversationStore.getConversation(result.metadata.responseId);
5755

58-
if (typeof conversation === 'object' && conversation.getLatestTurn().getMetadata(IntentInvocationMetadata)?.value?.location === ChatLocation.Editor) {
56+
if (typeof conversation === 'object' && conversation.getLatestTurn().getMetadata(CopilotInteractiveEditorResponse)) {
5957
this._handleChatUserAction(result.metadata?.sessionId, agentId, conversation, e, undefined);
6058
return;
6159
}
@@ -380,16 +378,6 @@ export class UserFeedbackService implements IUserFeedbackService {
380378
return;
381379
}
382380

383-
const response = conversation.getLatestTurn().getMetadata(CopilotInteractiveEditorResponse);
384-
if (!response) {
385-
return;
386-
}
387-
388-
const interactionOutcome = conversation.getLatestTurn().getMetadata(InteractionOutcome);
389-
if (!interactionOutcome) {
390-
return;
391-
}
392-
393381
let kind: InteractiveEditorResponseFeedbackKind | undefined;
394382
if (event?.action.kind === 'editor') {
395383
kind = event.action.accepted ? InteractiveEditorResponseFeedbackKind.Accepted : InteractiveEditorResponseFeedbackKind.Undone;
@@ -405,6 +393,15 @@ export class UserFeedbackService implements IUserFeedbackService {
405393
return;
406394
}
407395

396+
const response = conversation.getLatestTurn().getMetadata(CopilotInteractiveEditorResponse);
397+
if (!response) {
398+
return;
399+
}
400+
401+
let interactionOutcome = conversation.getLatestTurn().getMetadata(InteractionOutcome);
402+
if (!interactionOutcome) {
403+
interactionOutcome = new InteractionOutcome(!response.telemetry?.editCount ? 'none' : 'inlineEdit', []);
404+
}
408405

409406
if (kind === InteractiveEditorResponseFeedbackKind.Bug && conversation) {
410407
this.feedbackReporter.reportInline(conversation, response.promptQuery, interactionOutcome);
@@ -606,4 +603,4 @@ const outcomes = new Map([
606603
[vscode.ChatEditingSessionActionOutcome.Accepted, 'accepted'],
607604
[vscode.ChatEditingSessionActionOutcome.Rejected, 'rejected'],
608605
[vscode.ChatEditingSessionActionOutcome.Saved, 'saved']
609-
]);
606+
]);

src/extension/inlineChat/node/inlineChatIntent.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import { Conversation, Turn } from '../../prompt/common/conversation';
4040
import { IToolCall } from '../../prompt/common/intents';
4141
import { ToolCallRound } from '../../prompt/common/toolCallRound';
4242
import { ChatTelemetryBuilder, InlineChatTelemetry } from '../../prompt/node/chatParticipantTelemetry';
43-
import { IntentInvocationMetadata } from '../../prompt/node/conversation';
4443
import { DefaultIntentRequestHandler } from '../../prompt/node/defaultIntentRequestHandler';
4544
import { IDocumentContext } from '../../prompt/node/documentContext';
4645
import { IIntent, NoopReplyInterpreter, ReplyInterpreterMetaData, TelemetryData } from '../../prompt/node/intents';
@@ -188,11 +187,9 @@ export class InlineChatIntent implements IIntent {
188187
assertType(documentContext);
189188

190189
const editSurvivalTracker = this._editSurvivalTrackerService.initialize(request.location2.document);
191-
let didSeeAnyEdit = false;
192190

193191
stream = ChatResponseStreamImpl.spy(stream, part => {
194192
if (part instanceof ChatResponseTextEditPart) {
195-
didSeeAnyEdit = true;
196193
editSurvivalTracker.collectAIEdits(part.edits);
197194
}
198195
});
@@ -242,18 +239,11 @@ export class InlineChatIntent implements IIntent {
242239

243240
// store metadata for telemetry sending
244241
const turn = conversation.getLatestTurn();
245-
turn.setMetadata(new InteractionOutcome(didSeeAnyEdit ? 'inlineEdit' : 'none', []));
246242
turn.setMetadata(new CopilotInteractiveEditorResponse(
247-
'ok', undefined,
243+
undefined,
248244
{ ...documentContext, query: request.prompt, intent: this },
249245
result.telemetry.telemetryMessageId, result.telemetry, editSurvivalTracker
250246
));
251-
turn.setMetadata(new IntentInvocationMetadata({ // UGLY fake intent invocation
252-
location: ChatLocation.Editor,
253-
intent: this,
254-
endpoint,
255-
buildPrompt: () => { throw new Error(); },
256-
}));
257247

258248
if (result.lastResponse.type !== ChatFetchResponseType.Success) {
259249
const details = getErrorDetailsFromChatFetchError(result.lastResponse, await this._endpointProvider.getChatEndpoint('copilot-base'), (await this._authenticationService.getCopilotToken()).copilotPlan);

src/extension/inlineChat/node/promptCraftingTypes.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,13 +138,14 @@ export interface ICodeContextInfo {
138138
above: CodeContextRegion;
139139
range: CodeContextRegion;
140140
below: CodeContextRegion;
141-
}export class CopilotInteractiveEditorResponse {
141+
}
142+
143+
export class CopilotInteractiveEditorResponse {
142144
constructor(
143-
public readonly kind: 'ok',
144-
public readonly store: ISessionTurnStorage | undefined,
145-
public readonly promptQuery: PromptQuery,
146-
public readonly messageId: string,
147-
public readonly telemetry: ChatTelemetry | undefined,
148-
public readonly editSurvivalTracker: IEditSurvivalTrackingSession
145+
readonly store: ISessionTurnStorage | undefined,
146+
readonly promptQuery: PromptQuery,
147+
readonly messageId: string,
148+
readonly telemetry: ChatTelemetry | undefined,
149+
readonly editSurvivalTracker: IEditSurvivalTrackingSession
149150
) { }
150151
}

src/extension/prompt/node/defaultIntentRequestHandler.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,6 @@ export class DefaultIntentRequestHandler {
266266

267267
if (this.documentContext) {
268268
this.turn.setMetadata(new CopilotInteractiveEditorResponse(
269-
'ok',
270269
interactionOutcome.store,
271270
{ ...this.documentContext, intent: this.intent, query: this.request.prompt },
272271
this.chatTelemetryBuilder.telemetryMessageId,

test/simulation/inlineChatSimulator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ export async function simulateEditingScenario(
507507
{
508508
// TODO@Alex: extract to host object
509509
const response = requestHandler.conversation.getLatestTurn()?.getMetadata(CopilotInteractiveEditorResponse);
510-
intent = (response && response.kind === 'ok' ? response.promptQuery.intent : undefined);
510+
intent = (response ? response.promptQuery.intent : undefined);
511511
}
512512
annotations = annotations.concat(requestHandler.conversation.getLatestTurn()?.getMetadata(InteractionOutcome)?.annotations ?? []);
513513

0 commit comments

Comments
 (0)