Path: blob/main/extensions/copilot/src/extension/context/node/resolvers/genericInlineIntentInvocation.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*--------------------------------------------------------------------------------------------*/456import { BasePromptElementProps } from '@vscode/prompt-tsx';7import type { CancellationToken, ChatResponseProgressPart, ChatResponseReferencePart, ChatResponseStream, Progress } from 'vscode';8import { IResponsePart } from '../../../../platform/chat/common/chatMLFetcher';9import { ChatLocation } from '../../../../platform/chat/common/commonTypes';10import { IChatEndpoint } from '../../../../platform/networking/common/networking';11import { Schemas } from '../../../../util/vs/base/common/network';12import { IInstantiationService } from '../../../../util/vs/platform/instantiation/common/instantiation';13import { IBuildPromptContext } from '../../../prompt/common/intents';14import { IDocumentContext } from '../../../prompt/node/documentContext';15import { EditStrategy } from '../../../prompt/node/editGeneration';16import { IBuildPromptResult, IIntent, IIntentInvocation, IResponseProcessorContext, NoopReplyInterpreter, ReplyInterpreter, ReplyInterpreterMetaData } from '../../../prompt/node/intents';17import { PromptElementCtor } from '../../../prompts/node/base/promptElement';18import { PromptRenderer } from '../../../prompts/node/base/promptRenderer';19import { InlineChatEditCodePrompt } from '../../../prompts/node/inline/inlineChatEditCodePrompt';20import { InlineChatEditMarkdownPrompt } from '../../../prompts/node/inline/inlineChatEditMarkdownPrompt';21import { InlineChatGenerateCodePrompt } from '../../../prompts/node/inline/inlineChatGenerateCodePrompt';22import { InlineChatGenerateMarkdownPrompt } from '../../../prompts/node/inline/inlineChatGenerateMarkdownPrompt';23import { InlineChatNotebookEditPrompt } from '../../../prompts/node/inline/inlineChatNotebookEditPrompt';24import { InlineChatNotebookGeneratePrompt } from '../../../prompts/node/inline/inlineChatNotebookGeneratePrompt';2526export interface GenericInlinePromptProps extends BasePromptElementProps {27documentContext: IDocumentContext;28promptContext: IBuildPromptContext;29}3031export class GenericInlineIntentInvocation implements IIntentInvocation {3233private replyInterpreter: ReplyInterpreter | null = null;3435constructor(36readonly intent: IIntent,37readonly location: ChatLocation,38readonly endpoint: IChatEndpoint,39private readonly documentContext: IDocumentContext,40private readonly editStrategy: EditStrategy,41@IInstantiationService private readonly instantiationService: IInstantiationService,42) { }4344async buildPrompt(45promptContext: IBuildPromptContext,46progress: Progress<ChatResponseReferencePart | ChatResponseProgressPart>,47token: CancellationToken48): Promise<IBuildPromptResult> {49let prompt: PromptElementCtor<GenericInlinePromptProps, any>;50if (this.documentContext.document.uri.scheme === Schemas.vscodeNotebookCell) {51prompt = (this.editStrategy === EditStrategy.ForceInsertion ? InlineChatNotebookGeneratePrompt : InlineChatNotebookEditPrompt);52} else if (this.documentContext.document.languageId === 'markdown') {53prompt = (this.editStrategy === EditStrategy.ForceInsertion ? InlineChatGenerateMarkdownPrompt : InlineChatEditMarkdownPrompt);54} else {55prompt = (this.editStrategy === EditStrategy.ForceInsertion ? InlineChatGenerateCodePrompt : InlineChatEditCodePrompt);56}57const renderer = PromptRenderer.create(this.instantiationService, this.endpoint, prompt, {58documentContext: this.documentContext,59promptContext60});61const result = await renderer.render(progress, token);6263this.replyInterpreter = result.metadata.get(ReplyInterpreterMetaData)?.replyInterpreter ?? null;6465if (!this.replyInterpreter && result.hasIgnoredFiles) {66this.replyInterpreter = new NoopReplyInterpreter();67}686970return result;71}7273public processResponse(context: IResponseProcessorContext, inputStream: AsyncIterable<IResponsePart>, outputStream: ChatResponseStream, token: CancellationToken): Promise<void> {74if (!this.replyInterpreter) {75throw new Error(`Could not process response without a reply interpreter!`);76}77return this.replyInterpreter.processResponse(context, inputStream, outputStream, token);78}79}808182