LLVMFuzzerTestOneInput:
   18|  1.65k|extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
   19|  1.65k|  FuzzedDataProvider fuzzed_data(data, size);
   20|       |
   21|  1.65k|  std::string p1 = fuzzed_data.ConsumeRandomLengthString();
   22|  1.65k|  std::string p2 = fuzzed_data.ConsumeRandomLengthString();
   23|  1.65k|  std::string p3 = fuzzed_data.ConsumeRandomLengthString();
   24|  1.65k|  std::string p4 = fuzzed_data.ConsumeRandomLengthString();
   25|  1.65k|  std::string p5 = fuzzed_data.ConsumeRandomLengthString();
   26|  1.65k|  std::string p6 = fuzzed_data.ConsumeRandomLengthString();
   27|  1.65k|  std::string p7 = fuzzed_data.ConsumeRandomLengthString();
   28|       |
   29|  1.65k|  llama_chat_message conversation[] = {
   30|  1.65k|      {"system", p2.c_str()},    {"user", p3.c_str()},
   31|  1.65k|      {"assistant", p4.c_str()}, {"user", p5.c_str()},
   32|  1.65k|      {"assistant", p6.c_str()}, {"user", p7.c_str()},
   33|  1.65k|  };
   34|  1.65k|  size_t message_count = 6;
   35|       |
   36|  1.65k|  llama_chat_apply_template(p1.c_str(), conversation, message_count,
   37|  1.65k|                            true, buf, 4096);
   38|  1.65k|  return 0;
   39|  1.65k|}

_Z26llm_chat_template_from_strRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE:
   85|  1.65k|llm_chat_template llm_chat_template_from_str(const std::string & name) {
   86|  1.65k|    return LLM_CHAT_TEMPLATES.at(name);
   87|  1.65k|}
