mirror of
https://github.com/LostRuins/koboldcpp.git
synced 2026-09-05 04:21:12 +02:00
common: add json.h abstraction (#27511)
* add common/json * migrate common * adapt jinja * migrate server * big wip * migrate tests * wip * revert some excessive changes * wip * wip 2 * revert redundant changes * fix server crash * various fixes * fix ci * harden a bit * clean up * rm json-shim * add some comments * rm redundant decl
This commit is contained in:
@@ -11,9 +11,9 @@
|
||||
#include <regex>
|
||||
#include <string>
|
||||
|
||||
#include "nlohmann/json.hpp"
|
||||
#include "json.h"
|
||||
|
||||
using json = nlohmann::ordered_json;
|
||||
using json = common_json;
|
||||
|
||||
static json create_tools();
|
||||
static void test_example_native(testing & t);
|
||||
@@ -63,10 +63,10 @@ static json create_tools() {
|
||||
{ { "type", "string" }, { "description", "The city and state, e.g. San Francisco, CA" } } },
|
||||
{ "unit",
|
||||
{ { "type", "string" },
|
||||
{ "enum", { "celsius", "fahrenheit" } },
|
||||
{ "enum", json::array({ "celsius", "fahrenheit" }) },
|
||||
{ "description",
|
||||
"The temperature unit to use. Infer this from the users location." } } } } },
|
||||
{ "required", { "location", "unit" } },
|
||||
{ "required", json::array({ "location", "unit" }) },
|
||||
} },
|
||||
} }
|
||||
};
|
||||
@@ -86,14 +86,14 @@ static json create_tools() {
|
||||
{ { "type", "string" }, { "description", "The city and state, e.g. San Francisco, CA" } } },
|
||||
{ "unit",
|
||||
{ { "type", "string" },
|
||||
{ "enum", { "celsius", "fahrenheit" } },
|
||||
{ "enum", json::array({ "celsius", "fahrenheit" }) },
|
||||
{ "description", "The temperature unit to use. Infer this from the users location." } } },
|
||||
{ "days",
|
||||
{ { "type", "integer" },
|
||||
{ "description", "Number of days to forecast (1-10)" },
|
||||
{ "minimum", 1 },
|
||||
{ "maximum", 10 } } } } },
|
||||
{ "required", { "location", "unit" } },
|
||||
{ "required", json::array({ "location", "unit" }) },
|
||||
} },
|
||||
} }
|
||||
};
|
||||
@@ -114,9 +114,9 @@ static json create_tools() {
|
||||
{ "default", 5 } } },
|
||||
{ "category",
|
||||
{ { "type", "string" },
|
||||
{ "enum", { "api", "troubleshooting", "billing", "general" } },
|
||||
{ "enum", json::array({ "api", "troubleshooting", "billing", "general" }) },
|
||||
{ "description", "Filter search by specific category." } } } } },
|
||||
{ "required", { "query", "category" } },
|
||||
{ "required", json::array({ "query", "category" }) },
|
||||
{ "additionalProperties", false } } },
|
||||
{ "strict", true } } }
|
||||
};
|
||||
@@ -341,7 +341,7 @@ static void test_example_native(testing & t) {
|
||||
{ { "invoice_number", { { "type", "string" } } },
|
||||
{ "amount", { { "type", "number" } } },
|
||||
{ "due_date", { { "type", "string" } } } } },
|
||||
{ "required", { "invoice_number", "amount", "due_date" } } },
|
||||
{ "required", json::array({ "invoice_number", "amount", "due_date" }) } },
|
||||
/* .parallel_tool_calls = */ false,
|
||||
/* .generation_prompt = */ "<think>",
|
||||
/* .input = */
|
||||
@@ -406,7 +406,7 @@ static void test_example_qwen3_coder(testing & t) {
|
||||
|
||||
std::set<std::string> required_properties;
|
||||
if (function.contains("required")) {
|
||||
function.at("required").get_to(required_properties);
|
||||
required_properties = function.at("required").get<std::set<std::string>>();
|
||||
}
|
||||
|
||||
std::vector<common_peg_parser> arg_parsers;
|
||||
@@ -661,8 +661,8 @@ void test_command7_parser_compare(testing & t) {
|
||||
"5. Provide a detailed cost breakdown that includes accommodation, transportation, meals, and entry fees "
|
||||
"to attractions.";
|
||||
|
||||
std::vector<std::tuple<std::string, std::string, nlohmann::json>> tool_calls = {
|
||||
{ "call_0", "plan_trip", nlohmann::json::parse(R"({
|
||||
std::vector<std::tuple<std::string, std::string, common_json>> tool_calls = {
|
||||
{ "call_0", "plan_trip", common_json::parse(R"({
|
||||
"destination": "Japan",
|
||||
"duration": 14,
|
||||
"budget": 4000,
|
||||
@@ -686,16 +686,16 @@ void test_command7_parser_compare(testing & t) {
|
||||
if (!tool_calls.empty()) {
|
||||
tokens.emplace_back("<|START_ACTION|>");
|
||||
|
||||
auto json = nlohmann::json::array();
|
||||
auto json = common_json::array();
|
||||
for (const auto & tc : tool_calls) {
|
||||
auto tc_json = nlohmann::json::object();
|
||||
auto tc_json = common_json::object();
|
||||
tc_json["tool_call_id"] = std::get<0>(tc);
|
||||
tc_json["tool_name"] = std::get<1>(tc);
|
||||
tc_json["parameters"] = std::get<2>(tc);
|
||||
json.push_back(tc_json);
|
||||
}
|
||||
|
||||
auto tokenized = simple_tokenize(json.dump(-1, ' ', true));
|
||||
auto tokenized = simple_tokenize(json.dump(-1));
|
||||
tokens.insert(tokens.end(), tokenized.begin(), tokenized.end());
|
||||
|
||||
tokens.emplace_back("<|END_ACTION|>");
|
||||
@@ -737,7 +737,7 @@ static void test_prefix_tool_names(testing & t) {
|
||||
{
|
||||
{ "arg1", { { "type", "integer" } } },
|
||||
} },
|
||||
{ "required", { "arg1" } },
|
||||
{ "required", json::array({ "arg1" }) },
|
||||
} },
|
||||
} }
|
||||
};
|
||||
@@ -757,7 +757,7 @@ static void test_prefix_tool_names(testing & t) {
|
||||
{ "arg1", { { "type", "integer" } } },
|
||||
{ "arg2", { { "type", "integer" } } },
|
||||
} },
|
||||
{ "required", { "arg1" } },
|
||||
{ "required", json::array({ "arg1" }) },
|
||||
} },
|
||||
} }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user