From 2e107d56c64bb465be5da31a3e0a11c81d855276 Mon Sep 17 00:00:00 2001 From: Gleb Sizov Date: Mon, 3 Mar 2025 09:25:56 +0100 Subject: [PATCH 1/3] Added json schema to grammar method --- pom.xml | 2 +- src/main/cpp/jllama.cpp | 9 +++++++ src/main/cpp/jllama.h | 8 ++++++ src/main/java/de/kherud/llama/LlamaModel.java | 5 ++++ .../java/de/kherud/llama/LlamaModelTest.java | 25 +++++++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 68674de9..a086bef1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ de.kherud llama - 3.4.1 + 3.4.2 jar ${project.groupId}:${project.artifactId} diff --git a/src/main/cpp/jllama.cpp b/src/main/cpp/jllama.cpp index d59f3b77..8ea501bf 100644 --- a/src/main/cpp/jllama.cpp +++ b/src/main/cpp/jllama.cpp @@ -1,6 +1,7 @@ #include "jllama.h" #include "llama.h" +#include "json-schema-to-grammar.h" #include "nlohmann/json.hpp" #include "server.hpp" @@ -667,3 +668,11 @@ JNIEXPORT void JNICALL Java_de_kherud_llama_LlamaModel_setLogger(JNIEnv *env, jc } } } + +JNIEXPORT jbyteArray JNICALL Java_de_kherud_llama_LlamaModel_jsonSchemaToGrammarBytes(JNIEnv *env, jclass clazz, jstring j_schema) +{ + const std::string c_schema = parse_jstring(env, j_schema); + nlohmann::ordered_json c_schema_json = nlohmann::ordered_json::parse(c_schema); + const std::string c_grammar = json_schema_to_grammar(c_schema_json); + return parse_jbytes(env, c_grammar); +} \ No newline at end of file diff --git a/src/main/cpp/jllama.h b/src/main/cpp/jllama.h index 2fd0529e..2b3a6bc4 100644 --- a/src/main/cpp/jllama.h +++ b/src/main/cpp/jllama.h @@ -78,6 +78,14 @@ JNIEXPORT void JNICALL Java_de_kherud_llama_LlamaModel_loadModel */ JNIEXPORT void JNICALL Java_de_kherud_llama_LlamaModel_delete (JNIEnv *, jobject); + +/* + * Class: de_kherud_llama_LlamaModel + * Method: jsonSchemaToGrammarBytes + * Signature: (Ljava/lang/String;)[B + */ +JNIEXPORT jbyteArray JNICALL Java_de_kherud_llama_LlamaModel_jsonSchemaToGrammarBytes + (JNIEnv *, jclass, jstring); #ifdef __cplusplus } diff --git a/src/main/java/de/kherud/llama/LlamaModel.java b/src/main/java/de/kherud/llama/LlamaModel.java index b78e056e..5535dbbe 100644 --- a/src/main/java/de/kherud/llama/LlamaModel.java +++ b/src/main/java/de/kherud/llama/LlamaModel.java @@ -128,4 +128,9 @@ public void close() { private native void delete(); + private static native byte[] jsonSchemaToGrammarBytes(String schema); + + public static String jsonSchemaToGrammar(String schema) { + return new String(jsonSchemaToGrammarBytes(schema), StandardCharsets.UTF_8); + } } diff --git a/src/test/java/de/kherud/llama/LlamaModelTest.java b/src/test/java/de/kherud/llama/LlamaModelTest.java index b5481cef..7253f8b6 100644 --- a/src/test/java/de/kherud/llama/LlamaModelTest.java +++ b/src/test/java/de/kherud/llama/LlamaModelTest.java @@ -269,4 +269,29 @@ private LogMessage(LogLevel level, String text) { this.text = text; } } + + @Test + public void testJsonSchemaToGrammar() { + String schema = "{\n" + + " \"properties\": {\n" + + " \"a\": {\"type\": \"string\"},\n" + + " \"b\": {\"type\": \"string\"},\n" + + " \"c\": {\"type\": \"string\"}\n" + + " },\n" + + " \"additionalProperties\": false\n" + + "}"; + + String expectedGrammar = "a-kv ::= \"\\\"a\\\"\" space \":\" space string\n" + + "a-rest ::= ( \",\" space b-kv )? b-rest\n" + + "b-kv ::= \"\\\"b\\\"\" space \":\" space string\n" + + "b-rest ::= ( \",\" space c-kv )?\n" + + "c-kv ::= \"\\\"c\\\"\" space \":\" space string\n" + + "char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n" + + "root ::= \"{\" space (a-kv a-rest | b-kv b-rest | c-kv )? \"}\" space\n" + + "space ::= | \" \" | \"\\n\" [ \\t]{0,20}\n" + + "string ::= \"\\\"\" char* \"\\\"\" space\n"; + + String actualGrammar = LlamaModel.jsonSchemaToGrammar(schema); + Assert.assertEquals(expectedGrammar, actualGrammar); + } } From 6a9f941aeb4cd3cc73a6ac54927e8834f870c7eb Mon Sep 17 00:00:00 2001 From: Konstantin Herud Date: Sun, 9 Mar 2025 15:49:03 +0100 Subject: [PATCH 2/3] re-generate jni header --- src/main/cpp/jllama.h | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/cpp/jllama.h b/src/main/cpp/jllama.h index 1f67b231..a97463e8 100644 --- a/src/main/cpp/jllama.h +++ b/src/main/cpp/jllama.h @@ -81,20 +81,19 @@ JNIEXPORT void JNICALL Java_de_kherud_llama_LlamaModel_delete /* * Class: de_kherud_llama_LlamaModel - * Method: jsonSchemaToGrammarBytes - * Signature: (Ljava/lang/String;)[B + * Method: releaseTask + * Signature: (I)V */ -JNIEXPORT jbyteArray JNICALL Java_de_kherud_llama_LlamaModel_jsonSchemaToGrammarBytes - (JNIEnv *, jclass, jstring); - +JNIEXPORT void JNICALL Java_de_kherud_llama_LlamaModel_releaseTask + (JNIEnv *, jobject, jint); /* * Class: de_kherud_llama_LlamaModel - * Method: releaseTask - * Signature: ()V + * Method: jsonSchemaToGrammarBytes + * Signature: (Ljava/lang/String;)[B */ -JNIEXPORT void JNICALL Java_de_kherud_llama_LlamaModel_releaseTask - (JNIEnv *, jobject, jint); +JNIEXPORT jbyteArray JNICALL Java_de_kherud_llama_LlamaModel_jsonSchemaToGrammarBytes + (JNIEnv *, jclass, jstring); #ifdef __cplusplus } From 9ff59aad3af0e3a58c48aea7af4d0b8388afdbf6 Mon Sep 17 00:00:00 2001 From: Konstantin Herud Date: Sun, 9 Mar 2025 15:50:25 +0100 Subject: [PATCH 3/3] minor test json schema to grammar test fix --- src/test/java/de/kherud/llama/LlamaModelTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/de/kherud/llama/LlamaModelTest.java b/src/test/java/de/kherud/llama/LlamaModelTest.java index f622e178..f2e931b4 100644 --- a/src/test/java/de/kherud/llama/LlamaModelTest.java +++ b/src/test/java/de/kherud/llama/LlamaModelTest.java @@ -290,7 +290,7 @@ public void testJsonSchemaToGrammar() { "c-kv ::= \"\\\"c\\\"\" space \":\" space string\n" + "char ::= [^\"\\\\\\x7F\\x00-\\x1F] | [\\\\] ([\"\\\\bfnrt] | \"u\" [0-9a-fA-F]{4})\n" + "root ::= \"{\" space (a-kv a-rest | b-kv b-rest | c-kv )? \"}\" space\n" + - "space ::= | \" \" | \"\\n\" [ \\t]{0,20}\n" + + "space ::= | \" \" | \"\\n\"{1,2} [ \\t]{0,20}\n" + "string ::= \"\\\"\" char* \"\\\"\" space\n"; String actualGrammar = LlamaModel.jsonSchemaToGrammar(schema);