Path: blob/main/extensions/copilot/src/extension/prompt/vscode-node/settingsEditorSearchServiceImpl.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*--------------------------------------------------------------------------------------------*/4import { CancellationToken, Progress, SettingsSearchProviderOptions, SettingsSearchResult, SettingsSearchResultKind } from 'vscode';5import { IAuthenticationService } from '../../../platform/authentication/common/authentication';6import { Embeddings, EmbeddingType, IEmbeddingsComputer } from '../../../platform/embeddings/common/embeddingsComputer';7import { ICombinedEmbeddingIndex, SettingListItem } from '../../../platform/embeddings/common/vscodeIndex';8import { ChatEndpointFamily, IEndpointProvider } from '../../../platform/endpoint/common/endpointProvider';9import { ISettingsEditorSearchService } from '../../../platform/settingsEditor/common/settingsEditorSearchService';10import { TelemetryCorrelationId } from '../../../util/common/telemetryCorrelationId';11import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';12import { SettingsEditorSearchResultsSelector } from '../node/settingsEditorSearchResultsSelector';1314export class SettingsEditorSearchServiceImpl implements ISettingsEditorSearchService {15declare readonly _serviceBrand: undefined;1617constructor(18@IAuthenticationService private readonly authenticationService: IAuthenticationService,19@IEndpointProvider private readonly endpointProvider: IEndpointProvider,20@ICombinedEmbeddingIndex private readonly embeddingIndex: ICombinedEmbeddingIndex,21@IEmbeddingsComputer private readonly embeddingsComputer: IEmbeddingsComputer,22@IInstantiationService private readonly instantiationService: IInstantiationService23) {24}2526async provideSettingsSearchResults(query: string, options: SettingsSearchProviderOptions, progress: Progress<SettingsSearchResult>, token: CancellationToken): Promise<void> {27if (!query || options.limit <= 0) {28return;29}3031// Start searching for embedding results.32let embeddingResult: Embeddings;33try {34embeddingResult = await this.embeddingsComputer.computeEmbeddings(EmbeddingType.text3small_512, [query], {}, new TelemetryCorrelationId('SettingsEditorSearchServiceImpl::provideSettingsSearchResults'), token);35} catch {36this.reportEmptyEmbeddingsResult(query, progress);37if (!options.embeddingsOnly) {38this.reportEmptyLLMRankedResult(query, progress);39}40return;41}4243if (token.isCancellationRequested || !embeddingResult || embeddingResult.values.length === 0) {44this.reportEmptyEmbeddingsResult(query, progress);45if (!options.embeddingsOnly) {46this.reportEmptyLLMRankedResult(query, progress);47}48return;49}5051await this.embeddingIndex.loadIndexes();52const embeddingSettings: SettingListItem[] = this.embeddingIndex.settingsIndex.nClosestValues(embeddingResult.values[0], 25);53if (token.isCancellationRequested) {54this.reportEmptyEmbeddingsResult(query, progress);55if (!options.embeddingsOnly) {56this.reportEmptyLLMRankedResult(query, progress);57}58return;59}6061// Report final embedding results.62progress.report({63query,64kind: SettingsSearchResultKind.EMBEDDED,65settings: embeddingSettings.map(setting => setting.key)66});6768if (options.embeddingsOnly) {69return;70}7172// Start searching LLM-ranked results.73const copilotToken = await this.authenticationService.getCopilotToken();74if (embeddingSettings.length === 0 || copilotToken.isFreeUser || copilotToken.isNoAuthUser) {75this.reportEmptyLLMRankedResult(query, progress);76return;77}7879const endpointName: ChatEndpointFamily = 'copilot-base';80const endpoint = await this.endpointProvider.getChatEndpoint(endpointName);81const generator = this.instantiationService.createInstance(SettingsEditorSearchResultsSelector);82const llmSearchSuggestions = await generator.selectTopSearchResults(endpoint, query, embeddingSettings, token);83if (token.isCancellationRequested) {84this.reportEmptyLLMRankedResult(query, progress);85return;86}8788// Report final LLM-ranked results.89progress.report({90query,91kind: SettingsSearchResultKind.LLM_RANKED,92settings: llmSearchSuggestions93});94}9596private reportEmptyEmbeddingsResult(query: string, progress: Progress<SettingsSearchResult>): void {97progress.report({98query,99kind: SettingsSearchResultKind.EMBEDDED,100settings: []101});102}103104private reportEmptyLLMRankedResult(query: string, progress: Progress<SettingsSearchResult>): void {105progress.report({106query,107kind: SettingsSearchResultKind.LLM_RANKED,108settings: []109});110}111}112113