Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/prompt/node/codebaseToolCalling.ts
13399 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { randomUUID } from 'crypto';
7
import type { CancellationToken, ChatRequest, LanguageModelToolInformation, Progress } from 'vscode';
8
import { IAuthenticationChatUpgradeService } from '../../../platform/authentication/common/authenticationUpgrade';
9
import { IChatHookService } from '../../../platform/chat/common/chatHookService';
10
import { ChatLocation, ChatResponse } from '../../../platform/chat/common/commonTypes';
11
import { ISessionTranscriptService } from '../../../platform/chat/common/sessionTranscriptService';
12
import { IConfigurationService } from '../../../platform/configuration/common/configurationService';
13
import { IEndpointProvider } from '../../../platform/endpoint/common/endpointProvider';
14
import { IFileSystemService } from '../../../platform/filesystem/common/fileSystemService';
15
import { IGitService } from '../../../platform/git/common/gitService';
16
import { ILogService } from '../../../platform/log/common/logService';
17
import { IOTelService } from '../../../platform/otel/common/otelService';
18
import { IRequestLogger } from '../../../platform/requestLogger/common/requestLogger';
19
import { IExperimentationService } from '../../../platform/telemetry/common/nullExperimentationService';
20
import { ITelemetryService } from '../../../platform/telemetry/common/telemetry';
21
import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';
22
import { ChatResponseProgressPart, ChatResponseReferencePart } from '../../../vscodeTypes';
23
import { IToolCallingLoopOptions, ToolCallingLoop, ToolCallingLoopFetchOptions } from '../../intents/node/toolCallingLoop';
24
import { PromptRenderer } from '../../prompts/node/base/promptRenderer';
25
import { CodebaseAgentPrompt } from '../../prompts/node/panel/codebaseAgentPrompt';
26
import { IToolsService } from '../../tools/common/toolsService';
27
import { IBuildPromptContext } from '../common/intents';
28
import { IBuildPromptResult } from './intents';
29
30
export interface ICodebaseToolCallingLoopOptions extends IToolCallingLoopOptions {
31
request: ChatRequest;
32
location: ChatLocation;
33
}
34
35
export class CodebaseToolCallingLoop extends ToolCallingLoop<ICodebaseToolCallingLoopOptions> {
36
37
public static readonly ID = 'codebaseTool';
38
39
constructor(
40
options: ICodebaseToolCallingLoopOptions,
41
@IInstantiationService private readonly instantiationService: IInstantiationService,
42
@ILogService logService: ILogService,
43
@IRequestLogger requestLogger: IRequestLogger,
44
@IEndpointProvider private readonly endpointProvider: IEndpointProvider,
45
@IToolsService private readonly toolsService: IToolsService,
46
@IAuthenticationChatUpgradeService authenticationChatUpgradeService: IAuthenticationChatUpgradeService,
47
@ITelemetryService telemetryService: ITelemetryService,
48
@IConfigurationService configurationService: IConfigurationService,
49
@IExperimentationService experimentationService: IExperimentationService,
50
@IChatHookService chatHookService: IChatHookService,
51
@ISessionTranscriptService sessionTranscriptService: ISessionTranscriptService,
52
@IFileSystemService fileSystemService: IFileSystemService,
53
@IOTelService otelService: IOTelService,
54
@IGitService gitService: IGitService,
55
) {
56
super(options, instantiationService, endpointProvider, logService, requestLogger, authenticationChatUpgradeService, telemetryService, configurationService, experimentationService, chatHookService, sessionTranscriptService, fileSystemService, otelService, gitService);
57
}
58
59
private async getEndpoint(request: ChatRequest) {
60
let endpoint = await this.endpointProvider.getChatEndpoint(this.options.request);
61
if (!endpoint.supportsToolCalls) {
62
endpoint = await this.endpointProvider.getChatEndpoint('copilot-base');
63
}
64
return endpoint;
65
}
66
67
protected async buildPrompt(buildPromptContext: IBuildPromptContext, progress: Progress<ChatResponseReferencePart | ChatResponseProgressPart>, token: CancellationToken): Promise<IBuildPromptResult> {
68
const endpoint = await this.getEndpoint(this.options.request);
69
const renderer = PromptRenderer.create(
70
this.instantiationService,
71
endpoint,
72
CodebaseAgentPrompt,
73
{
74
promptContext: buildPromptContext
75
}
76
);
77
return await renderer.render(progress, token);
78
}
79
80
protected async getAvailableTools(): Promise<LanguageModelToolInformation[]> {
81
const endpoint = await this.getEndpoint(this.options.request);
82
return this.toolsService.getEnabledTools(this.options.request, endpoint, tool => tool.tags.includes('vscode_codesearch'));
83
}
84
85
protected async fetch({ messages, finishedCb, requestOptions }: ToolCallingLoopFetchOptions, token: CancellationToken): Promise<ChatResponse> {
86
const endpoint = await this.getEndpoint(this.options.request);
87
return endpoint.makeChatRequest(
88
CodebaseToolCallingLoop.ID,
89
messages,
90
finishedCb,
91
token,
92
this.options.location,
93
undefined,
94
{
95
...requestOptions,
96
temperature: 0
97
},
98
// This loop is inside a tool called from another request, so never user initiated
99
false,
100
{
101
messageId: randomUUID(), // @TODO@joyceerhl
102
messageSource: CodebaseToolCallingLoop.ID
103
},
104
);
105
}
106
}
107
108