Skip to content

Commit 5b43087

Browse files
committed
combine ai-feedback and ai-feedback-service
1 parent a5f4263 commit 5b43087

File tree

5 files changed

+73
-90
lines changed

5 files changed

+73
-90
lines changed

src/commands/aiFeedback.ts

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,85 @@
11
import type { TextEditor, Uri } from 'vscode';
22
import { window } from 'vscode';
33
import { Schemes } from '../constants';
4+
import type { AIFeedbackEvent, Source } from '../constants.telemetry';
45
import type { Container } from '../container';
56
import type { MarkdownContentMetadata } from '../documents/markdown';
67
import { decodeGitLensRevisionUriAuthority } from '../git/gitUri.authority';
7-
import type { AIFeedbackContext } from '../plus/ai/aiFeedbackService';
88
import { command } from '../system/-webview/command';
99
import { Logger } from '../system/logger';
1010
import { ActiveEditorCommand } from './commandBase';
1111
import { getCommandUri } from './commandBase.utils';
1212

13+
export interface AIFeedbackContext {
14+
feature: AIFeedbackEvent['feature'];
15+
model: {
16+
id: string;
17+
providerId: string;
18+
providerName: string;
19+
};
20+
usage?: {
21+
promptTokens?: number;
22+
completionTokens?: number;
23+
totalTokens?: number;
24+
limits?: {
25+
used: number;
26+
limit: number;
27+
resetsOn: Date;
28+
};
29+
};
30+
aiRequestId: string | undefined;
31+
outputLength: number;
32+
}
33+
1334
export interface AIFeedbackCommandArgs {
1435
context: AIFeedbackContext;
1536
}
1637

38+
function sendFeedbackEvent(
39+
container: Container,
40+
context: AIFeedbackContext,
41+
rating: 'positive' | 'negative',
42+
feedback: {
43+
presetReasons?: string[];
44+
writeInFeedback?: string;
45+
},
46+
source: Source,
47+
): void {
48+
const hasPresetReasons = feedback.presetReasons && feedback.presetReasons.length > 0;
49+
const writeInFeedback = feedback.writeInFeedback?.trim() ?? undefined;
50+
51+
let feedbackType: 'preset' | 'writeIn' | 'both';
52+
if (hasPresetReasons && writeInFeedback?.length) {
53+
feedbackType = 'both';
54+
} else if (hasPresetReasons) {
55+
feedbackType = 'preset';
56+
} else {
57+
feedbackType = 'writeIn';
58+
}
59+
60+
const eventData: AIFeedbackEvent = {
61+
feature: context.feature,
62+
rating: rating,
63+
feedbackType: feedbackType,
64+
presetReason: hasPresetReasons ? feedback.presetReasons!.join(', ') : undefined,
65+
'writeInFeedback.length': writeInFeedback?.length ?? undefined,
66+
'writeInFeedback.text': writeInFeedback?.length ? writeInFeedback : undefined,
67+
'model.id': context.model.id,
68+
'model.provider.id': context.model.providerId as any,
69+
'model.provider.name': context.model.providerName,
70+
'usage.promptTokens': context.usage?.promptTokens,
71+
'usage.completionTokens': context.usage?.completionTokens,
72+
'usage.totalTokens': context.usage?.totalTokens,
73+
'usage.limits.used': context.usage?.limits?.used,
74+
'usage.limits.limit': context.usage?.limits?.limit,
75+
'usage.limits.resetsOn': context.usage?.limits?.resetsOn?.toISOString(),
76+
'ai.request.id': context.aiRequestId,
77+
'output.length': context.outputLength,
78+
};
79+
80+
container.telemetry.sendEvent('ai/feedback', eventData, source);
81+
}
82+
1783
@command()
1884
export class AIFeedbackPositiveCommand extends ActiveEditorCommand {
1985
constructor(private readonly container: Container) {
@@ -30,7 +96,8 @@ export class AIFeedbackPositiveCommand extends ActiveEditorCommand {
3096

3197
try {
3298
// For positive feedback, just send the event immediately without showing any form
33-
this.container.aiFeedback.sendFeedbackEvent(
99+
sendFeedbackEvent(
100+
this.container,
34101
context,
35102
'positive',
36103
{
@@ -142,7 +209,8 @@ async function showDetailedFeedbackForm(container: Container, context: AIFeedbac
142209
});
143210

144211
// Always send feedback submission telemetry for negative feedback
145-
container.aiFeedback.sendFeedbackEvent(
212+
sendFeedbackEvent(
213+
container,
146214
context,
147215
'negative',
148216
{

src/commands/explainBase.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import type { MarkdownContentMetadata } from '../documents/markdown';
55
import { getMarkdownHeaderContent } from '../documents/markdown';
66
import type { GitRepositoryService } from '../git/gitRepositoryService';
77
import { GitUri } from '../git/gitUri';
8-
import type { AIFeedbackContext } from '../plus/ai/aiFeedbackService';
98
import type { AIExplainSource, AISummarizeResult } from '../plus/ai/aiProviderService';
109
import { getBestRepositoryOrShowPicker } from '../quickpicks/repositoryPicker';
1110
import { showMarkdownPreview } from '../system/-webview/markdown';
11+
import type { AIFeedbackContext } from './aiFeedback';
1212
import { GlCommandBase } from './commandBase';
1313
import { getCommandUri } from './commandBase.utils';
1414

src/commands/generateRebase.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ import type { GitReference, GitStashReference } from '../git/models/reference';
1010
import { uncommitted } from '../git/models/revision';
1111
import { createReference } from '../git/utils/reference.utils';
1212
import { showGenericErrorMessage } from '../messages';
13-
import type { AIFeedbackContext } from '../plus/ai/aiFeedbackService';
1413
import type { AIRebaseResult } from '../plus/ai/aiProviderService';
1514
import { showComparisonPicker } from '../quickpicks/comparisonPicker';
1615
import { getRepositoryOrShowPicker } from '../quickpicks/repositoryPicker';
1716
import { command, executeCommand } from '../system/-webview/command';
1817
import { showMarkdownPreview } from '../system/-webview/markdown';
1918
import { Logger } from '../system/logger';
2019
import { escapeMarkdownCodeBlocks } from '../system/markdown';
20+
import type { AIFeedbackContext } from './aiFeedback';
2121
import { GlCommandBase } from './commandBase';
2222
import type { CommandContext } from './commandContext';
2323
import {

src/container.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import { GitFileSystemProvider } from './git/fsProvider';
2525
import { GitProviderService } from './git/gitProviderService';
2626
import type { RepositoryLocationProvider } from './git/location/repositorylocationProvider';
2727
import { LineHoverController } from './hovers/lineHoverController';
28-
import { AIFeedbackService } from './plus/ai/aiFeedbackService';
2928
import { AIProviderService } from './plus/ai/aiProviderService';
3029
import { DraftService } from './plus/drafts/draftsService';
3130
import { AccountAuthenticationProvider } from './plus/gk/authenticationProvider';
@@ -368,14 +367,6 @@ export class Container {
368367
return this._ai;
369368
}
370369

371-
private _aiFeedback: AIFeedbackService | undefined;
372-
get aiFeedback(): AIFeedbackService {
373-
if (this._aiFeedback == null) {
374-
this._disposables.push((this._aiFeedback = new AIFeedbackService(this)));
375-
}
376-
return this._aiFeedback;
377-
}
378-
379370
private _autolinks: AutolinksProvider | undefined;
380371
get autolinks(): AutolinksProvider {
381372
if (this._autolinks == null) {

src/plus/ai/aiFeedbackService.ts

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)