_Z24llm_chat_detect_templateRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE:
   89|  1.65k|llm_chat_template llm_chat_detect_template(const std::string & tmpl) {
   90|  1.65k|    try {
   91|  1.65k|        return llm_chat_template_from_str(tmpl);
   92|  1.65k|    } catch (const std::out_of_range &) {
   93|       |        // ignore
   94|  1.06k|    }
   95|       |
   96|  1.06k|    auto tmpl_contains = [&tmpl](const char * haystack) -> bool {
   97|  1.06k|        return tmpl.find(haystack) != std::string::npos;
   98|  1.06k|    };
   99|  1.06k|    if (tmpl_contains("<|im_start|>")) {
  ------------------
  |  Branch (99:9): [True: 7, False: 1.05k]
  ------------------
  100|      7|        return tmpl_contains("<|im_sep|>")
  ------------------
  |  Branch (100:16): [True: 2, False: 5]
  ------------------
  101|      7|            ? LLM_CHAT_TEMPLATE_PHI_4
  102|      7|            : tmpl_contains("<end_of_utterance>")
  ------------------
  |  Branch (102:15): [True: 0, False: 5]
  ------------------
  103|      5|                ? LLM_CHAT_TEMPLATE_SMOLVLM // SmolVLM uses <|im_start|> as BOS, but it is NOT chatml
  104|      5|                : LLM_CHAT_TEMPLATE_CHATML;
  105|  1.05k|    } else if (tmpl.find("mistral") == 0 || tmpl_contains("[INST]")) {
  ------------------
  |  Branch (105:16): [True: 46, False: 1.01k]
  |  Branch (105:45): [True: 77, False: 933]
  ------------------
  106|    123|        if (tmpl_contains("[SYSTEM_PROMPT]")) {
  ------------------
  |  Branch (106:13): [True: 12, False: 111]
  ------------------
  107|     12|            return LLM_CHAT_TEMPLATE_MISTRAL_V7;
  108|    111|        } else if (
  109|       |            // catches official 'v1' template
  110|    111|            tmpl_contains("' [INST] ' + system_message")
  ------------------
  |  Branch (110:13): [True: 10, False: 101]
  ------------------
  111|       |            // catches official 'v3' and 'v3-tekken' templates
  112|    101|            || tmpl_contains("[AVAILABLE_TOOLS]")
  ------------------
  |  Branch (112:16): [True: 11, False: 90]
  ------------------
  113|    111|        ) {
  114|       |            // Official mistral 'v1', 'v3' and 'v3-tekken' templates
  115|       |            // See: https://github.com/mistralai/cookbook/blob/main/concept-deep-dive/tokenization/chat_templates.md
  116|       |            // See: https://github.com/mistralai/cookbook/blob/main/concept-deep-dive/tokenization/templates.md
  117|     21|            if (tmpl_contains(" [INST]")) {
  ------------------
  |  Branch (117:17): [True: 12, False: 9]
  ------------------
  118|     12|                return LLM_CHAT_TEMPLATE_MISTRAL_V1;
  119|     12|            } else if (tmpl_contains("\"[INST]\"")) {
  ------------------
  |  Branch (119:24): [True: 2, False: 7]
  ------------------
  120|      2|                return LLM_CHAT_TEMPLATE_MISTRAL_V3_TEKKEN;
  121|      2|            }
  122|      7|            return LLM_CHAT_TEMPLATE_MISTRAL_V3;
  123|     90|        } else {
  124|       |            // llama2 template and its variants
  125|       |            // [variant] support system message
  126|       |            // See: https://huggingface.co/blog/llama2#how-to-prompt-llama-2
  127|     90|            bool support_system_message = tmpl_contains("<<SYS>>");
  128|     90|            bool add_bos_inside_history = tmpl_contains("bos_token + '[INST]");
  129|     90|            bool strip_message = tmpl_contains("content.strip()");
  130|     90|            if (strip_message) {
  ------------------
  |  Branch (130:17): [True: 6, False: 84]
  ------------------
  131|      6|                return LLM_CHAT_TEMPLATE_LLAMA_2_SYS_STRIP;
  132|     84|            } else if (add_bos_inside_history) {
  ------------------
  |  Branch (132:24): [True: 4, False: 80]
  ------------------
  133|      4|                return LLM_CHAT_TEMPLATE_LLAMA_2_SYS_BOS;
  134|     80|            } else if (support_system_message) {
  ------------------
  |  Branch (134:24): [True: 2, False: 78]
  ------------------
  135|      2|                return LLM_CHAT_TEMPLATE_LLAMA_2_SYS;
  136|     78|            } else {
  137|     78|                return LLM_CHAT_TEMPLATE_LLAMA_2;
  138|     78|            }
  139|     90|        }
  140|    933|    } else if (tmpl_contains("<|assistant|>") && tmpl_contains("<|end|>")) {
  ------------------
  |  Branch (140:16): [True: 130, False: 803]
  |  Branch (140:50): [True: 3, False: 127]
  ------------------
  141|      3|        return LLM_CHAT_TEMPLATE_PHI_3;
  142|    930|    } else if (tmpl_contains("[gMASK]<sop>")) {
  ------------------
  |  Branch (142:16): [True: 2, False: 928]
  ------------------
  143|      2|        return LLM_CHAT_TEMPLATE_CHATGLM_4;
  144|    928|    } else if (tmpl_contains("<|assistant|>") && tmpl_contains("<|user|>")) {
  ------------------
  |  Branch (144:16): [True: 126, False: 802]
  |  Branch (144:50): [True: 29, False: 97]
  ------------------
  145|     29|        if (tmpl_contains("<|tool_declare|>")) {
  ------------------
  |  Branch (145:13): [True: 1, False: 28]
  ------------------
  146|      1|            return LLM_CHAT_TEMPLATE_EXAONE_MOE;
  147|      1|        }
  148|     28|        return tmpl_contains("</s>") ? LLM_CHAT_TEMPLATE_FALCON_3 : LLM_CHAT_TEMPLATE_GLMEDGE;
  ------------------
  |  Branch (148:16): [True: 14, False: 14]
  ------------------
  149|    899|    } else if (tmpl_contains("<|{{ item['role'] }}|>") && tmpl_contains("<|begin_of_image|>")) {
  ------------------
  |  Branch (149:16): [True: 15, False: 884]
  |  Branch (149:59): [True: 5, False: 10]
  ------------------
  150|      5|        return LLM_CHAT_TEMPLATE_GLMEDGE;
  151|    894|    } else if (tmpl_contains("<|user|>") && tmpl_contains("<|endoftext|>")) {
  ------------------
  |  Branch (151:16): [True: 4, False: 890]
  |  Branch (151:45): [True: 2, False: 2]
  ------------------
  152|      2|        return LLM_CHAT_TEMPLATE_ZEPHYR;
  153|    892|    } else if (tmpl_contains("bos_token + message['role']")) {
  ------------------
  |  Branch (153:16): [True: 5, False: 887]
  ------------------
  154|      5|        return LLM_CHAT_TEMPLATE_MONARCH;
  155|    887|    } else if (tmpl_contains("<start_of_turn>")) {
  ------------------
  |  Branch (155:16): [True: 10, False: 877]
  ------------------
  156|     10|        return LLM_CHAT_TEMPLATE_GEMMA;
  157|    877|    } else if (tmpl_contains("'\\n\\nAssistant: ' + eos_token")) {
  ------------------
  |  Branch (157:16): [True: 5, False: 872]
  ------------------
  158|       |        // OrionStarAI/Orion-14B-Chat
  159|      5|        return LLM_CHAT_TEMPLATE_ORION;
  160|    872|    } else if (tmpl_contains("GPT4 Correct ")) {
  ------------------
  |  Branch (160:16): [True: 4, False: 868]
  ------------------
  161|       |        // openchat/openchat-3.5-0106
  162|      4|        return LLM_CHAT_TEMPLATE_OPENCHAT;
  163|    868|    } else if (tmpl_contains("USER: ") && tmpl_contains("ASSISTANT: ")) {
  ------------------
  |  Branch (163:16): [True: 25, False: 843]
  |  Branch (163:43): [True: 4, False: 21]
  ------------------
  164|       |        // eachadea/vicuna-13b-1.1 (and Orca variant)
  165|      4|        if (tmpl_contains("SYSTEM: ")) {
  ------------------
  |  Branch (165:13): [True: 2, False: 2]
  ------------------
  166|      2|            return LLM_CHAT_TEMPLATE_VICUNA_ORCA;
  167|      2|        }
  168|      2|        return LLM_CHAT_TEMPLATE_VICUNA;
  169|    864|    } else if (tmpl_contains("### Instruction:") && tmpl_contains("<|EOT|>")) {
  ------------------
  |  Branch (169:16): [True: 12, False: 852]
  |  Branch (169:53): [True: 2, False: 10]
  ------------------
  170|       |        // deepseek-ai/deepseek-coder-33b-instruct
  171|      2|        return LLM_CHAT_TEMPLATE_DEEPSEEK;
  172|    862|    } else if (tmpl_contains("<|START_OF_TURN_TOKEN|>") && tmpl_contains("<|USER_TOKEN|>")) {
  ------------------
  |  Branch (172:16): [True: 13, False: 849]
  |  Branch (172:60): [True: 3, False: 10]
  ------------------
  173|       |        // CohereForAI/c4ai-command-r-plus
  174|      3|        return LLM_CHAT_TEMPLATE_COMMAND_R;
  175|    859|    } else if (tmpl_contains("<|start_header_id|>") && tmpl_contains("<|end_header_id|>")) {
  ------------------
  |  Branch (175:16): [True: 26, False: 833]
  |  Branch (175:56): [True: 5, False: 21]
  ------------------
  176|      5|        return LLM_CHAT_TEMPLATE_LLAMA_3;
  177|    854|    } else if (tmpl_contains("[gMASK]sop")) {
  ------------------
  |  Branch (177:16): [True: 12, False: 842]
  ------------------
  178|       |        // chatglm3-6b
  179|     12|        return LLM_CHAT_TEMPLATE_CHATGLM_3;
  180|    842|    } else if (tmpl_contains(LU8("<用户>"))) {
  ------------------
  |  |   12|    842|    #define LU8(x) u8##x
  ------------------
  |  Branch (180:16): [True: 9, False: 833]
  ------------------
  181|       |        // MiniCPM-3B-OpenHermes-2.5-v2-GGUF
  182|      9|        return LLM_CHAT_TEMPLATE_MINICPM;
  183|    833|    } else if (tmpl_contains("'Assistant: ' + message['content'] + eos_token")) {
  ------------------
  |  Branch (183:16): [True: 3, False: 830]
  ------------------
  184|      3|        return LLM_CHAT_TEMPLATE_DEEPSEEK_2;
  185|    830|    } else if (tmpl_contains(LU8("<｜Assistant｜>")) && tmpl_contains(LU8("<｜User｜>")) && tmpl_contains(LU8("<｜end▁of▁sentence｜>"))) {
  ------------------
  |  |   12|    830|    #define LU8(x) u8##x
  ------------------
                  } else if (tmpl_contains(LU8("<｜Assistant｜>")) && tmpl_contains(LU8("<｜User｜>")) && tmpl_contains(LU8("<｜end▁of▁sentence｜>"))) {
  ------------------
  |  |   12|     14|    #define LU8(x) u8##x
  ------------------
                  } else if (tmpl_contains(LU8("<｜Assistant｜>")) && tmpl_contains(LU8("<｜User｜>")) && tmpl_contains(LU8("<｜end▁of▁sentence｜>"))) {
  ------------------
  |  |   12|      4|    #define LU8(x) u8##x
  ------------------
  |  Branch (185:16): [True: 14, False: 816]
  |  Branch (185:59): [True: 4, False: 10]
  |  Branch (185:97): [True: 1, False: 3]
  ------------------
  186|      1|        return LLM_CHAT_TEMPLATE_DEEPSEEK_3;
  187|    829|    } else if (tmpl_contains("[|system|]") && tmpl_contains("[|assistant|]") && tmpl_contains("[|endofturn|]")) {
  ------------------
  |  Branch (187:16): [True: 19, False: 810]
  |  Branch (187:47): [True: 7, False: 12]
  |  Branch (187:81): [True: 5, False: 2]
  ------------------
  188|      5|        if (tmpl_contains("[|tool|]")) {
  ------------------
  |  Branch (188:13): [True: 1, False: 4]
  ------------------
  189|      1|            return LLM_CHAT_TEMPLATE_EXAONE_4;
  190|      1|        }
  191|       |        // ref: https://huggingface.co/LGAI-EXAONE/EXAONE-3.0-7.8B-Instruct/discussions/8#66bae61b1893d14ee8ed85bb
  192|       |        // EXAONE-3.0-7.8B-Instruct
  193|      4|        return LLM_CHAT_TEMPLATE_EXAONE_3;
  194|    824|    } else if (tmpl_contains("rwkv-world") || tmpl_contains("{{- 'User: ' + message['content']|trim + '\\n\\n' -}}")) {
  ------------------
  |  Branch (194:16): [True: 10, False: 814]
  |  Branch (194:47): [True: 0, False: 814]
  ------------------
  195|     10|        return LLM_CHAT_TEMPLATE_RWKV_WORLD;
  196|    814|    } else if (tmpl_contains("<|start_of_role|>")) {
  ------------------
  |  Branch (196:16): [True: 5, False: 809]
  ------------------
  197|      5|        if (tmpl_contains("<tool_call>") || tmpl_contains("<tools>")) {
  ------------------
  |  Branch (197:13): [True: 1, False: 4]
  |  Branch (197:45): [True: 1, False: 3]
  ------------------
  198|      2|            if (tmpl_contains("g4_default_system_message")) {
  ------------------
  |  Branch (198:17): [True: 0, False: 2]
  ------------------
  199|      0|                return LLM_CHAT_TEMPLATE_GRANITE_4_0;
  200|      0|            }
  201|      2|            return LLM_CHAT_TEMPLATE_GRANITE_4_1;
  202|      2|        }
  203|      3|        return LLM_CHAT_TEMPLATE_GRANITE_3_X;
  204|    809|    } else if (tmpl_contains("message['role'] + additional_special_tokens[0] + message['content'] + additional_special_tokens[1]")) {
  ------------------
  |  Branch (204:16): [True: 1, False: 808]
  ------------------
  205|      1|        return LLM_CHAT_TEMPLATE_GIGACHAT;
  206|    808|    } else if (tmpl_contains("<|role_start|>")) {
  ------------------
  |  Branch (206:16): [True: 3, False: 805]
  ------------------
  207|      3|        return LLM_CHAT_TEMPLATE_MEGREZ;
  208|    805|    } else if (tmpl_contains(" Ассистент:")) {
  ------------------
  |  Branch (208:16): [True: 3, False: 802]
  ------------------
  209|      3|        return LLM_CHAT_TEMPLATE_YANDEX;
  210|    802|    } else if (tmpl_contains("<role>ASSISTANT</role>") && tmpl_contains("'HUMAN'")) {
  ------------------
  |  Branch (210:16): [True: 23, False: 779]
  |  Branch (210:59): [True: 1, False: 22]
  ------------------
  211|      1|        return LLM_CHAT_TEMPLATE_BAILING;
  212|    801|    } else if (tmpl_contains("<role>ASSISTANT</role>") && tmpl_contains("\"HUMAN\"") && tmpl_contains("<think>")) {
  ------------------
  |  Branch (212:16): [True: 22, False: 779]
  |  Branch (212:59): [True: 9, False: 13]
  |  Branch (212:89): [True: 4, False: 5]
  ------------------
  213|      4|        return LLM_CHAT_TEMPLATE_BAILING_THINK;
  214|    797|    } else if (tmpl_contains("<role>ASSISTANT</role>") && tmpl_contains("<role>HUMAN</role>") && tmpl_contains("<|role_end|>")) {
  ------------------
  |  Branch (214:16): [True: 18, False: 779]
  |  Branch (214:59): [True: 9, False: 9]
  |  Branch (214:98): [True: 7, False: 2]
  ------------------
  215|      7|        return LLM_CHAT_TEMPLATE_BAILING2;
  216|    790|    } else if (tmpl_contains("<|header_start|>") && tmpl_contains("<|header_end|>")) {
  ------------------
  |  Branch (216:16): [True: 7, False: 783]
  |  Branch (216:53): [True: 2, False: 5]
  ------------------
  217|      2|        return LLM_CHAT_TEMPLATE_LLAMA4;
  218|    788|    } else if (tmpl_contains("<|endofuserprompt|>")) {
  ------------------
  |  Branch (218:16): [True: 5, False: 783]
  ------------------
  219|      5|        return LLM_CHAT_TEMPLATE_DOTS1;
  220|    783|    } else if (tmpl_contains("<|extra_0|>") && tmpl_contains("<|extra_4|>")) {
  ------------------
  |  Branch (220:16): [True: 9, False: 774]
  |  Branch (220:48): [True: 2, False: 7]
  ------------------
  221|      2|        return LLM_CHAT_TEMPLATE_HUNYUAN_MOE;
  222|    781|    } else if (tmpl_contains("<|start|>") && tmpl_contains("<|channel|>")) {
  ------------------
  |  Branch (222:16): [True: 11, False: 770]
  |  Branch (222:46): [True: 1, False: 10]
  ------------------
  223|      1|        return LLM_CHAT_TEMPLATE_OPENAI_MOE;
  224|    780|    } else if (tmpl_contains("<｜hy_Assistant｜>") && tmpl_contains("<｜hy_begin▁of▁sentence｜>")) {
  ------------------
  |  Branch (224:16): [True: 16, False: 764]
  |  Branch (224:57): [True: 4, False: 12]
  ------------------
  225|      4|        return LLM_CHAT_TEMPLATE_HUNYUAN_VL;
  226|    776|    } else if (tmpl_contains("<｜hy_Assistant｜>") && tmpl_contains("<｜hy_place▁holder▁no▁3｜>")) {
  ------------------
  |  Branch (226:16): [True: 12, False: 764]
  |  Branch (226:57): [True: 2, False: 10]
  ------------------
  227|      2|        return LLM_CHAT_TEMPLATE_HUNYUAN_DENSE;
  228|    774|    } else if (tmpl_contains("<|im_assistant|>assistant<|im_middle|>")) {
  ------------------
  |  Branch (228:16): [True: 4, False: 770]
  ------------------
  229|      4|        return LLM_CHAT_TEMPLATE_KIMI_K2;
  230|    770|    } else if (tmpl_contains("<seed:bos>")) {
  ------------------
  |  Branch (230:16): [True: 7, False: 763]
  ------------------
  231|      7|        return LLM_CHAT_TEMPLATE_SEED_OSS;
  232|    763|    } else if (tmpl_contains("'Assistant: '  + message['content'] + '<|separator|>")) {
  ------------------
  |  Branch (232:16): [True: 3, False: 760]
  ------------------
  233|      3|        return LLM_CHAT_TEMPLATE_GROK_2;
  234|    760|    } else if (tmpl_contains(LU8("[unused9]系统：[unused10]"))) {
  ------------------
  |  |   12|    760|    #define LU8(x) u8##x
  ------------------
  |  Branch (234:16): [True: 5, False: 755]
  ------------------
  235|      5|        return LLM_CHAT_TEMPLATE_PANGU_EMBED;
  236|    755|    } else if (tmpl_contains("<|begin|>") && tmpl_contains("<|end|>") && tmpl_contains("<|content|>")) {
  ------------------
  |  Branch (236:16): [True: 11, False: 744]
  |  Branch (236:46): [True: 3, False: 8]
  |  Branch (236:74): [True: 2, False: 1]
  ------------------
  237|      2|        return LLM_CHAT_TEMPLATE_SOLAR_OPEN;
  238|      2|    }
  239|    753|    return LLM_CHAT_TEMPLATE_UNKNOWN;
  240|  1.06k|}
