diff --git a/common/jinja/jinja-value.cpp b/common/jinja/jinja-value.cpp index 5a515fc8e4..6c3d9249b3 100644 --- a/common/jinja/jinja-value.cpp +++ b/common/jinja/jinja-value.cpp @@ -165,6 +165,11 @@ const func_builtins & global_builtins() { } return out; }}, + {"tojson", [](const func_args & args) -> value { + args.ensure_count(1); + // placeholder implementation + return mk_val("TODO: to_json output"); + }}, // tests {"test_is_boolean", test_type_fn}, @@ -646,7 +651,12 @@ const func_builtins & value_object_t::get_builtins() const { } return result; }}, - {{"dictsort"}, [](const func_args & args) -> value { + {"tojson", [](const func_args & args) -> value { + args.ensure_vals(); + // use global to_json + return global_builtins().at("tojson")(args); + }}, + {"dictsort", [](const func_args & args) -> value { // no-op args.ensure_vals(); return args.args[0]; diff --git a/common/jinja/jinja-vm.cpp b/common/jinja/jinja-vm.cpp index ed98f1d050..d6958a54c9 100644 --- a/common/jinja/jinja-vm.cpp +++ b/common/jinja/jinja-vm.cpp @@ -312,10 +312,19 @@ value test_expression::execute_impl(context & ctx) { throw std::runtime_error("Unknown test '" + test_id + "'"); } + value input = operand->execute(ctx); + func_args args(ctx); - args.args.push_back(operand->execute(ctx)); + args.args.push_back(input); auto res = it->second(args); + // hack: allow type inference + if (test_id == "defined" || test_id == "undefined" || test_id == "none") { + ctx.mark_known_type(input, inferred_type::optional); + } else if (test_id == "string") { + ctx.mark_known_type(input, inferred_type::string); + } + if (negate) { return mk_val(!res->as_bool()); } else { diff --git a/common/jinja/jinja-vm.h b/common/jinja/jinja-vm.h index bb24abad96..0ac2e5f16a 100644 --- a/common/jinja/jinja-vm.h +++ b/common/jinja/jinja-vm.h @@ -105,8 +105,9 @@ public: if (is_val(val)) { auto & obj = val->as_object(); for (const auto & pair : obj) { - flatten_globals[pair.first] = pair.second; - set_flattened_global_recursively(pair.first, pair.second); + std::string child_path = path + "." + pair.first; + flatten_globals[child_path] = pair.second; + set_flattened_global_recursively(child_path, pair.second); } } else if (is_val(val)) { auto & arr = val->as_array(); diff --git a/tests/test-chat-jinja.cpp b/tests/test-chat-jinja.cpp index 39ce9fed00..c205b150cf 100644 --- a/tests/test-chat-jinja.cpp +++ b/tests/test-chat-jinja.cpp @@ -123,6 +123,21 @@ void run_single(std::string contents) { { "role": "assistant", "content": {"__input__": "I am fine, thank you!"} + }, + { + "role": "assistant", + "content": "Calling weather tool.", + "tool_calls": [ + { + "function": { + "name": "get_weather", + "arguments": { + "location": "New York", + "unit": "celsius" + } + } + } + ] } ], "bos_token": "",