Skip to content

Commit 9f956db

Browse files
committed
Adds explicit feature field to AI result objects
Introduces a dedicated field to capture the feature responsible for generating each AI result, improving clarity when handling or displaying results. Ensures downstream consumers can reliably differentiate between AI actions beyond their general type, supporting better analytics, debugging, and UI handling. (#4502, #4510)
1 parent 4cad117 commit 9f956db

File tree

5 files changed

+39
-6
lines changed

5 files changed

+39
-6
lines changed

docs/telemetry-events.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@
146146
147147
```typescript
148148
{
149+
'feature': string,
149150
'id': string,
150151
'model.id': string,
151152
'model.provider.id': 'anthropic' | 'azure' | 'deepseek' | 'gemini' | 'github' | 'gitkraken' | 'huggingface' | 'mistral' | 'ollama' | 'openai' | 'openaicompatible' | 'openrouter' | 'vscode' | 'xai',

src/commands/aiFeedback.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ function sendFeedbackEvent(
121121
): void {
122122
const eventData: AIFeedbackEvent = {
123123
type: context.type,
124+
feature: context.feature,
124125
sentiment: sentiment,
125126
'unhelpful.reasons': unhelpful?.reasons?.length ? unhelpful.reasons.join(',') : undefined,
126127
'unhelpful.custom': unhelpful?.custom?.trim() ?? undefined,

src/constants.telemetry.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,7 @@ export type AIFeedbackUnhelpfulReasons =
419419
export interface AIFeedbackEvent extends AIEventDataBase {
420420
/** The AI feature that feedback was submitted for */
421421
type: AIActionType;
422+
feature: string;
422423
sentiment: 'helpful' | 'unhelpful';
423424
/** Unhelpful reasons selected (if any) - comma-separated list of AIFeedbackUnhelpfulReasons values */
424425
'unhelpful.reasons'?: string;

src/plus/ai/aiProviderService.ts

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ function dedent(template: string): string {
120120
export interface AIResult {
121121
readonly id: string;
122122
readonly type: AIActionType;
123+
readonly feature: string;
123124
readonly content: string;
124125
readonly model: AIModel;
125126
readonly usage?: {
@@ -647,7 +648,12 @@ export class AIProviderService implements Disposable {
647648
return result === 'cancelled'
648649
? result
649650
: result != null
650-
? { ...result, type: 'explain-changes', parsed: parseSummarizeResult(result.content) }
651+
? {
652+
...result,
653+
type: 'explain-changes',
654+
feature: `explain-${type}`,
655+
parsed: parseSummarizeResult(result.content),
656+
}
651657
: undefined;
652658
}
653659

@@ -703,7 +709,12 @@ export class AIProviderService implements Disposable {
703709
return result === 'cancelled'
704710
? result
705711
: result != null
706-
? { ...result, type: 'generate-commitMessage', parsed: parseSummarizeResult(result.content) }
712+
? {
713+
...result,
714+
type: 'generate-commitMessage',
715+
feature: 'generate-commitMessage',
716+
parsed: parseSummarizeResult(result.content),
717+
}
707718
: undefined;
708719
}
709720

@@ -767,7 +778,12 @@ export class AIProviderService implements Disposable {
767778
return result === 'cancelled'
768779
? result
769780
: result != null
770-
? { ...result, type: 'generate-create-pullRequest', parsed: parseSummarizeResult(result.content) }
781+
? {
782+
...result,
783+
type: 'generate-create-pullRequest',
784+
feature: 'generate-create-pullRequest',
785+
parsed: parseSummarizeResult(result.content),
786+
}
771787
: undefined;
772788
}
773789

@@ -839,6 +855,9 @@ export class AIProviderService implements Disposable {
839855
? {
840856
...result,
841857
type: options?.codeSuggestion ? 'generate-create-codeSuggestion' : 'generate-create-cloudPatch',
858+
feature: options?.codeSuggestion
859+
? 'generate-create-codeSuggestion'
860+
: 'generate-create-cloudPatch',
842861
parsed: parseSummarizeResult(result.content),
843862
}
844863
: undefined;
@@ -896,7 +915,12 @@ export class AIProviderService implements Disposable {
896915
return result === 'cancelled'
897916
? result
898917
: result != null
899-
? { ...result, type: 'generate-stashMessage', parsed: parseSummarizeResult(result.content) }
918+
? {
919+
...result,
920+
type: 'generate-stashMessage',
921+
feature: 'generate-stashMessage',
922+
parsed: parseSummarizeResult(result.content),
923+
}
900924
: undefined;
901925
}
902926

@@ -943,7 +967,11 @@ export class AIProviderService implements Disposable {
943967
}),
944968
options,
945969
);
946-
return result === 'cancelled' ? result : result != null ? { ...result, type: 'generate-changelog' } : undefined;
970+
return result === 'cancelled'
971+
? result
972+
: result != null
973+
? { ...result, type: 'generate-changelog', feature: 'generate-changelog' }
974+
: undefined;
947975
}
948976

949977
async generateSearchQuery(
@@ -990,7 +1018,7 @@ export class AIProviderService implements Disposable {
9901018
return result === 'cancelled'
9911019
? result
9921020
: result != null
993-
? { ...result, type: 'generate-searchQuery' }
1021+
? { ...result, type: 'generate-searchQuery', feature: 'generate-searchQuery' }
9941022
: undefined;
9951023
}
9961024

@@ -1065,6 +1093,7 @@ export class AIProviderService implements Disposable {
10651093
...rq,
10661094
...result,
10671095
type: 'generate-rebase',
1096+
feature: options?.generateCommits ? 'generate-commits' : 'generate-rebase',
10681097
};
10691098
}
10701099

src/plus/ai/utils/-webview/ai.utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ export function getAIResultContext(result: AIResult): AIResultContext {
261261
return {
262262
id: result.id,
263263
type: result.type,
264+
feature: result.feature,
264265
model: result.model,
265266
usage:
266267
result.usage != null

0 commit comments

Comments
 (0)