#include "common.h"
#include "log.h"
-// Change JSON_ASSERT from assert() to GGML_ASSERT:
-#define JSON_ASSERT GGML_ASSERT
-#include "json.hpp"
#include "llama.h"
#include <algorithm>
#pragma warning(disable: 4244 4267) // possible loss of data
#endif
-using json = nlohmann::ordered_json;
-
//
// CPU utils
//
return result;
}
-
-template <>
-json common_grammar_trigger::to_json() const {
- json out {
- {"type", (int) type},
- {"value", value},
- };
- if (type == COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN) {
- out["token"] = (int) token;
- }
- return out;
-}
-
-template <>
-common_grammar_trigger common_grammar_trigger::from_json(const json & in) {
- common_grammar_trigger out;
- out.type = (common_grammar_trigger_type) in.at("type").get<int>();
- out.value = in.at("value").get<std::string>();
- if (out.type == COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN) {
- out.token = (llama_token) in.at("token").get<int>();
- }
- return out;
-}
common_grammar_trigger_type type;
std::string value;
llama_token token = LLAMA_TOKEN_NULL;
-
- // T can only be nlohmann::ordered_json
- template <class T> T to_json() const;
- template <class T> static common_grammar_trigger from_json(const T & in);
};
// sampling parameters
auto grammar_triggers = json::array();
for (const auto & trigger : sampling.grammar_triggers) {
- grammar_triggers.push_back(trigger.to_json<json>());
+ server_grammar_trigger ct(std::move(trigger));
+ grammar_triggers.push_back(ct.to_json());
}
return json {
const auto grammar_triggers = data.find("grammar_triggers");
if (grammar_triggers != data.end()) {
for (const auto & t : *grammar_triggers) {
- auto ct = common_grammar_trigger::from_json(t);
- if (ct.type == COMMON_GRAMMAR_TRIGGER_TYPE_WORD) {
- const auto & word = ct.value;
+ server_grammar_trigger ct(t);
+ if (ct.value.type == COMMON_GRAMMAR_TRIGGER_TYPE_WORD) {
+ const auto & word = ct.value.value;
auto ids = common_tokenize(vocab, word, /* add_special= */ false, /* parse_special= */ true);
if (ids.size() == 1) {
auto token = ids[0];
params.sampling.grammar_triggers.push_back({COMMON_GRAMMAR_TRIGGER_TYPE_WORD, word});
}
} else {
- params.sampling.grammar_triggers.push_back(ct);
+ params.sampling.grammar_triggers.push_back(std::move(ct.value));
}
}
}
const static std::string build_info("b" + std::to_string(LLAMA_BUILD_NUMBER) + "-" + LLAMA_COMMIT);
+// thin wrapper around common_grammar_trigger with (de)serialization functions
+struct server_grammar_trigger {
+ common_grammar_trigger value;
+
+ server_grammar_trigger() = default;
+ server_grammar_trigger(const common_grammar_trigger & value) : value(value) {}
+ server_grammar_trigger(const json & in) {
+ value.type = (common_grammar_trigger_type) in.at("type").get<int>();
+ value.value = in.at("value").get<std::string>();
+ if (value.type == COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN) {
+ value.token = (llama_token) in.at("token").get<int>();
+ }
+ }
+
+ json to_json() const {
+ json out {
+ {"type", (int) value.type},
+ {"value", value.value},
+ };
+ if (value.type == COMMON_GRAMMAR_TRIGGER_TYPE_TOKEN) {
+ out["token"] = (int) value.token;
+ }
+ return out;
+ }
+};
+
//
// tokenizer and input processing utils
//
llama_params["grammar_lazy"] = chat_params.grammar_lazy;
auto grammar_triggers = json::array();
for (const auto & trigger : chat_params.grammar_triggers) {
- grammar_triggers.push_back(trigger.to_json<json>());
+ server_grammar_trigger ct(trigger);
+ grammar_triggers.push_back(ct.to_json());
}
llama_params["grammar_triggers"] = grammar_triggers;
llama_params["preserved_tokens"] = chat_params.preserved_tokens;