From dbe2be271a14ddf8e6103b4aded6594e0c6de00a Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Wed, 27 Aug 2025 11:58:47 +1000 Subject: [PATCH] Telemetry to determine if NES completion for active doc (#779) --- .../inlineEdits/node/nextEditProviderTelemetry.ts | 11 +++++++++++ .../vscode-node/inlineCompletionProvider.ts | 4 +++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/extensions/copilot/src/extension/inlineEdits/node/nextEditProviderTelemetry.ts b/extensions/copilot/src/extension/inlineEdits/node/nextEditProviderTelemetry.ts index 1a6657d1208c..c721fc23c345 100644 --- a/extensions/copilot/src/extension/inlineEdits/node/nextEditProviderTelemetry.ts +++ b/extensions/copilot/src/extension/inlineEdits/node/nextEditProviderTelemetry.ts @@ -112,6 +112,7 @@ export interface INextEditProviderTelemetry extends ILlmNESTelemetry, IDiagnosti readonly alternativeAction: IAlternativeAction | undefined; readonly postProcessingOutcome: string | undefined; readonly isNESForAnotherDoc: boolean; + readonly isActiveDocument?: boolean; readonly isNaturalLanguageDominated: boolean; readonly hadLlmNES: boolean; @@ -448,6 +449,7 @@ export class NextEditProviderTelemetryBuilder extends Disposable { supersededByOpportunityId: this._supersededByOpportunityId, pickedNES: this._nesTypePicked, hadLlmNES: this._hadLlmNES, + isActiveDocument: this._isActiveDocument, isNESForAnotherDoc: this._isNESForAnotherDoc, hadDiagnosticsNES: this._hadDiagnosticsNES, configIsDiagnosticsNESEnabled: this._configIsDiagnosticsNESEnabled, @@ -519,6 +521,12 @@ export class NextEditProviderTelemetryBuilder extends Disposable { return this; } + private _isActiveDocument?: boolean; + public setIsActiveDocument(isActive: boolean): this { + this._isActiveDocument = isActive; + return this; + } + private _isNESForAnotherDoc: boolean = false; public setIsNESForOtherEditor(): this { this._isNESForAnotherDoc = true; @@ -649,6 +657,7 @@ export class TelemetrySender implements IDisposable { isNotebook, notebookType, isNESForAnotherDoc, + isActiveDocument, acceptance, disposalReason, logProbThreshold, @@ -732,6 +741,7 @@ export class TelemetrySender implements IDisposable { "isShown": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the edit was shown", "isMeasurement": true }, "isNotebook": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the document is a notebook", "isMeasurement": true }, "isNESForAnotherDoc": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the NES if for another document", "isMeasurement": true }, + "isActiveDocument": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the document is the active document", "isMeasurement": true }, "hasNotebookCellMarker": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Whether the edit has a notebook cell marker", "isMeasurement": true }, "notebookType": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Type of notebook, if any" }, "logProbThreshold": { "classification": "SystemMetaData", "purpose": "FeatureInsight", "comment": "Log probability threshold for the edit", "isMeasurement": true }, @@ -799,6 +809,7 @@ export class TelemetrySender implements IDisposable { isShown: this._boolToNum(isShown), isNotebook: this._boolToNum(isNotebook), isNESForAnotherDoc: this._boolToNum(isNESForAnotherDoc), + isActiveDocument: this._boolToNum(isActiveDocument), hasNotebookCellMarker: this._boolToNum(hasNotebookCellMarker), logProbThreshold, documentsCount, diff --git a/extensions/copilot/src/extension/inlineEdits/vscode-node/inlineCompletionProvider.ts b/extensions/copilot/src/extension/inlineEdits/vscode-node/inlineCompletionProvider.ts index 3921da9061ac..e0a315c19543 100644 --- a/extensions/copilot/src/extension/inlineEdits/vscode-node/inlineCompletionProvider.ts +++ b/extensions/copilot/src/extension/inlineEdits/vscode-node/inlineCompletionProvider.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { CancellationToken, Command, InlineCompletionContext, InlineCompletionDisplayLocation, InlineCompletionDisplayLocationKind, InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletionItem, InlineCompletionItemProvider, InlineCompletionList, InlineCompletionsDisposeReason, InlineCompletionsDisposeReasonKind, Position, Range, TextDocument, TextDocumentShowOptions, l10n, Event as vscodeEvent, workspace } from 'vscode'; +import { CancellationToken, Command, InlineCompletionContext, InlineCompletionDisplayLocation, InlineCompletionDisplayLocationKind, InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletionItem, InlineCompletionItemProvider, InlineCompletionList, InlineCompletionsDisposeReason, InlineCompletionsDisposeReasonKind, Position, Range, TextDocument, TextDocumentShowOptions, l10n, Event as vscodeEvent, window, workspace } from 'vscode'; import { ConfigKey, IConfigurationService } from '../../../platform/configuration/common/configurationService'; import { IDiffService } from '../../../platform/diff/common/diffService'; import { stringEditFromDiff } from '../../../platform/editing/common/edit'; @@ -236,6 +236,7 @@ export class InlineCompletionProviderImpl implements InlineCompletionItemProvide tracer.trace('no next edit suggestion'); } else if (documents[0][0] === document) { // nes is for this same document. + telemetryBuilder.setIsActiveDocument(window.activeTextEditor?.document === documents[0][0]); range = documents[0][1]; const allowInlineCompletions = this.model.inlineEditsInlineCompletionsEnabled.get(); isInlineCompletion = allowInlineCompletions && isInlineSuggestion(position, document, range, result.edit.newText); @@ -245,6 +246,7 @@ export class InlineCompletionProviderImpl implements InlineCompletionItemProvide } else { // nes is for a different document. telemetryBuilder.setIsNESForOtherEditor(); + telemetryBuilder.setIsActiveDocument(window.activeTextEditor?.document === documents[0][0]); range = documents[0][1]; completionItem = serveAsCompletionsProvider ? undefined :