From 9c6a55f7b0bd0f9f805f3546368752c4a46448f9 Mon Sep 17 00:00:00 2001 From: AgentSchmecker Date: Mon, 20 May 2024 11:08:49 +0000 Subject: [PATCH 1/2] Generalizes Abstract Serialization Test Class Removes the "Request" naming context as this base class technically serves for general serialization purposes. --- ...st.java => AbstractSerializationTest.java} | 16 +++++----- .../jackson/TestChatRequestSerialization.java | 32 +++++++++---------- .../TestEmbeddingsRequestSerialization.java | 10 +++--- .../TestGenerateRequestSerialization.java | 12 +++---- 4 files changed, 35 insertions(+), 35 deletions(-) rename src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/{AbstractRequestSerializationTest.java => AbstractSerializationTest.java} (64%) diff --git a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/AbstractRequestSerializationTest.java b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/AbstractSerializationTest.java similarity index 64% rename from src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/AbstractRequestSerializationTest.java rename to src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/AbstractSerializationTest.java index c6b2ff5..d0ffc2c 100644 --- a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/AbstractRequestSerializationTest.java +++ b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/AbstractSerializationTest.java @@ -6,30 +6,30 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.github.amithkoujalgi.ollama4j.core.utils.Utils; -public abstract class AbstractRequestSerializationTest { +public abstract class AbstractSerializationTest { protected ObjectMapper mapper = Utils.getObjectMapper(); - protected String serializeRequest(T req) { + protected String serialize(T obj) { try { - return mapper.writeValueAsString(req); + return mapper.writeValueAsString(obj); } catch (JsonProcessingException e) { fail("Could not serialize request!", e); return null; } } - protected T deserializeRequest(String jsonRequest, Class requestClass) { + protected T deserialize(String jsonObject, Class deserializationClass) { try { - return mapper.readValue(jsonRequest, requestClass); + return mapper.readValue(jsonObject, deserializationClass); } catch (JsonProcessingException e) { - fail("Could not deserialize jsonRequest!", e); + fail("Could not deserialize jsonObject!", e); return null; } } - protected void assertEqualsAfterUnmarshalling(T unmarshalledRequest, + protected void assertEqualsAfterUnmarshalling(T unmarshalledObject, T req) { - assertEquals(req, unmarshalledRequest); + assertEquals(req, unmarshalledObject); } } diff --git a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestChatRequestSerialization.java b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestChatRequestSerialization.java index e4655bf..3ad049c 100644 --- a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestChatRequestSerialization.java +++ b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestChatRequestSerialization.java @@ -14,7 +14,7 @@ import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestBuilde import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestModel; import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; -public class TestChatRequestSerialization extends AbstractRequestSerializationTest{ +public class TestChatRequestSerialization extends AbstractSerializationTest { private OllamaChatRequestBuilder builder; @@ -26,8 +26,8 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe @Test public void testRequestOnlyMandatoryFields() { OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt").build(); - String jsonRequest = serializeRequest(req); - assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req); + String jsonRequest = serialize(req); + assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req); } @Test @@ -35,16 +35,16 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.SYSTEM, "System prompt") .withMessage(OllamaChatMessageRole.USER, "Some prompt") .build(); - String jsonRequest = serializeRequest(req); - assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req); + String jsonRequest = serialize(req); + assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req); } @Test public void testRequestWithMessageAndImage() { OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt", List.of(new File("src/test/resources/dog-on-a-boat.jpg"))).build(); - String jsonRequest = serializeRequest(req); - assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req); + String jsonRequest = serialize(req); + assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req); } @Test @@ -61,8 +61,8 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe .withOptions(b.setTopP(1).build()) .build(); - String jsonRequest = serializeRequest(req); - OllamaChatRequestModel deserializeRequest = deserializeRequest(jsonRequest, OllamaChatRequestModel.class); + String jsonRequest = serialize(req); + OllamaChatRequestModel deserializeRequest = deserialize(jsonRequest, OllamaChatRequestModel.class); assertEqualsAfterUnmarshalling(deserializeRequest, req); assertEquals(1, deserializeRequest.getOptions().get("mirostat")); assertEquals(1.0, deserializeRequest.getOptions().get("temperature")); @@ -79,7 +79,7 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt") .withGetJsonResponse().build(); - String jsonRequest = serializeRequest(req); + String jsonRequest = serialize(req); // no jackson deserialization as format property is not boolean ==> omit as deserialization // of request is never used in real code anyways JSONObject jsonObject = new JSONObject(jsonRequest); @@ -91,15 +91,15 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe public void testWithTemplate() { OllamaChatRequestModel req = builder.withTemplate("System Template") .build(); - String jsonRequest = serializeRequest(req); - assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest, OllamaChatRequestModel.class), req); + String jsonRequest = serialize(req); + assertEqualsAfterUnmarshalling(deserialize(jsonRequest, OllamaChatRequestModel.class), req); } @Test public void testWithStreaming() { OllamaChatRequestModel req = builder.withStreaming().build(); - String jsonRequest = serializeRequest(req); - assertEquals(deserializeRequest(jsonRequest, OllamaChatRequestModel.class).isStream(), true); + String jsonRequest = serialize(req); + assertEquals(deserialize(jsonRequest, OllamaChatRequestModel.class).isStream(), true); } @Test @@ -107,7 +107,7 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe String expectedKeepAlive = "5m"; OllamaChatRequestModel req = builder.withKeepAlive(expectedKeepAlive) .build(); - String jsonRequest = serializeRequest(req); - assertEquals(deserializeRequest(jsonRequest, OllamaChatRequestModel.class).getKeepAlive(), expectedKeepAlive); + String jsonRequest = serialize(req); + assertEquals(deserialize(jsonRequest, OllamaChatRequestModel.class).getKeepAlive(), expectedKeepAlive); } } diff --git a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestEmbeddingsRequestSerialization.java b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestEmbeddingsRequestSerialization.java index ff1e308..a546d6d 100644 --- a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestEmbeddingsRequestSerialization.java +++ b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestEmbeddingsRequestSerialization.java @@ -7,7 +7,7 @@ import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsR import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsRequestBuilder; import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; -public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializationTest{ +public class TestEmbeddingsRequestSerialization extends AbstractSerializationTest { private OllamaEmbeddingsRequestBuilder builder; @@ -19,8 +19,8 @@ public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializa @Test public void testRequestOnlyMandatoryFields() { OllamaEmbeddingsRequestModel req = builder.build(); - String jsonRequest = serializeRequest(req); - assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaEmbeddingsRequestModel.class), req); + String jsonRequest = serialize(req); + assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaEmbeddingsRequestModel.class), req); } @Test @@ -29,8 +29,8 @@ public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializa OllamaEmbeddingsRequestModel req = builder .withOptions(b.setMirostat(1).build()).build(); - String jsonRequest = serializeRequest(req); - OllamaEmbeddingsRequestModel deserializeRequest = deserializeRequest(jsonRequest,OllamaEmbeddingsRequestModel.class); + String jsonRequest = serialize(req); + OllamaEmbeddingsRequestModel deserializeRequest = deserialize(jsonRequest,OllamaEmbeddingsRequestModel.class); assertEqualsAfterUnmarshalling(deserializeRequest, req); assertEquals(1, deserializeRequest.getOptions().get("mirostat")); } diff --git a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestGenerateRequestSerialization.java b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestGenerateRequestSerialization.java index 03610f7..8e95288 100644 --- a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestGenerateRequestSerialization.java +++ b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestGenerateRequestSerialization.java @@ -11,7 +11,7 @@ import io.github.amithkoujalgi.ollama4j.core.models.generate.OllamaGenerateReque import io.github.amithkoujalgi.ollama4j.core.models.generate.OllamaGenerateRequestModel; import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; -public class TestGenerateRequestSerialization extends AbstractRequestSerializationTest{ +public class TestGenerateRequestSerialization extends AbstractSerializationTest { private OllamaGenerateRequestBuilder builder; @@ -24,8 +24,8 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati public void testRequestOnlyMandatoryFields() { OllamaGenerateRequestModel req = builder.withPrompt("Some prompt").build(); - String jsonRequest = serializeRequest(req); - assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest, OllamaGenerateRequestModel.class), req); + String jsonRequest = serialize(req); + assertEqualsAfterUnmarshalling(deserialize(jsonRequest, OllamaGenerateRequestModel.class), req); } @Test @@ -34,8 +34,8 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati OllamaGenerateRequestModel req = builder.withPrompt("Some prompt").withOptions(b.setMirostat(1).build()).build(); - String jsonRequest = serializeRequest(req); - OllamaGenerateRequestModel deserializeRequest = deserializeRequest(jsonRequest, OllamaGenerateRequestModel.class); + String jsonRequest = serialize(req); + OllamaGenerateRequestModel deserializeRequest = deserialize(jsonRequest, OllamaGenerateRequestModel.class); assertEqualsAfterUnmarshalling(deserializeRequest, req); assertEquals(1, deserializeRequest.getOptions().get("mirostat")); } @@ -45,7 +45,7 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati OllamaGenerateRequestModel req = builder.withPrompt("Some prompt").withGetJsonResponse().build(); - String jsonRequest = serializeRequest(req); + String jsonRequest = serialize(req); // no jackson deserialization as format property is not boolean ==> omit as deserialization // of request is never used in real code anyways JSONObject jsonObject = new JSONObject(jsonRequest); From f8ca4d041d61a3f769439b4a6fc805c3ec74d108 Mon Sep 17 00:00:00 2001 From: AgentSchmecker Date: Mon, 20 May 2024 11:10:03 +0000 Subject: [PATCH 2/2] Changes DateTime types of Model.java to OffsetDatetime Fixes #48 --- .../ollama4j/core/models/Model.java | 5 ++- .../TestModelRequestSerialization.java | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestModelRequestSerialization.java diff --git a/src/main/java/io/github/amithkoujalgi/ollama4j/core/models/Model.java b/src/main/java/io/github/amithkoujalgi/ollama4j/core/models/Model.java index 79c2458..15efd70 100644 --- a/src/main/java/io/github/amithkoujalgi/ollama4j/core/models/Model.java +++ b/src/main/java/io/github/amithkoujalgi/ollama4j/core/models/Model.java @@ -1,6 +1,7 @@ package io.github.amithkoujalgi.ollama4j.core.models; import java.time.LocalDateTime; +import java.time.OffsetDateTime; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; @@ -13,9 +14,9 @@ public class Model { private String name; private String model; @JsonProperty("modified_at") - private LocalDateTime modifiedAt; + private OffsetDateTime modifiedAt; @JsonProperty("expires_at") - private LocalDateTime expiresAt; + private OffsetDateTime expiresAt; private String digest; private long size; @JsonProperty("details") diff --git a/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestModelRequestSerialization.java b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestModelRequestSerialization.java new file mode 100644 index 0000000..712e507 --- /dev/null +++ b/src/test/java/io/github/amithkoujalgi/ollama4j/unittests/jackson/TestModelRequestSerialization.java @@ -0,0 +1,42 @@ +package io.github.amithkoujalgi.ollama4j.unittests.jackson; + +import io.github.amithkoujalgi.ollama4j.core.models.Model; +import org.junit.jupiter.api.Test; + +public class TestModelRequestSerialization extends AbstractSerializationTest { + + @Test + public void testDeserializationOfModelResponseWithOffsetTime(){ + String serializedTestStringWithOffsetTime = "{\n" + + "\"name\": \"codellama:13b\",\n" + + "\"modified_at\": \"2023-11-04T14:56:49.277302595-07:00\",\n" + + "\"size\": 7365960935,\n" + + "\"digest\": \"9f438cb9cd581fc025612d27f7c1a6669ff83a8bb0ed86c94fcf4c5440555697\",\n" + + "\"details\": {\n" + + "\"format\": \"gguf\",\n" + + "\"family\": \"llama\",\n" + + "\"families\": null,\n" + + "\"parameter_size\": \"13B\",\n" + + "\"quantization_level\": \"Q4_0\"\n" + + "}}"; + deserialize(serializedTestStringWithOffsetTime,Model.class); + } + + @Test + public void testDeserializationOfModelResponseWithZuluTime(){ + String serializedTestStringWithZuluTimezone = "{\n" + + "\"name\": \"codellama:13b\",\n" + + "\"modified_at\": \"2023-11-04T14:56:49.277302595Z\",\n" + + "\"size\": 7365960935,\n" + + "\"digest\": \"9f438cb9cd581fc025612d27f7c1a6669ff83a8bb0ed86c94fcf4c5440555697\",\n" + + "\"details\": {\n" + + "\"format\": \"gguf\",\n" + + "\"family\": \"llama\",\n" + + "\"families\": null,\n" + + "\"parameter_size\": \"13B\",\n" + + "\"quantization_level\": \"Q4_0\"\n" + + "}}"; + deserialize(serializedTestStringWithZuluTimezone,Model.class); + } + +}