Skip to content
Draft
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
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,23 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { IValidator, vArray, vObj, vString } from '../../../configuration/common/validator';
import { IValidator, vArray, vObj, vString, vUndefined, vUnion } from '../../../configuration/common/validator';

export namespace WireTypes {

export namespace Capabilities {
export type t = {
promptStrategy: string;
eagernessPrompt?: string;
};
export function is(obj: unknown): obj is t {
return !!obj && typeof obj === 'object' &&
typeof (obj as t).promptStrategy === 'string';
typeof (obj as t).promptStrategy === 'string' &&
((obj as t).eagernessPrompt === undefined || typeof (obj as t).eagernessPrompt === 'string');
}
export const validator: IValidator<t> = vObj({
promptStrategy: vString(),
eagernessPrompt: vUnion(vString(), vUndefined()),
});
}

Expand Down Expand Up @@ -54,4 +57,3 @@ export namespace WireTypes {
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -574,6 +574,7 @@ export function isEagernessPrompt(options: PromptOptions): boolean {
return (options.eagernessPrompt !== undefined && [
PromptingStrategy.PatchBased02,
PromptingStrategy.PatchBased02WithRecentLineNumbers,
PromptingStrategy.PatchBased02Unified,
PromptingStrategy.PatchBased02WithoutRecentLineNumbers,
].includes(options.promptingStrategy)) // eagerness prompt option is only supported for patch-based strategies
|| [PromptingStrategy.XtabAggressiveness,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ export class InlineEditsModelService extends Disposable implements IInlineEditsM
return {
modelName: m.name,
promptingStrategy: m.capabilities.promptStrategy,
eagernessPrompt: m.capabilities.eagernessPrompt === 'aggressionHighLow' ? m.capabilities.eagernessPrompt : undefined,
includeTagsInCurrentFile: false, // FIXME@ulugbekna: determine this based on model capabilities and config
source: ModelSource.Fetched,
lintOptions: undefined,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,15 @@ describe('isEagernessPrompt', () => {
expect(isEagernessPrompt({ ...DEFAULT_OPTIONS, promptingStrategy: PromptingStrategy.PatchBased02, eagernessPrompt: 'aggressionHighLow' })).toBe(true);
expect(isEagernessPrompt({ ...DEFAULT_OPTIONS, promptingStrategy: PromptingStrategy.PatchBased02 })).toBe(false);
});

it('recognizes the optimized PatchBased02 aggression prompt option', () => {
expect(isEagernessPrompt({ ...DEFAULT_OPTIONS, promptingStrategy: PromptingStrategy.PatchBased02Unified, eagernessPrompt: 'aggressionHighLow' })).toBe(true);
expect(isEagernessPrompt({ ...DEFAULT_OPTIONS, promptingStrategy: PromptingStrategy.PatchBased02Unified })).toBe(false);
});

it('does not recognize eagerness for an unrelated strategy', () => {
expect(isEagernessPrompt({ ...DEFAULT_OPTIONS, promptingStrategy: PromptingStrategy.CopilotNesXtab, eagernessPrompt: 'aggressionHighLow' })).toBe(false);
});
});

describe('GlobalBudgetOptions', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,46 @@ import { IInstantiationService } from '../../../../util/vs/platform/instantiatio
import { CopilotToken, createTestExtendedTokenInfo } from '../../../authentication/common/copilotToken';
import { ICopilotTokenStore } from '../../../authentication/common/copilotTokenStore';
import { getEditorVersionHeaders, IEnvService } from '../../../env/common/envService';
import { WireTypes } from '../../../inlineEdits/common/dataTypes/inlineEditsModelsTypes';
import { FetchOptions, IAbortController, IFetcherService, PaginationOptions, Response, WebSocketConnection } from '../../../networking/common/fetcherService';
import { createFakeResponse } from '../../../test/node/fetcher';
import { createPlatformServices } from '../../../test/node/services';
import { ProxyModelsService } from '../../node/proxyModelsService';

suite('ProxyModelsService', function () {

test('validates optional eagerness prompts from the models response', function () {
const withEagernessPrompt = WireTypes.ModelList.validator.validate({
models: [{
serviceType: 'NESChat',
name: 'test-model',
provider: 'test-provider',
capabilities: {
promptStrategy: 'patchBased02Optimized',
eagernessPrompt: 'aggressionHighLow',
},
}],
});
const withoutEagernessPrompt = WireTypes.ModelList.validator.validate({
models: [{
serviceType: 'NESChat',
name: 'test-model',
provider: 'test-provider',
capabilities: {
promptStrategy: 'patchBased02Optimized',
},
}],
});

assert.deepStrictEqual({
withEagernessPrompt: withEagernessPrompt.content?.models[0].capabilities.eagernessPrompt,
withoutEagernessPrompt: withoutEagernessPrompt.content?.models[0].capabilities.eagernessPrompt,
}, {
withEagernessPrompt: 'aggressionHighLow',
withoutEagernessPrompt: undefined,
});
});

test('includes editor-related headers when fetching the models list', async function () {
let capturedHeaders: { [name: string]: string } | undefined;

Expand Down
Loading