From e15efe007dc1c0d79afa347190dba91de3bd659b Mon Sep 17 00:00:00 2001 From: "Piotr Wilkin (ilintar)" Date: Thu, 2 Apr 2026 11:29:11 +0200 Subject: [PATCH] Relax prefill parser to allow space. (#21240) * Relax prefill parser to allow space. * Move changes from prefix() to parser generation * Only allow spaces if we're not having a pure content parser next --- common/chat-auto-parser-generator.cpp | 5 ++++- common/chat.cpp | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/common/chat-auto-parser-generator.cpp b/common/chat-auto-parser-generator.cpp index 3f036bb5b2..e38541fd04 100644 --- a/common/chat-auto-parser-generator.cpp +++ b/common/chat-auto-parser-generator.cpp @@ -100,6 +100,7 @@ common_peg_arena autoparser::build_parser(const generation_params & inputs) cons bool has_tools = inputs.tools.is_array() && !inputs.tools.empty(); bool has_response_format = inputs.json_schema.is_object() && !inputs.json_schema.empty(); + bool pure_content = reasoning.mode == reasoning_mode::NONE; if (has_response_format) { auto response_format = p.rule("response-format", p.content(p.schema(p.json(), "response-format-schema", inputs.json_schema))); @@ -107,12 +108,14 @@ common_peg_arena autoparser::build_parser(const generation_params & inputs) cons p.literal("```json") + p.space() + response_format + p.space() + p.literal("```"), response_format }) + p.end(); + pure_content = false; } else if (has_tools && inputs.tool_choice != COMMON_CHAT_TOOL_CHOICE_NONE && jinja_caps.supports_tool_calls) { parser = tools.build_parser(ctx); + pure_content = false; } else { parser = content.build_parser(ctx); } - return p.prefix(inputs.generation_prompt, reasoning.start) + parser; + return pure_content ? p.prefix(inputs.generation_prompt, reasoning.start) + parser : p.prefix(inputs.generation_prompt, reasoning.start) << parser; }); } diff --git a/common/chat.cpp b/common/chat.cpp index 7536c0cd01..5ccb238f20 100644 --- a/common/chat.cpp +++ b/common/chat.cpp @@ -1709,7 +1709,7 @@ static common_chat_params common_chat_templates_apply_jinja(const struct common_ data.format = COMMON_CHAT_FORMAT_PEG_NATIVE; data.generation_prompt = params.generation_prompt; auto parser = build_chat_peg_parser([¶ms](common_chat_peg_builder &p) { - return p.prefix(params.generation_prompt) + p.content(p.rest()); + return p.prefix(params.generation_prompt) << p.content(p.rest()); }); data.parser = parser.save(); return data;