Path: blob/main/extensions/copilot/src/extension/test/vscode-node/endpoints.test.ts
13399 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { SinonSandbox, createSandbox } from 'sinon';7import { LanguageModelChat } from 'vscode';8import { CHAT_MODEL } from '../../../platform/configuration/common/configurationService';9import { IChatModelInformation, ICompletionModelInformation, IEmbeddingModelInformation } from '../../../platform/endpoint/common/endpointProvider';10import { IModelMetadataFetcher } from '../../../platform/endpoint/node/modelMetadataFetcher';11import { ITestingServicesAccessor } from '../../../platform/test/node/services';12import { TokenizerType } from '../../../util/common/tokenizer';13import { Event } from '../../../util/vs/base/common/event';14import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';15import { ProductionEndpointProvider } from '../../prompt/vscode-node/endpointProviderImpl';16import { createExtensionTestingServices } from './services';1718class FakeModelMetadataFetcher implements IModelMetadataFetcher {19public onDidModelsRefresh = Event.None;20async getAllChatModels(): Promise<IChatModelInformation[]> {21return [];22}23async getAllCompletionModels(forceRefresh: boolean): Promise<ICompletionModelInformation[]> {24return [];25}26async getChatModelFromApiModel(model: LanguageModelChat): Promise<IChatModelInformation | undefined> {27return undefined;28}29async getChatModelFromFamily(modelId: string): Promise<IChatModelInformation> {30return {31id: modelId,32vendor: 'fake-vendor',33name: 'fake-name',34version: 'fake-version',35model_picker_enabled: false,36is_chat_default: false,37is_chat_fallback: false,38capabilities: {39supports: { streaming: true },40type: 'chat',41tokenizer: TokenizerType.O200K,42family: 'fake-family'43}44};45}4647async getEmbeddingsModel(): Promise<IEmbeddingModelInformation> {48return {49id: 'text-embedding-3-small',50name: 'fake-name',51vendor: 'fake-vendor',52version: 'fake-version',53model_picker_enabled: false,54is_chat_default: false,55is_chat_fallback: false,56capabilities: {57type: 'embeddings',58tokenizer: TokenizerType.O200K,59family: 'text-embedding-3-small',60limits: { max_inputs: 256 }61}62};63}64}6566suite('Endpoint Class Test', function () {67let accessor: ITestingServicesAccessor;68let endpointProvider: ProductionEndpointProvider;69let sandbox: SinonSandbox;7071setup(() => {72accessor = createExtensionTestingServices().createTestingAccessor();73endpointProvider = accessor.get(IInstantiationService).createInstance(ProductionEndpointProvider);74sandbox = createSandbox();75//@ts-expect-error76sandbox.replace(endpointProvider, '_modelFetcher', new FakeModelMetadataFetcher());77});7879teardown(() => {80sandbox.restore();81});8283test('Model names have proper casing', async function () {84assert.strictEqual(CHAT_MODEL.GPT41, 'gpt-4.1-2025-04-14', 'Incorrect GPT 41 model name, changing this will break requests.');85assert.strictEqual(CHAT_MODEL.GPT4OMINI, 'gpt-4o-mini', 'Incorrect GPT 4o mini model name, changing this will break requests.');86});87});888990