From 34861194be060e5e848882cd04bf9c1d9cb187d9 Mon Sep 17 00:00:00 2001 From: Xuan Son Nguyen Date: Sat, 22 Aug 2026 00:48:33 +0200 Subject: [PATCH] revert redundant changes --- common/arg.cpp | 15 ++++++++------- common/chat-diff-analyzer.cpp | 6 +++--- common/chat-peg-parser.cpp | 1 - common/chat.cpp | 5 ++--- common/download.cpp | 2 +- common/hf-cache.cpp | 8 ++++---- common/jinja/caps.cpp | 2 +- common/jinja/value.cpp | 17 ++++++++--------- common/json-schema-to-grammar.cpp | 10 +++++----- common/json-schema-to-grammar.h | 1 - common/json.cpp | 4 ++++ common/json.h | 3 +++ tests/test-chat-template.cpp | 4 ++-- tools/server/server-chat.cpp | 2 +- tools/server/server-chat.h | 1 - tools/server/server-common.cpp | 21 ++++++++------------- tools/server/server-context.cpp | 1 - tools/server/server-mcp.cpp | 2 +- tools/server/server-schema.cpp | 2 +- tools/server/server-task.cpp | 2 -- tools/server/server-tools.cpp | 4 ++-- 21 files changed, 54 insertions(+), 59 deletions(-) diff --git a/common/arg.cpp b/common/arg.cpp index 4a36ff9b0c..9896f2ceff 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -54,6 +54,7 @@ #define LLAMA_MAX_URL_LENGTH 2084 // Maximum URL Length in Chrome: 2083 +using json = common_json; using namespace common_arg_utils; static std::initializer_list mmproj_examples = { @@ -2270,7 +2271,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex {"-j", "--json-schema"}, "SCHEMA", "JSON schema to constrain generations (https://json-schema.org/), e.g. `{}` for any JSON object\nFor schemas w/ external $refs, use --grammar + example/json_schema_to_grammar.py instead", [](common_params & params, const std::string & value) { - params.sampling.grammar = {COMMON_GRAMMAR_TYPE_OUTPUT_FORMAT, json_schema_to_grammar(common_json::parse(value))}; + params.sampling.grammar = {COMMON_GRAMMAR_TYPE_OUTPUT_FORMAT, json_schema_to_grammar(json::parse(value))}; } ).set_sampling()); add_opt(common_arg( @@ -2287,7 +2288,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex std::istreambuf_iterator(), std::back_inserter(schema) ); - params.sampling.grammar = {COMMON_GRAMMAR_TYPE_OUTPUT_FORMAT, json_schema_to_grammar(common_json::parse(schema))}; + params.sampling.grammar = {COMMON_GRAMMAR_TYPE_OUTPUT_FORMAT, json_schema_to_grammar(json::parse(schema))}; } ).set_sampling()); add_opt(common_arg( @@ -3498,13 +3499,13 @@ common_params_context common_params_parser_init(common_params & params, llama_ex {"--chat-template-kwargs"}, "STRING", "sets additional params for the json template parser, must be a valid json object string, e.g. '{\"key1\":\"value1\",\"key2\":\"value2\"}'", [](common_params & params, const std::string & value) { - auto parsed = common_json::parse(value); - for (const auto & [key, val] : parsed.items()) { - if (key == "enable_thinking") { + auto parsed = json::parse(value); + for (const auto & item : parsed.items()) { + if (item.key() == "enable_thinking") { LOG_WRN("Setting 'enable_thinking' via --chat-template-kwargs is deprecated. " "Use --reasoning on / --reasoning off instead.\n"); } - params.default_template_kwargs[key] = val.dump(); + params.default_template_kwargs[item.key()] = item.value().dump(); } } ).set_examples({LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_CLI}).set_env("LLAMA_ARG_CHAT_TEMPLATE_KWARGS")); @@ -3672,7 +3673,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex if (value == "default") { params.default_template_kwargs.erase("reasoning_effort"); } else { - params.default_template_kwargs["reasoning_effort"] = common_json::make(value).dump(); + params.default_template_kwargs["reasoning_effort"] = json(value).dump(); } } ).set_examples({LLAMA_EXAMPLE_SERVER, LLAMA_EXAMPLE_COMPLETION, LLAMA_EXAMPLE_CLI}).set_env("LLAMA_ARG_REASONING_EFFORT")); diff --git a/common/chat-diff-analyzer.cpp b/common/chat-diff-analyzer.cpp index 79ce8153bf..a7e370578f 100644 --- a/common/chat-diff-analyzer.cpp +++ b/common/chat-diff-analyzer.cpp @@ -6,9 +6,9 @@ #include "log.h" #include "peg-parser.h" -#include #include #include +#include #include #include @@ -930,9 +930,9 @@ void analyze_tools::analyze_tool_call_format_json_native(const std::string & cle std::string cut = clean_haystack.substr(json_start, json_end - json_start + 1); json call_struct = json::parse(cut); auto register_field = [&](const std::string & prefix, const common_json_entry & subel) { - if (subel.value().is_string() && subel.value().get().find("call0000") != std::string::npos) { + if (subel.value().is_string() && std::string(subel.value()).find("call0000") != std::string::npos) { format.id_field = !prefix.empty() ? prefix + "." + subel.key() : subel.key(); - } else if (subel.value().is_string() && subel.value().get() == fun_name_needle) { + } else if (subel.value().is_string() && std::string(subel.value()) == fun_name_needle) { format.name_field = !prefix.empty() ? prefix + "." + subel.key() : subel.key(); } else if (subel.value().dump().find(arg_name_needle) != std::string::npos) { // handle both string and JSON obj variants diff --git a/common/chat-peg-parser.cpp b/common/chat-peg-parser.cpp index e17134b6c2..79b97a80f1 100644 --- a/common/chat-peg-parser.cpp +++ b/common/chat-peg-parser.cpp @@ -4,7 +4,6 @@ #include "ggml.h" #include "peg-parser.h" - #include #include diff --git a/common/chat.cpp b/common/chat.cpp index 800c2cf1dd..24618d35ae 100644 --- a/common/chat.cpp +++ b/common/chat.cpp @@ -14,7 +14,6 @@ #include "jinja/caps.h" #include "peg-parser.h" - #include #include #include @@ -596,7 +595,7 @@ std::vector common_chat_tools_parse_oaicompat(const json & too const auto & function = tool.at("function"); result.push_back({ - /* .name = */ function.at("name").get(), + /* .name = */ function.at("name"), /* .description = */ function.value("description", ""), /* .parameters = */ function.value("parameters", json::object()).dump(), }); @@ -2483,7 +2482,7 @@ static common_chat_params common_chat_params_init_kimi_k3(const common_chat_temp std::string type = "string"; if (prop.value().is_object() && prop.value().contains("type") && prop.value().at("type").is_string()) { - type = prop.value().at("type"); + type = prop.value().at("type").get(); } auto value = type == "string" ? p.tool_arg_string_value(p.until(ARG_END)) : diff --git a/common/download.cpp b/common/download.cpp index a7513974b0..4b28a708c8 100644 --- a/common/download.cpp +++ b/common/download.cpp @@ -924,7 +924,7 @@ std::string common_docker_resolve_model(const std::string & docker) { std::string media_type = layer["mediaType"].get(); if (media_type == "application/vnd.docker.ai.gguf.v3" || media_type.find("gguf") != std::string::npos) { - gguf_digest = layer["digest"]; + gguf_digest = layer["digest"].get(); break; } } diff --git a/common/hf-cache.cpp b/common/hf-cache.cpp index 55c4d3b9b3..50d6dd6105 100644 --- a/common/hf-cache.cpp +++ b/common/hf-cache.cpp @@ -213,7 +213,7 @@ static common_json api_get(const std::string & url, return common_json::parse(res->body); } try { - body = common_json::parse(res->body)["error"]; + body = common_json::parse(res->body)["error"].get(); } catch (...) { } throw std::runtime_error("GET failed (" + std::to_string(res->status) + "): " + body); @@ -320,7 +320,7 @@ hf_files get_repo_files(const std::string & repo_id, hf_file file; file.repo_id = repo_id; - file.path = item["path"]; + file.path = item["path"].get(); if (!is_valid_subpath(commit_path, file.path)) { LOG_WRN("%s: skip invalid path: %s\n", __func__, file.path.c_str()); @@ -329,10 +329,10 @@ hf_files get_repo_files(const std::string & repo_id, if (item.contains("lfs") && item["lfs"].is_object()) { if (item["lfs"].contains("oid") && item["lfs"]["oid"].is_string()) { - file.oid = item["lfs"]["oid"]; + file.oid = item["lfs"]["oid"].get(); } } else if (item.contains("oid") && item["oid"].is_string()) { - file.oid = item["oid"]; + file.oid = item["oid"].get(); } if (!file.oid.empty() && !is_valid_oid(file.oid)) { diff --git a/common/jinja/caps.cpp b/common/jinja/caps.cpp index 53965d9903..9971c021e1 100644 --- a/common/jinja/caps.cpp +++ b/common/jinja/caps.cpp @@ -370,7 +370,7 @@ caps caps_get(jinja::program & prog) { caps_try_execute( prog, [&]() { - json args = json::make(R"({"arg": "value"})"); + json args = json(R"({"arg": "value"})"); if (result.supports_object_arguments) { args = json{{"arg", "value"}}; } diff --git a/common/jinja/value.cpp b/common/jinja/value.cpp index 1af09d6628..6999ef7d67 100644 --- a/common/jinja/value.cpp +++ b/common/jinja/value.cpp @@ -1378,8 +1378,8 @@ static value from_json(const common_json & j, bool mark_input) { return arr; } else if (j.is_object()) { auto obj = mk_val(); - for (const auto & [key, val] : j.items()) { - obj->insert(key, from_json(val, mark_input)); + for (auto it = j.begin(); it != j.end(); ++it) { + obj->insert(it.key(), from_json(it.value(), mark_input)); } return obj; } else { @@ -1451,19 +1451,18 @@ bool value_compare(const value & a, const value & b, value_compare_op op) { return result; } -template -void global_from_json(context & ctx, const T_JSON & json_obj, bool mark_input) { +template<> +void global_from_json(context & ctx, const common_json & json_obj, bool mark_input) { + // printf("global_from_json: %s\n" , json_obj.dump(2).c_str()); if (json_obj.is_null() || !json_obj.is_object()) { throw std::runtime_error("global_from_json: input JSON value must be an object"); } - for (const auto & [key, val] : json_obj.items()) { - JJ_DEBUG("global_from_json: setting key '%s'", key.c_str()); - ctx.set_val(key, from_json(val, mark_input)); + for (auto it = json_obj.begin(); it != json_obj.end(); ++it) { + JJ_DEBUG("global_from_json: setting key '%s'", it.key().c_str()); + ctx.set_val(it.key(), from_json(it.value(), mark_input)); } } -template void global_from_json(context &, const common_json &, bool); - // recursively convert value to JSON string // TODO: avoid circular references static void value_to_json_internal(std::ostringstream & oss, const value & val, int curr_lvl, int indent, const std::string_view item_sep, const std::string_view key_sep) { diff --git a/common/json-schema-to-grammar.cpp b/common/json-schema-to-grammar.cpp index c7b63724bc..2c873905d5 100644 --- a/common/json-schema-to-grammar.cpp +++ b/common/json-schema-to-grammar.cpp @@ -916,7 +916,7 @@ public: std::string rule_name = is_reserved_name(name) ? name + "-" : name.empty() ? "root" : name; if (schema.contains("$ref")) { - return _add_rule(rule_name, _resolve_ref(schema["$ref"].get())); + return _add_rule(rule_name, _resolve_ref(schema["$ref"])); } if (schema.contains("oneOf") || schema.contains("anyOf")) { const json & alts = schema.contains("oneOf") ? schema.at("oneOf") : schema.at("anyOf"); @@ -974,7 +974,7 @@ public: const std::string& hybrid_name = name; std::function add_component = [&](const json & comp_schema, bool is_required) { if (comp_schema.contains("$ref")) { - add_component(_refs[comp_schema["$ref"].get()], is_required); + add_component(_refs[comp_schema["$ref"]], is_required); } else if (comp_schema.contains("properties")) { for (const auto & prop : comp_schema["properties"].items()) { properties.emplace_back(prop.key(), prop.value()); @@ -1037,7 +1037,7 @@ public: return _add_rule(rule_name, "\"[\" space " + build_repetition(item_rule_name, min_items, max_items, "\",\" space") + " space \"]\""); } if ((schema_type.is_null() || schema_type == "string") && schema.contains("pattern")) { - return _visit_pattern(schema["pattern"].get(), rule_name); + return _visit_pattern(schema["pattern"], rule_name); } if ((schema_type.is_null() || schema_type == "string") && std::regex_match(schema_format, std::regex("^uuid[1-5]?$"))) { return _add_primitive(rule_name == "root" ? "root" : schema_format, PRIMITIVE_RULES.at("uuid")); @@ -1135,7 +1135,7 @@ bool common_schema_info::resolves_to_string(const common_json & schema) { // Handle $ref if (s.contains("$ref")) { - const std::string ref = s["$ref"]; + const std::string & ref = s["$ref"]; if (visited_refs.find(ref) != visited_refs.end()) { // Circular reference, assume not a string to be safe return false; @@ -1218,7 +1218,7 @@ bool common_schema_info::resolves_to_string(const common_json & schema) { // Check format - many formats imply string if (s.contains("format")) { - const std::string fmt = s["format"]; + const std::string & fmt = s["format"]; if (fmt == "date" || fmt == "time" || fmt == "date-time" || fmt == "uri" || fmt == "email" || fmt == "hostname" || fmt == "ipv4" || fmt == "ipv6" || fmt == "uuid" || diff --git a/common/json-schema-to-grammar.h b/common/json-schema-to-grammar.h index cc84d4f6cd..84ed71c76a 100644 --- a/common/json-schema-to-grammar.h +++ b/common/json-schema-to-grammar.h @@ -2,7 +2,6 @@ #include "json.h" - #include #include #include diff --git a/common/json.cpp b/common/json.cpp index 8f9ca72fd3..a40622437b 100644 --- a/common/json.cpp +++ b/common/json.cpp @@ -82,6 +82,10 @@ common_json_value::common_json_value(const char * val) { common_json_value::common_json_value(const common_json & val) : type(VAL_JSON), val_json(std::make_shared(val)) {} +common_json_value::common_json_value(const std::map & vals) : type(VAL_JSON) { + val_json = std::make_shared(common_json_from_raw(ordered_json(vals))); +} + template common_json_value::common_json_value(const std::vector & vals) : type(VAL_JSON) { common_json out = common_json::array(); diff --git a/common/json.h b/common/json.h index f760c243ed..bc4b65b031 100644 --- a/common/json.h +++ b/common/json.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,8 @@ struct common_json_value { common_json_value(std::string_view val) : type(VAL_STRING), val_string(val) {} common_json_value(const char * val); common_json_value(const common_json & val); + // becomes an object, so a plain string map can be passed where a JSON value is expected + common_json_value(const std::map & vals); // only for the types instantiated in json.cpp, the rest fails at link time template common_json_value(const std::vector & vals); diff --git a/tests/test-chat-template.cpp b/tests/test-chat-template.cpp index 5255155af3..bcc574afe9 100644 --- a/tests/test-chat-template.cpp +++ b/tests/test-chat-template.cpp @@ -299,10 +299,10 @@ void run_single(const std::string& contents, json input, bool use_common, bool d std::string bos_token = ""; std::string eos_token = ""; if (input.contains("bos_token")) { - bos_token = input["bos_token"]; + bos_token = input["bos_token"].get(); } if (input.contains("eos_token")) { - eos_token = input["eos_token"]; + eos_token = input["eos_token"].get(); } common_json msgs_json = input["messages"]; common_json tools_json = input["tools"]; diff --git a/tools/server/server-chat.cpp b/tools/server/server-chat.cpp index 17e4e2d098..a6fe3c6ba6 100644 --- a/tools/server/server-chat.cpp +++ b/tools/server/server-chat.cpp @@ -341,7 +341,7 @@ json server_chat_convert_anthropic_to_oai(const json & body) { std::string system_content; if (system_param.is_string()) { - system_content = system_param; + system_content = system_param.get(); normalize_anthropic_billing_header(system_content); } else if (system_param.is_array()) { for (const auto & block : system_param) { diff --git a/tools/server/server-chat.h b/tools/server/server-chat.h index 2b4945980c..86b842650e 100644 --- a/tools/server/server-chat.h +++ b/tools/server/server-chat.h @@ -8,7 +8,6 @@ #include "json.h" - // Convert OpenAI Responses API format to OpenAI Chat Completions API format json server_chat_convert_responses_to_chatcmpl(const json & body); diff --git a/tools/server/server-common.cpp b/tools/server/server-common.cpp index 8111a3ba10..4f5b8202ac 100644 --- a/tools/server/server-common.cpp +++ b/tools/server/server-common.cpp @@ -9,7 +9,6 @@ #include "server-common.h" - #include #include #include @@ -978,9 +977,9 @@ static server_tokens tokenize_input_subprompt(const llama_vocab * vocab, mtmd_co // JSON object with prompt and multimodal key. std::vector files; for (const auto & entry : json_prompt.at(JSON_MTMD_DATA_KEY)) { - files.push_back(base64_decode(entry.get())); + files.push_back(base64_decode(entry)); } - return process_mtmd_prompt(mctx, json_prompt.at(JSON_STRING_PROMPT_KEY).get(), files); + return process_mtmd_prompt(mctx, json_prompt.at(JSON_STRING_PROMPT_KEY), files); } else { // Not multimodal, but contains a subobject. llama_tokens tmp = tokenize_mixed(vocab, json_prompt.at(JSON_STRING_PROMPT_KEY), add_special, parse_special); @@ -1301,8 +1300,7 @@ json oaicompat_chat_params_parse( } // parse the "enable_thinking" kwarg to override the default value - const auto kwarg_it = inputs.chat_template_kwargs.find("enable_thinking"); - std::string enable_thinking_kwarg = kwarg_it == inputs.chat_template_kwargs.end() ? "" : kwarg_it->second; + auto enable_thinking_kwarg = json_value(inputs.chat_template_kwargs, "enable_thinking", std::string("")); if (enable_thinking_kwarg == "true") { inputs.enable_thinking = true; } else if (enable_thinking_kwarg == "false") { @@ -1318,7 +1316,7 @@ json oaicompat_chat_params_parse( inputs.enable_thinking = false; inputs.chat_template_kwargs.erase("reasoning_effort"); } else if (!reasoning_effort.empty()) { - inputs.chat_template_kwargs["reasoning_effort"] = json::make(reasoning_effort).dump(); + inputs.chat_template_kwargs["reasoning_effort"] = json(reasoning_effort).dump(); } } @@ -1467,10 +1465,7 @@ json format_response_rerank( }); elements.resize(std::min(top_n, (int)elements.size())); - json results = json::array(); - for (const auto & el : elements) { - results.push_back(el); - } + json results = elements; if (is_tei_format) return results; @@ -1795,12 +1790,12 @@ server_tokens format_prompt_rerank( std::string prompt = rerank_prompt; string_replace_all(prompt, "{query}" , query); string_replace_all(prompt, "{document}", doc ); - server_tokens tokens = tokenize_input_subprompt(vocab, mctx, json::make(prompt), false, true); + server_tokens tokens = tokenize_input_subprompt(vocab, mctx, prompt, false, true); result.push_back(tokens); } else { // Get EOS token - use SEP token as fallback if EOS is not available - server_tokens query_tokens = tokenize_input_subprompt(vocab, mctx, json::make(query), false, false); - server_tokens doc_tokens = tokenize_input_subprompt(vocab, mctx, json::make(doc), false, false); + server_tokens query_tokens = tokenize_input_subprompt(vocab, mctx, query, false, false); + server_tokens doc_tokens = tokenize_input_subprompt(vocab, mctx, doc, false, false); llama_token eos_token = llama_vocab_eos(vocab); if (eos_token == LLAMA_TOKEN_NULL) { eos_token = llama_vocab_sep(vocab); diff --git a/tools/server/server-context.cpp b/tools/server/server-context.cpp index 744ffccd3a..c47c063b76 100644 --- a/tools/server/server-context.cpp +++ b/tools/server/server-context.cpp @@ -35,7 +35,6 @@ #include #endif - constexpr int HTTP_POLLING_SECONDS = 1; static common_speculative_output_limits server_output_limits(const common_params & params) { diff --git a/tools/server/server-mcp.cpp b/tools/server/server-mcp.cpp index fcac5061c8..93db6164d3 100644 --- a/tools/server/server-mcp.cpp +++ b/tools/server/server-mcp.cpp @@ -157,7 +157,7 @@ std::vector server_mcp_server_config::parse_cursor_for } if (cfg.contains("env") && cfg.at("env").is_object()) { for (const auto & [k, v] : cfg.at("env").items()) { - sc.env[k] = v; + sc.env[k] = v.get(); } } diff --git a/tools/server/server-schema.cpp b/tools/server/server-schema.cpp index 7b368ef788..64b9251295 100644 --- a/tools/server/server-schema.cpp +++ b/tools/server/server-schema.cpp @@ -487,7 +487,7 @@ std::vector> make_llama_cmpl_schema(const common_params & const auto & stop = data.at("stop"); if (stop.is_array()) { for (const auto & word : stop) { - if (!word.empty()) ctx.params.antiprompt.push_back(word.get()); + if (!word.empty()) ctx.params.antiprompt.push_back(word); } } else if (stop.is_string()) { ctx.params.antiprompt.push_back(stop.get()); diff --git a/tools/server/server-task.cpp b/tools/server/server-task.cpp index 2bca3dd744..0d3beb313c 100644 --- a/tools/server/server-task.cpp +++ b/tools/server/server-task.cpp @@ -1,6 +1,5 @@ #include "server-task.h" - #include "build-info.h" #include "server-chat.h" #include "chat.h" @@ -13,7 +12,6 @@ #include - // // task_params // diff --git a/tools/server/server-tools.cpp b/tools/server/server-tools.cpp index 9861809d11..12e9dbb8cf 100644 --- a/tools/server/server-tools.cpp +++ b/tools/server/server-tools.cpp @@ -1420,8 +1420,8 @@ struct server_tool_edit_file : server_tool { edits.reserve(edits_json.size()); for (const auto & e : edits_json) { edit_req er; - er.old_text = e.at("old_text"); - er.new_text = e.at("new_text"); + er.old_text = e.at("old_text").get(); + er.new_text = e.at("new_text").get(); if (er.old_text.empty()) { return {{"error", string_format("edits[%zu].old_text must not be empty", edits.size())}}; }