Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/byok/common/test/anthropicMessageConverter.spec.ts
13405 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 { MessageParam, TextBlockParam } from '@anthropic-ai/sdk/resources';
7
import { expect, suite, test } from 'vitest';
8
import { anthropicMessagesToRawMessages } from '../anthropicMessageConverter';
9
10
suite('anthropicMessagesToRawMessages', function () {
11
12
test('converts simple text messages', function () {
13
const messages: MessageParam[] = [
14
{
15
role: 'user',
16
content: 'Hello world'
17
},
18
{
19
role: 'assistant',
20
content: 'Hi there!'
21
}
22
];
23
const system: TextBlockParam = { type: 'text', text: 'You are a helpful assistant' };
24
25
const result = anthropicMessagesToRawMessages(messages, system);
26
27
expect(result).toMatchSnapshot();
28
});
29
30
test('handles empty system message', function () {
31
const messages: MessageParam[] = [
32
{
33
role: 'user',
34
content: 'Hello'
35
}
36
];
37
const system: TextBlockParam = { type: 'text', text: '' };
38
39
const result = anthropicMessagesToRawMessages(messages, system);
40
41
expect(result).toMatchSnapshot();
42
});
43
44
test('converts messages with content blocks', function () {
45
const messages: MessageParam[] = [
46
{
47
role: 'user',
48
content: [
49
{ type: 'text', text: 'Look at this image:' },
50
{
51
type: 'image',
52
source: {
53
type: 'base64',
54
media_type: 'image/jpeg',
55
data: 'fake-base64-data'
56
}
57
}
58
]
59
}
60
];
61
const system: TextBlockParam = { type: 'text', text: 'System prompt' };
62
63
const result = anthropicMessagesToRawMessages(messages, system);
64
65
expect(result).toMatchSnapshot();
66
});
67
68
test('converts tool use messages', function () {
69
const messages: MessageParam[] = [
70
{
71
role: 'assistant',
72
content: [
73
{ type: 'text', text: 'I will use a tool:' },
74
{
75
type: 'tool_use',
76
id: 'call_123',
77
name: 'get_weather',
78
input: { location: 'London' }
79
}
80
]
81
}
82
];
83
const system: TextBlockParam = { type: 'text', text: '' };
84
85
const result = anthropicMessagesToRawMessages(messages, system);
86
87
expect(result).toMatchSnapshot();
88
});
89
90
test('converts tool result messages', function () {
91
const messages: MessageParam[] = [
92
{
93
role: 'user',
94
content: [
95
{
96
type: 'tool_result',
97
tool_use_id: 'call_123',
98
content: 'The weather in London is sunny'
99
}
100
]
101
}
102
];
103
const system: TextBlockParam = { type: 'text', text: '' };
104
105
const result = anthropicMessagesToRawMessages(messages, system);
106
107
expect(result).toMatchSnapshot();
108
});
109
110
test('converts tool result with content blocks', function () {
111
const messages: MessageParam[] = [
112
{
113
role: 'user',
114
content: [
115
{
116
type: 'tool_result',
117
tool_use_id: 'call_456',
118
content: [
119
{ type: 'text', text: 'Here is the chart:' },
120
{
121
type: 'image',
122
source: {
123
type: 'base64',
124
media_type: 'image/png',
125
data: 'chart-data'
126
}
127
}
128
]
129
}
130
]
131
}
132
];
133
const system: TextBlockParam = { type: 'text', text: '' };
134
135
const result = anthropicMessagesToRawMessages(messages, system);
136
137
expect(result).toMatchSnapshot();
138
});
139
140
test('handles cache control blocks', function () {
141
const messages: MessageParam[] = [
142
{
143
role: 'user',
144
content: [
145
{
146
type: 'text',
147
text: 'Cached content',
148
cache_control: { type: 'ephemeral' }
149
}
150
]
151
}
152
];
153
const system: TextBlockParam = {
154
type: 'text',
155
text: 'System with cache',
156
cache_control: { type: 'ephemeral' }
157
};
158
159
const result = anthropicMessagesToRawMessages(messages, system);
160
161
expect(result).toMatchSnapshot();
162
});
163
164
test('includes thinking blocks in conversion to raw messages', function () {
165
const messages: MessageParam[] = [
166
{
167
role: 'assistant',
168
content: [
169
{ type: 'thinking', thinking: 'Let me think...', signature: '' },
170
{ type: 'text', text: 'Here is my response' }
171
]
172
}
173
];
174
const system: TextBlockParam = { type: 'text', text: '' };
175
176
const result = anthropicMessagesToRawMessages(messages, system);
177
178
expect(result).toMatchSnapshot();
179
});
180
181
test('handles url-based images', function () {
182
const messages: MessageParam[] = [
183
{
184
role: 'user',
185
content: [
186
{
187
type: 'image',
188
source: {
189
type: 'url',
190
url: 'https://example.com/image.jpg'
191
}
192
}
193
]
194
}
195
];
196
const system: TextBlockParam = { type: 'text', text: '' };
197
198
const result = anthropicMessagesToRawMessages(messages, system);
199
200
expect(result).toMatchSnapshot();
201
});
202
203
test('handles empty tool result content', function () {
204
const messages: MessageParam[] = [
205
{
206
role: 'user',
207
content: [
208
{
209
type: 'tool_result',
210
tool_use_id: 'call_empty',
211
content: []
212
}
213
]
214
}
215
];
216
const system: TextBlockParam = { type: 'text', text: '' };
217
218
const result = anthropicMessagesToRawMessages(messages, system);
219
220
expect(result).toMatchSnapshot();
221
});
222
});
223