Skip to content

Commit e5c5ead

Browse files
committed
Refactor inline edits strategy configuration
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 13bd697b-ebe3-4c55-a34e-58dcf027cad6
1 parent de154da commit e5c5ead

2 files changed

Lines changed: 78 additions & 57 deletions

File tree

extensions/copilot/src/extension/xtab/node/xtabProvider.ts

Lines changed: 54 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,70 +1521,68 @@ export class XtabProvider implements IStatelessNextEditProvider {
15211521
}
15221522

15231523
private determineModelConfiguration(activeDocument: StatelessNextEditDocument): { promptOptions: ModelConfig; modelServiceConfig: xtabPromptOptions.ModelConfiguration } {
1524+
let baseOptions: ModelConfig;
1525+
let rawModelConfig: xtabPromptOptions.ModelConfiguration;
15241526
if (this.forceUseDefaultModel) {
1525-
const defaultOptions = {
1527+
baseOptions = {
15261528
modelName: undefined,
15271529
...xtabPromptOptions.DEFAULT_OPTIONS,
15281530
};
1529-
const defaultModelConfig = xtabPromptOptions.applyStrategyConfig(this.modelService.defaultModelConfiguration());
1530-
return {
1531-
promptOptions: overrideModelConfig(defaultOptions, defaultModelConfig),
1532-
modelServiceConfig: defaultModelConfig
1531+
rawModelConfig = this.modelService.defaultModelConfiguration();
1532+
} else {
1533+
baseOptions = {
1534+
modelName: undefined,
1535+
promptingStrategy: undefined,
1536+
currentFile: {
1537+
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabCurrentFileMaxTokens, this.expService),
1538+
includeTags: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeTagsInCurrentFile, this.expService),
1539+
includeLineNumbers: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeLineNumbersInCurrentFile, this.expService),
1540+
includeCursorTag: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeCursorTagInCurrentFile, this.expService),
1541+
prioritizeAboveCursor: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabPrioritizeAboveCursor, this.expService),
1542+
useLeftoverBudgetFromAbove: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabCurrentFileUseLeftoverBudgetFromAbove, this.expService)
1543+
},
1544+
pagedClipping: {
1545+
pageSize: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabPageSize, this.expService)
1546+
},
1547+
recentlyViewedDocuments: {
1548+
nDocuments: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabNRecentlyViewedDocuments, this.expService),
1549+
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedDocumentsMaxTokens, this.expService),
1550+
includeViewedFiles: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeViewedFiles, this.expService),
1551+
includeLineNumbers: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedIncludeLineNumbers, this.expService),
1552+
clippingStrategy: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedClippingStrategy, this.expService),
1553+
useLeftoverBudgetFromAbove: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedUseLeftoverBudgetFromAbove, this.expService),
1554+
},
1555+
languageContext: determineLanguageContextOptions(activeDocument.languageId, {
1556+
enabled: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabLanguageContextEnabled, this.expService),
1557+
enabledLanguages: this.configService.getConfig(ConfigKey.TeamInternal.InlineEditsXtabLanguageContextEnabledLanguages),
1558+
enableAllContextProviders: this.configService.getExperimentBasedConfig<boolean>(ConfigKey.Advanced.DiagnosticsContextProvider, this.expService)
1559+
|| this.configService.getExperimentBasedConfig<boolean>(ConfigKey.Advanced.ChatSessionContextProvider, this.expService),
1560+
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabLanguageContextMaxTokens, this.expService),
1561+
traitPosition: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabLanguageContextTraitsPosition, this.expService),
1562+
}),
1563+
neighborFiles: {
1564+
enabled: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeNeighborFiles, this.expService),
1565+
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabNeighborFilesMaxTokens, this.expService),
1566+
includeRelatedFiles: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabNeighborFilesIncludeRelatedFiles, this.expService),
1567+
},
1568+
diffHistory: {
1569+
nEntries: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabDiffNEntries, this.expService),
1570+
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabDiffMaxTokens, this.expService),
1571+
onlyForDocsInPrompt: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabDiffOnlyForDocsInPrompt, this.expService),
1572+
useRelativePaths: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabDiffUseRelativePaths, this.expService),
1573+
},
1574+
memory: undefined,
1575+
lintOptions: undefined,
1576+
eagernessPrompt: undefined,
1577+
includePostScript: true,
1578+
globalBudget: this.getGlobalBudget(),
15331579
};
1580+
rawModelConfig = this.modelService.selectedModelConfiguration();
15341581
}
15351582

