Path: blob/main/extensions/copilot/src/extension/prompt/node/title.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 type * as vscode from 'vscode';6import { sessionResourceToId } from '../../../platform/chat/common/chatDebugFileLoggerService';7import { ChatFetchResponseType, ChatLocation } from '../../../platform/chat/common/commonTypes';8import { IEndpointProvider } from '../../../platform/endpoint/common/endpointProvider';9import { ILogService } from '../../../platform/log/common/logService';10import { CapturingToken } from '../../../platform/requestLogger/common/capturingToken';11import { IRequestLogger } from '../../../platform/requestLogger/common/requestLogger';12import { URI } from '../../../util/vs/base/common/uri';13import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';14import { ChatRequestTurn } from '../../../vscodeTypes';15import { renderPromptElement } from '../../prompts/node/base/promptRenderer';16import { TitlePrompt } from '../../prompts/node/panel/title';1718export class ChatTitleProvider implements vscode.ChatTitleProvider {1920constructor(21@ILogService private readonly logService: ILogService,22@IEndpointProvider private endpointProvider: IEndpointProvider,23@IInstantiationService private readonly instantiationService: IInstantiationService,24@IRequestLogger private readonly requestLogger: IRequestLogger,25) { }2627async provideChatTitle(28context: vscode.ChatContext,29token: vscode.CancellationToken,30): Promise<string | undefined> {3132// Get the first user message directly from the context33// Use instanceof to properly check if the first item is a ChatRequestTurn34const firstRequest = context.history.find(item => item instanceof ChatRequestTurn);35if (!firstRequest) {36return '';37}3839// Extract the parent session ID from the context's sessionResource (provided by VS Code)40const sessionResource = context.sessionResource;41const parentChatSessionId = sessionResource ? sessionResourceToId(URI.from(sessionResource)) : undefined;4243const endpoint = await this.endpointProvider.getChatEndpoint('copilot-fast');44const { messages } = await renderPromptElement(this.instantiationService, endpoint, TitlePrompt, { userRequest: firstRequest.prompt });4546const capturingToken = new CapturingToken(47'title',48undefined,49undefined,50undefined,51undefined,52parentChatSessionId,53'title',54);5556const doRequest = async () => {57const response = await endpoint.makeChatRequest2({58debugName: 'title',59messages,60finishedCb: undefined,61location: ChatLocation.Panel,62userInitiatedRequest: false,63isConversationRequest: false,64}, token);65return response;66};6768const response = await this.requestLogger.captureInvocation(capturingToken, doRequest);69if (token.isCancellationRequested) {70return '';71}7273if (response.type === ChatFetchResponseType.Success) {74let title = response.value.trim();75if (title.match(/^".*"$/)) {76title = title.slice(1, -1);77}7879if (title.includes('can\'t assist with that')) {80return undefined;81}8283return title;84} else {85this.logService.error(`Failed to fetch conversation title because of response type (${response.type}) and reason (${response.reason})`);86return '';87}88}89}909192