_Z23llm_chat_apply_template17llm_chat_templateRKNSt3__16vectorIPK18llama_chat_messageNS0_9allocatorIS4_EEEERNS0_12basic_stringIcNS0_11char_traitsIcEENS5_IcEEEEb:
  247|    902|    std::string & dest, bool add_ass) {
  248|       |    // Taken from the research: https://github.com/ggml-org/llama.cpp/issues/5527
  249|    902|    std::stringstream ss;
  250|    902|    if (tmpl == LLM_CHAT_TEMPLATE_CHATML) {
  ------------------
  |  Branch (250:9): [True: 6, False: 896]
  ------------------
  251|       |        // chatml template
  252|     36|        for (auto message : chat) {
  ------------------
  |  Branch (252:27): [True: 36, False: 6]
  ------------------
  253|     36|            ss << "<|im_start|>" << message->role << "\n" << message->content << "<|im_end|>\n";
  254|     36|        }
  255|      6|        if (add_ass) {
  ------------------
  |  Branch (255:13): [True: 6, False: 0]
  ------------------
  256|      6|            ss << "<|im_start|>assistant\n";
  257|      6|        }
  258|    896|    } else if (tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V7 || tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V7_TEKKEN) {
  ------------------
  |  Branch (258:16): [True: 75, False: 821]
  |  Branch (258:56): [True: 1, False: 820]
  ------------------
  259|       |        // Official mistral 'v7' template
  260|       |        // See: https://huggingface.co/mistralai/Mistral-Large-Instruct-2411#basic-instruct-template-v7
  261|       |        //      https://huggingface.co/mistralai/Mistral-Small-3.1-24B-Instruct-2503#basic-instruct-template-v7-tekken
  262|     76|        const char * trailing_space = tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V7 ? " " : "";
  ------------------
  |  Branch (262:39): [True: 75, False: 1]
  ------------------
  263|    456|        for (auto message : chat) {
  ------------------
  |  Branch (263:27): [True: 456, False: 76]
  ------------------
  264|    456|            std::string role(message->role);
  265|    456|            std::string content(message->content);
  266|    456|            if (role == "system") {
  ------------------
  |  Branch (266:17): [True: 76, False: 380]
  ------------------
  267|     76|                ss << "[SYSTEM_PROMPT]" << trailing_space << content << "[/SYSTEM_PROMPT]";
  268|    380|            } else if (role == "user") {
  ------------------
  |  Branch (268:24): [True: 228, False: 152]
  ------------------
  269|    228|                ss << "[INST]" << trailing_space << content << "[/INST]";
  270|    228|            } else {
  271|    152|                ss << trailing_space << content << "</s>";
  272|    152|            }
  273|    456|        }
  274|    820|    } else if (tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V1
  ------------------
  |  Branch (274:16): [True: 79, False: 741]
  ------------------
  275|    741|            || tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V3
  ------------------
  |  Branch (275:16): [True: 37, False: 704]
  ------------------
  276|    704|            || tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V3_TEKKEN) {
  ------------------
  |  Branch (276:16): [True: 4, False: 700]
  ------------------
  277|       |        // See: https://github.com/mistralai/cookbook/blob/main/concept-deep-dive/tokenization/chat_templates.md
  278|       |        // See: https://github.com/mistralai/cookbook/blob/main/concept-deep-dive/tokenization/templates.md
  279|    120|        std::string leading_space = tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V1 ? " " : "";
  ------------------
  |  Branch (279:37): [True: 79, False: 41]
  ------------------
  280|    120|        std::string trailing_space = tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V3_TEKKEN ? "" : " ";
  ------------------
  |  Branch (280:38): [True: 4, False: 116]
  ------------------
  281|    120|        bool trim_assistant_message = tmpl == LLM_CHAT_TEMPLATE_MISTRAL_V3;
  282|    120|        bool is_inside_turn = false;
  283|    720|        for (auto message : chat) {
  ------------------
  |  Branch (283:27): [True: 720, False: 120]
  ------------------
  284|    720|            if (!is_inside_turn) {
  ------------------
  |  Branch (284:17): [True: 360, False: 360]
  ------------------
  285|    360|                ss << leading_space << "[INST]" << trailing_space;
  286|    360|                is_inside_turn = true;
  287|    360|            }
  288|    720|            std::string role(message->role);
  289|    720|            std::string content(message->content);
  290|    720|            if (role == "system") {
  ------------------
  |  Branch (290:17): [True: 120, False: 600]
  ------------------
  291|    120|                ss << content << "\n\n";
  292|    600|            } else if (role == "user") {
  ------------------
  |  Branch (292:24): [True: 360, False: 240]
  ------------------
  293|    360|                ss << content << leading_space << "[/INST]";
  294|    360|            } else {
  295|    240|                ss << trailing_space << (trim_assistant_message ? trim(content) : content) << "</s>";
  ------------------
  |  Branch (295:42): [True: 74, False: 166]
  ------------------
  296|    240|                is_inside_turn = false;
  297|    240|            }
  298|    720|        }
  299|    700|    } else if (
  300|    700|            tmpl == LLM_CHAT_TEMPLATE_LLAMA_2
  ------------------
  |  Branch (300:13): [True: 106, False: 594]
  ------------------
  301|    594|            || tmpl == LLM_CHAT_TEMPLATE_LLAMA_2_SYS
  ------------------
  |  Branch (301:16): [True: 6, False: 588]
  ------------------
  302|    588|            || tmpl == LLM_CHAT_TEMPLATE_LLAMA_2_SYS_BOS
  ------------------
  |  Branch (302:16): [True: 5, False: 583]
  ------------------
  303|    583|            || tmpl == LLM_CHAT_TEMPLATE_LLAMA_2_SYS_STRIP) {
  ------------------
  |  Branch (303:16): [True: 71, False: 512]
  ------------------
  304|       |        // llama2 template and its variants
  305|       |        // [variant] support system message
  306|       |        // See: https://huggingface.co/blog/llama2#how-to-prompt-llama-2
  307|    188|        bool support_system_message = tmpl != LLM_CHAT_TEMPLATE_LLAMA_2;
  308|       |        // [variant] add BOS inside history
  309|    188|        bool add_bos_inside_history = tmpl == LLM_CHAT_TEMPLATE_LLAMA_2_SYS_BOS;
  310|       |        // [variant] trim spaces from the input message
  311|    188|        bool strip_message = tmpl == LLM_CHAT_TEMPLATE_LLAMA_2_SYS_STRIP;
  312|       |        // construct the prompt
  313|    188|        bool is_inside_turn = true; // skip BOS at the beginning
  314|    188|        ss << "[INST] ";
  315|  1.12k|        for (auto message : chat) {
  ------------------
  |  Branch (315:27): [True: 1.12k, False: 188]
  ------------------
  316|  1.12k|            std::string content = strip_message ? trim(message->content) : message->content;
  ------------------
  |  Branch (316:35): [True: 426, False: 702]
  ------------------
  317|  1.12k|            std::string role(message->role);
  318|  1.12k|            if (!is_inside_turn) {
  ------------------
  |  Branch (318:17): [True: 376, False: 752]
  ------------------
  319|    376|                is_inside_turn = true;
  320|    376|                ss << (add_bos_inside_history ? "<s>[INST] " : "[INST] ");
  ------------------
  |  Branch (320:24): [True: 10, False: 366]
  ------------------
  321|    376|            }
  322|  1.12k|            if (role == "system") {
  ------------------
  |  Branch (322:17): [True: 188, False: 940]
  ------------------
  323|    188|                if (support_system_message) {
  ------------------
  |  Branch (323:21): [True: 82, False: 106]
  ------------------
  324|     82|                    ss << "<<SYS>>\n" << content << "\n<</SYS>>\n\n";
  325|    106|                } else {
  326|       |                    // if the model does not support system message, we still include it in the first message, but without <<SYS>>
  327|    106|                    ss << content << "\n";
  328|    106|                }
  329|    940|            } else if (role == "user") {
  ------------------
  |  Branch (329:24): [True: 564, False: 376]
  ------------------
  330|    564|                ss << content << " [/INST]";
  331|    564|            } else {
  332|    376|                ss << content << "</s>";
  333|    376|                is_inside_turn = false;
  334|    376|            }
  335|  1.12k|        }
  336|    512|    } else if (tmpl == LLM_CHAT_TEMPLATE_PHI_3) {
  ------------------
  |  Branch (336:16): [True: 4, False: 508]
  ------------------
  337|       |        // Phi 3
  338|     24|        for (auto message : chat) {
  ------------------
  |  Branch (338:27): [True: 24, False: 4]
  ------------------
  339|     24|            std::string role(message->role);
  340|     24|            ss << "<|" << role << "|>\n" << message->content << "<|end|>\n";
  341|     24|        }
  342|      4|        if (add_ass) {
  ------------------
  |  Branch (342:13): [True: 4, False: 0]
  ------------------
  343|      4|            ss << "<|assistant|>\n";
  344|      4|        }
  345|    508|    } else if (tmpl == LLM_CHAT_TEMPLATE_PHI_4) {
  ------------------
  |  Branch (345:16): [True: 3, False: 505]
  ------------------
  346|       |        // chatml template
  347|     18|        for (auto message : chat) {
  ------------------
  |  Branch (347:27): [True: 18, False: 3]
  ------------------
  348|     18|            ss << "<|im_start|>" << message->role << "<|im_sep|>" << message->content << "<|im_end|>";
  349|     18|        }
  350|      3|        if (add_ass) {
  ------------------
  |  Branch (350:13): [True: 3, False: 0]
  ------------------
  351|      3|            ss << "<|im_start|>assistant<|im_sep|>";
  352|      3|        }
  353|    505|    } else if (tmpl == LLM_CHAT_TEMPLATE_FALCON_3) {
  ------------------
  |  Branch (353:16): [True: 15, False: 490]
  ------------------
  354|       |        // Falcon 3
  355|     90|        for (auto message : chat) {
  ------------------
  |  Branch (355:27): [True: 90, False: 15]
  ------------------
  356|     90|            std::string role(message->role);
  357|     90|            ss << "<|" << role << "|>\n" << message->content << "\n";
  358|     90|        }
  359|     15|        if (add_ass) {
  ------------------
  |  Branch (359:13): [True: 15, False: 0]
  ------------------
  360|     15|            ss << "<|assistant|>\n";
  361|     15|        }
  362|    490|    } else if (tmpl == LLM_CHAT_TEMPLATE_ZEPHYR) {
  ------------------
  |  Branch (362:16): [True: 4, False: 486]
  ------------------
  363|       |        // zephyr template
  364|     24|        for (auto message : chat) {
  ------------------
  |  Branch (364:27): [True: 24, False: 4]
  ------------------
  365|     24|            ss << "<|" << message->role << "|>" << "\n" << message->content << "<|endoftext|>\n";
  366|     24|        }
  367|      4|        if (add_ass) {
  ------------------
  |  Branch (367:13): [True: 4, False: 0]
  ------------------
  368|      4|            ss << "<|assistant|>\n";
  369|      4|        }
  370|    486|    } else if (tmpl == LLM_CHAT_TEMPLATE_MONARCH) {
  ------------------
  |  Branch (370:16): [True: 6, False: 480]
  ------------------
  371|       |        // mlabonne/AlphaMonarch-7B template (the <s> is included inside history)
  372|     36|        for (auto message : chat) {
  ------------------
  |  Branch (372:27): [True: 36, False: 6]
  ------------------
  373|     36|            std::string bos = (message == chat.front()) ? "" : "<s>"; // skip BOS for first message
  ------------------
  |  Branch (373:31): [True: 6, False: 30]
  ------------------
  374|     36|            ss << bos << message->role << "\n" << message->content << "</s>\n";
  375|     36|        }
  376|      6|        if (add_ass) {
  ------------------
  |  Branch (376:13): [True: 6, False: 0]
  ------------------
  377|      6|            ss << "<s>assistant\n";
  378|      6|        }
  379|    480|    } else if (tmpl == LLM_CHAT_TEMPLATE_GEMMA) {
  ------------------
  |  Branch (379:16): [True: 165, False: 315]
  ------------------
  380|       |        // google/gemma-7b-it
  381|    165|        std::string system_prompt = "";
  382|    990|        for (auto message : chat) {
  ------------------
  |  Branch (382:27): [True: 990, False: 165]
  ------------------
  383|    990|            std::string role(message->role);
  384|    990|            if (role == "system") {
  ------------------
  |  Branch (384:17): [True: 165, False: 825]
  ------------------
  385|       |                // there is no system message for gemma, but we will merge it with user prompt, so nothing is broken
  386|    165|                system_prompt += trim(message->content);
  387|    165|                continue;
  388|    165|            }
  389|       |            // in gemma, "assistant" is "model"
  390|    825|            role = role == "assistant" ? "model" : message->role;
  ------------------
  |  Branch (390:20): [True: 330, False: 495]
  ------------------
  391|    825|            ss << "<start_of_turn>" << role << "\n";
  392|    825|            if (!system_prompt.empty() && role != "model") {
  ------------------
  |  Branch (392:17): [True: 141, False: 684]
  |  Branch (392:43): [True: 141, False: 0]
  ------------------
  393|    141|                ss << system_prompt << "\n\n";
  394|    141|                system_prompt = "";
  395|    141|            }
  396|    825|            ss << trim(message->content) << "<end_of_turn>\n";
  397|    825|        }
  398|    165|        if (add_ass) {
  ------------------
  |  Branch (398:13): [True: 165, False: 0]
  ------------------
  399|    165|            ss << "<start_of_turn>model\n";
  400|    165|        }
  401|    315|    } else if (tmpl == LLM_CHAT_TEMPLATE_ORION) {
  ------------------
  |  Branch (401:16): [True: 27, False: 288]
  ------------------
  402|       |        // OrionStarAI/Orion-14B-Chat
  403|     27|        std::string system_prompt = "";
  404|    162|        for (auto message : chat) {
  ------------------
  |  Branch (404:27): [True: 162, False: 27]
  ------------------
  405|    162|            std::string role(message->role);
  406|    162|            if (role == "system") {
  ------------------
  |  Branch (406:17): [True: 27, False: 135]
  ------------------
  407|       |                // there is no system message support, we will merge it with user prompt
  408|     27|                system_prompt += message->content;
  409|     27|                continue;
  410|    135|            } else if (role == "user") {
  ------------------
  |  Branch (410:24): [True: 81, False: 54]
  ------------------
  411|     81|                ss << "Human: ";
  412|     81|                if (!system_prompt.empty()) {
  ------------------
  |  Branch (412:21): [True: 21, False: 60]
  ------------------
  413|     21|                    ss << system_prompt << "\n\n";
  414|     21|                    system_prompt = "";
  415|     21|                }
  416|     81|                ss << message->content << "\n\nAssistant: </s>";
  417|     81|            } else {
  418|     54|                ss << message->content << "</s>";
  419|     54|            }
  420|    162|        }
  421|    288|    } else if (tmpl == LLM_CHAT_TEMPLATE_OPENCHAT) {
  ------------------
  |  Branch (421:16): [True: 5, False: 283]
  ------------------
  422|       |        // openchat/openchat-3.5-0106,
  423|     30|        for (auto message : chat) {
  ------------------
  |  Branch (423:27): [True: 30, False: 5]
  ------------------
  424|     30|            std::string role(message->role);
  425|     30|            if (role == "system") {
  ------------------
  |  Branch (425:17): [True: 5, False: 25]
  ------------------
  426|      5|                ss << message->content << "<|end_of_turn|>";
  427|     25|            } else {
  428|     25|                role[0] = toupper(role[0]);
  429|     25|                ss << "GPT4 Correct " << role << ": " << message->content << "<|end_of_turn|>";
  430|     25|            }
  431|     30|        }
  432|      5|        if (add_ass) {
  ------------------
  |  Branch (432:13): [True: 5, False: 0]
  ------------------
  433|      5|            ss << "GPT4 Correct Assistant:";
  434|      5|        }
  435|    283|    } else if (tmpl == LLM_CHAT_TEMPLATE_VICUNA || tmpl == LLM_CHAT_TEMPLATE_VICUNA_ORCA) {
  ------------------
  |  Branch (435:16): [True: 3, False: 280]
  |  Branch (435:52): [True: 3, False: 277]
  ------------------
  436|       |        // eachadea/vicuna-13b-1.1 (and Orca variant)
  437|     36|        for (auto message : chat) {
  ------------------
  |  Branch (437:27): [True: 36, False: 6]
  ------------------
  438|     36|            std::string role(message->role);
  439|     36|            if (role == "system") {
  ------------------
  |  Branch (439:17): [True: 6, False: 30]
  ------------------
  440|       |                // Orca-Vicuna variant uses a system prefix
  441|      6|                if (tmpl == LLM_CHAT_TEMPLATE_VICUNA_ORCA) {
  ------------------
  |  Branch (441:21): [True: 3, False: 3]
  ------------------
  442|      3|                    ss << "SYSTEM: " << message->content << "\n";
  443|      3|                } else {
  444|      3|                    ss << message->content << "\n\n";
  445|      3|                }
  446|     30|            } else if (role == "user") {
  ------------------
  |  Branch (446:24): [True: 18, False: 12]
  ------------------
  447|     18|                ss << "USER: " << message->content << "\n";
  448|     18|            } else if (role == "assistant") {
  ------------------
  |  Branch (448:24): [True: 12, False: 0]
  ------------------
  449|     12|                ss << "ASSISTANT: " << message->content << "</s>\n";
  450|     12|            }
  451|     36|        }
  452|      6|        if (add_ass) {
  ------------------
  |  Branch (452:13): [True: 6, False: 0]
  ------------------
  453|      6|            ss << "ASSISTANT:";
  454|      6|        }
  455|    277|    } else if (tmpl == LLM_CHAT_TEMPLATE_DEEPSEEK) {
  ------------------
  |  Branch (455:16): [True: 3, False: 274]
  ------------------
  456|       |        // deepseek-ai/deepseek-coder-33b-instruct
  457|     18|        for (auto message : chat) {
  ------------------
  |  Branch (457:27): [True: 18, False: 3]
  ------------------
  458|     18|            std::string role(message->role);
  459|     18|            if (role == "system") {
  ------------------
  |  Branch (459:17): [True: 3, False: 15]
  ------------------
  460|      3|                ss << message->content;
  461|     15|            } else if (role == "user") {
  ------------------
  |  Branch (461:24): [True: 9, False: 6]
  ------------------
  462|      9|                ss << "### Instruction:\n" << message->content << "\n";
  463|      9|            } else if (role == "assistant") {
  ------------------
  |  Branch (463:24): [True: 6, False: 0]
  ------------------
  464|      6|                ss << "### Response:\n" << message->content << "\n<|EOT|>\n";
  465|      6|            }
  466|     18|        }
  467|      3|        if (add_ass) {
  ------------------
  |  Branch (467:13): [True: 3, False: 0]
  ------------------
  468|      3|            ss << "### Response:\n";
  469|      3|        }
  470|    274|    } else if (tmpl == LLM_CHAT_TEMPLATE_COMMAND_R) {
  ------------------
  |  Branch (470:16): [True: 21, False: 253]
  ------------------
  471|       |        // CohereForAI/c4ai-command-r-plus
  472|    126|        for (auto message : chat) {
  ------------------
  |  Branch (472:27): [True: 126, False: 21]
  ------------------
  473|    126|            std::string role(message->role);
  474|    126|            if (role == "system") {
  ------------------
  |  Branch (474:17): [True: 21, False: 105]
  ------------------
  475|     21|                ss << "<|START_OF_TURN_TOKEN|><|SYSTEM_TOKEN|>" << trim(message->content) << "<|END_OF_TURN_TOKEN|>";
  476|    105|            } else if (role == "user") {
  ------------------
  |  Branch (476:24): [True: 63, False: 42]
  ------------------
  477|     63|                ss << "<|START_OF_TURN_TOKEN|><|USER_TOKEN|>" << trim(message->content) << "<|END_OF_TURN_TOKEN|>";
  478|     63|            } else if (role == "assistant") {
  ------------------
  |  Branch (478:24): [True: 42, False: 0]
  ------------------
  479|     42|                ss << "<|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>" << trim(message->content) << "<|END_OF_TURN_TOKEN|>";
  480|     42|            }
  481|    126|        }
  482|     21|        if (add_ass) {
  ------------------
  |  Branch (482:13): [True: 21, False: 0]
  ------------------
  483|     21|            ss << "<|START_OF_TURN_TOKEN|><|CHATBOT_TOKEN|>";
  484|     21|        }
  485|    253|    } else if (tmpl == LLM_CHAT_TEMPLATE_LLAMA_3) {
  ------------------
  |  Branch (485:16): [True: 13, False: 240]
  ------------------
  486|       |        // Llama 3
  487|     78|        for (auto message : chat) {
  ------------------
  |  Branch (487:27): [True: 78, False: 13]
  ------------------
  488|     78|            std::string role(message->role);
  489|     78|            ss << "<|start_header_id|>" << role << "<|end_header_id|>\n\n" << trim(message->content) << "<|eot_id|>";
  490|     78|        }
  491|     13|        if (add_ass) {
  ------------------
  |  Branch (491:13): [True: 13, False: 0]
  ------------------
  492|     13|            ss << "<|start_header_id|>assistant<|end_header_id|>\n\n";
  493|     13|        }
  494|    240|    } else if (tmpl == LLM_CHAT_TEMPLATE_CHATGLM_3) {
  ------------------
  |  Branch (494:16): [True: 13, False: 227]
  ------------------
  495|       |        // chatglm3-6b
  496|     13|        ss << "[gMASK]" << "sop";
  497|     78|        for (auto message : chat) {
  ------------------
  |  Branch (497:27): [True: 78, False: 13]
  ------------------
  498|     78|            std::string role(message->role);
  499|     78|            ss << "<|" << role << "|>" << "\n " << message->content;
  500|     78|        }
  501|     13|        if (add_ass) {
  ------------------
  |  Branch (501:13): [True: 13, False: 0]
  ------------------
  502|     13|            ss << "<|assistant|>";
  503|     13|        }
  504|    227|    } else if (tmpl == LLM_CHAT_TEMPLATE_CHATGLM_4) {
  ------------------
  |  Branch (504:16): [True: 3, False: 224]
  ------------------
  505|      3|        ss << "[gMASK]" << "<sop>";
  506|     18|        for (auto message : chat) {
  ------------------
  |  Branch (506:27): [True: 18, False: 3]
  ------------------
  507|     18|            std::string role(message->role);
  508|     18|            ss << "<|" << role << "|>" << "\n" << message->content;
  509|     18|        }
  510|      3|        if (add_ass) {
  ------------------
  |  Branch (510:13): [True: 3, False: 0]
  ------------------
  511|      3|            ss << "<|assistant|>\n";
  512|      3|        }
  513|    224|    } else if (tmpl == LLM_CHAT_TEMPLATE_GLMEDGE) {
  ------------------
  |  Branch (513:16): [True: 20, False: 204]
  ------------------
  514|    120|        for (auto message : chat) {
  ------------------
  |  Branch (514:27): [True: 120, False: 20]
  ------------------
  515|    120|            std::string role(message->role);
  516|    120|            ss << "<|" << role << "|>" << "\n" << message->content;
  517|    120|        }
  518|     20|        if (add_ass) {
  ------------------
  |  Branch (518:13): [True: 20, False: 0]
  ------------------
  519|     20|            ss << "<|assistant|>";
  520|     20|        }
  521|    204|    } else if (tmpl == LLM_CHAT_TEMPLATE_MINICPM) {
  ------------------
  |  Branch (521:16): [True: 18, False: 186]
  ------------------
  522|       |        // MiniCPM-3B-OpenHermes-2.5-v2-GGUF
  523|    108|        for (auto message : chat) {
  ------------------
  |  Branch (523:27): [True: 108, False: 18]
  ------------------
  524|    108|            std::string role(message->role);
  525|    108|            if (role == "user") {
  ------------------
  |  Branch (525:17): [True: 54, False: 54]
  ------------------
  526|     54|                ss << LU8("<用户>");
  ------------------
  |  |   12|     54|    #define LU8(x) u8##x
  ------------------
  527|     54|                ss << trim(message->content);
  528|     54|                ss << "<AI>";
  529|     54|            } else {
  530|     54|                ss << trim(message->content);
  531|     54|            }
  532|    108|        }
  533|    186|    } else if (tmpl == LLM_CHAT_TEMPLATE_DEEPSEEK_2) {
  ------------------
  |  Branch (533:16): [True: 4, False: 182]
  ------------------
  534|       |        // DeepSeek-V2
  535|     24|        for (auto message : chat) {
  ------------------
  |  Branch (535:27): [True: 24, False: 4]
  ------------------
  536|     24|            std::string role(message->role);
  537|     24|            if (role == "system") {
  ------------------
  |  Branch (537:17): [True: 4, False: 20]
  ------------------
  538|      4|                ss << message->content << "\n\n";
  539|     20|            } else if (role == "user") {
  ------------------
  |  Branch (539:24): [True: 12, False: 8]
  ------------------
  540|     12|                ss << "User: " << message->content << "\n\n";
  541|     12|            } else if (role == "assistant") {
  ------------------
  |  Branch (541:24): [True: 8, False: 0]
  ------------------
  542|      8|                ss << "Assistant: " << message->content << LU8("<｜end▁of▁sentence｜>");
  ------------------
  |  |   12|      8|    #define LU8(x) u8##x
  ------------------
  543|      8|            }
  544|     24|        }
  545|      4|        if (add_ass) {
  ------------------
  |  Branch (545:13): [True: 4, False: 0]
  ------------------
  546|      4|            ss << "Assistant:";
  547|      4|        }
  548|    182|    } else if (tmpl == LLM_CHAT_TEMPLATE_DEEPSEEK_3) {
  ------------------
  |  Branch (548:16): [True: 2, False: 180]
  ------------------
  549|       |        // DeepSeek-V3
  550|     12|        for (auto message : chat) {
  ------------------
  |  Branch (550:27): [True: 12, False: 2]
  ------------------
  551|     12|            std::string role(message->role);
  552|     12|            if (role == "system") {
  ------------------
  |  Branch (552:17): [True: 2, False: 10]
  ------------------
  553|      2|                ss << message->content << "\n\n";
  554|     10|            } else if (role == "user") {
  ------------------
  |  Branch (554:24): [True: 6, False: 4]
  ------------------
  555|      6|                ss << LU8("<｜User｜>") << message->content;
  ------------------
  |  |   12|      6|    #define LU8(x) u8##x
  ------------------
  556|      6|            } else if (role == "assistant") {
  ------------------
  |  Branch (556:24): [True: 4, False: 0]
  ------------------
  557|      4|                ss << LU8("<｜Assistant｜>") << message->content << LU8("<｜end▁of▁sentence｜>");
  ------------------
  |  |   12|      4|    #define LU8(x) u8##x
  ------------------
                              ss << LU8("<｜Assistant｜>") << message->content << LU8("<｜end▁of▁sentence｜>");
  ------------------
  |  |   12|      4|    #define LU8(x) u8##x
  ------------------
  558|      4|            }
  559|     12|        }
  560|      2|        if (add_ass) {
  ------------------
  |  Branch (560:13): [True: 2, False: 0]
  ------------------
  561|      2|            ss << LU8("<｜Assistant｜>");
  ------------------
  |  |   12|      2|    #define LU8(x) u8##x
  ------------------
  562|      2|        }
  563|    180|    } else if (tmpl == LLM_CHAT_TEMPLATE_DEEPSEEK_OCR) {
  ------------------
  |  Branch (563:16): [True: 4, False: 176]
  ------------------
  564|     24|        for (auto message : chat) {
  ------------------
  |  Branch (564:27): [True: 24, False: 4]
  ------------------
  565|       |            // no template
  566|     24|            ss << message->content;
  567|     24|        }
  568|    176|    } else if (tmpl == LLM_CHAT_TEMPLATE_EXAONE_3) {
  ------------------
  |  Branch (568:16): [True: 14, False: 162]
  ------------------
  569|       |        // ref: https://huggingface.co/LGAI-EXAONE/EXAONE-3.0-7.8B-Instruct/discussions/8#66bae61b1893d14ee8ed85bb
  570|       |        // EXAONE-3.0-7.8B-Instruct
  571|     84|        for (auto message : chat) {
  ------------------
  |  Branch (571:27): [True: 84, False: 14]
  ------------------
  572|     84|            std::string role(message->role);
  573|     84|            if (role == "system") {
  ------------------
  |  Branch (573:17): [True: 14, False: 70]
  ------------------
  574|     14|                ss << "[|system|]" << trim(message->content) << "[|endofturn|]\n";
  575|     70|            } else if (role == "user") {
  ------------------
  |  Branch (575:24): [True: 42, False: 28]
  ------------------
  576|     42|                ss << "[|user|]" << trim(message->content) << "\n";
  577|     42|            } else if (role == "assistant") {
  ------------------
  |  Branch (577:24): [True: 28, False: 0]
  ------------------
  578|     28|                ss << "[|assistant|]" << trim(message->content) << "[|endofturn|]\n";
  579|     28|            }
  580|     84|        }
  581|     14|        if (add_ass) {
  ------------------
  |  Branch (581:13): [True: 14, False: 0]
  ------------------
  582|     14|            ss << "[|assistant|]";
  583|     14|        }
  584|    162|    } else if (tmpl == LLM_CHAT_TEMPLATE_EXAONE_4) {
  ------------------
  |  Branch (584:16): [True: 13, False: 149]
  ------------------
  585|     78|        for (auto message : chat) {
  ------------------
  |  Branch (585:27): [True: 78, False: 13]
  ------------------
  586|     78|            std::string role(message->role);
  587|     78|            if (role == "system") {
  ------------------
  |  Branch (587:17): [True: 13, False: 65]
  ------------------
  588|     13|                ss << "[|system|]" << trim(message->content) << "[|endofturn|]\n";
  589|     65|            } else if (role == "user") {
  ------------------
  |  Branch (589:24): [True: 39, False: 26]
  ------------------
  590|     39|                ss << "[|user|]" << trim(message->content) << "\n";
  591|     39|            } else if (role == "assistant") {
  ------------------
  |  Branch (591:24): [True: 26, False: 0]
  ------------------
  592|     26|                ss << "[|assistant|]" << trim(message->content) << "[|endofturn|]\n";
  593|     26|            } else if (role == "tool") {
  ------------------
  |  Branch (593:24): [True: 0, False: 0]
  ------------------
  594|      0|                ss << "[|tool|]" << trim(message->content) << "[|endofturn|]\n";
  595|      0|            }
  596|     78|        }
  597|     13|        if (add_ass) {
  ------------------
  |  Branch (597:13): [True: 13, False: 0]
  ------------------
  598|     13|            ss << "[|assistant|]";
  599|     13|        }
  600|    149|    } else if (tmpl == LLM_CHAT_TEMPLATE_EXAONE_MOE) {
  ------------------
  |  Branch (600:16): [True: 11, False: 138]
  ------------------
  601|     66|        for (auto message : chat) {
  ------------------
  |  Branch (601:27): [True: 66, False: 11]
  ------------------
  602|     66|            std::string role(message->role);
  603|     66|            if (role == "system") {
  ------------------
  |  Branch (603:17): [True: 11, False: 55]
  ------------------
  604|     11|                ss << "<|system|>\n" << trim(message->content) << "<|endofturn|>\n";
  605|     55|            } else if (role == "user") {
  ------------------
  |  Branch (605:24): [True: 33, False: 22]
  ------------------
  606|     33|                ss << "<|user|>\n" << trim(message->content) << "<|endofturn|>\n";
  607|     33|            } else if (role == "assistant") {
  ------------------
  |  Branch (607:24): [True: 22, False: 0]
  ------------------
  608|     22|                ss << "<|assistant|>\n" << trim(message->content) << "<|endofturn|>\n";
  609|     22|            } else if (role == "tool") {
  ------------------
  |  Branch (609:24): [True: 0, False: 0]
  ------------------
  610|      0|                ss << "<|tool|>\n" << trim(message->content) << "<|endofturn|>\n";
  611|      0|            }
  612|     66|        }
  613|     11|        if (add_ass) {
  ------------------
  |  Branch (613:13): [True: 11, False: 0]
  ------------------
  614|     11|            ss << "<|assistant|>\n";
  615|     11|        }
  616|    138|    } else if (tmpl == LLM_CHAT_TEMPLATE_RWKV_WORLD) {
  ------------------
  |  Branch (616:16): [True: 17, False: 121]
  ------------------
  617|       |        // this template requires the model to have "\n\n" as EOT token
  618|    119|        for (size_t i = 0; i < chat.size(); i++) {
  ------------------
  |  Branch (618:28): [True: 102, False: 17]
  ------------------
  619|    102|            std::string role(chat[i]->role);
  620|    102|            if (role == "system") {
  ------------------
  |  Branch (620:17): [True: 17, False: 85]
  ------------------
  621|     17|                ss << "System: " << trim(chat[i]->content) << "\n\n";
  622|     85|            } else if (role == "user") {
  ------------------
  |  Branch (622:24): [True: 51, False: 34]
  ------------------
  623|     51|                ss << "User: " << trim(chat[i]->content) << "\n\n";
  624|     51|                if (i == chat.size() - 1) {
  ------------------
  |  Branch (624:21): [True: 17, False: 34]
  ------------------
  625|     17|                    ss << "Assistant:";
  626|     17|                }
  627|     51|            } else if (role == "assistant") {
  ------------------
  |  Branch (627:24): [True: 34, False: 0]
  ------------------
  628|     34|                ss << "Assistant: " << trim(chat[i]->content) << "\n\n";
  629|     34|            }
  630|    102|        }
  631|    121|    } else if (tmpl == LLM_CHAT_TEMPLATE_GRANITE_3_X) {
  ------------------
  |  Branch (631:16): [True: 4, False: 117]
  ------------------
  632|       |        // IBM Granite 3.x template
  633|     24|        for (const auto & message : chat) {
  ------------------
  |  Branch (633:35): [True: 24, False: 4]
  ------------------
  634|     24|            std::string role(message->role);
  635|     24|            ss << "<|start_of_role|>" << role << "<|end_of_role|>";
  636|     24|            if (role == "assistant_tool_call") {
  ------------------
  |  Branch (636:17): [True: 0, False: 24]
  ------------------
  637|      0|                ss << "<|tool_call|>";
  638|      0|            }
  639|     24|            ss << message->content << "<|end_of_text|>\n";
  640|     24|        }
  641|      4|        if (add_ass) {
  ------------------
  |  Branch (641:13): [True: 4, False: 0]
  ------------------
  642|      4|            ss << "<|start_of_role|>assistant<|end_of_role|>";
  643|      4|        }
  644|    117|    } else if (tmpl == LLM_CHAT_TEMPLATE_GRANITE_4_0) {
  ------------------
  |  Branch (644:16): [True: 0, False: 117]
  ------------------
  645|       |        // IBM Granite 4.0 template
  646|      0|        for (const auto & message : chat) {
  ------------------
  |  Branch (646:35): [True: 0, False: 0]
  ------------------
  647|      0|            std::string role(message->role);
  648|      0|            if (role == "assistant_tool_call") {
  ------------------
  |  Branch (648:17): [True: 0, False: 0]
  ------------------
  649|      0|                ss << "<|start_of_role|>assistant<|end_of_role|><|tool_call|>";
  650|      0|            } else {
  651|      0|                ss << "<|start_of_role|>" << role << "<|end_of_role|>";
  652|      0|            }
  653|      0|            ss << message->content << "<|end_of_text|>\n";
  654|      0|        }
  655|      0|        if (add_ass) {
  ------------------
  |  Branch (655:13): [True: 0, False: 0]
  ------------------
  656|      0|            ss << "<|start_of_role|>assistant<|end_of_role|>";
  657|      0|        }
  658|    117|    } else if (tmpl == LLM_CHAT_TEMPLATE_GRANITE_4_1) {
  ------------------
  |  Branch (658:16): [True: 2, False: 115]
  ------------------
  659|       |        // IBM Granite 4.1 template
  660|     12|        for (const auto & message : chat) {
  ------------------
  |  Branch (660:35): [True: 12, False: 2]
  ------------------
  661|     12|            std::string role(message->role);
  662|     12|            if (role == "assistant_tool_call") {
  ------------------
  |  Branch (662:17): [True: 0, False: 12]
  ------------------
  663|      0|                ss << "<|start_of_role|>assistant<|end_of_role|><|tool_call|>";
  664|     12|            } else {
  665|     12|                ss << "<|start_of_role|>" << role << "<|end_of_role|>";
  666|     12|            }
  667|     12|            ss << message->content << "<|end_of_text|>\n";
  668|     12|        }
  669|      2|        if (add_ass) {
  ------------------
  |  Branch (669:13): [True: 2, False: 0]
  ------------------
  670|      2|            ss << "<|start_of_role|>assistant<|end_of_role|>";
  671|      2|        }
  672|    115|    } else if (tmpl == LLM_CHAT_TEMPLATE_GIGACHAT) {
  ------------------
  |  Branch (672:16): [True: 2, False: 113]
  ------------------
  673|       |        // GigaChat template
  674|      2|        bool has_system = !chat.empty() && std::string(chat[0]->role) == "system";
  ------------------
  |  Branch (674:27): [True: 2, False: 0]
  |  Branch (674:44): [True: 2, False: 0]
  ------------------
  675|       |
  676|       |        // Handle system message if present
  677|      2|        if (has_system) {
  ------------------
  |  Branch (677:13): [True: 2, False: 0]
  ------------------
  678|      2|            ss << "<s>" << chat[0]->content << "<|message_sep|>";
  679|      2|        } else {
  680|      0|            ss << "<s>";
  681|      0|        }
  682|       |
  683|       |        // Process remaining messages
  684|     12|        for (size_t i = has_system ? 1 : 0; i < chat.size(); i++) {
  ------------------
  |  Branch (684:25): [True: 2, False: 0]
  |  Branch (684:45): [True: 10, False: 2]
  ------------------
  685|     10|            std::string role(chat[i]->role);
  686|     10|            if (role == "user") {
  ------------------
  |  Branch (686:17): [True: 6, False: 4]
  ------------------
  687|      6|                ss << "user<|role_sep|>" << chat[i]->content << "<|message_sep|>"
  688|      6|                << "available functions<|role_sep|>[]<|message_sep|>";
  689|      6|            } else if (role == "assistant") {
  ------------------
  |  Branch (689:24): [True: 4, False: 0]
  ------------------
  690|      4|                ss << "assistant<|role_sep|>" << chat[i]->content << "<|message_sep|>";
  691|      4|            }
  692|     10|        }
  693|       |
  694|       |        // Add generation prompt if needed
  695|      2|        if (add_ass) {
  ------------------
  |  Branch (695:13): [True: 2, False: 0]
  ------------------
  696|      2|            ss << "assistant<|role_sep|>";
  697|      2|        }
  698|    113|    }  else if (tmpl == LLM_CHAT_TEMPLATE_MEGREZ) {
  ------------------
  |  Branch (698:17): [True: 4, False: 109]
  ------------------
  699|       |        // Megrez template
  700|     24|        for (auto message : chat) {
  ------------------
  |  Branch (700:27): [True: 24, False: 4]
  ------------------
  701|     24|            std::string role(message->role);
  702|     24|            ss << "<|role_start|>" << role << "<|role_end|>" << message->content << "<|turn_end|>";
  703|     24|        }
  704|       |
  705|      4|        if (add_ass) {
  ------------------
  |  Branch (705:13): [True: 4, False: 0]
  ------------------
  706|      4|            ss << "<|role_start|>assistant<|role_end|>";
  707|      4|        }
  708|    109|    } else if (tmpl == LLM_CHAT_TEMPLATE_YANDEX) {
  ------------------
  |  Branch (708:16): [True: 4, False: 105]
  ------------------
  709|       |        // Yandex template ("\n\n" is defined as EOT token)
  710|       |
  711|     28|        for (size_t i = 0; i < chat.size(); i++) {
  ------------------
  |  Branch (711:28): [True: 24, False: 4]
  ------------------
  712|     24|            std::string role(chat[i]->role);
  713|     24|            if (role == "user") {
  ------------------
  |  Branch (713:17): [True: 12, False: 12]
  ------------------
  714|     12|                ss << " Пользователь: " << chat[i]->content << "\n\n";
  715|     12|            } else if (role == "assistant") {
  ------------------
  |  Branch (715:24): [True: 8, False: 4]
  ------------------
  716|      8|                ss << " Ассистент: " << chat[i]->content << "\n\n";
  717|      8|            }
  718|     24|        }
  719|       |
  720|       |        // Add generation prompt if needed
  721|      4|        if (add_ass) {
  ------------------
  |  Branch (721:13): [True: 4, False: 0]
  ------------------
  722|      4|            ss << " Ассистент:[SEP]";
  723|      4|        }
  724|    105|    } else if (tmpl == LLM_CHAT_TEMPLATE_BAILING || tmpl == LLM_CHAT_TEMPLATE_BAILING_THINK) {
  ------------------
  |  Branch (724:16): [True: 2, False: 103]
  |  Branch (724:53): [True: 5, False: 98]
  ------------------
  725|       |        // Bailing (Ling/Ring) template
  726|     42|        for (auto message : chat) {
  ------------------
  |  Branch (726:27): [True: 42, False: 7]
  ------------------
  727|     42|            std::string role(message->role);
  728|       |
  729|     42|            if (role == "user") {
  ------------------
  |  Branch (729:17): [True: 21, False: 21]
  ------------------
  730|     21|                role = "HUMAN";
  731|     21|            } else {
  732|     21|                std::transform(role.begin(), role.end(), role.begin(), ::toupper);
  733|     21|            }
  734|       |
  735|     42|            ss << "<role>" << role << "</role>" << message->content;
  736|     42|        }
  737|       |
  738|      7|        if (add_ass) {
  ------------------
  |  Branch (738:13): [True: 7, False: 0]
  ------------------
  739|      7|            ss << "<role>ASSISTANT</role>";
  740|       |
  741|      7|            if (tmpl == LLM_CHAT_TEMPLATE_BAILING_THINK) {
  ------------------
  |  Branch (741:17): [True: 5, False: 2]
  ------------------
  742|      5|                ss << "<think>";
  743|      5|            }
  744|      7|        }
  745|     98|    } else if (tmpl == LLM_CHAT_TEMPLATE_BAILING2) {
  ------------------
  |  Branch (745:16): [True: 8, False: 90]
  ------------------
  746|       |        // Bailing2 (Ling 2.0) template
  747|      8|        bool has_system = !chat.empty() && std::string(chat[0]->role) == "system";
  ------------------
  |  Branch (747:27): [True: 8, False: 0]
  |  Branch (747:44): [True: 8, False: 0]
  ------------------
  748|       |
  749|      8|        if (!has_system) {
  ------------------
  |  Branch (749:13): [True: 0, False: 8]
  ------------------
  750|      0|            ss << "<role>SYSTEM</role>detailed thinking off<|role_end|>";
  751|      0|        }
  752|       |
  753|     48|        for (auto message : chat) {
  ------------------
  |  Branch (753:27): [True: 48, False: 8]
  ------------------
  754|     48|            std::string role(message->role);
  755|       |
  756|     48|            if (role == "user") {
  ------------------
  |  Branch (756:17): [True: 24, False: 24]
  ------------------
  757|     24|                role = "HUMAN";
  758|     24|            } else {
  759|     24|                std::transform(role.begin(), role.end(), role.begin(), ::toupper);
  760|     24|            }
  761|       |
  762|     48|            ss << "<role>" << role << "</role>" << message->content << "<|role_end|>";
  763|     48|        }
  764|       |
  765|      8|        if (add_ass) {
  ------------------
  |  Branch (765:13): [True: 8, False: 0]
  ------------------
  766|      8|            ss << "<role>ASSISTANT</role>";
  767|      8|        }
  768|     90|    } else if (tmpl == LLM_CHAT_TEMPLATE_LLAMA4) {
  ------------------
  |  Branch (768:16): [True: 12, False: 78]
  ------------------
  769|       |        // Llama 4
  770|     72|        for (auto message : chat) {
  ------------------
  |  Branch (770:27): [True: 72, False: 12]
  ------------------
  771|     72|            std::string role(message->role);
  772|     72|            ss << "<|header_start|>" << role << "<|header_end|>\n\n" << trim(message->content) << "<|eot|>";
  773|     72|        }
  774|     12|        if (add_ass) {
  ------------------
  |  Branch (774:13): [True: 12, False: 0]
  ------------------
  775|     12|            ss << "<|header_start|>assistant<|header_end|>\n\n";
  776|     12|        }
  777|     78|    } else if (tmpl == LLM_CHAT_TEMPLATE_SMOLVLM) {
  ------------------
  |  Branch (777:16): [True: 1, False: 77]
  ------------------
  778|       |        // SmolVLM
  779|      1|        ss << "<|im_start|>"; // uses <|im_start|> as BOS, but the actual content is NOT chatml
  780|      6|        for (auto message : chat) {
  ------------------
  |  Branch (780:27): [True: 6, False: 1]
  ------------------
  781|      6|            std::string role(message->role);
  782|      6|            if (role == "system") {
  ------------------
  |  Branch (782:17): [True: 1, False: 5]
  ------------------
  783|      1|                ss << message->content << "\n\n";
  784|      5|            } else if (role == "user") {
  ------------------
  |  Branch (784:24): [True: 3, False: 2]
  ------------------
  785|      3|                ss << "User: " << message->content << "<end_of_utterance>\n";
  786|      3|            } else {
  787|      2|                ss << "Assistant: " << message->content << "<end_of_utterance>\n";
  788|      2|            }
  789|      6|        }
  790|      1|        if (add_ass) {
  ------------------
  |  Branch (790:13): [True: 1, False: 0]
  ------------------
  791|      1|            ss << "Assistant:";
  792|      1|        }
  793|     77|    } else if (tmpl == LLM_CHAT_TEMPLATE_DOTS1) {
  ------------------
  |  Branch (793:16): [True: 5, False: 72]
  ------------------
  794|       |        // dots.llm1.inst (DOTS1)
  795|     30|        for (auto message : chat) {
  ------------------
  |  Branch (795:27): [True: 30, False: 5]
  ------------------
  796|     30|            std::string role(message->role);
  797|     30|            if (role == "system") {
  ------------------
  |  Branch (797:17): [True: 5, False: 25]
  ------------------
  798|      5|                ss << "<|system|>" << message->content << "<|endofsystem|>";
  799|     25|            } else if (role == "user") {
  ------------------
  |  Branch (799:24): [True: 15, False: 10]
  ------------------
  800|     15|                ss << "<|userprompt|>" << message->content << "<|endofuserprompt|>";
  801|     15|            } else {
  802|     10|                ss << "<|response|>" << message->content << "<|endofresponse|>";
  803|     10|            }
  804|     30|        }
  805|      5|        if (add_ass) {
  ------------------
  |  Branch (805:13): [True: 5, False: 0]
  ------------------
  806|      5|            ss << "<|response|>";
  807|      5|        }
  808|     72|    } else if (tmpl == LLM_CHAT_TEMPLATE_HUNYUAN_MOE) {
  ------------------
  |  Branch (808:16): [True: 3, False: 69]
  ------------------
  809|       |        // tencent/Hunyuan-A13B-Instruct
  810|     18|        for (auto message : chat) {
  ------------------
  |  Branch (810:27): [True: 18, False: 3]
  ------------------
  811|     18|            std::string role(message->role);
  812|     18|            if (role == "system") {
  ------------------
  |  Branch (812:17): [True: 3, False: 15]
  ------------------
  813|      3|                ss << "<|startoftext|>" << message->content << "<|extra_4|>";
  814|     15|            } else if (role == "assistant") {
  ------------------
  |  Branch (814:24): [True: 6, False: 9]
  ------------------
  815|      6|                ss << message->content << "<|eos|>";
  816|      9|            } else {
  817|      9|                ss << "<|startoftext|>" << message->content << "<|extra_0|>";
  818|      9|            }
  819|     18|        }
  820|     69|    } else if (tmpl == LLM_CHAT_TEMPLATE_OPENAI_MOE) {
  ------------------
  |  Branch (820:16): [True: 2, False: 67]
  ------------------
  821|       |        // OpenAI MoE (based on Harmony chat template)
  822|     12|        for (auto message : chat) {
  ------------------
  |  Branch (822:27): [True: 12, False: 2]
  ------------------
  823|     12|            std::string role(message->role);
  824|     12|            ss << "<|start|>" << role << "<|message|>" << message->content;
  825|     12|            ss << (role == "assistant" ? "<|return|>" : "<|end|>");
  ------------------
  |  Branch (825:20): [True: 4, False: 8]
  ------------------
  826|     12|        }
  827|      2|        if (add_ass) {
  ------------------
  |  Branch (827:13): [True: 2, False: 0]
  ------------------
  828|      2|            ss << "<|start|>assistant";
  829|      2|        }
  830|     67|    } else if (tmpl == LLM_CHAT_TEMPLATE_HUNYUAN_DENSE) {
  ------------------
  |  Branch (830:16): [True: 3, False: 64]
  ------------------
  831|       |        // tencent/Hunyuan-4B-Instruct
  832|     21|        for (size_t i = 0; i < chat.size(); i++) {
  ------------------
  |  Branch (832:28): [True: 18, False: 3]
  ------------------
  833|     18|            std::string role(chat[i]->role);
  834|     18|            if (i == 0) {
  ------------------
  |  Branch (834:17): [True: 3, False: 15]
  ------------------
  835|      3|                if (role == "system") {
  ------------------
  |  Branch (835:21): [True: 3, False: 0]
  ------------------
  836|      3|                    ss << chat[i]->content << "<｜hy_place▁holder▁no▁3｜>";
  837|      3|                }
  838|      3|            }
  839|       |
  840|     18|            if (role == "assistant") {
  ------------------
  |  Branch (840:17): [True: 6, False: 12]
  ------------------
  841|      6|                ss << "<｜hy_Assistant｜>" << chat[i]->content << "<｜hy_place▁holder▁no▁2｜>";
  842|     12|            } else if (role == "user") {
  ------------------
  |  Branch (842:24): [True: 9, False: 3]
  ------------------
  843|      9|                ss << "<｜hy_User｜>" << chat[i]->content << "<｜hy_Assistant｜>";
  844|      9|            }
  845|     18|        }
  846|     64|    } else if (tmpl == LLM_CHAT_TEMPLATE_HUNYUAN_VL) {
  ------------------
  |  Branch (846:16): [True: 4, False: 60]
  ------------------
  847|       |        // tencent/HunyuanOCR & tencent/HunyuanVL
  848|      4|        ss << "<｜hy_begin▁of▁sentence｜>";
  849|     28|        for (size_t i = 0; i < chat.size(); i++) {
  ------------------
  |  Branch (849:28): [True: 24, False: 4]
  ------------------
  850|     24|            std::string role(chat[i]->role);
  851|     24|            if (i == 0 && role == "system") {
  ------------------
  |  Branch (851:17): [True: 4, False: 20]
  |  Branch (851:27): [True: 4, False: 0]
  ------------------
  852|      4|                ss << chat[i]->content << "<｜hy_place▁holder▁no▁3｜>";
  853|      4|                continue;
  854|      4|            }
  855|       |
  856|     20|            if (role == "user") {
  ------------------
  |  Branch (856:17): [True: 12, False: 8]
  ------------------
  857|     12|                ss << chat[i]->content << "<｜hy_User｜>";
  858|     12|            } else if (role == "assistant") {
  ------------------
  |  Branch (858:24): [True: 8, False: 0]
  ------------------
  859|      8|                ss << chat[i]->content << "<｜hy_Assistant｜>";
  860|      8|            }
  861|     20|        }
  862|     60|    } else if (tmpl == LLM_CHAT_TEMPLATE_KIMI_K2) {
  ------------------
  |  Branch (862:16): [True: 5, False: 55]
  ------------------
  863|       |        // moonshotai/Kimi-K2-Instruct
  864|     30|        for (auto message : chat) {
  ------------------
  |  Branch (864:27): [True: 30, False: 5]
  ------------------
  865|     30|            std::string role(message->role);
  866|     30|            if (role == "system") {
  ------------------
  |  Branch (866:17): [True: 5, False: 25]
  ------------------
  867|      5|                ss << "<|im_system|>system<|im_middle|>";
  868|     25|            } else if (role == "user") {
  ------------------
  |  Branch (868:24): [True: 15, False: 10]
  ------------------
  869|     15|                ss << "<|im_user|>user<|im_middle|>";
  870|     15|            } else if (role == "assistant") {
  ------------------
  |  Branch (870:24): [True: 10, False: 0]
  ------------------
  871|     10|                ss << "<|im_assistant|>assistant<|im_middle|>";
  872|     10|            } else if (role == "tool") {
  ------------------
  |  Branch (872:24): [True: 0, False: 0]
  ------------------
  873|      0|                ss << "<|im_system|>tool<|im_middle|>";
  874|      0|            }
  875|       |
  876|     30|            ss << message->content << "<|im_end|>";
  877|     30|        }
  878|      5|        if (add_ass) {
  ------------------
  |  Branch (878:13): [True: 5, False: 0]
  ------------------
  879|      5|            ss << "<|im_assistant|>assistant<|im_middle|>";
  880|      5|        }
  881|     55|    } else if (tmpl == LLM_CHAT_TEMPLATE_SEED_OSS) {
  ------------------
  |  Branch (881:16): [True: 16, False: 39]
  ------------------
  882|     96|        for (auto message: chat) {
  ------------------
  |  Branch (882:26): [True: 96, False: 16]
  ------------------
  883|     96|            std::string role(message->role);
  884|     96|            ss << "<seed:bos>" << role << "\n" << (role == "assistant" ? trim(message->content) : message->content) << "<seed:eos>";
  ------------------
  |  Branch (884:52): [True: 32, False: 64]
  ------------------
  885|     96|        }
  886|     16|        if (add_ass) {
  ------------------
  |  Branch (886:13): [True: 16, False: 0]
  ------------------
  887|     16|            ss << "<seed:bos>assistant\n";
  888|     16|        }
  889|     39|    } else if (tmpl == LLM_CHAT_TEMPLATE_GROK_2) {
  ------------------
  |  Branch (889:16): [True: 21, False: 18]
  ------------------
  890|    126|        for (auto message : chat) {
  ------------------
  |  Branch (890:27): [True: 126, False: 21]
  ------------------
  891|    126|            std::string role(message->role);
  892|    126|            if (role == "system") {
  ------------------
  |  Branch (892:17): [True: 21, False: 105]
  ------------------
  893|     21|                ss << "System: " << trim(message->content) << "<|separator|>\n\n";
  894|    105|            } else if (role == "user") {
  ------------------
  |  Branch (894:24): [True: 63, False: 42]
  ------------------
  895|     63|                ss << "Human: " << trim(message->content) << "<|separator|>\n\n";
  896|     63|            } else if (role == "assistant") {
  ------------------
  |  Branch (896:24): [True: 42, False: 0]
  ------------------
  897|     42|                ss << "Assistant: " << message->content << "<|separator|>\n\n";
  898|     42|            }
  899|    126|        }
  900|     21|        if (add_ass) {
  ------------------
  |  Branch (900:13): [True: 21, False: 0]
  ------------------
  901|     21|            ss << "Assistant:";
  902|     21|        }
  903|     21|    }else if (tmpl == LLM_CHAT_TEMPLATE_PANGU_EMBED) {
  ------------------
  |  Branch (903:15): [True: 15, False: 3]
  ------------------
  904|       |        // [unused9]系统：xxx[unused10]
  905|       |        // [unused9]用户：xxx[unused10]
  906|       |        // [unused9]助手：xxx[unused10]
  907|       |        // ...
  908|    105|        for (size_t i = 0; i < chat.size(); ++i) {
  ------------------
  |  Branch (908:28): [True: 90, False: 15]
  ------------------
  909|     90|            const auto & msg = chat[i];
  910|     90|            const std::string & role = msg->role;
  911|     90|            const std::string & content = msg->content;
  912|       |
  913|     90|            if (i == 0 && role != "system") {
  ------------------
  |  Branch (913:17): [True: 15, False: 75]
  |  Branch (913:27): [True: 0, False: 15]
  ------------------
  914|      0|                ss << "[unused9]系统：[unused10]";
  915|      0|            }
  916|       |
  917|     90|            if (role == "system") {
  ------------------
  |  Branch (917:17): [True: 15, False: 75]
  ------------------
  918|     15|                ss << "[unused9]系统：" << content << "[unused10]";
  919|     75|            } else if (role == "user") {
  ------------------
  |  Branch (919:24): [True: 45, False: 30]
  ------------------
  920|     45|                ss << "[unused9]用户：" << content << "[unused10]";
  921|     45|            } else if (role == "assistant") {
  ------------------
  |  Branch (921:24): [True: 30, False: 0]
  ------------------
  922|     30|                ss << "[unused9]助手：" << content << "[unused10]";
  923|     30|            } else if (role == "tool") {
  ------------------
  |  Branch (923:24): [True: 0, False: 0]
  ------------------
  924|      0|                ss << "[unused9]工具：" << content << "[unused10]";
  925|      0|            } else if (role == "function") {
  ------------------
  |  Branch (925:24): [True: 0, False: 0]
  ------------------
  926|      0|                ss << "[unused9]方法：" << content << "[unused10]";
  927|      0|            }
  928|     90|        }
  929|     15|        if (add_ass) {
  ------------------
  |  Branch (929:13): [True: 15, False: 0]
  ------------------
  930|     15|            ss << "[unused9]助手：";
  931|     15|        }
  932|     15|    } else if (tmpl == LLM_CHAT_TEMPLATE_SOLAR_OPEN) {
  ------------------
  |  Branch (932:16): [True: 3, False: 0]
  ------------------
  933|     18|        for (auto message : chat) {
  ------------------
  |  Branch (933:27): [True: 18, False: 3]
  ------------------
  934|     18|            std::string role(message->role);
  935|     18|            ss << "<|begin|>" << role << "<|content|>" << message->content << "<|end|>";
  936|     18|        }
  937|      3|        if (add_ass) {
  ------------------
  |  Branch (937:13): [True: 3, False: 0]
  ------------------
  938|      3|            ss << "<|begin|>assistant";
  939|      3|        }
  940|      3|    } else {
  941|       |        // template not supported
  942|      0|        return -1;
  943|      0|    }
  944|    902|    dest = ss.str();
  945|    902|    return dest.size();
  946|    902|}
