From ee3a5a10adf9e83722d1914dddc56a0623ececaf Mon Sep 17 00:00:00 2001 From: Olivier Chafik Date: Mon, 3 Nov 2025 05:33:56 +0000 Subject: [PATCH] sync: minja (glm 4.6 & minmax m2 templates) (#16949) * sync: minja * Sync https://github.com/ochafik/minja/pull/7 (MinMax M2) --- vendor/minja/chat-template.hpp | 11 +++++++++-- vendor/minja/minja.hpp | 12 +++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/vendor/minja/chat-template.hpp b/vendor/minja/chat-template.hpp index d5295b335b..f080aa92f1 100644 --- a/vendor/minja/chat-template.hpp +++ b/vendor/minja/chat-template.hpp @@ -192,18 +192,25 @@ class chat_template { }; }; const json dummy_args_obj {{"argument_needle", "print('Hello, World!')"}}; + const auto contains_arg_needle = [&](const std::string & out_str) { + return contains(out_str, "") + || contains(out_str, "\"argument_needle\":") + || contains(out_str, "'argument_needle':") + || contains(out_str, ">argument_needle<") + || contains(out_str, ""); + }; // Note: the arguments are rendered in both cases, but may be double-escaped, which we don't want. out = try_raw_render(json::array({ dummy_user_msg, make_tool_calls_msg(json::array({make_tool_call("ipython", dummy_args_obj.dump())})), }), {}, false); - auto tool_call_renders_str_arguments = contains(out, "") || contains(out, "\"argument_needle\":") || contains(out, "'argument_needle':"); + auto tool_call_renders_str_arguments = contains_arg_needle(out); out = try_raw_render(json::array({ dummy_user_msg, make_tool_calls_msg(json::array({make_tool_call("ipython", dummy_args_obj)})), }), {}, false); - auto tool_call_renders_obj_arguments = contains(out, "") || contains(out, "\"argument_needle\":") || contains(out, "'argument_needle':"); + auto tool_call_renders_obj_arguments = contains_arg_needle(out); caps_.supports_tool_calls = tool_call_renders_str_arguments || tool_call_renders_obj_arguments; caps_.requires_object_arguments = !tool_call_renders_str_arguments && tool_call_renders_obj_arguments; diff --git a/vendor/minja/minja.hpp b/vendor/minja/minja.hpp index 57b138add6..873ece8c18 100644 --- a/vendor/minja/minja.hpp +++ b/vendor/minja/minja.hpp @@ -2205,7 +2205,7 @@ private: auto value = parseValue(); - while (it != end && consumeSpaces() && peekSymbols({ "[", "." })) { + while (it != end && consumeSpaces() && peekSymbols({ "[", ".", "(" })) { if (!consumeToken("[").empty()) { std::shared_ptr index; auto slice_loc = get_location(); @@ -2250,15 +2250,13 @@ private: auto key = std::make_shared(identifier->location, Value(identifier->get_name())); value = std::make_shared(identifier->location, std::move(value), std::move(key)); } + } else if (peekSymbols({ "(" })) { + auto callParams = parseCallArgs(); + value = std::make_shared(get_location(), std::move(value), std::move(callParams)); } consumeSpaces(); } - if (peekSymbols({ "(" })) { - auto location = get_location(); - auto callParams = parseCallArgs(); - value = std::make_shared(location, std::move(value), std::move(callParams)); - } return value; } @@ -2738,7 +2736,7 @@ inline std::shared_ptr Context::builtins() { globals.set("raise_exception", simple_function("raise_exception", { "message" }, [](const std::shared_ptr &, Value & args) -> Value { throw std::runtime_error(args.at("message").get()); })); - globals.set("tojson", simple_function("tojson", { "value", "indent" }, [](const std::shared_ptr &, Value & args) { + globals.set("tojson", simple_function("tojson", { "value", "indent", "ensure_ascii" }, [](const std::shared_ptr &, Value & args) { return Value(args.at("value").dump(args.get("indent", -1), /* to_json= */ true)); })); globals.set("items", simple_function("items", { "object" }, [](const std::shared_ptr &, Value & args) {