nes: Add prompt template which enables only low/medium eagerness modes by bstee615 · Pull Request #340404 · microsoft/vscode · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions extensions/copilot/src/extension/xtab/common/promptCrafting.ts
12 changes: 7 additions & 5 deletions extensions/copilot/src/extension/xtab/node/xtabProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,9 @@ export class XtabProvider implements IStatelessNextEditProvider {

const currentDocument = new CurrentDocument(activeDocument.documentAfterEdits, cursorPosition);

this._configureDebounceTimings(request, currentDocument, promptOptions, modelServiceConfig, telemetry, delaySession, tracer);
const { aggressivenessLevel, userHappinessScore } = this.userInteractionMonitor.getAggressivenessLevel();

this._configureDebounceTimings(request, currentDocument, promptOptions, modelServiceConfig, aggressivenessLevel, telemetry, delaySession, tracer);

const areaAroundEditWindowLinesRange = computeAreaAroundEditWindowLinesRange(currentDocument);

Expand Down Expand Up @@ -429,8 +431,6 @@ export class XtabProvider implements IStatelessNextEditProvider {
);
};

const { aggressivenessLevel, userHappinessScore } = this.userInteractionMonitor.getAggressivenessLevel();

// Log user's raw aggressiveness setting when explicitly changed from default
const userAggressivenessSetting = this.configService.getExperimentBasedConfig(ConfigKey.Advanced.InlineEditsAggressiveness, this.expService);
telemetry.setUserAggressivenessSetting(userAggressivenessSetting);
Expand Down Expand Up @@ -591,6 +591,7 @@ export class XtabProvider implements IStatelessNextEditProvider {
currentDocument: CurrentDocument,
promptOptions: ModelConfig,
modelServiceConfig: xtabPromptOptions.ModelConfiguration,
aggressivenessLevel: xtabPromptOptions.AggressivenessLevel,
telemetry: StatelessNextEditTelemetryBuilder,
delaySession: DelaySession,
tracer: ILogger,
Expand Down Expand Up @@ -618,8 +619,8 @@ export class XtabProvider implements IStatelessNextEditProvider {
}
}

