Path: blob/main/extensions/copilot/src/extension/byok/common/test/anthropicMessageConverter.spec.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*--------------------------------------------------------------------------------------------*/45import { MessageParam, TextBlockParam } from '@anthropic-ai/sdk/resources';6import { expect, suite, test } from 'vitest';7import { anthropicMessagesToRawMessages } from '../anthropicMessageConverter';89suite('anthropicMessagesToRawMessages', function () {1011test('converts simple text messages', function () {12const messages: MessageParam[] = [13{14role: 'user',15content: 'Hello world'16},17{18role: 'assistant',19content: 'Hi there!'20}21];22const system: TextBlockParam = { type: 'text', text: 'You are a helpful assistant' };2324const result = anthropicMessagesToRawMessages(messages, system);2526expect(result).toMatchSnapshot();27});2829test('handles empty system message', function () {30const messages: MessageParam[] = [31{32role: 'user',33content: 'Hello'34}35];36const system: TextBlockParam = { type: 'text', text: '' };3738const result = anthropicMessagesToRawMessages(messages, system);3940expect(result).toMatchSnapshot();41});4243test('converts messages with content blocks', function () {44const messages: MessageParam[] = [45{46role: 'user',47content: [48{ type: 'text', text: 'Look at this image:' },49{50type: 'image',51source: {52type: 'base64',53media_type: 'image/jpeg',54data: 'fake-base64-data'55}56}57]58}59];60const system: TextBlockParam = { type: 'text', text: 'System prompt' };6162const result = anthropicMessagesToRawMessages(messages, system);6364expect(result).toMatchSnapshot();65});6667test('converts tool use messages', function () {68const messages: MessageParam[] = [69{70role: 'assistant',71content: [72{ type: 'text', text: 'I will use a tool:' },73{74type: 'tool_use',75id: 'call_123',76name: 'get_weather',77input: { location: 'London' }78}79]80}81];82const system: TextBlockParam = { type: 'text', text: '' };8384const result = anthropicMessagesToRawMessages(messages, system);8586expect(result).toMatchSnapshot();87});8889test('converts tool result messages', function () {90const messages: MessageParam[] = [91{92role: 'user',93content: [94{95type: 'tool_result',96tool_use_id: 'call_123',97content: 'The weather in London is sunny'98}99]100}101];102const system: TextBlockParam = { type: 'text', text: '' };103104const result = anthropicMessagesToRawMessages(messages, system);105106expect(result).toMatchSnapshot();107});108109test('converts tool result with content blocks', function () {110const messages: MessageParam[] = [111{112role: 'user',113content: [114{115type: 'tool_result',116tool_use_id: 'call_456',117content: [118{ type: 'text', text: 'Here is the chart:' },119{120type: 'image',121source: {122type: 'base64',123media_type: 'image/png',124data: 'chart-data'125}126}127]128}129]130}131];132const system: TextBlockParam = { type: 'text', text: '' };133134const result = anthropicMessagesToRawMessages(messages, system);135136expect(result).toMatchSnapshot();137});138139test('handles cache control blocks', function () {140const messages: MessageParam[] = [141{142role: 'user',143content: [144{145type: 'text',146text: 'Cached content',147cache_control: { type: 'ephemeral' }148}149]150}151];152const system: TextBlockParam = {153type: 'text',154text: 'System with cache',155cache_control: { type: 'ephemeral' }156};157158const result = anthropicMessagesToRawMessages(messages, system);159160expect(result).toMatchSnapshot();161});162163test('includes thinking blocks in conversion to raw messages', function () {164const messages: MessageParam[] = [165{166role: 'assistant',167content: [168{ type: 'thinking', thinking: 'Let me think...', signature: '' },169{ type: 'text', text: 'Here is my response' }170]171}172];173const system: TextBlockParam = { type: 'text', text: '' };174175const result = anthropicMessagesToRawMessages(messages, system);176177expect(result).toMatchSnapshot();178});179180test('handles url-based images', function () {181const messages: MessageParam[] = [182{183role: 'user',184content: [185{186type: 'image',187source: {188type: 'url',189url: 'https://example.com/image.jpg'190}191}192]193}194];195const system: TextBlockParam = { type: 'text', text: '' };196197const result = anthropicMessagesToRawMessages(messages, system);198199expect(result).toMatchSnapshot();200});201202test('handles empty tool result content', function () {203const messages: MessageParam[] = [204{205role: 'user',206content: [207{208type: 'tool_result',209tool_use_id: 'call_empty',210content: []211}212]213}214];215const system: TextBlockParam = { type: 'text', text: '' };216217const result = anthropicMessagesToRawMessages(messages, system);218219expect(result).toMatchSnapshot();220});221});222223