cont : make assistant start optional

This commit is contained in:
Alde Rojas 2026-01-02 08:33:09 -06:00
parent 92aad3d73b
commit 980c772d44
No known key found for this signature in database
1 changed files with 10 additions and 9 deletions

View File

@ -2547,8 +2547,6 @@ static common_chat_params common_chat_params_init_solar_open(const common_chat_t
}
}
auto enable_thinking = prompt.rfind("<|think|><|end|>") == std::string::npos;
data.prompt = prompt;
data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
data.preserved_tokens = {
@ -2570,6 +2568,9 @@ static common_chat_params common_chat_params_init_solar_open(const common_chat_t
auto lit_end = p.atomic(p.literal("<|end|>"));
auto parser_until_end = p.until("<|end|>");
// prefix <- "<|begin|>assistant"?
auto parser_prefix = p.optional(lit_assistant_begin);
// reasoning <- "<|think|>" (!"<|end|>" .)*
auto parser_reasoning = p.rule("reasoning", lit_think + p.reasoning(parser_until_end));
@ -2581,8 +2582,7 @@ static common_chat_params common_chat_params_init_solar_open(const common_chat_t
// wrapped <- "<|end|><|begin|>assistant" item-choice
auto wrap_choice = [&](const std::vector<common_peg_parser> & items) {
auto choice = p.choice(items);
auto first = enable_thinking ? choice : lit_assistant_begin + choice;
return first + p.zero_or_more(lit_end + lit_assistant_begin + choice);
return choice + p.zero_or_more(lit_end + lit_assistant_begin + choice);
};
// wrap_seq(items) <- item[0] "<|end|><|begin|>assistant" item[1] ...
@ -2590,7 +2590,7 @@ static common_chat_params common_chat_params_init_solar_open(const common_chat_t
auto seq = p.sequence();
for (auto i = 0u; i < items.size(); i++) {
if (i == 0) {
seq += enable_thinking ? items[i] : lit_assistant_begin + items[i];
seq += items[i];
continue;
}
seq += lit_end + lit_assistant_begin + items[i];
@ -2601,7 +2601,7 @@ static common_chat_params common_chat_params_init_solar_open(const common_chat_t
// Response format parser
if (inputs.json_schema.is_object() && !inputs.json_schema.empty()) {
auto parser_response_format = lit_content + p.content(p.schema(p.json(), "response-format", inputs.json_schema));
return p.choice({
return parser_prefix + p.choice({
wrap_seq({parser_reasoning, parser_response_format}),
wrap_seq({parser_response_format})
});
@ -2648,19 +2648,20 @@ static common_chat_params common_chat_params_init_solar_open(const common_chat_t
if (min_calls == 1) {
// If required, then try any combination of the reasoning, content, and tool call
p.choice({
return parser_prefix + p.choice({
wrap_seq({parser_reasoning, parser_content, parser_tool_calls}),
wrap_seq({parser_reasoning, parser_tool_calls}),
wrap_seq({parser_content, parser_tool_calls}),
wrap_seq({parser_tool_calls})
});
}
return wrap_choice({parser_reasoning, parser_content, parser_tool_calls});
return parser_prefix + wrap_choice({parser_reasoning, parser_content, parser_tool_calls});
}
// Content only parser
include_grammar = false;
return wrap_choice({parser_reasoning, parser_content});
return parser_prefix + wrap_choice({parser_reasoning, parser_content});
});
data.parser = parser.save();