Path: blob/main/extensions/copilot/src/extension/conversation/vscode-node/test/languageModelAccess.test.ts
13405 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 * as vscode from 'vscode';7import { IChatMLFetcher } from '../../../../platform/chat/common/chatMLFetcher';8import { MockChatMLFetcher } from '../../../../platform/chat/test/common/mockChatMLFetcher';9import { IEndpointProvider } from '../../../../platform/endpoint/common/endpointProvider';10import { IVSCodeExtensionContext } from '../../../../platform/extContext/common/extensionContext';11import { IChatEndpoint } from '../../../../platform/networking/common/networking';12import { ITestingServicesAccessor } from '../../../../platform/test/node/services';13import { CancellationToken } from '../../../../util/vs/base/common/cancellation';14import { IInstantiationService } from '../../../../util/vs/platform/instantiation/common/instantiation';15import { createExtensionTestingServices } from '../../../test/vscode-node/services';16import { CopilotLanguageModelWrapper } from '../languageModelAccess';171819suite('CopilotLanguageModelWrapper', () => {20let accessor: ITestingServicesAccessor;21let instaService: IInstantiationService;2223function createAccessor(vscodeExtensionContext?: IVSCodeExtensionContext) {24const testingServiceCollection = createExtensionTestingServices();25testingServiceCollection.define(IChatMLFetcher, new MockChatMLFetcher());2627accessor = testingServiceCollection.createTestingAccessor();28instaService = accessor.get(IInstantiationService);29}3031suite('validateRequest - invalid', () => {32let wrapper: CopilotLanguageModelWrapper;33let endpoint: IChatEndpoint;34setup(async () => {35createAccessor();36endpoint = await accessor.get(IEndpointProvider).getChatEndpoint('copilot-base');37wrapper = instaService.createInstance(CopilotLanguageModelWrapper);38});3940const runTest = async (messages: vscode.LanguageModelChatMessage[], tools?: vscode.LanguageModelChatTool[], errMsg?: string) => {41await assert.rejects(42() => wrapper.provideLanguageModelResponse(endpoint, messages, { tools, requestInitiator: 'unknown', toolMode: vscode.LanguageModelChatToolMode.Auto }, vscode.extensions.all[0].id, { report: () => { } }, CancellationToken.None),43err => {44errMsg ??= 'Invalid request';45assert.ok(err instanceof Error, 'expected an Error');46assert.ok(err.message.includes(errMsg), `expected error to include "${errMsg}", got ${err.message}`);47return true;48}49);50};5152test('empty', async () => {53await runTest([]);54});5556test('bad tool name', async () => {57await runTest([vscode.LanguageModelChatMessage.User('hello')], [{ name: 'hello world', description: 'my tool' }], 'Invalid tool name');58});59});6061suite('validateRequest - valid', () => {62let wrapper: CopilotLanguageModelWrapper;63let endpoint: IChatEndpoint;64setup(async () => {65createAccessor();66endpoint = await accessor.get(IEndpointProvider).getChatEndpoint('copilot-base');67wrapper = instaService.createInstance(CopilotLanguageModelWrapper);68});69const runTest = async (messages: vscode.LanguageModelChatMessage[], tools?: vscode.LanguageModelChatTool[]) => {70await wrapper.provideLanguageModelResponse(endpoint, messages, { tools, requestInitiator: 'unknown', toolMode: vscode.LanguageModelChatToolMode.Auto }, vscode.extensions.all[0].id, { report: () => { } }, CancellationToken.None);71};7273test('simple', async () => {74await runTest([vscode.LanguageModelChatMessage.User('hello')]);75});7677test('tool call and user message', async () => {78const toolCall = vscode.LanguageModelChatMessage.Assistant('');79toolCall.content = [new vscode.LanguageModelToolCallPart('id', 'func', { param: 123 })];80const toolResult = vscode.LanguageModelChatMessage.User('');81toolResult.content = [new vscode.LanguageModelToolResultPart('id', [new vscode.LanguageModelTextPart('result')])];82await runTest([toolCall, toolResult, vscode.LanguageModelChatMessage.User('user message')]);83});8485test('good tool name', async () => {86await runTest([vscode.LanguageModelChatMessage.User('hello2')], [{ name: 'hello_world', description: 'my tool' }]);87});88});89});909192