#include "jinja/caps.h"
#include "peg-parser.h"
+#include "nlohmann/json.hpp"
+
#include <cstdio>
#include <cstdlib>
#include <ctime>
}
}
-std::string common_chat_template_direct_apply(
+static std::string common_chat_template_direct_apply_impl(
const common_chat_template & tmpl,
const autoparser::generation_params & inputs,
- const std::optional<json> & messages_override,
- const std::optional<json> & tools_override,
- const std::optional<json> & additional_context) {
+ const std::optional<json> & messages_override = std::nullopt,
+ const std::optional<json> & tools_override = std::nullopt,
+ const std::optional<json> & additional_context = std::nullopt) {
jinja::context ctx(tmpl.source());
nlohmann::ordered_json inp = nlohmann::ordered_json{
return result;
}
+std::string common_chat_template_direct_apply(
+ const common_chat_template & tmpl,
+ const autoparser::generation_params & inputs) {
+ return common_chat_template_direct_apply_impl(tmpl, inputs, std::nullopt, std::nullopt, std::nullopt);
+}
+
static common_chat_params common_chat_params_init_ministral_3(const common_chat_template & tmpl,
const autoparser::generation_params & inputs) {
common_chat_params data;
data.supports_thinking = true;
data.thinking_start_tag = "[THINK]";
data.thinking_end_tag = "[/THINK]";
- data.prompt = common_chat_template_direct_apply(tmpl, inputs, /* messages_override = */ adjusted_messages);
+ data.prompt = common_chat_template_direct_apply_impl(tmpl, inputs, /* messages_override = */ adjusted_messages);
data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
data.preserved_tokens = {
"[THINK]",
adjusted_messages.push_back(msg);
}
- auto prompt = common_chat_template_direct_apply(tmpl, inputs, /* messages_override= */ adjusted_messages);
+ auto prompt = common_chat_template_direct_apply_impl(tmpl, inputs, /* messages_override= */ adjusted_messages);
// Check if we need to replace the return token with end token during
// inference and without generation prompt. For more details see:
const autoparser::generation_params & inputs) {
common_chat_params data;
- data.prompt = common_chat_template_direct_apply(tmpl, inputs);
+ data.prompt = common_chat_template_direct_apply_impl(tmpl, inputs);
data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
data.preserved_tokens = {
">>>all",
const autoparser::generation_params & inputs) {
common_chat_params data;
- data.prompt = common_chat_template_direct_apply(tmpl, inputs);
+ data.prompt = common_chat_template_direct_apply_impl(tmpl, inputs);
data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
data.supports_thinking = true;
data.preserved_tokens = {
const autoparser::generation_params & inputs) {
common_chat_params data;
- data.prompt = common_chat_template_direct_apply(tmpl, inputs);
+ data.prompt = common_chat_template_direct_apply_impl(tmpl, inputs);
data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
data.supports_thinking = true;
data.preserved_tokens = {
const autoparser::generation_params & inputs) {
common_chat_params data;
- data.prompt = common_chat_template_direct_apply(tmpl, inputs);
+ data.prompt = common_chat_template_direct_apply_impl(tmpl, inputs);
data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
data.supports_thinking = true;
data.preserved_tokens = {
common_chat_params data;
- data.prompt = common_chat_template_direct_apply(tmpl, inputs);
+ data.prompt = common_chat_template_direct_apply_impl(tmpl, inputs);
data.format = COMMON_CHAT_FORMAT_PEG_NATIVE;
data.supports_thinking = false;
data.preserved_tokens = {
}
params.add_generation_prompt = false;
- std::string no_gen_prompt = common_chat_template_direct_apply(tmpl, params);
+ std::string no_gen_prompt = common_chat_template_direct_apply_impl(tmpl, params);
params.add_generation_prompt = true;
- std::string gen_prompt = common_chat_template_direct_apply(tmpl, params);
+ std::string gen_prompt = common_chat_template_direct_apply_impl(tmpl, params);
auto diff = calculate_diff_split(no_gen_prompt, gen_prompt);
params.generation_prompt = diff.right;
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.prompt = common_chat_template_direct_apply_impl(tmpl, params_copy);
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) {
#pragma once
#include "common.h"
-#include "jinja/parser.h"
-#include "nlohmann/json_fwd.hpp"
#include "peg-parser.h"
+#include "jinja/parser.h"
#include "jinja/runtime.h"
#include "jinja/caps.h"
-#include "nlohmann/json.hpp"
+
+#include "nlohmann/json_fwd.hpp"
#include <chrono>
#include <functional>
using chat_template_caps = jinja::caps;
using json = nlohmann::ordered_json;
-#include <nlohmann/json_fwd.hpp>
-
struct common_chat_templates;
namespace autoparser {
const std::string & bos_token() const { return bos_tok; }
const std::string & eos_token() const { return eos_tok; }
- // TODO: this is ugly, refactor it somehow
- json add_system(const json & messages, const std::string & system_prompt) const {
- GGML_ASSERT(messages.is_array());
- auto msgs_copy = messages;
- if (!caps.supports_system_role) {
- if (msgs_copy.empty()) {
- msgs_copy.insert(msgs_copy.begin(), json{
- {"role", "user"},
- {"content", system_prompt}
- });
- } else {
- auto & first_msg = msgs_copy[0];
- if (!first_msg.contains("content")) {
- first_msg["content"] = "";
- }
- first_msg["content"] = system_prompt + "\n\n"
- + first_msg["content"].get<std::string>();
- }
- } else {
- if (msgs_copy.empty() || msgs_copy[0].at("role") != "system") {
- msgs_copy.insert(msgs_copy.begin(), json{
- {"role", "system"},
- {"content", system_prompt}
- });
- } else if (msgs_copy[0].at("role") == "system") {
- msgs_copy[0]["content"] = system_prompt;
- }
- }
- return msgs_copy;
- }
-
chat_template_caps original_caps() const {
return caps;
}
-
};
struct common_chat_msg {
const std::string & bos_token_override = "",
const std::string & eos_token_override = "");
-bool common_chat_templates_was_explicit(const struct common_chat_templates * tmpls);
-std::string common_chat_templates_source(const struct common_chat_templates * tmpls, const std::string & variant = "");
+bool common_chat_templates_was_explicit(const struct common_chat_templates * tmpls);
+std::string common_chat_templates_source(const struct common_chat_templates * tmpls, const std::string & variant = "");
struct common_chat_params common_chat_templates_apply(const struct common_chat_templates * tmpls,
const struct common_chat_templates_inputs & inputs);
bool use_jinja,
const std::map<std::string, std::string> & chat_template_kwargs);
-const char * common_chat_format_name(common_chat_format format);
-common_chat_msg common_chat_parse(const std::string & input, bool is_partial, const common_chat_parser_params & params);
-common_chat_msg common_chat_peg_parse(const common_peg_arena & src_parser, const std::string & input, bool is_partial, const common_chat_parser_params & params);
+const char * common_chat_format_name(common_chat_format format);
+common_chat_msg common_chat_parse(const std::string & input, bool is_partial, const common_chat_parser_params & params);
+common_chat_msg common_chat_peg_parse(const common_peg_arena & src_parser, const std::string & input, bool is_partial, const common_chat_parser_params & params);
// used by arg and server
const char * common_reasoning_format_name(common_reasoning_format format);
std::string common_chat_template_direct_apply(
const common_chat_template & tmpl,
- const autoparser::generation_params & inputs,
- const std::optional<json> & messages_override = std::nullopt,
- const std::optional<json> & tools_override = std::nullopt,
- const std::optional<json> & additional_context = std::nullopt);
+ const autoparser::generation_params & inputs);