@@ -380,15 +380,46 @@ std::vector<common_chat_msg> common_chat_msgs_parse_oaicompat(const json & messa
380380 return msgs;
381381}
382382
383- json common_chat_msgs_to_json_oaicompat (const std::vector<common_chat_msg> & msgs, bool concat_typed_text) {
383+ static json render_message_to_json (const std::vector<common_chat_msg> & msgs, const jinja::caps & c) {
384+ if (!c.supports_string_content && !c.supports_typed_content ) {
385+ LOG_WRN (" %s: Neither string content nor typed content is supported by the template. This is unexpected and may lead to issues.\n " , __func__);
386+ }
387+
388+ bool only_string_accepted = c.supports_string_content && !c.supports_typed_content ;
389+ bool only_typed_accepted = !c.supports_string_content && c.supports_typed_content ;
390+
384391 json messages = json::array ();
385392 for (const auto & msg : msgs) {
386- json jmsg = msg.to_json_oaicompat (concat_typed_text);
387- messages.push_back (jmsg);
393+ if (only_string_accepted) {
394+ json jmsg = msg.to_json_oaicompat (/* concat_typed_text= */ true );
395+ messages.push_back (jmsg);
396+ } else if (only_typed_accepted) {
397+ json jmsg = msg.to_json_oaicompat (/* concat_typed_text= */ false );
398+ if (jmsg.at (" content" ).is_string ()) {
399+ jmsg[" content" ] = json::array ({
400+ json{
401+ {" type" , " text" },
402+ {" text" , jmsg.at (" content" ).get <std::string>()},
403+ }
404+ });
405+ }
406+ messages.push_back (jmsg);
407+ } else {
408+ json jmsg = msg.to_json_oaicompat (/* concat_typed_text= */ false );
409+ messages.push_back (jmsg);
410+ }
388411 }
389412 return messages;
390413}
391414
415+ // DEPRECATED: only used in tests
416+ json common_chat_msgs_to_json_oaicompat (const std::vector<common_chat_msg> & msgs, bool concat_typed_text) {
417+ jinja::caps c;
418+ c.supports_string_content = true ;
419+ c.supports_typed_content = !concat_typed_text;
420+ return render_message_to_json (msgs, c);
421+ }
422+
392423std::vector<common_chat_tool> common_chat_tools_parse_oaicompat (const json & tools) {
393424 std::vector<common_chat_tool> result;
394425
@@ -3020,7 +3051,7 @@ static common_chat_params common_chat_templates_apply_jinja(
30203051 : *tmpls->template_default ;
30213052 const auto & src = tmpl.source ();
30223053 const auto & caps = tmpl.original_caps ();
3023- params.messages = common_chat_msgs_to_json_oaicompat (inputs.messages , /* concat_text= */ ! tmpl.original_caps (). requires_typed_content );
3054+ params.messages = render_message_to_json (inputs.messages , tmpl.original_caps ());
30243055 params.add_generation_prompt = inputs.add_generation_prompt ;
30253056 params.tool_choice = inputs.tool_choice ;
30263057 params.reasoning_format = inputs.reasoning_format ;
0 commit comments