@@ -8,14 +8,14 @@ import { livekitItemToOpenAIItem } from './realtime_model.js';
88
99describe ( 'livekitItemToOpenAIItem' , ( ) => {
1010 describe ( 'message items' , ( ) => {
11- it ( 'should use output_text type for assistant messages' , ( ) => {
11+ it ( 'should use output_text type for assistant messages' , async ( ) => {
1212 const assistantMessage = new llm . ChatMessage ( {
1313 role : 'assistant' ,
1414 content : 'Hello, how can I help you?' ,
1515 id : 'test-assistant-msg' ,
1616 } ) ;
1717
18- const result = livekitItemToOpenAIItem ( assistantMessage ) as api_proto . AssistantItem ;
18+ const result = ( await livekitItemToOpenAIItem ( assistantMessage ) ) as api_proto . AssistantItem ;
1919
2020 expect ( result . type ) . toBe ( 'message' ) ;
2121 expect ( result . role ) . toBe ( 'assistant' ) ;
@@ -25,14 +25,14 @@ describe('livekitItemToOpenAIItem', () => {
2525 expect ( ( content as api_proto . OutputTextContent ) . text ) . toBe ( 'Hello, how can I help you?' ) ;
2626 } ) ;
2727
28- it ( 'should use input_text type for user messages' , ( ) => {
28+ it ( 'should use input_text type for user messages' , async ( ) => {
2929 const userMessage = new llm . ChatMessage ( {
3030 role : 'user' ,
3131 content : 'What is the weather like?' ,
3232 id : 'test-user-msg' ,
3333 } ) ;
3434
35- const result = livekitItemToOpenAIItem ( userMessage ) as api_proto . UserItem ;
35+ const result = ( await livekitItemToOpenAIItem ( userMessage ) ) as api_proto . UserItem ;
3636
3737 expect ( result . type ) . toBe ( 'message' ) ;
3838 expect ( result . role ) . toBe ( 'user' ) ;
@@ -42,14 +42,14 @@ describe('livekitItemToOpenAIItem', () => {
4242 expect ( ( content as api_proto . InputTextContent ) . text ) . toBe ( 'What is the weather like?' ) ;
4343 } ) ;
4444
45- it ( 'should use input_text type for system messages' , ( ) => {
45+ it ( 'should use input_text type for system messages' , async ( ) => {
4646 const systemMessage = new llm . ChatMessage ( {
4747 role : 'system' ,
4848 content : 'You are a helpful assistant.' ,
4949 id : 'test-system-msg' ,
5050 } ) ;
5151
52- const result = livekitItemToOpenAIItem ( systemMessage ) as api_proto . UserItem ;
52+ const result = ( await livekitItemToOpenAIItem ( systemMessage ) ) as api_proto . UserItem ;
5353
5454 expect ( result . type ) . toBe ( 'message' ) ;
5555 expect ( result . role ) . toBe ( 'system' ) ;
@@ -58,48 +58,98 @@ describe('livekitItemToOpenAIItem', () => {
5858 expect ( content . type ) . toBe ( 'input_text' ) ;
5959 } ) ;
6060
61- it ( 'should convert developer role to system role' , ( ) => {
61+ it ( 'should convert developer role to system role' , async ( ) => {
6262 const developerMessage = new llm . ChatMessage ( {
6363 role : 'developer' ,
6464 content : 'System instructions.' ,
6565 id : 'test-developer-msg' ,
6666 } ) ;
6767
68- const result = livekitItemToOpenAIItem ( developerMessage ) as api_proto . UserItem ;
68+ const result = ( await livekitItemToOpenAIItem ( developerMessage ) ) as api_proto . UserItem ;
6969
7070 expect ( result . type ) . toBe ( 'message' ) ;
7171 expect ( result . role ) . toBe ( 'system' ) ;
7272 const content = result . content [ 0 ] ! ;
7373 expect ( content . type ) . toBe ( 'input_text' ) ;
7474 } ) ;
7575
76- it ( 'should handle multiple content items for assistant' , ( ) => {
76+ it ( 'should handle multiple content items for assistant' , async ( ) => {
7777 const multiContentMessage = new llm . ChatMessage ( {
7878 role : 'assistant' ,
7979 content : [ 'First part.' , 'Second part.' ] ,
8080 id : 'test-multi-msg' ,
8181 } ) ;
8282
83- const result = livekitItemToOpenAIItem ( multiContentMessage ) as api_proto . AssistantItem ;
83+ const result = ( await livekitItemToOpenAIItem (
84+ multiContentMessage ,
85+ ) ) as api_proto . AssistantItem ;
8486
8587 expect ( result . content ) . toHaveLength ( 2 ) ;
8688 const content0 = result . content [ 0 ] ! ;
8789 const content1 = result . content [ 1 ] ! ;
8890 expect ( content0 . type ) . toBe ( 'output_text' ) ;
8991 expect ( content1 . type ) . toBe ( 'output_text' ) ;
9092 } ) ;
93+
94+ it ( 'should convert image content to input_image for user messages' , async ( ) => {
95+ const base64Data =
96+ 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==' ;
97+ const imageContent = llm . createImageContent ( {
98+ image : `data:image/png;base64,${ base64Data } ` ,
99+ mimeType : 'image/png' ,
100+ } ) ;
101+
102+ const userMessage = new llm . ChatMessage ( {
103+ role : 'user' ,
104+ content : [ imageContent ] ,
105+ id : 'test-image-msg' ,
106+ } ) ;
107+
108+ const result = ( await livekitItemToOpenAIItem ( userMessage ) ) as api_proto . UserItem ;
109+
110+ expect ( result . type ) . toBe ( 'message' ) ;
111+ expect ( result . role ) . toBe ( 'user' ) ;
112+ expect ( result . content ) . toHaveLength ( 1 ) ;
113+ const content = result . content [ 0 ] ! ;
114+ expect ( content . type ) . toBe ( 'input_image' ) ;
115+ expect ( ( content as api_proto . InputImageContent ) . image_url ) . toBe (
116+ `data:image/png;base64,${ base64Data } ` ,
117+ ) ;
118+ } ) ;
119+
120+ it ( 'should handle mixed text and image content' , async ( ) => {
121+ const base64Data =
122+ 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==' ;
123+ const imageContent = llm . createImageContent ( {
124+ image : `data:image/png;base64,${ base64Data } ` ,
125+ mimeType : 'image/png' ,
126+ } ) ;
127+
128+ const userMessage = new llm . ChatMessage ( {
129+ role : 'user' ,
130+ content : [ 'Describe this image:' , imageContent ] ,
131+ id : 'test-mixed-msg' ,
132+ } ) ;
133+
134+ const result = ( await livekitItemToOpenAIItem ( userMessage ) ) as api_proto . UserItem ;
135+
136+ expect ( result . type ) . toBe ( 'message' ) ;
137+ expect ( result . content ) . toHaveLength ( 2 ) ;
138+ expect ( result . content [ 0 ] ! . type ) . toBe ( 'input_text' ) ;
139+ expect ( result . content [ 1 ] ! . type ) . toBe ( 'input_image' ) ;
140+ } ) ;
91141 } ) ;
92142
93143 describe ( 'function_call items' , ( ) => {
94- it ( 'should convert function call items correctly' , ( ) => {
144+ it ( 'should convert function call items correctly' , async ( ) => {
95145 const functionCall = new llm . FunctionCall ( {
96146 callId : 'call-123' ,
97147 name : 'get_weather' ,
98148 args : '{"location": "San Francisco"}' ,
99149 id : 'test-func-call' ,
100150 } ) ;
101151
102- const result = livekitItemToOpenAIItem ( functionCall ) as api_proto . FunctionCallItem ;
152+ const result = ( await livekitItemToOpenAIItem ( functionCall ) ) as api_proto . FunctionCallItem ;
103153
104154 expect ( result . type ) . toBe ( 'function_call' ) ;
105155 expect ( result . id ) . toBe ( 'test-func-call' ) ;
@@ -110,15 +160,17 @@ describe('livekitItemToOpenAIItem', () => {
110160 } ) ;
111161
112162 describe ( 'function_call_output items' , ( ) => {
113- it ( 'should convert function call output items correctly' , ( ) => {
163+ it ( 'should convert function call output items correctly' , async ( ) => {
114164 const functionOutput = new llm . FunctionCallOutput ( {
115165 callId : 'call-123' ,
116166 output : 'The weather in San Francisco is sunny.' ,
117167 isError : false ,
118168 id : 'test-func-output' ,
119169 } ) ;
120170
121- const result = livekitItemToOpenAIItem ( functionOutput ) as api_proto . FunctionCallOutputItem ;
171+ const result = ( await livekitItemToOpenAIItem (
172+ functionOutput ,
173+ ) ) as api_proto . FunctionCallOutputItem ;
122174
123175 expect ( result . type ) . toBe ( 'function_call_output' ) ;
124176 expect ( result . id ) . toBe ( 'test-func-output' ) ;
0 commit comments