llama-chat.cpp:_ZZ24llm_chat_detect_templateRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEEENK3$_0clEPKc:
   96|  34.8k|    auto tmpl_contains = [&tmpl](const char * haystack) -> bool {
   97|  34.8k|        return tmpl.find(haystack) != std::string::npos;
   98|  34.8k|    };
llama-chat.cpp:_ZL4trimRKNSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE:
   16|  2.32k|static std::string trim(const std::string & str) {
   17|  2.32k|    size_t start = 0;
   18|  2.32k|    size_t end = str.size();
   19|  24.2k|    while (start < end && isspace(static_cast<unsigned char>(str[start]))) {
  ------------------
  |  Branch (19:12): [True: 22.4k, False: 1.78k]
  |  Branch (19:27): [True: 21.9k, False: 532]
  ------------------
   20|  21.9k|        start += 1;
   21|  21.9k|    }
   22|  1.23M|    while (end > start && isspace(static_cast<unsigned char>(str[end - 1]))) {
  ------------------
  |  Branch (22:12): [True: 1.23M, False: 1.78k]
  |  Branch (22:27): [True: 1.22M, False: 532]
  ------------------
   23|  1.22M|        end -= 1;
   24|  1.22M|    }
   25|  2.32k|    return str.substr(start, end - start);
   26|  2.32k|}

