json: ordered json in server/schema converter to respect orig order

This commit is contained in:
ochafik 2024-03-22 08:59:45 +00:00
parent be07a03217
commit f00b0b936a
5 changed files with 21 additions and 22 deletions

View file

@ -9,7 +9,7 @@
#include <unordered_set> #include <unordered_set>
#include <vector> #include <vector>
using json = nlohmann::json; using json = nlohmann::ordered_json;
const std::string SPACE_RULE = "\" \"?"; const std::string SPACE_RULE = "\" \"?";
@ -137,7 +137,7 @@ private:
std::function<json(const std::string &)> _fetch_json; std::function<json(const std::string &)> _fetch_json;
bool _dotall; bool _dotall;
std::map<std::string, std::string> _rules; std::map<std::string, std::string> _rules;
std::unordered_map<std::string, nlohmann::json> _refs; std::unordered_map<std::string, json> _refs;
std::unordered_set<std::string> _refs_being_resolved; std::unordered_set<std::string> _refs_being_resolved;
std::vector<std::string> _errors; std::vector<std::string> _errors;
std::vector<std::string> _warnings; std::vector<std::string> _warnings;
@ -495,7 +495,7 @@ public:
_rules["space"] = SPACE_RULE; _rules["space"] = SPACE_RULE;
} }
void resolve_refs(nlohmann::json & schema, const std::string & url) { void resolve_refs(json & schema, const std::string & url) {
/* /*
* Resolves all $ref fields in the given schema, fetching any remote schemas, * Resolves all $ref fields in the given schema, fetching any remote schemas,
* replacing each $ref with absolute reference URL and populates _refs with the * replacing each $ref with absolute reference URL and populates _refs with the

View file

@ -1,4 +1,4 @@
#pragma once #pragma once
#include "json.hpp" #include "json.hpp"
std::string json_schema_to_grammar(const nlohmann::json& schema); std::string json_schema_to_grammar(const nlohmann::ordered_json& schema);

View file

@ -30,7 +30,7 @@
#include <signal.h> #include <signal.h>
#include <memory> #include <memory>
using json = nlohmann::json; using json = nlohmann::ordered_json;
bool server_verbose = false; bool server_verbose = false;
bool server_log_json = true; bool server_log_json = true;

View file

@ -12,7 +12,7 @@
#define DEFAULT_OAICOMPAT_MODEL "gpt-3.5-turbo-0613" #define DEFAULT_OAICOMPAT_MODEL "gpt-3.5-turbo-0613"
using json = nlohmann::json; using json = nlohmann::ordered_json;
// https://community.openai.com/t/openai-chat-list-of-error-codes-and-types/357791/11 // https://community.openai.com/t/openai-chat-list-of-error-codes-and-types/357791/11
enum error_type { enum error_type {

View file

@ -378,20 +378,18 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
test({ test({
SUCCESS, SUCCESS,
"required props", "required props in original order",
R"""({ R"""({
"type": "object", "type": "object",
"properties": { "properties": {
"a": { "b": {"type": "string"},
"type": "string" "c": {"type": "string"},
}, "a": {"type": "string"}
"b": {
"type": "string"
}
}, },
"required": [ "required": [
"a", "a",
"b" "b",
"c"
], ],
"additionalProperties": false, "additionalProperties": false,
"definitions": {} "definitions": {}
@ -399,7 +397,8 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
R"""( R"""(
a-kv ::= "\"a\"" space ":" space string a-kv ::= "\"a\"" space ":" space string
b-kv ::= "\"b\"" space ":" space string b-kv ::= "\"b\"" space ":" space string
root ::= "{" space a-kv "," space b-kv "}" space c-kv ::= "\"c\"" space ":" space string
root ::= "{" space b-kv "," space c-kv "," space a-kv "}" space
space ::= " "? space ::= " "?
string ::= "\"" ( string ::= "\"" (
[^"\\] | [^"\\] |
@ -458,13 +457,13 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
test({ test({
SUCCESS, SUCCESS,
"required + optional props", "required + optional props each in original order",
R"""({ R"""({
"properties": { "properties": {
"a": {"type": "string"},
"b": {"type": "string"}, "b": {"type": "string"},
"c": {"type": "string"}, "a": {"type": "string"},
"d": {"type": "string"} "d": {"type": "string"},
"c": {"type": "string"}
}, },
"required": ["a", "b"], "required": ["a", "b"],
"additionalProperties": false "additionalProperties": false
@ -473,9 +472,9 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
a-kv ::= "\"a\"" space ":" space string a-kv ::= "\"a\"" space ":" space string
b-kv ::= "\"b\"" space ":" space string b-kv ::= "\"b\"" space ":" space string
c-kv ::= "\"c\"" space ":" space string c-kv ::= "\"c\"" space ":" space string
c-rest ::= ( "," space d-kv )?
d-kv ::= "\"d\"" space ":" space string d-kv ::= "\"d\"" space ":" space string
root ::= "{" space a-kv "," space b-kv ( "," space ( c-kv c-rest | d-kv ) )? "}" space d-rest ::= ( "," space c-kv )?
root ::= "{" space b-kv "," space a-kv ( "," space ( d-kv d-rest | c-kv ) )? "}" space
space ::= " "? space ::= " "?
string ::= "\"" ( string ::= "\"" (
[^"\\] | [^"\\] |
@ -796,7 +795,7 @@ static void test_all(const std::string & lang, std::function<void(const TestCase
int main() { int main() {
test_all("C++", [](const TestCase & tc) { test_all("C++", [](const TestCase & tc) {
try { try {
tc.verify(json_schema_to_grammar(nlohmann::json::parse(tc.schema))); tc.verify(json_schema_to_grammar(nlohmann::ordered_json::parse(tc.schema)));
tc.verify_status(SUCCESS); tc.verify_status(SUCCESS);
} catch (const std::runtime_error & ex) { } catch (const std::runtime_error & ex) {
fprintf(stderr, "Error: %s\n", ex.what()); fprintf(stderr, "Error: %s\n", ex.what());