]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
common/parser: add `--skip-chat-parsing` to force a pure content parser. (#20289)
authorPiotr Wilkin (ilintar) <redacted>
Tue, 17 Mar 2026 15:16:43 +0000 (16:16 +0100)
committerGitHub <redacted>
Tue, 17 Mar 2026 15:16:43 +0000 (16:16 +0100)
* Add `--force-pure-content` to force a pure content parser.

* Update common/arg.cpp

Co-authored-by: Sigbjørn Skjæret <redacted>
* Change parameter name [no ci]

---------

Co-authored-by: Sigbjørn Skjæret <redacted>
common/arg.cpp
common/chat.cpp
common/chat.h
common/common.h
tools/cli/cli.cpp
tools/completion/completion.cpp
tools/server/server-common.cpp
tools/server/server-common.h
tools/server/server-context.cpp

index 10aa1b5e4fece1a27bb962eaab332251b488b588..666339a0945c337ba645c8cb494d4cc4b789d989 100644 (file)
@@ -3115,6 +3115,17 @@ common_params_context common_params_parser_init(common_params & params, llama_ex
             params.chat_template = read_file(value);
         }
     ).set_examples({LLAMA_EXAMPLE_COMPLETION, LLAMA_EXAMPLE_CLI, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_CHAT_TEMPLATE_FILE"));
+    add_opt(common_arg(
+        {"--skip-chat-parsing"},
+        {"--no-skip-chat-parsing"},
+        string_format(
+            "force a pure content parser, even if a Jinja template is specified; model will output everything "
+            "in the content section, including any reasoning and/or tool calls (default: disabled)"
+        ),
+        [](common_params & params, bool value) {
+            params.force_pure_content_parser = value;
+        }
+    ).set_examples({LLAMA_EXAMPLE_COMPLETION, LLAMA_EXAMPLE_CLI, LLAMA_EXAMPLE_SERVER}).set_env("LLAMA_ARG_SKIP_CHAT_PARSING"));
     add_opt(common_arg(
         {"--prefill-assistant"},
         {"--no-prefill-assistant"},
index 056feb9681fb4cca43a4bd699e60c1a9d2466770..fb4751e5319f1182b2c66ed9aa3293f4f4634b4a 100644 (file)
@@ -1562,6 +1562,21 @@ static common_chat_params common_chat_templates_apply_jinja(const struct common_
         }
     }
 
+    if (inputs.force_pure_content) {
+        LOG_WRN("Forcing pure content template, will not render reasoning or tools separately.");
+        // Create the result structure
+        common_chat_params data;
+        auto params_copy               = params;
+        params_copy.reasoning_format   = COMMON_REASONING_FORMAT_NONE;
+        data.prompt                    = common_chat_template_direct_apply(tmpl, params_copy);
+        data.format                    = COMMON_CHAT_FORMAT_PEG_NATIVE;
+        auto parser                    = build_chat_peg_parser([](common_chat_peg_builder &p) {
+            return p.content(p.rest());
+        });
+        data.parser                    = parser.save();
+        return data;
+    }
+
     // Ministral/Mistral Large 3 - uses special reasoning structure fixes, can't use autoparser
     // Note: Mistral Small 3.2 uses [CALL_ID] which Ministral doesn't have, so we can distinguish them
     if (src.find("[SYSTEM_PROMPT]") != std::string::npos && src.find("[TOOL_CALLS]") != std::string::npos &&
index 930987cf77b9ab6622ed279a66e4b8772e9e1564..23e80baf698f95de82ffaee376ae95a520967372 100644 (file)
@@ -204,6 +204,7 @@ struct common_chat_templates_inputs {
     std::map<std::string, std::string>    chat_template_kwargs;
     bool                                  add_bos = false;
     bool                                  add_eos = false;
+    bool                                  force_pure_content = false;
 };
 
 struct common_chat_params {
index ee7a2d805e090ccb822deb14639c7cb273b45f95..073ef566d2d5320e4ce2b3392490c2cd970a12db 100644 (file)
@@ -544,6 +544,7 @@ struct common_params {
     std::string chat_template = "";                                                                         // NOLINT
     bool use_jinja = true;                                                                                  // NOLINT
     bool enable_chat_template = true;
+    bool force_pure_content_parser = false;
     common_reasoning_format reasoning_format = COMMON_REASONING_FORMAT_DEEPSEEK;
     int enable_reasoning = -1; // -1 = auto, 0 = disable, 1 = enable
     int reasoning_budget = -1;
index 7c4342d6bf26fc7a4be851be92e7f23ef2f9d169..94182b2ad8a47abedd37a1521b15278a9468cc5e 100644 (file)
@@ -215,6 +215,7 @@ struct cli_context {
         inputs.parallel_tool_calls   = false;
         inputs.add_generation_prompt = true;
         inputs.reasoning_format      = COMMON_REASONING_FORMAT_DEEPSEEK;
+        inputs.force_pure_content    = chat_params.force_pure_content;
         inputs.enable_thinking       = chat_params.enable_thinking ? common_chat_templates_support_enable_thinking(chat_params.tmpls.get()) : false;
 
         // Apply chat template to the list of messages
index 2e0f0871847f34664e9f352f92d4f6f47107d084..58d598fcc07801684c3eb37b3a8dedfa70a193fc 100644 (file)
@@ -308,6 +308,7 @@ int main(int argc, char ** argv) {
                 inputs.use_jinja = g_params->use_jinja;
                 inputs.messages = chat_msgs;
                 inputs.add_generation_prompt = !params.prompt.empty();
+                inputs.force_pure_content = params.force_pure_content_parser;
 
                 prompt = common_chat_templates_apply(chat_templates.get(), inputs).prompt;
             }
index d55987c6d26bf3c67cc878d9e78be4dda999bc36..59ea11fc47eeea15de325181dd58d3f58fb24edd 100644 (file)
@@ -1065,6 +1065,7 @@ json oaicompat_chat_params_parse(
 
         inputs.add_generation_prompt = true;
     }
+    inputs.force_pure_content = opt.force_pure_content;
 
     // Apply chat template to the list of messages
     auto chat_params = common_chat_templates_apply(opt.tmpls.get(), inputs);
index 3e56b3d856dcad6df326a0479f77f4f364659ebc..213ae52bb09e605ea1d11f18de70ce6b8ee6f7d0 100644 (file)
@@ -290,6 +290,7 @@ struct server_chat_params {
     int  reasoning_budget = -1;
     std::string reasoning_budget_message;
     std::string media_path;
+    bool force_pure_content = false;
 };
 
 // used by /completions endpoint
index 05d6da10063f11ab94d607cfc0b290d460576e3e..1e5ff101c85678c9fc40314185e4f9b1b9e9e5dd 100644 (file)
@@ -911,6 +911,7 @@ private:
                 /* reasoning_budget      */ params_base.reasoning_budget,
                 /* reasoning_budget_msg  */ params_base.reasoning_budget_message,
                 /* media_path            */ params_base.media_path,
+                /* force_pure_content    */ params_base.force_pure_content_parser
             };
         }