llama_chat_apply_template:
  476|  1.65k|                                 int32_t   length) {
  477|  1.65k|    const std::string curr_tmpl(tmpl == nullptr ? "chatml" : tmpl);
  ------------------
  |  Branch (477:33): [True: 0, False: 1.65k]
  ------------------
  478|       |
  479|       |    // format the chat to string
  480|  1.65k|    std::vector<const llama_chat_message *> chat_vec;
  481|  1.65k|    chat_vec.resize(n_msg);
  482|  11.5k|    for (size_t i = 0; i < n_msg; i++) {
  ------------------
  |  Branch (482:24): [True: 9.93k, False: 1.65k]
  ------------------
  483|  9.93k|        chat_vec[i] = &chat[i];
  484|  9.93k|    }
  485|       |
  486|  1.65k|    std::string formatted_chat;
  487|  1.65k|    llm_chat_template detected_tmpl = llm_chat_detect_template(curr_tmpl);
  488|  1.65k|    if (detected_tmpl == LLM_CHAT_TEMPLATE_UNKNOWN) {
  ------------------
  |  Branch (488:9): [True: 753, False: 902]
  ------------------
  489|    753|        return -1;
  490|    753|    }
  491|    902|    int32_t res = llm_chat_apply_template(detected_tmpl, chat_vec, formatted_chat, add_ass);
  492|    902|    if (res < 0) {
  ------------------
  |  Branch (492:9): [True: 0, False: 902]
  ------------------
  493|      0|        return res;
  494|      0|    }
  495|    902|    if (buf && length > 0) {
  ------------------
  |  Branch (495:9): [True: 902, False: 0]
  |  Branch (495:16): [True: 902, False: 0]
  ------------------
  496|    902|        strncpy(buf, formatted_chat.c_str(), length);
  497|    902|    }
  498|    902|    return res;
  499|    902|}