1536-
const sourcedModelConfig: ModelConfig = {
1537-
modelName: undefined,
1538-
promptingStrategy: undefined,
1539-
currentFile: {
1540-
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabCurrentFileMaxTokens, this.expService),
1541-
includeTags: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeTagsInCurrentFile, this.expService),
1542-
includeLineNumbers: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeLineNumbersInCurrentFile, this.expService),
1543-
includeCursorTag: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeCursorTagInCurrentFile, this.expService),
1544-
prioritizeAboveCursor: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabPrioritizeAboveCursor, this.expService),
1545-
useLeftoverBudgetFromAbove: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabCurrentFileUseLeftoverBudgetFromAbove, this.expService)
1546-
},
1547-
pagedClipping: {
1548-
pageSize: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabPageSize, this.expService)
1549-
},
1550-
recentlyViewedDocuments: {
1551-
nDocuments: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabNRecentlyViewedDocuments, this.expService),
1552-
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedDocumentsMaxTokens, this.expService),
1553-
includeViewedFiles: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeViewedFiles, this.expService),
1554-
includeLineNumbers: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedIncludeLineNumbers, this.expService),
1555-
clippingStrategy: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedClippingStrategy, this.expService),
1556-
useLeftoverBudgetFromAbove: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabRecentlyViewedUseLeftoverBudgetFromAbove, this.expService),
1557-
},
1558-
languageContext: determineLanguageContextOptions(activeDocument.languageId, {
1559-
enabled: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabLanguageContextEnabled, this.expService),
1560-
enabledLanguages: this.configService.getConfig(ConfigKey.TeamInternal.InlineEditsXtabLanguageContextEnabledLanguages),
1561-
enableAllContextProviders: this.configService.getExperimentBasedConfig<boolean>(ConfigKey.Advanced.DiagnosticsContextProvider, this.expService)
1562-
|| this.configService.getExperimentBasedConfig<boolean>(ConfigKey.Advanced.ChatSessionContextProvider, this.expService),
1563-
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabLanguageContextMaxTokens, this.expService),
1564-
traitPosition: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabLanguageContextTraitsPosition, this.expService),
1565-
}),
1566-
neighborFiles: {
1567-
enabled: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabIncludeNeighborFiles, this.expService),
1568-
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabNeighborFilesMaxTokens, this.expService),
1569-
includeRelatedFiles: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabNeighborFilesIncludeRelatedFiles, this.expService),
1570-
},
1571-
diffHistory: {
1572-
nEntries: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabDiffNEntries, this.expService),
1573-
maxTokens: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabDiffMaxTokens, this.expService),
1574-
onlyForDocsInPrompt: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabDiffOnlyForDocsInPrompt, this.expService),
1575-
useRelativePaths: this.configService.getExperimentBasedConfig(ConfigKey.TeamInternal.InlineEditsXtabDiffUseRelativePaths, this.expService),
1576-
},
1577-
memory: undefined,
1578-
lintOptions: undefined,
1579-
eagernessPrompt: undefined,
1580-
includePostScript: true,
1581-
globalBudget: this.getGlobalBudget(),
1582-
};
1583-
1584-
const selectedModelConfig = this.modelService.selectedModelConfiguration();
1585-
const modelConfig = xtabPromptOptions.applyStrategyConfig(selectedModelConfig);
1583+
const modelConfig = xtabPromptOptions.applyStrategyConfig(rawModelConfig);
15861584
return {
1587-
promptOptions: overrideModelConfig(sourcedModelConfig, modelConfig),
1585+
promptOptions: overrideModelConfig(baseOptions, modelConfig),
15881586
modelServiceConfig: modelConfig
15891587
};
15901588
}

extensions/copilot/src/extension/xtab/test/node/xtabProvider.spec.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,29 @@ describe('XtabProvider integration', () => {
10661066
expect(getMessageText(systemMessage!)).toBe(xtab275SystemPrompt);
10671067
});
10681068

1069+
it('applies strategy config to the selected model', async () => {
1070+
await configService.setConfig(ConfigKey.Advanced.InlineEditsAggressiveness, AggressivenessSetting.High);
1071+
mockModelService.setSelectedConfig({
1072+
promptingStrategy: PromptingStrategy.PatchBased02UnifiedEagerness,
1073+
});
1074+
1075+
const lines = ['const x = 1;'];
1076+
streamingFetcher.setStreamingLines(lines);
1077+
const gen = createProvider().provideNextEdit(
1078+
createRequestWithEdit(lines, { insertionOffset: 3, insertedText: 'a' }),
1079+
createMockLogger(),
1080+
createLogContext(),
1081+
CancellationToken.None
1082+
);
1083+
await AsyncIterUtils.drainUntilReturn(gen);
1084+
1085+
const userMessages = streamingFetcher.capturedOptions
1086+
.flatMap(options => options.messages)
1087+
.filter(message => message.role === Raw.ChatRole.User)
1088+
.map(getMessageText);
1089+
expect(userMessages.some(prompt => prompt.includes('<|aggression|>high<|/aggression|>'))).toBe(true);
1090+
});
1091+
10691092
it('applies configured aggressiveness only to aggressiveness strategies', async () => {
10701093
const lines = ['const x = 1;', 'const y = 2;'];
10711094
const captureUserPrompt = async (promptingStrategy: PromptingStrategy, aggressivenessLevel: AggressivenessLevel) => {
@@ -1123,7 +1146,7 @@ describe('XtabProvider integration', () => {
11231146
expect(streamingFetcher.callCount).toBe(2);
11241147
});
11251148

1126-
it('applies four-in-one strategy config when retrying with the default model', async () => {
1149+
it('applies strategy config when retrying with the default model', async () => {
11271150
const provider = createProvider();
11281151
await configService.setConfig(ConfigKey.Advanced.InlineEditsAggressiveness, AggressivenessSetting.High);
11291152
mockModelService.setDefaultConfig({

0 commit comments

Comments
 (0)