@@ -1612,6 +1612,7 @@ enum llm_chat_template {
16121612 LLM_CHAT_TEMPLATE_MISTRAL_V3_TEKKEN,
16131613 LLM_CHAT_TEMPLATE_MISTRAL_V7,
16141614 LLM_CHAT_TEMPLATE_PHI_3,
1615+ LLM_CHAT_TEMPLATE_FALCON_3,
16151616 LLM_CHAT_TEMPLATE_ZEPHYR,
16161617 LLM_CHAT_TEMPLATE_MONARCH,
16171618 LLM_CHAT_TEMPLATE_GEMMA,
@@ -1644,6 +1645,7 @@ static const std::map<std::string, llm_chat_template> LLM_CHAT_TEMPLATES = {
16441645 { "mistral-v3-tekken", LLM_CHAT_TEMPLATE_MISTRAL_V3_TEKKEN },
16451646 { "mistral-v7", LLM_CHAT_TEMPLATE_MISTRAL_V7 },
16461647 { "phi3", LLM_CHAT_TEMPLATE_PHI_3 },
1648+ { "falcon3", LLM_CHAT_TEMPLATE_FALCON_3 },
16471649 { "zephyr", LLM_CHAT_TEMPLATE_ZEPHYR },
16481650 { "monarch", LLM_CHAT_TEMPLATE_MONARCH },
16491651 { "gemma", LLM_CHAT_TEMPLATE_GEMMA },
@@ -6473,6 +6475,11 @@ static void llm_load_vocab(
64736475 } else if (
64746476 tokenizer_pre == "falcon") {
64756477 vocab.type_pre = LLAMA_VOCAB_PRE_TYPE_FALCON;
6478+ } else if (
6479+ tokenizer_pre == "falcon3") {
6480+ vocab.type_pre = LLAMA_VOCAB_PRE_TYPE_LLAMA3;
6481+ vocab.tokenizer_ignore_merges = true;
6482+ vocab.tokenizer_add_bos = true;
64766483 } else if (
64776484 tokenizer_pre == "mpt") {
64786485 vocab.type_pre = LLAMA_VOCAB_PRE_TYPE_MPT;
@@ -22219,6 +22226,8 @@ static llm_chat_template llama_chat_detect_template(const std::string & tmpl) {
2221922226 }
2222022227 } else if (tmpl_contains("<|assistant|>") && tmpl_contains("<|end|>")) {
2222122228 return LLM_CHAT_TEMPLATE_PHI_3;
22229+ } else if (tmpl_contains("<|assistant|>") && tmpl_contains("<|user|>")) {
22230+ return LLM_CHAT_TEMPLATE_FALCON_3;
2222222231 } else if (tmpl_contains("<|user|>") && tmpl_contains("<|endoftext|>")) {
2222322232 return LLM_CHAT_TEMPLATE_ZEPHYR;
2222422233 } else if (tmpl_contains("bos_token + message['role']")) {
@@ -22371,6 +22380,15 @@ static int32_t llama_chat_apply_template_internal(
2237122380 if (add_ass) {
2237222381 ss << "<|assistant|>\n";
2237322382 }
22383+ } else if (tmpl == LLM_CHAT_TEMPLATE_FALCON_3) {
22384+ // Falcon 3
22385+ for (auto message : chat) {
22386+ std::string role(message->role);
22387+ ss << "<|" << role << "|>\n" << message->content << "\n";
22388+ }
22389+ if (add_ass) {
22390+ ss << "<|assistant|>\n";
22391+ }
2237422392 } else if (tmpl == LLM_CHAT_TEMPLATE_ZEPHYR) {
2237522393 // zephyr template
2237622394 for (auto message : chat) {
0 commit comments