// Adjust debounce based on user aggressiveness setting for non-aggressiveness models
if (!isEagernessPrompt(promptOptions)) {
// Use timing-based eagerness when the prompt does not handle this level.
if (!isEagernessPrompt(promptOptions, aggressivenessLevel)) {
this._applyAggressivenessSettings(delaySession, tracer);
}
}
Expand Down Expand Up @@ -1827,6 +1828,7 @@ export function pickSystemPrompt(promptingStrategy: xtabPromptOptions.PromptingS
case xtabPromptOptions.PromptingStrategy.PatchBased02WithRecentLineNumbers:
case xtabPromptOptions.PromptingStrategy.PatchBased02Unified:
case xtabPromptOptions.PromptingStrategy.PatchBased02UnifiedEagerness:
case xtabPromptOptions.PromptingStrategy.PatchBased02UnifiedEagernessLowMedium:
case xtabPromptOptions.PromptingStrategy.PatchBased02WithoutRecentLineNumbers:
case xtabPromptOptions.PromptingStrategy.Xtab275:
case xtabPromptOptions.PromptingStrategy.XtabAggressiveness:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { assert, describe, expect, it, suite, test } from 'vitest';
import { DocumentId } from '../../../../platform/inlineEdits/common/dataTypes/documentId';
import { Edits } from '../../../../platform/inlineEdits/common/dataTypes/edit';
import { LanguageId } from '../../../../platform/inlineEdits/common/dataTypes/languageId';
import { AggressivenessLevel, CurrentFileOptions, DEFAULT_OPTIONS, GlobalBudgetOptions, IncludeLineNumbersOption, PromptingStrategy, PromptOptions, RejectedEditsMemoryMode } from '../../../../platform/inlineEdits/common/dataTypes/xtabPromptOptions';
import { AggressivenessLevel, CurrentFileOptions, DEFAULT_OPTIONS, EagernessPrompt, GlobalBudgetOptions, IncludeLineNumbersOption, PromptingStrategy, PromptOptions, RejectedEditsMemoryMode } from '../../../../platform/inlineEdits/common/dataTypes/xtabPromptOptions';
import { LanguageContextResponse } from '../../../../platform/inlineEdits/common/dataTypes/languageContext';
import { PromptSectionTokenCounts } from '../../../../platform/inlineEdits/common/dataTypes/promptSectionTokens';
import { ContextKind } from '../../../../platform/languageServer/common/languageContextService';
Expand Down Expand Up @@ -614,7 +614,7 @@ describe('getUserPrompt', () => {
strategy: PromptingStrategy | undefined;
includeLineNumbers?: IncludeLineNumbersOption;
includePostScript?: boolean;
eagernessPrompt?: 'aggressionHighLow';
eagernessPrompt?: EagernessPrompt;
aggressivenessLevel?: AggressivenessLevel;
rejectedEditsMemory?: RejectedEditsMemoryMode;
}): PromptPieces {
Expand Down Expand Up @@ -870,6 +870,27 @@ describe('getUserPrompt', () => {
}
});

test.each([PromptingStrategy.PatchBased02, PromptingStrategy.PatchBased02UnifiedEagernessLowMedium])('%s low/medium prompting omits the high tag and preserves the medium prompt', strategy => {
const prompts = Object.values(AggressivenessLevel).map(aggressivenessLevel => getUserPrompt(createTestPromptPieces({
cursorLine: 2,
cursorColumn: 9,
strategy,
eagernessPrompt: 'aggressionLowMedium',
aggressivenessLevel,
})).prompt);
const baseline = getUserPrompt(createTestPromptPieces({
cursorLine: 2,
cursorColumn: 9,
strategy: PromptingStrategy.PatchBased02,
})).prompt;
const postScript = 'The developer was working on a section of code within the `current_file_content`';
expect(prompts).toEqual([
baseline.replace(postScript, `<|aggression|>low<|/aggression|>\n\n${postScript}`),
baseline,
baseline,
]);
});

describe('Xtab275AggressivenessHighLow', () => {
test('medium level does not include aggressive tag', () => {
const pieces = createTestPromptPieces({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { DocumentId } from '../../../../platform/inlineEdits/common/dataTypes/do
import { Edits } from '../../../../platform/inlineEdits/common/dataTypes/edit';
import { ImportChanges } from '../../../../platform/inlineEdits/common/dataTypes/importFilteringOptions';
import { LanguageId } from '../../../../platform/inlineEdits/common/dataTypes/languageId';
import { AggressivenessLevel, DEFAULT_OPTIONS, EarlyDivergenceCancellationMode, LanguageContextLanguages, LintOptionShowCode, LintOptionWarning, ModelConfiguration, PatchModelPrediction, PromptingStrategy, ResponseFormat } from '../../../../platform/inlineEdits/common/dataTypes/xtabPromptOptions';
import { AggressivenessLevel, AggressivenessSetting, applyStrategyConfig, DEFAULT_OPTIONS, EarlyDivergenceCancellationMode, LanguageContextLanguages, LintOptionShowCode, LintOptionWarning, ModelConfiguration, PatchModelPrediction, PromptingStrategy, ResponseFormat } from '../../../../platform/inlineEdits/common/dataTypes/xtabPromptOptions';
import { InlineEditRequestLogContext } from '../../../../platform/inlineEdits/common/inlineEditLogContext';
import { IInlineEditsModelService } from '../../../../platform/inlineEdits/common/inlineEditsModelService';
import { NoNextEditReason, StatelessNextEditDocument, StatelessNextEditRequest, StreamedEdit, WithStatelessProviderTelemetry } from '../../../../platform/inlineEdits/common/statelessNextEditProvider';
Expand Down Expand Up @@ -202,6 +202,7 @@ describe('pickSystemPrompt', () => {
PromptingStrategy.PatchBased02WithRecentLineNumbers,
PromptingStrategy.PatchBased02Unified,
PromptingStrategy.PatchBased02UnifiedEagerness,
PromptingStrategy.PatchBased02UnifiedEagernessLowMedium,
PromptingStrategy.PatchBased02WithoutRecentLineNumbers,
PromptingStrategy.Xtab275,
PromptingStrategy.XtabAggressiveness,
Expand Down Expand Up @@ -2114,6 +2115,48 @@ describe('XtabProvider integration', () => {
// ========================================================================

describe('debounce behavior', () => {
it.each([
[AggressivenessSetting.Low, '<|aggression|>low<|/aggression|>', []],
[AggressivenessSetting.Medium, undefined, []],
[AggressivenessSetting.Default, undefined, []],
[AggressivenessSetting.High, undefined, [[17]]],
] as const)('uses low/medium prompting and high timing for user eagerness=%s', async (setting, tag, debounceCalls) => {
mockModelService.setSelectedConfig(applyStrategyConfig({
modelName: 'test-model',
promptingStrategy: PromptingStrategy.PatchBased02UnifiedEagernessLowMedium,
includeTagsInCurrentFile: false,
lintOptions: undefined,
}));
await configService.setConfig(ConfigKey.Advanced.InlineEditsAggressiveness, setting);
await configService.setConfig(ConfigKey.TeamInternal.InlineEditsXtabAggressivenessLevel, AggressivenessLevel.Medium);
await configService.setConfig(ConfigKey.TeamInternal.InlineEditsAggressivenessHighDebounceMs, 17);
await configService.setConfig(ConfigKey.TeamInternal.InlineEditsAggressivenessLowMinResponseTimeMs, 23);
await configService.setConfig(ConfigKey.TeamInternal.InlineEditsAggressivenessMediumMinResponseTimeMs, 29);
const setBaseDebounceTime = vi.spyOn(DelaySession.prototype, 'setBaseDebounceTime');
const setExpectedTotalTime = vi.spyOn(DelaySession.prototype, 'setExpectedTotalTime');
try {
const lines = ['const x = 1;', 'const y = 2;'];
streamingFetcher.setStreamingLines([]);
const gen = createProvider().provideNextEdit(createRequestWithEdit(lines, { insertionOffset: 3 }), createMockLogger(), createLogContext(), CancellationToken.None);
const result = await AsyncIterUtils.drainUntilReturn(gen);
const userMessage = streamingFetcher.capturedOptions[0]?.messages.find(message => message.role === Raw.ChatRole.User);
expect({
result: result.v instanceof NoNextEditReason.NoSuggestions,
tag: userMessage && getMessageText(userMessage).match(/<\|aggression\|>.*?<\|\/aggression\|>/)?.[0],
debounceCalls: setBaseDebounceTime.mock.calls,
minResponseCalls: setExpectedTotalTime.mock.calls,
}).toEqual({
result: true,
tag,
debounceCalls,
minResponseCalls: [],
});
} finally {
setBaseDebounceTime.mockRestore();
setExpectedTotalTime.mockRestore();
}
});

it('does not change timing for a non-aggressiveness strategy when user eagerness is default', async () => {
mockModelService.setSelectedConfig({ promptingStrategy: PromptingStrategy.Xtab275 });
const setBaseDebounceTime = vi.spyOn(DelaySession.prototype, 'setBaseDebounceTime');
Expand Down
Loading
Loading