From 252ea50717806b4d86a8365dfff8cd14edc899d5 Mon Sep 17 00:00:00 2001 From: Amith Koujalgi <koujalgi.amith@gmail.com> Date: Tue, 25 Mar 2025 20:40:58 +0530 Subject: [PATCH 1/3] Update OllamaAPIIntegrationTest.java --- .../OllamaAPIIntegrationTest.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java b/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java index 703222c..e1b22bf 100644 --- a/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java +++ b/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java @@ -58,6 +58,7 @@ public class OllamaAPIIntegrationTest { boolean useExternalOllamaHost = Boolean.parseBoolean(System.getenv("USE_EXTERNAL_OLLAMA_HOST")); String ollamaHost = System.getenv("OLLAMA_HOST"); if (useExternalOllamaHost) { + LOG.info("Using external Ollama host..."); api = new OllamaAPI(ollamaHost); } else { throw new RuntimeException( @@ -73,6 +74,7 @@ public class OllamaAPIIntegrationTest { portBindings.add(mappedPort + ":" + internalPort); ollama.setPortBindings(portBindings); ollama.start(); + LOG.info("Using Testcontainer Ollama host..."); api = new OllamaAPI("http://" + ollama.getHost() + ":" + ollama.getMappedPort(internalPort)); } api.setRequestTimeoutSeconds(120); @@ -152,12 +154,12 @@ public class OllamaAPIIntegrationTest { @Order(6) void testAskModelWithStructuredOutput() throws OllamaBaseException, IOException, InterruptedException, URISyntaxException { - api.pullModel(CHAT_MODEL_QWEN_SMALL); + api.pullModel(CHAT_MODEL_LLAMA3); int timeHour = 6; boolean isNightTime = false; - String prompt = "The Sun is shining, and its " + timeHour + " in the morning right now. So, its daytime."; + String prompt = "The Sun is shining, and its " + timeHour + ". Its daytime."; Map<String, Object> format = new HashMap<>(); format.put("type", "object"); @@ -177,22 +179,21 @@ public class OllamaAPIIntegrationTest { }); format.put("required", Arrays.asList("timeHour", "isNightTime")); - OllamaResult result = api.generate(CHAT_MODEL_QWEN_SMALL, prompt, format); + OllamaResult result = api.generate(CHAT_MODEL_LLAMA3, prompt, format); assertNotNull(result); assertNotNull(result.getResponse()); assertFalse(result.getResponse().isEmpty()); - assertEquals(result.getStructuredResponse().get("timeHour").toString(), - result.getStructuredResponse().get("timeHour").toString()); - assertEquals(result.getStructuredResponse().get("isNightTime").toString(), - result.getStructuredResponse().get("isNightTime").toString()); + assertEquals(timeHour, + result.getStructuredResponse().get("timeHour")); + assertEquals(isNightTime, + result.getStructuredResponse().get("isNightTime")); - System.out.println(result.getResponse()); TimeOfDay timeOfDay = result.as(TimeOfDay.class); - assertEquals(timeOfDay.getTimeHour(), timeHour); - assertEquals(timeOfDay.isNightTime(), isNightTime); + assertEquals(timeHour, timeOfDay.getTimeHour()); + assertEquals(isNightTime, timeOfDay.isNightTime()); } @Test From 0248f21654e9dd713bd134923a16c327cc478ed3 Mon Sep 17 00:00:00 2001 From: amithkoujalgi <koujalgi.amith@gmail.com> Date: Tue, 25 Mar 2025 21:34:13 +0530 Subject: [PATCH 2/3] Used smaller-sized images for the test cases --- .../OllamaAPIIntegrationTest.java | 10 +++++----- src/test/resources/emoji-smile.jpeg | Bin 0 -> 5179 bytes 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/emoji-smile.jpeg diff --git a/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java b/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java index e1b22bf..6e03fde 100644 --- a/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java +++ b/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java @@ -341,7 +341,7 @@ public class OllamaAPIIntegrationTest { OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(IMAGE_MODEL_LLAVA); OllamaChatRequest requestModel = builder.withMessage(OllamaChatMessageRole.USER, "What's in the picture?", - Collections.emptyList(), List.of(getImageFileFromClasspath("dog-on-a-boat.jpg"))) + Collections.emptyList(), List.of(getImageFileFromClasspath("emoji-smile.jpeg"))) .build(); OllamaChatResult chatResult = api.chat(requestModel); @@ -609,12 +609,12 @@ public class OllamaAPIIntegrationTest { @Test @Order(17) - void testAskModelWithOptionsAndImageURLs() + void testAskModelWithOptionsAndImageURLs() throws OllamaBaseException, IOException, URISyntaxException, InterruptedException { api.pullModel(IMAGE_MODEL_LLAVA); OllamaResult result = api.generateWithImageURLs(IMAGE_MODEL_LLAVA, "What is in this image?", - List.of("https://t3.ftcdn.net/jpg/02/96/63/80/360_F_296638053_0gUVA4WVBKceGsIr7LNqRWSnkusi07dq.jpg"), + List.of("https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Noto_Emoji_v2.034_1f642.svg/360px-Noto_Emoji_v2.034_1f642.svg.png"), new OptionsBuilder().build()); assertNotNull(result); assertNotNull(result.getResponse()); @@ -626,7 +626,7 @@ public class OllamaAPIIntegrationTest { void testAskModelWithOptionsAndImageFiles() throws OllamaBaseException, IOException, URISyntaxException, InterruptedException { api.pullModel(IMAGE_MODEL_LLAVA); - File imageFile = getImageFileFromClasspath("dog-on-a-boat.jpg"); + File imageFile = getImageFileFromClasspath("emoji-smile.jpeg"); try { OllamaResult result = api.generateWithImageFiles(IMAGE_MODEL_LLAVA, "What is in this image?", List.of(imageFile), @@ -645,7 +645,7 @@ public class OllamaAPIIntegrationTest { throws OllamaBaseException, IOException, URISyntaxException, InterruptedException { api.pullModel(IMAGE_MODEL_LLAVA); - File imageFile = getImageFileFromClasspath("dog-on-a-boat.jpg"); + File imageFile = getImageFileFromClasspath("emoji-smile.jpeg"); StringBuffer sb = new StringBuffer(); diff --git a/src/test/resources/emoji-smile.jpeg b/src/test/resources/emoji-smile.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e333b099d18d43a380930f29dcba1eb38e25b869 GIT binary patch literal 5179 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 a^t$E^3PCJGbqavv?tcjWe*y3L=>Gr%=FpJ< literal 0 HcmV?d00001 From 70b4a7961aab2ee1c01a37499bd1a85269c01bfc Mon Sep 17 00:00:00 2001 From: amithkoujalgi <koujalgi.amith@gmail.com> Date: Tue, 25 Mar 2025 21:56:45 +0530 Subject: [PATCH 3/3] Used smaller-sized images for the test cases --- .../ollama4j/integrationtests/OllamaAPIIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java b/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java index 6e03fde..c73383b 100644 --- a/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java +++ b/src/test/java/io/github/ollama4j/integrationtests/OllamaAPIIntegrationTest.java @@ -350,7 +350,7 @@ public class OllamaAPIIntegrationTest { builder.reset(); requestModel = builder.withMessages(chatResult.getChatHistory()) - .withMessage(OllamaChatMessageRole.USER, "What's the dogs breed?").build(); + .withMessage(OllamaChatMessageRole.USER, "What's the color?").build(); chatResult = api.chat(requestModel); assertNotNull(chatResult);