@@ -244,12 +244,41 @@ Client::get_v1_chat_completions_params(V1ChatCompletionParams* params)
244244            return  send_error (400 , " message must have string role"  );
245245        if  (!is_legal_role (message[" role"  ].getString ()))
246246            return  send_error (400 , " message role not system user assistant"  );
247-         if  (!message[" content"  ].isString ())
248-             return  send_error (400 , " message must have string content"  );
249-         if  (message[" content"  ].getString ().empty ())
250-             return  send_error (400 , " message must not have empty content"  );
251-         params->messages .emplace_back (message[" role"  ].getString (),
252-                                       message[" content"  ].getString ());
247+ 
248+         //  Accept string or array for content
249+         if  (message[" content"  ].isString ()) {
250+             if  (message[" content"  ].getString ().empty ())
251+                 return  send_error (400 , " message must not have empty content"  );
252+             params->messages .emplace_back (message[" role"  ].getString (),
253+                                           message[" content"  ].getString ());
254+         } else  if  (message[" content"  ].isArray ()) {
255+             std::string combined_content;
256+             std::vector<Json>& content_array = message[" content"  ].getArray ();
257+             if  (content_array.empty ())
258+                 return  send_error (400 , " message content array must not be empty"  );
259+             for  (Json& part : content_array) {
260+                 if  (!part.isObject () || !part[" type"  ].isString ())
261+                     return  send_error (400 , " content array items must be objects with type"  );
262+                 std::string type = part[" type"  ].getString ();
263+                 if  (type == " text"  ) {
264+                     if  (!part[" text"  ].isString ())
265+                         return  send_error (400 , " text part must have string text"  );
266+                     combined_content += part[" text"  ].getString ();
267+                 } else  if  (type == " image_url"  ) {
268+                     if  (!part[" image_url"  ].isObject () || !part[" image_url"  ][" url"  ].isString ())
269+                         return  send_error (400 , " image_url part must have url string"  );
270+                     //  TODO collect image data (?)
271+                     //  std::string image_url = part["image_url"]["url"].getString();
272+                 } else  {
273+                     return  send_error (400 , " unsupported content part type"  );
274+                 }
275+             }
276+             if  (combined_content.empty ())
277+                 return  send_error (400 , " message must not have empty content"  );
278+             params->messages .emplace_back (message[" role"  ].getString (), combined_content);
279+         } else  {
280+             return  send_error (400 , " message content must be string or array"  );
281+         }
253282    }
254283
255284    //  n: integer|null
0 commit comments