Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/conversation/vscode-node/languageModelAccessPrompt.tsx
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
7
import { AssistantMessage, PromptElement, PromptElementProps, SystemMessage, ToolMessage, UserMessage } from '@vscode/prompt-tsx';
8
import * as vscode from 'vscode';
9
import { LanguageModelTextPart } from 'vscode';
10
import { CustomDataPartMimeTypes } from '../../../platform/endpoint/common/endpointTypes';
11
import { decodeStatefulMarker, StatefulMarkerContainer } from '../../../platform/endpoint/common/statefulMarkerContainer';
12
import { ThinkingDataContainer } from '../../../platform/endpoint/common/thinkingDataContainer';
13
import { SafetyRules } from '../../prompts/node/base/safetyRules';
14
import { EditorIntegrationRules } from '../../prompts/node/panel/editorIntegrationRules';
15
import { imageDataPartToTSX, ToolResult } from '../../prompts/node/panel/toolCalling';
16
import { isImageDataPart } from '../common/languageModelChatMessageHelpers';
17
18
export type Props = PromptElementProps<{
19
noSafety: boolean;
20
messages: Array<vscode.LanguageModelChatMessage | vscode.LanguageModelChatMessage2>;
21
}>;
22
23
export class LanguageModelAccessPrompt extends PromptElement<Props> {
24
async render() {
25
26
const systemMessages: string[] = [];
27
const chatMessages: (UserMessage | AssistantMessage)[] = [];
28
29
for (const message of this.props.messages) {
30
if (message.role === vscode.LanguageModelChatMessageRole.System) {
31
// Filter out DataPart since it does not share the same value type and does not have callId, function, etc.
32
const filteredContent = message.content.filter(part => !(part instanceof vscode.LanguageModelDataPart));
33
systemMessages.push(filteredContent
34
.filter(part => part instanceof vscode.LanguageModelTextPart)
35
.map(part => part.value).join(''));
36
37
} else if (message.role === vscode.LanguageModelChatMessageRole.Assistant) {
38
const statefulMarkerPart = message.content.find(part => part instanceof vscode.LanguageModelDataPart && part.mimeType === CustomDataPartMimeTypes.StatefulMarker) as vscode.LanguageModelDataPart | undefined;
39
const statefulMarker = statefulMarkerPart && decodeStatefulMarker(statefulMarkerPart.data);
40
const filteredContent = message.content.filter(part => !(part instanceof vscode.LanguageModelDataPart));
41
// There should only be one string part per message
42
const content = filteredContent.find(part => part instanceof LanguageModelTextPart);
43
const toolCalls = filteredContent.filter(part => part instanceof vscode.LanguageModelToolCallPart);
44
const thinking = filteredContent.find(part => part instanceof vscode.LanguageModelThinkingPart);
45
46
const statefulMarkerElement = statefulMarker && <StatefulMarkerContainer statefulMarker={statefulMarker} />;
47
const thinkingElement = thinking && thinking.id && <ThinkingDataContainer thinking={{ id: thinking.id, text: thinking.value, metadata: thinking.metadata }} />;
48
chatMessages.push(<AssistantMessage name={message.name} toolCalls={toolCalls.map(tc => ({ id: tc.callId, type: 'function', function: { name: tc.name, arguments: JSON.stringify(tc.input) } }))}>{statefulMarkerElement}{content?.value}{thinkingElement}</AssistantMessage>);
49
} else if (message.role === vscode.LanguageModelChatMessageRole.User) {
50
for (const part of message.content) {
51
if (part instanceof vscode.LanguageModelToolResultPart2 || part instanceof vscode.LanguageModelToolResultPart) {
52
chatMessages.push(
53
<ToolMessage toolCallId={part.callId}>
54
<ToolResult content={part.content} toolCallId={part.callId} />
55
</ToolMessage>
56
);
57
} else if (isImageDataPart(part)) {
58
const imageElement = await imageDataPartToTSX(part);
59
chatMessages.push(<UserMessage priority={0}>{imageElement}</UserMessage>);
60
} else if (part instanceof vscode.LanguageModelTextPart) {
61
chatMessages.push(<UserMessage name={message.name}>{part.value}</UserMessage>);
62
}
63
}
64
}
65
}
66
67
return (
68
<>
69
<SystemMessage>
70
{this.props.noSafety
71
// Only custom system message
72
? systemMessages
73
// Our and custom system message
74
: <>
75
<SafetyRules />
76
<EditorIntegrationRules />
77
<br />
78
{systemMessages.join('\n')}
79
</>}
80
</SystemMessage>
81
{chatMessages}
82
</>
83
);
84
}
85
}
86
87