forked from Mirror/ollama4j
		
	Compare commits
	
		
			16 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 33ebd088c4 | |||
| caf632ec8b | |||
| 62f3c3efa5 | |||
| 613e152e7d | |||
|   | bb0785140b | ||
|   | e33ad1a1e3 | ||
|   | cd60c506cb | ||
|   | b55925df28 | ||
|   | 3a9b8c309d | ||
|   | bf07159522 | ||
|   | f8ca4d041d | ||
|   | 9c6a55f7b0 | ||
|   | 2866d83a2f | ||
|   | 45e5d07581 | ||
|   | 3a264cb6bb | ||
|   | 54edba144c | 
							
								
								
									
										23
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								README.md
									
									
									
									
									
								
							| @@ -67,10 +67,29 @@ In your Maven project, add this dependency: | ||||
| <dependency> | ||||
|     <groupId>io.github.amithkoujalgi</groupId> | ||||
|     <artifactId>ollama4j</artifactId> | ||||
|     <version>1.0.57</version> | ||||
|     <version>1.0.70</version> | ||||
| </dependency> | ||||
| ``` | ||||
|  | ||||
| or | ||||
|  | ||||
| In your Gradle project, add the dependency using the Kotlin DSL or the Groovy DSL: | ||||
|  | ||||
| ```kotlin | ||||
| dependencies { | ||||
|  | ||||
|     val ollama4jVersion = "1.0.70" | ||||
|  | ||||
|     implementation("io.github.amithkoujalgi:ollama4j:$ollama4jVersion") | ||||
| } | ||||
|  ``` | ||||
|  | ||||
| ```groovy | ||||
| dependencies { | ||||
|     implementation("io.github.amithkoujalgi:ollama4j:1.0.70") | ||||
| } | ||||
| ``` | ||||
|  | ||||
| Latest release: | ||||
|  | ||||
|  | ||||
| @@ -160,4 +179,4 @@ project. | ||||
|  | ||||
| ### References | ||||
|  | ||||
| - [Ollama REST APIs](https://github.com/jmorganca/ollama/blob/main/docs/api.md) | ||||
| - [Ollama REST APIs](https://github.com/jmorganca/ollama/blob/main/docs/api.md) | ||||
|   | ||||
							
								
								
									
										21
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  | ||||
|     <groupId>io.github.amithkoujalgi</groupId> | ||||
|     <artifactId>ollama4j</artifactId> | ||||
|     <version>1.0.70</version> | ||||
|     <version>1.0.72-1</version> | ||||
|  | ||||
|     <name>Ollama4j</name> | ||||
|     <description>Java library for interacting with Ollama API.</description> | ||||
| @@ -39,7 +39,7 @@ | ||||
|         <connection>scm:git:git@github.com:amithkoujalgi/ollama4j.git</connection> | ||||
|         <developerConnection>scm:git:https://github.com/amithkoujalgi/ollama4j.git</developerConnection> | ||||
|         <url>https://github.com/amithkoujalgi/ollama4j</url> | ||||
|         <tag>v1.0.70</tag> | ||||
|         <tag>v1.0.16</tag> | ||||
|     </scm> | ||||
|  | ||||
|     <build> | ||||
| @@ -139,6 +139,13 @@ | ||||
|         </plugins> | ||||
|     </build> | ||||
|  | ||||
|     <repositories> | ||||
|         <repository> | ||||
|             <id>gitea</id> | ||||
|             <url>https://gitea.seeseepuff.be/api/packages/seeseemelk/maven</url> | ||||
|         </repository> | ||||
|     </repositories> | ||||
|  | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>org.projectlombok</groupId> | ||||
| @@ -189,12 +196,12 @@ | ||||
|  | ||||
|     <distributionManagement> | ||||
|         <snapshotRepository> | ||||
|             <id>ossrh</id> | ||||
|             <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url> | ||||
|             <id>gitea</id> | ||||
|             <url>https://gitea.seeseepuff.be/api/packages/seeseemelk/maven</url> | ||||
|         </snapshotRepository> | ||||
|         <repository> | ||||
|             <id>ossrh</id> | ||||
|             <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2</url> | ||||
|             <id>gitea</id> | ||||
|             <url>https://gitea.seeseepuff.be/api/packages/seeseemelk/maven</url> | ||||
|         </repository> | ||||
|     </distributionManagement> | ||||
|  | ||||
| @@ -308,4 +315,4 @@ | ||||
|         </profile> | ||||
|     </profiles> | ||||
|  | ||||
| </project> | ||||
| </project> | ||||
|   | ||||
| @@ -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") | ||||
|   | ||||
| @@ -16,16 +16,10 @@ public class OllamaChatResult extends OllamaResult{ | ||||
|             List<OllamaChatMessage> chatHistory) { | ||||
|         super(response, responseTime, httpStatusCode); | ||||
|         this.chatHistory = chatHistory; | ||||
|         appendAnswerToChatHistory(response); | ||||
|     } | ||||
|  | ||||
|     public List<OllamaChatMessage> getChatHistory() { | ||||
|         return chatHistory; | ||||
|     }  | ||||
|  | ||||
|     private void appendAnswerToChatHistory(String answer){ | ||||
|         OllamaChatMessage assistantMessage = new OllamaChatMessage(OllamaChatMessageRole.ASSISTANT, answer); | ||||
|         this.chatHistory.add(assistantMessage); | ||||
|     } | ||||
|      | ||||
|      | ||||
|   | ||||
| @@ -11,8 +11,6 @@ public class OllamaChatStreamObserver { | ||||
|  | ||||
|     private List<OllamaChatResponseModel> responseParts = new ArrayList<>(); | ||||
|  | ||||
|     private String message = ""; | ||||
|  | ||||
|     public OllamaChatStreamObserver(OllamaStreamHandler streamHandler) { | ||||
|         this.streamHandler = streamHandler; | ||||
|     } | ||||
| @@ -23,8 +21,7 @@ public class OllamaChatStreamObserver { | ||||
|     } | ||||
|      | ||||
|     protected void handleCurrentResponsePart(OllamaChatResponseModel currentResponsePart){ | ||||
|         message = message + currentResponsePart.getMessage().getContent(); | ||||
|         streamHandler.accept(message); | ||||
|         streamHandler.accept(currentResponsePart.getMessage().getContent()); | ||||
|     } | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -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<T> { | ||||
| public abstract class AbstractSerializationTest<T> { | ||||
| 
 | ||||
|     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<T> requestClass) { | ||||
|     protected T deserialize(String jsonObject, Class<T> 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); | ||||
|     } | ||||
| } | ||||
| @@ -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<OllamaChatRequestModel>{ | ||||
| public class TestChatRequestSerialization extends AbstractSerializationTest<OllamaChatRequestModel> { | ||||
|  | ||||
|     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); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -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<OllamaEmbeddingsRequestModel>{ | ||||
| public class TestEmbeddingsRequestSerialization extends AbstractSerializationTest<OllamaEmbeddingsRequestModel> { | ||||
|  | ||||
|         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")); | ||||
|         } | ||||
|   | ||||
| @@ -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<OllamaGenerateRequestModel>{ | ||||
| public class TestGenerateRequestSerialization extends AbstractSerializationTest<OllamaGenerateRequestModel> { | ||||
|  | ||||
|     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); | ||||
|   | ||||
| @@ -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<Model> { | ||||
|  | ||||
|     @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); | ||||
|     } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user