mirror of
				https://github.com/amithkoujalgi/ollama4j.git
				synced 2025-10-31 08:30:41 +01:00 
			
		
		
		
	Compare commits
	
		
			24 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 3a9b8c309d | ||
|   | bf07159522 | ||
|   | f8ca4d041d | ||
|   | 9c6a55f7b0 | ||
|   | 3a264cb6bb | ||
|   | e1b9d42771 | ||
|   | 1a086c37c0 | ||
|   | 54edba144c | ||
|   | 3ed3187ba9 | ||
|   | b7cd81a7f5 | ||
|   | e750c2d7f9 | ||
|   | 62f16131f3 | ||
|   | 2cbaf12d7c | ||
|   | e2d555d404 | ||
|   | c296b34174 | ||
|   | e8f99f28ec | ||
|   | 250b1abc79 | ||
|   | 42b15ad93f | ||
|   | 6f7a714bae | ||
|   | 92618e5084 | ||
|   | 391a9242c3 | ||
|   | e1b6dc3b54 | ||
|   | 04124cf978 | ||
|   | e4e717b747 | 
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								README.md
									
									
									
									
									
								
							| @@ -110,6 +110,16 @@ make it | |||||||
| Releases (newer artifact versions) are done automatically on pushing the code to the `main` branch through GitHub | Releases (newer artifact versions) are done automatically on pushing the code to the `main` branch through GitHub | ||||||
| Actions CI workflow. | Actions CI workflow. | ||||||
|  |  | ||||||
|  | #### Who's using Ollama4j? | ||||||
|  |  | ||||||
|  | - `Datafaker`: a library to generate fake data | ||||||
|  |     - https://github.com/datafaker-net/datafaker-experimental/tree/main/ollama-api | ||||||
|  | - `Vaadin Web UI`: UI-Tester for Interactions with Ollama via ollama4j | ||||||
|  |     - https://github.com/TEAMPB/ollama4j-vaadin-ui | ||||||
|  | - `ollama-translator`: Minecraft 1.20.6 spigot plugin allows to easily break language barriers by using ollama on the | ||||||
|  |   server to translate all messages into a specfic target language. | ||||||
|  |     - https://github.com/liebki/ollama-translator | ||||||
|  |  | ||||||
| #### Traction | #### Traction | ||||||
|  |  | ||||||
| [](https://star-history.com/#amithkoujalgi/ollama4j&Date) | [](https://star-history.com/#amithkoujalgi/ollama4j&Date) | ||||||
|   | |||||||
| @@ -112,7 +112,7 @@ You will get a response similar to: | |||||||
|  |  | ||||||
| ## Use a simple Console Output Stream Handler | ## Use a simple Console Output Stream Handler | ||||||
|  |  | ||||||
| ``` | ```java | ||||||
| import io.github.amithkoujalgi.ollama4j.core.impl.ConsoleOutputStreamHandler; | import io.github.amithkoujalgi.ollama4j.core.impl.ConsoleOutputStreamHandler; | ||||||
|  |  | ||||||
| public class Main { | public class Main { | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								pom.xml
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ | |||||||
|  |  | ||||||
|     <groupId>io.github.amithkoujalgi</groupId> |     <groupId>io.github.amithkoujalgi</groupId> | ||||||
|     <artifactId>ollama4j</artifactId> |     <artifactId>ollama4j</artifactId> | ||||||
|     <version>1.0.65</version> |     <version>1.0.71</version> | ||||||
|  |  | ||||||
|     <name>Ollama4j</name> |     <name>Ollama4j</name> | ||||||
|     <description>Java library for interacting with Ollama API.</description> |     <description>Java library for interacting with Ollama API.</description> | ||||||
| @@ -39,7 +39,7 @@ | |||||||
|         <connection>scm:git:git@github.com:amithkoujalgi/ollama4j.git</connection> |         <connection>scm:git:git@github.com:amithkoujalgi/ollama4j.git</connection> | ||||||
|         <developerConnection>scm:git:https://github.com/amithkoujalgi/ollama4j.git</developerConnection> |         <developerConnection>scm:git:https://github.com/amithkoujalgi/ollama4j.git</developerConnection> | ||||||
|         <url>https://github.com/amithkoujalgi/ollama4j</url> |         <url>https://github.com/amithkoujalgi/ollama4j</url> | ||||||
|         <tag>v1.0.65</tag> |         <tag>v1.0.71</tag> | ||||||
|     </scm> |     </scm> | ||||||
|  |  | ||||||
|     <build> |     <build> | ||||||
| @@ -149,7 +149,12 @@ | |||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>com.fasterxml.jackson.core</groupId> |             <groupId>com.fasterxml.jackson.core</groupId> | ||||||
|             <artifactId>jackson-databind</artifactId> |             <artifactId>jackson-databind</artifactId> | ||||||
|             <version>2.15.3</version> |             <version>2.17.1</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>com.fasterxml.jackson.datatype</groupId> | ||||||
|  |             <artifactId>jackson-datatype-jsr310</artifactId> | ||||||
|  |             <version>2.17.1</version> | ||||||
|         </dependency> |         </dependency> | ||||||
|         <dependency> |         <dependency> | ||||||
|             <groupId>ch.qos.logback</groupId> |             <groupId>ch.qos.logback</groupId> | ||||||
|   | |||||||
| @@ -9,18 +9,13 @@ import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatResult; | |||||||
| import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingResponseModel; | import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingResponseModel; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsRequestModel; | import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsRequestModel; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.generate.OllamaGenerateRequestModel; | import io.github.amithkoujalgi.ollama4j.core.models.generate.OllamaGenerateRequestModel; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.request.CustomModelFileContentsRequest; | import io.github.amithkoujalgi.ollama4j.core.models.request.*; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.request.CustomModelFilePathRequest; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.request.ModelRequest; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.request.OllamaChatEndpointCaller; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.request.OllamaGenerateEndpointCaller; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.Options; | import io.github.amithkoujalgi.ollama4j.core.utils.Options; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | ||||||
| import java.io.BufferedReader; | import org.slf4j.Logger; | ||||||
| import java.io.File; | import org.slf4j.LoggerFactory; | ||||||
| import java.io.IOException; |  | ||||||
| import java.io.InputStream; | import java.io.*; | ||||||
| import java.io.InputStreamReader; |  | ||||||
| import java.net.URI; | import java.net.URI; | ||||||
| import java.net.URISyntaxException; | import java.net.URISyntaxException; | ||||||
| import java.net.http.HttpClient; | import java.net.http.HttpClient; | ||||||
| @@ -33,16 +28,16 @@ import java.time.Duration; | |||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
| import java.util.Base64; | import java.util.Base64; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import org.slf4j.Logger; |  | ||||||
| import org.slf4j.LoggerFactory; |  | ||||||
|  |  | ||||||
| /** The base Ollama API class. */ | /** | ||||||
|  |  * The base Ollama API class. | ||||||
|  |  */ | ||||||
| @SuppressWarnings("DuplicatedCode") | @SuppressWarnings("DuplicatedCode") | ||||||
| public class OllamaAPI { | public class OllamaAPI { | ||||||
|  |  | ||||||
|     private static final Logger logger = LoggerFactory.getLogger(OllamaAPI.class); |     private static final Logger logger = LoggerFactory.getLogger(OllamaAPI.class); | ||||||
|     private final String host; |     private final String host; | ||||||
|   private long requestTimeoutSeconds = 3; |     private long requestTimeoutSeconds = 10; | ||||||
|     private boolean verbose = true; |     private boolean verbose = true; | ||||||
|     private BasicAuth basicAuth; |     private BasicAuth basicAuth; | ||||||
|  |  | ||||||
| @@ -323,7 +318,7 @@ public class OllamaAPI { | |||||||
|      * @param modelRequest request for '/api/embeddings' endpoint |      * @param modelRequest request for '/api/embeddings' endpoint | ||||||
|      * @return embeddings |      * @return embeddings | ||||||
|      */ |      */ | ||||||
|   public List<Double> generateEmbeddings(OllamaEmbeddingsRequestModel modelRequest) throws IOException, InterruptedException, OllamaBaseException{ |     public List<Double> generateEmbeddings(OllamaEmbeddingsRequestModel modelRequest) throws IOException, InterruptedException, OllamaBaseException { | ||||||
|         URI uri = URI.create(this.host + "/api/embeddings"); |         URI uri = URI.create(this.host + "/api/embeddings"); | ||||||
|         String jsonData = modelRequest.toString(); |         String jsonData = modelRequest.toString(); | ||||||
|         HttpClient httpClient = HttpClient.newHttpClient(); |         HttpClient httpClient = HttpClient.newHttpClient(); | ||||||
| @@ -360,17 +355,17 @@ public class OllamaAPI { | |||||||
|             throws OllamaBaseException, IOException, InterruptedException { |             throws OllamaBaseException, IOException, InterruptedException { | ||||||
|         OllamaGenerateRequestModel ollamaRequestModel = new OllamaGenerateRequestModel(model, prompt); |         OllamaGenerateRequestModel ollamaRequestModel = new OllamaGenerateRequestModel(model, prompt); | ||||||
|         ollamaRequestModel.setOptions(options.getOptionsMap()); |         ollamaRequestModel.setOptions(options.getOptionsMap()); | ||||||
|     return generateSyncForOllamaRequestModel(ollamaRequestModel,streamHandler); |         return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Convenience method to call Ollama API without streaming responses. |      * Convenience method to call Ollama API without streaming responses. | ||||||
|    *  |      * <p> | ||||||
|      * Uses {@link #generate(String, String, Options, OllamaStreamHandler)} |      * Uses {@link #generate(String, String, Options, OllamaStreamHandler)} | ||||||
|      */ |      */ | ||||||
|     public OllamaResult generate(String model, String prompt, Options options) |     public OllamaResult generate(String model, String prompt, Options options) | ||||||
|             throws OllamaBaseException, IOException, InterruptedException { |             throws OllamaBaseException, IOException, InterruptedException { | ||||||
|     return generate(model, prompt, options,null); |         return generate(model, prompt, options, null); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -415,19 +410,19 @@ public class OllamaAPI { | |||||||
|         } |         } | ||||||
|         OllamaGenerateRequestModel ollamaRequestModel = new OllamaGenerateRequestModel(model, prompt, images); |         OllamaGenerateRequestModel ollamaRequestModel = new OllamaGenerateRequestModel(model, prompt, images); | ||||||
|         ollamaRequestModel.setOptions(options.getOptionsMap()); |         ollamaRequestModel.setOptions(options.getOptionsMap()); | ||||||
|     return generateSyncForOllamaRequestModel(ollamaRequestModel,streamHandler); |         return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Convenience method to call Ollama API without streaming responses. |      * Convenience method to call Ollama API without streaming responses. | ||||||
|    *  |      * <p> | ||||||
|      * Uses {@link #generateWithImageFiles(String, String, List, Options, OllamaStreamHandler)} |      * Uses {@link #generateWithImageFiles(String, String, List, Options, OllamaStreamHandler)} | ||||||
|      */ |      */ | ||||||
|     public OllamaResult generateWithImageFiles( |     public OllamaResult generateWithImageFiles( | ||||||
|             String model, String prompt, List<File> imageFiles, Options options) |             String model, String prompt, List<File> imageFiles, Options options) | ||||||
|     throws OllamaBaseException, IOException, InterruptedException{ |             throws OllamaBaseException, IOException, InterruptedException { | ||||||
|         return generateWithImageFiles(model, prompt, imageFiles, options, null); |         return generateWithImageFiles(model, prompt, imageFiles, options, null); | ||||||
| } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * With one or more image URLs, ask a question to a model running on Ollama server. This is a |      * With one or more image URLs, ask a question to a model running on Ollama server. This is a | ||||||
| @@ -451,12 +446,12 @@ public class OllamaAPI { | |||||||
|         } |         } | ||||||
|         OllamaGenerateRequestModel ollamaRequestModel = new OllamaGenerateRequestModel(model, prompt, images); |         OllamaGenerateRequestModel ollamaRequestModel = new OllamaGenerateRequestModel(model, prompt, images); | ||||||
|         ollamaRequestModel.setOptions(options.getOptionsMap()); |         ollamaRequestModel.setOptions(options.getOptionsMap()); | ||||||
|     return generateSyncForOllamaRequestModel(ollamaRequestModel,streamHandler); |         return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Convenience method to call Ollama API without streaming responses. |      * Convenience method to call Ollama API without streaming responses. | ||||||
|    *  |      * <p> | ||||||
|      * Uses {@link #generateWithImageURLs(String, String, List, Options, OllamaStreamHandler)} |      * Uses {@link #generateWithImageURLs(String, String, List, Options, OllamaStreamHandler)} | ||||||
|      */ |      */ | ||||||
|     public OllamaResult generateWithImageURLs(String model, String prompt, List<String> imageURLs, |     public OllamaResult generateWithImageURLs(String model, String prompt, List<String> imageURLs, | ||||||
| @@ -466,7 +461,6 @@ public class OllamaAPI { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
|    |  | ||||||
|     /** |     /** | ||||||
|      * Ask a question to a model based on a given message stack (i.e. a chat history). Creates a synchronous call to the api |      * Ask a question to a model based on a given message stack (i.e. a chat history). Creates a synchronous call to the api | ||||||
|      * 'api/chat'. |      * 'api/chat'. | ||||||
| @@ -478,14 +472,14 @@ public class OllamaAPI { | |||||||
|      * @throws IOException          in case the responseStream can not be read |      * @throws IOException          in case the responseStream can not be read | ||||||
|      * @throws InterruptedException in case the server is not reachable or network issues happen |      * @throws InterruptedException in case the server is not reachable or network issues happen | ||||||
|      */ |      */ | ||||||
|   public OllamaChatResult chat(String model, List<OllamaChatMessage> messages)  throws OllamaBaseException, IOException, InterruptedException{ |     public OllamaChatResult chat(String model, List<OllamaChatMessage> messages) throws OllamaBaseException, IOException, InterruptedException { | ||||||
|         OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(model); |         OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(model); | ||||||
|         return chat(builder.withMessages(messages).build()); |         return chat(builder.withMessages(messages).build()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Ask a question to a model using an {@link OllamaChatRequestModel}. This can be constructed using an {@link OllamaChatRequestBuilder}. |      * Ask a question to a model using an {@link OllamaChatRequestModel}. This can be constructed using an {@link OllamaChatRequestBuilder}. | ||||||
|    *  |      * <p> | ||||||
|      * Hint: the OllamaChatRequestModel#getStream() property is not implemented. |      * Hint: the OllamaChatRequestModel#getStream() property is not implemented. | ||||||
|      * |      * | ||||||
|      * @param request request object to be sent to the server |      * @param request request object to be sent to the server | ||||||
| @@ -494,13 +488,13 @@ public class OllamaAPI { | |||||||
|      * @throws IOException          in case the responseStream can not be read |      * @throws IOException          in case the responseStream can not be read | ||||||
|      * @throws InterruptedException in case the server is not reachable or network issues happen |      * @throws InterruptedException in case the server is not reachable or network issues happen | ||||||
|      */ |      */ | ||||||
|   public OllamaChatResult chat(OllamaChatRequestModel request)  throws OllamaBaseException, IOException, InterruptedException{ |     public OllamaChatResult chat(OllamaChatRequestModel request) throws OllamaBaseException, IOException, InterruptedException { | ||||||
|     return chat(request,null); |         return chat(request, null); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Ask a question to a model using an {@link OllamaChatRequestModel}. This can be constructed using an {@link OllamaChatRequestBuilder}. |      * Ask a question to a model using an {@link OllamaChatRequestModel}. This can be constructed using an {@link OllamaChatRequestBuilder}. | ||||||
|    *  |      * <p> | ||||||
|      * Hint: the OllamaChatRequestModel#getStream() property is not implemented. |      * Hint: the OllamaChatRequestModel#getStream() property is not implemented. | ||||||
|      * |      * | ||||||
|      * @param request       request object to be sent to the server |      * @param request       request object to be sent to the server | ||||||
| @@ -510,14 +504,13 @@ public class OllamaAPI { | |||||||
|      * @throws IOException          in case the responseStream can not be read |      * @throws IOException          in case the responseStream can not be read | ||||||
|      * @throws InterruptedException in case the server is not reachable or network issues happen |      * @throws InterruptedException in case the server is not reachable or network issues happen | ||||||
|      */ |      */ | ||||||
|   public OllamaChatResult chat(OllamaChatRequestModel request, OllamaStreamHandler streamHandler)  throws OllamaBaseException, IOException, InterruptedException{ |     public OllamaChatResult chat(OllamaChatRequestModel request, OllamaStreamHandler streamHandler) throws OllamaBaseException, IOException, InterruptedException { | ||||||
|         OllamaChatEndpointCaller requestCaller = new OllamaChatEndpointCaller(host, basicAuth, requestTimeoutSeconds, verbose); |         OllamaChatEndpointCaller requestCaller = new OllamaChatEndpointCaller(host, basicAuth, requestTimeoutSeconds, verbose); | ||||||
|         OllamaResult result; |         OllamaResult result; | ||||||
|     if(streamHandler != null){ |         if (streamHandler != null) { | ||||||
|             request.setStream(true); |             request.setStream(true); | ||||||
|             result = requestCaller.call(request, streamHandler); |             result = requestCaller.call(request, streamHandler); | ||||||
|     } |         } else { | ||||||
|     else { |  | ||||||
|             result = requestCaller.callSync(request); |             result = requestCaller.callSync(request); | ||||||
|         } |         } | ||||||
|         return new OllamaChatResult(result.getResponse(), result.getResponseTime(), result.getHttpStatusCode(), request.getMessages()); |         return new OllamaChatResult(result.getResponse(), result.getResponseTime(), result.getHttpStatusCode(), request.getMessages()); | ||||||
|   | |||||||
| @@ -1,5 +1,8 @@ | |||||||
| package io.github.amithkoujalgi.ollama4j.core.models; | 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.annotation.JsonProperty; | ||||||
| import com.fasterxml.jackson.core.JsonProcessingException; | import com.fasterxml.jackson.core.JsonProcessingException; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | ||||||
| @@ -11,7 +14,9 @@ public class Model { | |||||||
|   private String name; |   private String name; | ||||||
|   private String model; |   private String model; | ||||||
|   @JsonProperty("modified_at") |   @JsonProperty("modified_at") | ||||||
|   private String modifiedAt; |   private OffsetDateTime modifiedAt; | ||||||
|  |   @JsonProperty("expires_at") | ||||||
|  |   private OffsetDateTime expiresAt; | ||||||
|   private String digest; |   private String digest; | ||||||
|   private long size; |   private long size; | ||||||
|   @JsonProperty("details") |   @JsonProperty("details") | ||||||
|   | |||||||
| @@ -1,14 +1,15 @@ | |||||||
| package io.github.amithkoujalgi.ollama4j.core.models.chat; | package io.github.amithkoujalgi.ollama4j.core.models.chat; | ||||||
|  |  | ||||||
| import com.fasterxml.jackson.annotation.JsonProperty; | import com.fasterxml.jackson.annotation.JsonProperty; | ||||||
|  | import lombok.Data; | ||||||
|  |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import lombok.Data; |  | ||||||
|  |  | ||||||
| @Data | @Data | ||||||
| public class OllamaChatResponseModel { | public class OllamaChatResponseModel { | ||||||
|     private String model; |     private String model; | ||||||
|     private @JsonProperty("created_at") String createdAt; |     private @JsonProperty("created_at") String createdAt; | ||||||
|  |     private @JsonProperty("done_reason") String doneReason; | ||||||
|     private OllamaChatMessage message; |     private OllamaChatMessage message; | ||||||
|     private boolean done; |     private boolean done; | ||||||
|     private String error; |     private String error; | ||||||
|   | |||||||
| @@ -1,12 +1,6 @@ | |||||||
| package io.github.amithkoujalgi.ollama4j.core.models.request; | package io.github.amithkoujalgi.ollama4j.core.models.request; | ||||||
|  |  | ||||||
| import java.io.IOException; |  | ||||||
|  |  | ||||||
| import org.slf4j.Logger; |  | ||||||
| import org.slf4j.LoggerFactory; |  | ||||||
|  |  | ||||||
| import com.fasterxml.jackson.core.JsonProcessingException; | import com.fasterxml.jackson.core.JsonProcessingException; | ||||||
|  |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.OllamaStreamHandler; | import io.github.amithkoujalgi.ollama4j.core.OllamaStreamHandler; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.exceptions.OllamaBaseException; | import io.github.amithkoujalgi.ollama4j.core.exceptions.OllamaBaseException; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.BasicAuth; | import io.github.amithkoujalgi.ollama4j.core.models.BasicAuth; | ||||||
| @@ -15,11 +9,15 @@ import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatResponseModel | |||||||
| import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatStreamObserver; | import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatStreamObserver; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.OllamaRequestBody; | import io.github.amithkoujalgi.ollama4j.core.utils.OllamaRequestBody; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | ||||||
|  | import org.slf4j.Logger; | ||||||
|  | import org.slf4j.LoggerFactory; | ||||||
|  |  | ||||||
|  | import java.io.IOException; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Specialization class for requests |  * Specialization class for requests | ||||||
|  */ |  */ | ||||||
| public class OllamaChatEndpointCaller extends OllamaEndpointCaller{ | public class OllamaChatEndpointCaller extends OllamaEndpointCaller { | ||||||
|  |  | ||||||
|     private static final Logger LOG = LoggerFactory.getLogger(OllamaChatEndpointCaller.class); |     private static final Logger LOG = LoggerFactory.getLogger(OllamaChatEndpointCaller.class); | ||||||
|  |  | ||||||
| @@ -39,12 +37,12 @@ public class OllamaChatEndpointCaller extends OllamaEndpointCaller{ | |||||||
|         try { |         try { | ||||||
|             OllamaChatResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaChatResponseModel.class); |             OllamaChatResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaChatResponseModel.class); | ||||||
|             responseBuffer.append(ollamaResponseModel.getMessage().getContent()); |             responseBuffer.append(ollamaResponseModel.getMessage().getContent()); | ||||||
|             if(streamObserver != null) { |             if (streamObserver != null) { | ||||||
|                 streamObserver.notify(ollamaResponseModel); |                 streamObserver.notify(ollamaResponseModel); | ||||||
|             } |             } | ||||||
|             return ollamaResponseModel.isDone(); |             return ollamaResponseModel.isDone(); | ||||||
|         } catch (JsonProcessingException e) { |         } catch (JsonProcessingException e) { | ||||||
|             LOG.error("Error parsing the Ollama chat response!",e); |             LOG.error("Error parsing the Ollama chat response!", e); | ||||||
|             return true; |             return true; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -54,7 +52,4 @@ public class OllamaChatEndpointCaller extends OllamaEndpointCaller{ | |||||||
|         streamObserver = new OllamaChatStreamObserver(streamHandler); |         streamObserver = new OllamaChatStreamObserver(streamHandler); | ||||||
|         return super.callSync(body); |         return super.callSync(body); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|      |  | ||||||
|   |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,5 +1,15 @@ | |||||||
| package io.github.amithkoujalgi.ollama4j.core.models.request; | package io.github.amithkoujalgi.ollama4j.core.models.request; | ||||||
|  |  | ||||||
|  | import io.github.amithkoujalgi.ollama4j.core.OllamaAPI; | ||||||
|  | import io.github.amithkoujalgi.ollama4j.core.exceptions.OllamaBaseException; | ||||||
|  | import io.github.amithkoujalgi.ollama4j.core.models.BasicAuth; | ||||||
|  | import io.github.amithkoujalgi.ollama4j.core.models.OllamaErrorResponseModel; | ||||||
|  | import io.github.amithkoujalgi.ollama4j.core.models.OllamaResult; | ||||||
|  | import io.github.amithkoujalgi.ollama4j.core.utils.OllamaRequestBody; | ||||||
|  | import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | ||||||
|  | import org.slf4j.Logger; | ||||||
|  | import org.slf4j.LoggerFactory; | ||||||
|  |  | ||||||
| import java.io.BufferedReader; | import java.io.BufferedReader; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.InputStream; | import java.io.InputStream; | ||||||
| @@ -12,17 +22,6 @@ import java.nio.charset.StandardCharsets; | |||||||
| import java.time.Duration; | import java.time.Duration; | ||||||
| import java.util.Base64; | import java.util.Base64; | ||||||
|  |  | ||||||
| import org.slf4j.Logger; |  | ||||||
| import org.slf4j.LoggerFactory; |  | ||||||
|  |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.OllamaAPI; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.exceptions.OllamaBaseException; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.BasicAuth; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.OllamaErrorResponseModel; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.models.OllamaResult; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.OllamaRequestBody; |  | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.Utils; |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Abstract helperclass to call the ollama api server. |  * Abstract helperclass to call the ollama api server. | ||||||
|  */ |  */ | ||||||
| @@ -56,8 +55,7 @@ public abstract class OllamaEndpointCaller { | |||||||
|      * @throws IOException          in case the responseStream can not be read |      * @throws IOException          in case the responseStream can not be read | ||||||
|      * @throws InterruptedException in case the server is not reachable or network issues happen |      * @throws InterruptedException in case the server is not reachable or network issues happen | ||||||
|      */ |      */ | ||||||
|     public OllamaResult callSync(OllamaRequestBody body)  throws OllamaBaseException, IOException, InterruptedException{ |     public OllamaResult callSync(OllamaRequestBody body) throws OllamaBaseException, IOException, InterruptedException { | ||||||
|  |  | ||||||
|         // Create Request |         // Create Request | ||||||
|         long startTime = System.currentTimeMillis(); |         long startTime = System.currentTimeMillis(); | ||||||
|         HttpClient httpClient = HttpClient.newHttpClient(); |         HttpClient httpClient = HttpClient.newHttpClient(); | ||||||
| @@ -71,7 +69,6 @@ public abstract class OllamaEndpointCaller { | |||||||
|         HttpResponse<InputStream> response = |         HttpResponse<InputStream> response = | ||||||
|                 httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream()); |                 httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream()); | ||||||
|  |  | ||||||
|          |  | ||||||
|         int statusCode = response.statusCode(); |         int statusCode = response.statusCode(); | ||||||
|         InputStream responseBodyStream = response.body(); |         InputStream responseBodyStream = response.body(); | ||||||
|         StringBuilder responseBuffer = new StringBuilder(); |         StringBuilder responseBuffer = new StringBuilder(); | ||||||
| @@ -96,7 +93,7 @@ public abstract class OllamaEndpointCaller { | |||||||
|                             OllamaErrorResponseModel.class); |                             OllamaErrorResponseModel.class); | ||||||
|                     responseBuffer.append(ollamaResponseModel.getError()); |                     responseBuffer.append(ollamaResponseModel.getError()); | ||||||
|                 } else { |                 } else { | ||||||
|           boolean finished = parseResponseAndAddToBuffer(line,responseBuffer); |                     boolean finished = parseResponseAndAddToBuffer(line, responseBuffer); | ||||||
|                     if (finished) { |                     if (finished) { | ||||||
|                         break; |                         break; | ||||||
|                     } |                     } | ||||||
|   | |||||||
| @@ -8,10 +8,18 @@ import java.net.URISyntaxException; | |||||||
| import java.net.URL; | import java.net.URL; | ||||||
|  |  | ||||||
| import com.fasterxml.jackson.databind.ObjectMapper; | import com.fasterxml.jackson.databind.ObjectMapper; | ||||||
|  | import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; | ||||||
|  |  | ||||||
| public class Utils { | public class Utils { | ||||||
|  |  | ||||||
|  |   private static ObjectMapper objectMapper; | ||||||
|  |  | ||||||
|   public static ObjectMapper getObjectMapper() { |   public static ObjectMapper getObjectMapper() { | ||||||
|     return new ObjectMapper(); |     if(objectMapper == null) { | ||||||
|  |       objectMapper = new ObjectMapper(); | ||||||
|  |       objectMapper.registerModule(new JavaTimeModule()); | ||||||
|  |     } | ||||||
|  |     return objectMapper; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   public static byte[] loadImageBytesFromUrl(String imageUrl) |   public static byte[] loadImageBytesFromUrl(String imageUrl) | ||||||
|   | |||||||
| @@ -6,30 +6,30 @@ import com.fasterxml.jackson.core.JsonProcessingException; | |||||||
| import com.fasterxml.jackson.databind.ObjectMapper; | import com.fasterxml.jackson.databind.ObjectMapper; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | import io.github.amithkoujalgi.ollama4j.core.utils.Utils; | ||||||
| 
 | 
 | ||||||
| public abstract class AbstractRequestSerializationTest<T> { | public abstract class AbstractSerializationTest<T> { | ||||||
| 
 | 
 | ||||||
|     protected ObjectMapper mapper = Utils.getObjectMapper(); |     protected ObjectMapper mapper = Utils.getObjectMapper(); | ||||||
| 
 | 
 | ||||||
|     protected String serializeRequest(T req) { |     protected String serialize(T obj) { | ||||||
|         try { |         try { | ||||||
|             return mapper.writeValueAsString(req); |             return mapper.writeValueAsString(obj); | ||||||
|         } catch (JsonProcessingException e) { |         } catch (JsonProcessingException e) { | ||||||
|             fail("Could not serialize request!", e); |             fail("Could not serialize request!", e); | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     protected T deserializeRequest(String jsonRequest, Class<T> requestClass) { |     protected T deserialize(String jsonObject, Class<T> deserializationClass) { | ||||||
|         try { |         try { | ||||||
|             return mapper.readValue(jsonRequest, requestClass); |             return mapper.readValue(jsonObject, deserializationClass); | ||||||
|         } catch (JsonProcessingException e) { |         } catch (JsonProcessingException e) { | ||||||
|             fail("Could not deserialize jsonRequest!", e); |             fail("Could not deserialize jsonObject!", e); | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     protected void assertEqualsAfterUnmarshalling(T unmarshalledRequest, |     protected void assertEqualsAfterUnmarshalling(T unmarshalledObject, | ||||||
|         T req) { |         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.models.chat.OllamaChatRequestModel; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; | import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; | ||||||
|  |  | ||||||
| public class TestChatRequestSerialization extends AbstractRequestSerializationTest<OllamaChatRequestModel>{ | public class TestChatRequestSerialization extends AbstractSerializationTest<OllamaChatRequestModel> { | ||||||
|  |  | ||||||
|     private OllamaChatRequestBuilder builder; |     private OllamaChatRequestBuilder builder; | ||||||
|  |  | ||||||
| @@ -26,8 +26,8 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe | |||||||
|     @Test |     @Test | ||||||
|     public void testRequestOnlyMandatoryFields() { |     public void testRequestOnlyMandatoryFields() { | ||||||
|         OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt").build(); |         OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt").build(); | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req); |         assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
| @@ -35,16 +35,16 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe | |||||||
|         OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.SYSTEM, "System prompt") |         OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.SYSTEM, "System prompt") | ||||||
|         .withMessage(OllamaChatMessageRole.USER, "Some prompt") |         .withMessage(OllamaChatMessageRole.USER, "Some prompt") | ||||||
|         .build(); |         .build(); | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req); |         assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|     public void testRequestWithMessageAndImage() { |     public void testRequestWithMessageAndImage() { | ||||||
|         OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt", |         OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt", | ||||||
|                 List.of(new File("src/test/resources/dog-on-a-boat.jpg"))).build(); |                 List.of(new File("src/test/resources/dog-on-a-boat.jpg"))).build(); | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req); |         assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
| @@ -61,8 +61,8 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe | |||||||
|             .withOptions(b.setTopP(1).build()) |             .withOptions(b.setTopP(1).build()) | ||||||
|             .build(); |             .build(); | ||||||
|  |  | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         OllamaChatRequestModel deserializeRequest = deserializeRequest(jsonRequest, OllamaChatRequestModel.class); |         OllamaChatRequestModel deserializeRequest = deserialize(jsonRequest, OllamaChatRequestModel.class); | ||||||
|         assertEqualsAfterUnmarshalling(deserializeRequest, req); |         assertEqualsAfterUnmarshalling(deserializeRequest, req); | ||||||
|         assertEquals(1, deserializeRequest.getOptions().get("mirostat")); |         assertEquals(1, deserializeRequest.getOptions().get("mirostat")); | ||||||
|         assertEquals(1.0, deserializeRequest.getOptions().get("temperature")); |         assertEquals(1.0, deserializeRequest.getOptions().get("temperature")); | ||||||
| @@ -79,7 +79,7 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe | |||||||
|         OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt") |         OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt") | ||||||
|                 .withGetJsonResponse().build(); |                 .withGetJsonResponse().build(); | ||||||
|  |  | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         // no jackson deserialization as format property is not boolean ==> omit as deserialization |         // no jackson deserialization as format property is not boolean ==> omit as deserialization | ||||||
|         // of request is never used in real code anyways |         // of request is never used in real code anyways | ||||||
|         JSONObject jsonObject = new JSONObject(jsonRequest); |         JSONObject jsonObject = new JSONObject(jsonRequest); | ||||||
| @@ -91,15 +91,15 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe | |||||||
|     public void testWithTemplate() { |     public void testWithTemplate() { | ||||||
|         OllamaChatRequestModel req = builder.withTemplate("System Template") |         OllamaChatRequestModel req = builder.withTemplate("System Template") | ||||||
|             .build(); |             .build(); | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest, OllamaChatRequestModel.class), req); |         assertEqualsAfterUnmarshalling(deserialize(jsonRequest, OllamaChatRequestModel.class), req); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|     public void testWithStreaming() { |     public void testWithStreaming() { | ||||||
|         OllamaChatRequestModel req = builder.withStreaming().build(); |         OllamaChatRequestModel req = builder.withStreaming().build(); | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         assertEquals(deserializeRequest(jsonRequest, OllamaChatRequestModel.class).isStream(), true); |         assertEquals(deserialize(jsonRequest, OllamaChatRequestModel.class).isStream(), true); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
| @@ -107,7 +107,7 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe | |||||||
|         String expectedKeepAlive = "5m"; |         String expectedKeepAlive = "5m"; | ||||||
|         OllamaChatRequestModel req = builder.withKeepAlive(expectedKeepAlive) |         OllamaChatRequestModel req = builder.withKeepAlive(expectedKeepAlive) | ||||||
|             .build(); |             .build(); | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         assertEquals(deserializeRequest(jsonRequest, OllamaChatRequestModel.class).getKeepAlive(), expectedKeepAlive); |         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.models.embeddings.OllamaEmbeddingsRequestBuilder; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; | import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; | ||||||
|  |  | ||||||
| public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializationTest<OllamaEmbeddingsRequestModel>{ | public class TestEmbeddingsRequestSerialization extends AbstractSerializationTest<OllamaEmbeddingsRequestModel> { | ||||||
|  |  | ||||||
|         private OllamaEmbeddingsRequestBuilder builder; |         private OllamaEmbeddingsRequestBuilder builder; | ||||||
|  |  | ||||||
| @@ -19,8 +19,8 @@ public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializa | |||||||
|             @Test |             @Test | ||||||
|     public void testRequestOnlyMandatoryFields() { |     public void testRequestOnlyMandatoryFields() { | ||||||
|         OllamaEmbeddingsRequestModel req = builder.build(); |         OllamaEmbeddingsRequestModel req = builder.build(); | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaEmbeddingsRequestModel.class), req); |         assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaEmbeddingsRequestModel.class), req); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|         @Test |         @Test | ||||||
| @@ -29,8 +29,8 @@ public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializa | |||||||
|             OllamaEmbeddingsRequestModel req = builder |             OllamaEmbeddingsRequestModel req = builder | ||||||
|                     .withOptions(b.setMirostat(1).build()).build(); |                     .withOptions(b.setMirostat(1).build()).build(); | ||||||
|  |  | ||||||
|             String jsonRequest = serializeRequest(req); |             String jsonRequest = serialize(req); | ||||||
|             OllamaEmbeddingsRequestModel deserializeRequest = deserializeRequest(jsonRequest,OllamaEmbeddingsRequestModel.class); |             OllamaEmbeddingsRequestModel deserializeRequest = deserialize(jsonRequest,OllamaEmbeddingsRequestModel.class); | ||||||
|             assertEqualsAfterUnmarshalling(deserializeRequest, req); |             assertEqualsAfterUnmarshalling(deserializeRequest, req); | ||||||
|             assertEquals(1, deserializeRequest.getOptions().get("mirostat")); |             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.models.generate.OllamaGenerateRequestModel; | ||||||
| import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; | import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder; | ||||||
|  |  | ||||||
| public class TestGenerateRequestSerialization extends AbstractRequestSerializationTest<OllamaGenerateRequestModel>{ | public class TestGenerateRequestSerialization extends AbstractSerializationTest<OllamaGenerateRequestModel> { | ||||||
|  |  | ||||||
|     private OllamaGenerateRequestBuilder builder; |     private OllamaGenerateRequestBuilder builder; | ||||||
|  |  | ||||||
| @@ -24,8 +24,8 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati | |||||||
|     public void testRequestOnlyMandatoryFields() { |     public void testRequestOnlyMandatoryFields() { | ||||||
|         OllamaGenerateRequestModel req = builder.withPrompt("Some prompt").build(); |         OllamaGenerateRequestModel req = builder.withPrompt("Some prompt").build(); | ||||||
|  |  | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest, OllamaGenerateRequestModel.class), req); |         assertEqualsAfterUnmarshalling(deserialize(jsonRequest, OllamaGenerateRequestModel.class), req); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
| @@ -34,8 +34,8 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati | |||||||
|         OllamaGenerateRequestModel req = |         OllamaGenerateRequestModel req = | ||||||
|                 builder.withPrompt("Some prompt").withOptions(b.setMirostat(1).build()).build(); |                 builder.withPrompt("Some prompt").withOptions(b.setMirostat(1).build()).build(); | ||||||
|  |  | ||||||
|         String jsonRequest = serializeRequest(req); |         String jsonRequest = serialize(req); | ||||||
|         OllamaGenerateRequestModel deserializeRequest = deserializeRequest(jsonRequest, OllamaGenerateRequestModel.class); |         OllamaGenerateRequestModel deserializeRequest = deserialize(jsonRequest, OllamaGenerateRequestModel.class); | ||||||
|         assertEqualsAfterUnmarshalling(deserializeRequest, req); |         assertEqualsAfterUnmarshalling(deserializeRequest, req); | ||||||
|         assertEquals(1, deserializeRequest.getOptions().get("mirostat")); |         assertEquals(1, deserializeRequest.getOptions().get("mirostat")); | ||||||
|     } |     } | ||||||
| @@ -45,7 +45,7 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati | |||||||
|         OllamaGenerateRequestModel req = |         OllamaGenerateRequestModel req = | ||||||
|                 builder.withPrompt("Some prompt").withGetJsonResponse().build(); |                 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 |         // no jackson deserialization as format property is not boolean ==> omit as deserialization | ||||||
|         // of request is never used in real code anyways |         // of request is never used in real code anyways | ||||||
|         JSONObject jsonObject = new JSONObject(jsonRequest); |         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