forked from Mirror/ollama4j
Compare commits
42 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42b15ad93f | ||
|
|
6f7a714bae | ||
|
|
92618e5084 | ||
|
|
391a9242c3 | ||
|
|
e1b6dc3b54 | ||
|
|
04124cf978 | ||
|
|
e4e717b747 | ||
|
|
10d2a8f5ff | ||
|
|
899fa38805 | ||
|
|
2df878c953 | ||
|
|
78a5eedc8f | ||
|
|
364f961ee2 | ||
|
|
b21aa6add2 | ||
|
|
ec4abd1c2d | ||
|
|
9900ae92fb | ||
|
|
fa20daf6e5 | ||
|
|
44949c0559 | ||
|
|
e88711a017 | ||
|
|
32169ded18 | ||
|
|
4b2d566fd9 | ||
|
|
fb4b7a7ce5 | ||
|
|
18f27775b0 | ||
|
|
cb462ad05a | ||
|
|
1eec22ca1a | ||
|
|
c1f3c51f88 | ||
|
|
7dd556293f | ||
|
|
ee50131ce4 | ||
|
|
2cd47dbfaa | ||
|
|
e5296c1067 | ||
|
|
0f00f05e3d | ||
|
|
976a3b82e5 | ||
|
|
ba26d620c4 | ||
|
|
e45246a767 | ||
|
|
7336668f0c | ||
|
|
11701fb222 | ||
|
|
b1ec12c4e9 | ||
|
|
d0b0a0fc97 | ||
|
|
20774fca6b | ||
|
|
9c46b510d8 | ||
|
|
9d887b60a8 | ||
|
|
63d4de4e24 | ||
|
|
a10692e2f1 |
12
README.md
12
README.md
@@ -67,7 +67,7 @@ In your Maven project, add this dependency:
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.amithkoujalgi</groupId>
|
<groupId>io.github.amithkoujalgi</groupId>
|
||||||
<artifactId>ollama4j</artifactId>
|
<artifactId>ollama4j</artifactId>
|
||||||
<version>1.0.47</version>
|
<version>1.0.57</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -125,15 +125,15 @@ Actions CI workflow.
|
|||||||
- [x] Update request body creation with Java objects
|
- [x] Update request body creation with Java objects
|
||||||
- [ ] Async APIs for images
|
- [ ] Async APIs for images
|
||||||
- [ ] Add custom headers to requests
|
- [ ] Add custom headers to requests
|
||||||
- [ ] Add additional params for `ask` APIs such as:
|
- [x] Add additional params for `ask` APIs such as:
|
||||||
- [x] `options`: additional model parameters for the Modelfile such as `temperature` -
|
- [x] `options`: additional model parameters for the Modelfile such as `temperature` -
|
||||||
Supported [params](https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values).
|
Supported [params](https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values).
|
||||||
- [ ] `system`: system prompt to (overrides what is defined in the Modelfile)
|
- [x] `system`: system prompt to (overrides what is defined in the Modelfile)
|
||||||
- [ ] `template`: the full prompt or prompt template (overrides what is defined in the Modelfile)
|
- [x] `template`: the full prompt or prompt template (overrides what is defined in the Modelfile)
|
||||||
- [ ] `context`: the context parameter returned from a previous request, which can be used to keep a
|
- [x] `context`: the context parameter returned from a previous request, which can be used to keep a
|
||||||
short
|
short
|
||||||
conversational memory
|
conversational memory
|
||||||
- [ ] `stream`: Add support for streaming responses from the model
|
- [x] `stream`: Add support for streaming responses from the model
|
||||||
- [ ] Add test cases
|
- [ ] Add test cases
|
||||||
- [ ] Handle exceptions better (maybe throw more appropriate exceptions)
|
- [ ] Handle exceptions better (maybe throw more appropriate exceptions)
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ sidebar_position: 7
|
|||||||
|
|
||||||
# Chat
|
# Chat
|
||||||
|
|
||||||
This API lets you create a conversation with LLMs. Using this API enables you to ask questions to the model including
|
This API lets you create a conversation with LLMs. Using this API enables you to ask questions to the model including
|
||||||
information using the history of already asked questions and the respective answers.
|
information using the history of already asked questions and the respective answers.
|
||||||
|
|
||||||
## Create a new conversation and use chat history to augment follow up questions
|
## Create a new conversation and use chat history to augment follow up questions
|
||||||
@@ -20,8 +20,8 @@ public class Main {
|
|||||||
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAMA2);
|
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAMA2);
|
||||||
|
|
||||||
// create first user question
|
// create first user question
|
||||||
OllamaChatRequestModel requestModel = builder.withMessage(OllamaChatMessageRole.USER,"What is the capital of France?")
|
OllamaChatRequestModel requestModel = builder.withMessage(OllamaChatMessageRole.USER, "What is the capital of France?")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// start conversation with model
|
// start conversation with model
|
||||||
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
|
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
|
||||||
@@ -29,7 +29,7 @@ public class Main {
|
|||||||
System.out.println("First answer: " + chatResult.getResponse());
|
System.out.println("First answer: " + chatResult.getResponse());
|
||||||
|
|
||||||
// create next userQuestion
|
// create next userQuestion
|
||||||
requestModel = builder.withMessages(chatResult.getChatHistory()).withMessage(OllamaChatMessageRole.USER,"And what is the second largest city?").build();
|
requestModel = builder.withMessages(chatResult.getChatHistory()).withMessage(OllamaChatMessageRole.USER, "And what is the second largest city?").build();
|
||||||
|
|
||||||
// "continue" conversation with model
|
// "continue" conversation with model
|
||||||
chatResult = ollamaAPI.chat(requestModel);
|
chatResult = ollamaAPI.chat(requestModel);
|
||||||
@@ -41,32 +41,38 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
You will get a response similar to:
|
You will get a response similar to:
|
||||||
|
|
||||||
> First answer: Should be Paris!
|
> First answer: Should be Paris!
|
||||||
>
|
>
|
||||||
> Second answer: Marseille.
|
> Second answer: Marseille.
|
||||||
>
|
>
|
||||||
> Chat History:
|
> Chat History:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
[ {
|
[
|
||||||
"role" : "user",
|
{
|
||||||
"content" : "What is the capital of France?",
|
"role": "user",
|
||||||
"images" : [ ]
|
"content": "What is the capital of France?",
|
||||||
}, {
|
"images": []
|
||||||
"role" : "assistant",
|
},
|
||||||
"content" : "Should be Paris!",
|
{
|
||||||
"images" : [ ]
|
"role": "assistant",
|
||||||
}, {
|
"content": "Should be Paris!",
|
||||||
"role" : "user",
|
"images": []
|
||||||
"content" : "And what is the second largest city?",
|
},
|
||||||
"images" : [ ]
|
{
|
||||||
}, {
|
"role": "user",
|
||||||
"role" : "assistant",
|
"content": "And what is the second largest city?",
|
||||||
"content" : "Marseille.",
|
"images": []
|
||||||
"images" : [ ]
|
},
|
||||||
} ]
|
{
|
||||||
|
"role": "assistant",
|
||||||
|
"content": "Marseille.",
|
||||||
|
"images": []
|
||||||
|
}
|
||||||
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Create a conversation where the answer is streamed
|
## Create a conversation where the answer is streamed
|
||||||
@@ -81,30 +87,50 @@ public class Main {
|
|||||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||||
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(config.getModel());
|
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(config.getModel());
|
||||||
OllamaChatRequestModel requestModel = builder.withMessage(OllamaChatMessageRole.USER,
|
OllamaChatRequestModel requestModel = builder.withMessage(OllamaChatMessageRole.USER,
|
||||||
"What is the capital of France? And what's France's connection with Mona Lisa?")
|
"What is the capital of France? And what's France's connection with Mona Lisa?")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// define a handler (Consumer<String>)
|
// define a handler (Consumer<String>)
|
||||||
OllamaStreamHandler streamHandler = (s) -> {
|
OllamaStreamHandler streamHandler = (s) -> {
|
||||||
System.out.println(s);
|
System.out.println(s);
|
||||||
};
|
};
|
||||||
|
|
||||||
OllamaChatResult chatResult = ollamaAPI.chat(requestModel,streamHandler);
|
OllamaChatResult chatResult = ollamaAPI.chat(requestModel, streamHandler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You will get a response similar to:
|
You will get a response similar to:
|
||||||
|
|
||||||
> The
|
> The
|
||||||
> The capital
|
> The capital
|
||||||
> The capital of
|
> The capital of
|
||||||
> The capital of France
|
> The capital of France
|
||||||
> The capital of France is
|
> The capital of France is
|
||||||
> The capital of France is Paris
|
> The capital of France is Paris
|
||||||
> The capital of France is Paris.
|
> The capital of France is Paris.
|
||||||
|
|
||||||
|
## Use a simple Console Output Stream Handler
|
||||||
|
|
||||||
|
```java
|
||||||
|
import io.github.amithkoujalgi.ollama4j.core.impl.ConsoleOutputStreamHandler;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
String host = "http://localhost:11434/";
|
||||||
|
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||||
|
|
||||||
|
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAMA2);
|
||||||
|
OllamaChatRequestModel requestModel = builder.withMessage(OllamaChatMessageRole.USER, "List all cricket world cup teams of 2019. Name the teams!")
|
||||||
|
.build();
|
||||||
|
OllamaStreamHandler streamHandler = new ConsoleOutputStreamHandler();
|
||||||
|
ollamaAPI.chat(requestModel, streamHandler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Create a new conversation with individual system prompt
|
## Create a new conversation with individual system prompt
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public class Main {
|
public class Main {
|
||||||
|
|
||||||
@@ -117,8 +143,8 @@ public class Main {
|
|||||||
|
|
||||||
// create request with system-prompt (overriding the model defaults) and user question
|
// create request with system-prompt (overriding the model defaults) and user question
|
||||||
OllamaChatRequestModel requestModel = builder.withMessage(OllamaChatMessageRole.SYSTEM, "You are a silent bot that only says 'NI'. Do not say anything else under any circumstances!")
|
OllamaChatRequestModel requestModel = builder.withMessage(OllamaChatMessageRole.SYSTEM, "You are a silent bot that only says 'NI'. Do not say anything else under any circumstances!")
|
||||||
.withMessage(OllamaChatMessageRole.USER,"What is the capital of France? And what's France's connection with Mona Lisa?")
|
.withMessage(OllamaChatMessageRole.USER, "What is the capital of France? And what's France's connection with Mona Lisa?")
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// start conversation with model
|
// start conversation with model
|
||||||
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
|
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
|
||||||
@@ -128,6 +154,7 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
You will get a response similar to:
|
You will get a response similar to:
|
||||||
|
|
||||||
> NI.
|
> NI.
|
||||||
@@ -139,34 +166,40 @@ public class Main {
|
|||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
|
|
||||||
String host = "http://localhost:11434/";
|
String host = "http://localhost:11434/";
|
||||||
|
|
||||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||||
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAVA);
|
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAVA);
|
||||||
|
|
||||||
// Load Image from File and attach to user message (alternatively images could also be added via URL)
|
// Load Image from File and attach to user message (alternatively images could also be added via URL)
|
||||||
OllamaChatRequestModel requestModel =
|
OllamaChatRequestModel requestModel =
|
||||||
builder.withMessage(OllamaChatMessageRole.USER, "What's in the picture?",
|
builder.withMessage(OllamaChatMessageRole.USER, "What's in the picture?",
|
||||||
List.of(getImageFileFromClasspath("dog-on-a-boat.jpg"))).build();
|
List.of(getImageFileFromClasspath("dog-on-a-boat.jpg"))).build();
|
||||||
|
|
||||||
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
|
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
|
||||||
System.out.println("First answer: " + chatResult.getResponse());
|
System.out.println("First answer: " + chatResult.getResponse());
|
||||||
|
|
||||||
builder.reset();
|
builder.reset();
|
||||||
|
|
||||||
// Use history to ask further questions about the image or assistant answer
|
// Use history to ask further questions about the image or assistant answer
|
||||||
requestModel =
|
requestModel =
|
||||||
builder.withMessages(chatResult.getChatHistory())
|
builder.withMessages(chatResult.getChatHistory())
|
||||||
.withMessage(OllamaChatMessageRole.USER, "What's the dogs breed?").build();
|
.withMessage(OllamaChatMessageRole.USER, "What's the dogs breed?").build();
|
||||||
|
|
||||||
chatResult = ollamaAPI.chat(requestModel);
|
chatResult = ollamaAPI.chat(requestModel);
|
||||||
System.out.println("Second answer: " + chatResult.getResponse());
|
System.out.println("Second answer: " + chatResult.getResponse());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You will get a response similar to:
|
You will get a response similar to:
|
||||||
|
|
||||||
> First Answer: The image shows a dog sitting on the bow of a boat that is docked in calm water. The boat has two levels, with the lower level containing seating and what appears to be an engine cover. The dog seems relaxed and comfortable on the boat, looking out over the water. The background suggests it might be late afternoon or early evening, given the warm lighting and the low position of the sun in the sky.
|
> First Answer: The image shows a dog sitting on the bow of a boat that is docked in calm water. The boat has two
|
||||||
|
> levels, with the lower level containing seating and what appears to be an engine cover. The dog seems relaxed and
|
||||||
|
> comfortable on the boat, looking out over the water. The background suggests it might be late afternoon or early
|
||||||
|
> evening, given the warm lighting and the low position of the sun in the sky.
|
||||||
>
|
>
|
||||||
> Second Answer: Based on the image, it's difficult to definitively determine the breed of the dog. However, the dog appears to be medium-sized with a short coat and a brown coloration, which might suggest that it is a Golden Retriever or a similar breed. Without more details like ear shape and tail length, it's not possible to identify the exact breed confidently.
|
> Second Answer: Based on the image, it's difficult to definitively determine the breed of the dog. However, the dog
|
||||||
|
> appears to be medium-sized with a short coat and a brown coloration, which might suggest that it is a Golden Retriever
|
||||||
|
> or a similar breed. Without more details like ear shape and tail length, it's not possible to identify the exact breed
|
||||||
|
> confidently.
|
||||||
@@ -42,7 +42,7 @@ public class AskPhi {
|
|||||||
.addSeparator()
|
.addSeparator()
|
||||||
.add("How do I read a file in Go and print its contents to stdout?");
|
.add("How do I read a file in Go and print its contents to stdout?");
|
||||||
|
|
||||||
OllamaResult response = ollamaAPI.generate(model, promptBuilder.build());
|
OllamaResult response = ollamaAPI.generate(model, promptBuilder.build(), new OptionsBuilder().build());
|
||||||
System.out.println(response.getResponse());
|
System.out.println(response.getResponse());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
6
pom.xml
6
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.56</version>
|
<version>1.0.67</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.56</tag>
|
<tag>v1.0.67</tag>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<skipTests>${skipUnitTests}</skipTests>
|
<skipTests>${skipUnitTests}</skipTests>
|
||||||
<includes>
|
<includes>
|
||||||
<include>**/unittests/*.java</include>
|
<include>**/unittests/**/*.java</include>
|
||||||
</includes>
|
</includes>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,14 @@
|
|||||||
|
package io.github.amithkoujalgi.ollama4j.core.impl;
|
||||||
|
|
||||||
|
import io.github.amithkoujalgi.ollama4j.core.OllamaStreamHandler;
|
||||||
|
|
||||||
|
public class ConsoleOutputStreamHandler implements OllamaStreamHandler {
|
||||||
|
private final StringBuffer response = new StringBuffer();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(String message) {
|
||||||
|
String substr = message.substring(response.length());
|
||||||
|
response.append(substr);
|
||||||
|
System.out.print(substr);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,4 +1,4 @@
|
|||||||
package io.github.amithkoujalgi.ollama4j.core.models;
|
package io.github.amithkoujalgi.ollama4j.core.models.embeddings;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
|
||||||
@@ -7,7 +7,7 @@ import lombok.Data;
|
|||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@Data
|
@Data
|
||||||
public class EmbeddingResponse {
|
public class OllamaEmbeddingResponseModel {
|
||||||
@JsonProperty("embedding")
|
@JsonProperty("embedding")
|
||||||
private List<Double> embedding;
|
private List<Double> embedding;
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package io.github.amithkoujalgi.ollama4j.core.models.embeddings;
|
||||||
|
|
||||||
|
import io.github.amithkoujalgi.ollama4j.core.utils.Options;
|
||||||
|
|
||||||
|
public class OllamaEmbeddingsRequestBuilder {
|
||||||
|
|
||||||
|
private OllamaEmbeddingsRequestBuilder(String model, String prompt){
|
||||||
|
request = new OllamaEmbeddingsRequestModel(model, prompt);
|
||||||
|
}
|
||||||
|
|
||||||
|
private OllamaEmbeddingsRequestModel request;
|
||||||
|
|
||||||
|
public static OllamaEmbeddingsRequestBuilder getInstance(String model, String prompt){
|
||||||
|
return new OllamaEmbeddingsRequestBuilder(model, prompt);
|
||||||
|
}
|
||||||
|
|
||||||
|
public OllamaEmbeddingsRequestModel build(){
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OllamaEmbeddingsRequestBuilder withOptions(Options options){
|
||||||
|
this.request.setOptions(options.getOptionsMap());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OllamaEmbeddingsRequestBuilder withKeepAlive(String keepAlive){
|
||||||
|
this.request.setKeepAlive(keepAlive);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package io.github.amithkoujalgi.ollama4j.core.models.embeddings;
|
||||||
|
|
||||||
|
import static io.github.amithkoujalgi.ollama4j.core.utils.Utils.getObjectMapper;
|
||||||
|
import java.util.Map;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.NonNull;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class OllamaEmbeddingsRequestModel {
|
||||||
|
@NonNull
|
||||||
|
private String model;
|
||||||
|
@NonNull
|
||||||
|
private String prompt;
|
||||||
|
|
||||||
|
protected Map<String, Object> options;
|
||||||
|
@JsonProperty(value = "keep_alive")
|
||||||
|
private String keepAlive;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
try {
|
||||||
|
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
|
||||||
|
} catch (JsonProcessingException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
package io.github.amithkoujalgi.ollama4j.core.models.request;
|
|
||||||
|
|
||||||
import static io.github.amithkoujalgi.ollama4j.core.utils.Utils.getObjectMapper;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Data;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
@AllArgsConstructor
|
|
||||||
public class ModelEmbeddingsRequest {
|
|
||||||
private String model;
|
|
||||||
private String prompt;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
try {
|
|
||||||
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
|
|
||||||
} catch (JsonProcessingException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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,14 +37,14 @@ 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public OllamaResult call(OllamaRequestBody body, OllamaStreamHandler streamHandler)
|
public OllamaResult call(OllamaRequestBody body, OllamaStreamHandler streamHandler)
|
||||||
@@ -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,22 +22,11 @@ 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.
|
||||||
*/
|
*/
|
||||||
public abstract class OllamaEndpointCaller {
|
public abstract class OllamaEndpointCaller {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(OllamaAPI.class);
|
private static final Logger LOG = LoggerFactory.getLogger(OllamaAPI.class);
|
||||||
|
|
||||||
private String host;
|
private String host;
|
||||||
@@ -49,107 +48,105 @@ public abstract class OllamaEndpointCaller {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Calls the api server on the given host and endpoint suffix asynchronously, aka waiting for the response.
|
* Calls the api server on the given host and endpoint suffix asynchronously, aka waiting for the response.
|
||||||
*
|
*
|
||||||
* @param body POST body payload
|
* @param body POST body payload
|
||||||
* @return result answer given by the assistant
|
* @return result answer given by the assistant
|
||||||
* @throws OllamaBaseException any response code than 200 has been returned
|
* @throws OllamaBaseException any response code than 200 has been returned
|
||||||
* @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();
|
||||||
URI uri = URI.create(this.host + getEndpointSuffix());
|
URI uri = URI.create(this.host + getEndpointSuffix());
|
||||||
HttpRequest.Builder requestBuilder =
|
HttpRequest.Builder requestBuilder =
|
||||||
getRequestBuilderDefault(uri)
|
getRequestBuilderDefault(uri)
|
||||||
.POST(
|
.POST(
|
||||||
body.getBodyPublisher());
|
body.getBodyPublisher());
|
||||||
HttpRequest request = requestBuilder.build();
|
HttpRequest request = requestBuilder.build();
|
||||||
if (this.verbose) LOG.info("Asking model: " + body.toString());
|
if (this.verbose) LOG.info("Asking model: " + body.toString());
|
||||||
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();
|
||||||
try (BufferedReader reader =
|
try (BufferedReader reader =
|
||||||
new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
|
new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
|
||||||
String line;
|
String line;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
if (statusCode == 404) {
|
if (statusCode == 404) {
|
||||||
LOG.warn("Status code: 404 (Not Found)");
|
LOG.warn("Status code: 404 (Not Found)");
|
||||||
OllamaErrorResponseModel ollamaResponseModel =
|
OllamaErrorResponseModel ollamaResponseModel =
|
||||||
Utils.getObjectMapper().readValue(line, OllamaErrorResponseModel.class);
|
Utils.getObjectMapper().readValue(line, OllamaErrorResponseModel.class);
|
||||||
responseBuffer.append(ollamaResponseModel.getError());
|
responseBuffer.append(ollamaResponseModel.getError());
|
||||||
} else if (statusCode == 401) {
|
} else if (statusCode == 401) {
|
||||||
LOG.warn("Status code: 401 (Unauthorized)");
|
LOG.warn("Status code: 401 (Unauthorized)");
|
||||||
OllamaErrorResponseModel ollamaResponseModel =
|
OllamaErrorResponseModel ollamaResponseModel =
|
||||||
Utils.getObjectMapper()
|
Utils.getObjectMapper()
|
||||||
.readValue("{\"error\":\"Unauthorized\"}", OllamaErrorResponseModel.class);
|
.readValue("{\"error\":\"Unauthorized\"}", OllamaErrorResponseModel.class);
|
||||||
responseBuffer.append(ollamaResponseModel.getError());
|
responseBuffer.append(ollamaResponseModel.getError());
|
||||||
} else if (statusCode == 400) {
|
} else if (statusCode == 400) {
|
||||||
LOG.warn("Status code: 400 (Bad Request)");
|
LOG.warn("Status code: 400 (Bad Request)");
|
||||||
OllamaErrorResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line,
|
OllamaErrorResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line,
|
||||||
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (statusCode != 200) {
|
if (statusCode != 200) {
|
||||||
LOG.error("Status code " + statusCode);
|
LOG.error("Status code " + statusCode);
|
||||||
throw new OllamaBaseException(responseBuffer.toString());
|
throw new OllamaBaseException(responseBuffer.toString());
|
||||||
} else {
|
} else {
|
||||||
long endTime = System.currentTimeMillis();
|
long endTime = System.currentTimeMillis();
|
||||||
OllamaResult ollamaResult =
|
OllamaResult ollamaResult =
|
||||||
new OllamaResult(responseBuffer.toString().trim(), endTime - startTime, statusCode);
|
new OllamaResult(responseBuffer.toString().trim(), endTime - startTime, statusCode);
|
||||||
if (verbose) LOG.info("Model response: " + ollamaResult);
|
if (verbose) LOG.info("Model response: " + ollamaResult);
|
||||||
return ollamaResult;
|
return ollamaResult;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get default request builder.
|
* Get default request builder.
|
||||||
*
|
*
|
||||||
* @param uri URI to get a HttpRequest.Builder
|
* @param uri URI to get a HttpRequest.Builder
|
||||||
* @return HttpRequest.Builder
|
* @return HttpRequest.Builder
|
||||||
*/
|
*/
|
||||||
private HttpRequest.Builder getRequestBuilderDefault(URI uri) {
|
private HttpRequest.Builder getRequestBuilderDefault(URI uri) {
|
||||||
HttpRequest.Builder requestBuilder =
|
HttpRequest.Builder requestBuilder =
|
||||||
HttpRequest.newBuilder(uri)
|
HttpRequest.newBuilder(uri)
|
||||||
.header("Content-Type", "application/json")
|
.header("Content-Type", "application/json")
|
||||||
.timeout(Duration.ofSeconds(this.requestTimeoutSeconds));
|
.timeout(Duration.ofSeconds(this.requestTimeoutSeconds));
|
||||||
if (isBasicAuthCredentialsSet()) {
|
if (isBasicAuthCredentialsSet()) {
|
||||||
requestBuilder.header("Authorization", getBasicAuthHeaderValue());
|
requestBuilder.header("Authorization", getBasicAuthHeaderValue());
|
||||||
|
}
|
||||||
|
return requestBuilder;
|
||||||
}
|
}
|
||||||
return requestBuilder;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get basic authentication header value.
|
* Get basic authentication header value.
|
||||||
*
|
*
|
||||||
* @return basic authentication header value (encoded credentials)
|
* @return basic authentication header value (encoded credentials)
|
||||||
*/
|
*/
|
||||||
private String getBasicAuthHeaderValue() {
|
private String getBasicAuthHeaderValue() {
|
||||||
String credentialsToEncode = this.basicAuth.getUsername() + ":" + this.basicAuth.getPassword();
|
String credentialsToEncode = this.basicAuth.getUsername() + ":" + this.basicAuth.getPassword();
|
||||||
return "Basic " + Base64.getEncoder().encodeToString(credentialsToEncode.getBytes());
|
return "Basic " + Base64.getEncoder().encodeToString(credentialsToEncode.getBytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if Basic Auth credentials set.
|
||||||
|
*
|
||||||
|
* @return true when Basic Auth credentials set
|
||||||
|
*/
|
||||||
|
private boolean isBasicAuthCredentialsSet() {
|
||||||
|
return this.basicAuth != null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if Basic Auth credentials set.
|
|
||||||
*
|
|
||||||
* @return true when Basic Auth credentials set
|
|
||||||
*/
|
|
||||||
private boolean isBasicAuthCredentialsSet() {
|
|
||||||
return this.basicAuth != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,57 +8,75 @@ package io.github.amithkoujalgi.ollama4j.core.types;
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("ALL")
|
||||||
public class OllamaModelType {
|
public class OllamaModelType {
|
||||||
public static final String LLAMA2 = "llama2";
|
public static final String GEMMA = "gemma";
|
||||||
public static final String MISTRAL = "mistral";
|
public static final String LLAMA2 = "llama2";
|
||||||
public static final String LLAVA = "llava";
|
public static final String LLAMA3 = "llama3";
|
||||||
public static final String MIXTRAL = "mixtral";
|
public static final String MISTRAL = "mistral";
|
||||||
public static final String STARLING_LM = "starling-lm";
|
public static final String MIXTRAL = "mixtral";
|
||||||
public static final String NEURAL_CHAT = "neural-chat";
|
public static final String LLAVA = "llava";
|
||||||
public static final String CODELLAMA = "codellama";
|
public static final String LLAVA_PHI3 = "llava-phi3";
|
||||||
public static final String LLAMA2_UNCENSORED = "llama2-uncensored";
|
public static final String NEURAL_CHAT = "neural-chat";
|
||||||
public static final String DOLPHIN_MIXTRAL = "dolphin-mixtral";
|
public static final String CODELLAMA = "codellama";
|
||||||
public static final String ORCA_MINI = "orca-mini";
|
public static final String DOLPHIN_MIXTRAL = "dolphin-mixtral";
|
||||||
public static final String VICUNA = "vicuna";
|
public static final String MISTRAL_OPENORCA = "mistral-openorca";
|
||||||
public static final String WIZARD_VICUNA_UNCENSORED = "wizard-vicuna-uncensored";
|
public static final String LLAMA2_UNCENSORED = "llama2-uncensored";
|
||||||
public static final String PHIND_CODELLAMA = "phind-codellama";
|
public static final String PHI = "phi";
|
||||||
public static final String PHI = "phi";
|
public static final String PHI3 = "phi3";
|
||||||
public static final String ZEPHYR = "zephyr";
|
public static final String ORCA_MINI = "orca-mini";
|
||||||
public static final String WIZARDCODER = "wizardcoder";
|
public static final String DEEPSEEK_CODER = "deepseek-coder";
|
||||||
public static final String MISTRAL_OPENORCA = "mistral-openorca";
|
public static final String DOLPHIN_MISTRAL = "dolphin-mistral";
|
||||||
public static final String NOUS_HERMES = "nous-hermes";
|
public static final String VICUNA = "vicuna";
|
||||||
public static final String DEEPSEEK_CODER = "deepseek-coder";
|
public static final String WIZARD_VICUNA_UNCENSORED = "wizard-vicuna-uncensored";
|
||||||
public static final String WIZARD_MATH = "wizard-math";
|
public static final String ZEPHYR = "zephyr";
|
||||||
public static final String LLAMA2_CHINESE = "llama2-chinese";
|
public static final String OPENHERMES = "openhermes";
|
||||||
public static final String FALCON = "falcon";
|
public static final String QWEN = "qwen";
|
||||||
public static final String ORCA2 = "orca2";
|
public static final String WIZARDCODER = "wizardcoder";
|
||||||
public static final String STABLE_BELUGA = "stable-beluga";
|
public static final String LLAMA2_CHINESE = "llama2-chinese";
|
||||||
public static final String CODEUP = "codeup";
|
public static final String TINYLLAMA = "tinyllama";
|
||||||
public static final String EVERYTHINGLM = "everythinglm";
|
public static final String PHIND_CODELLAMA = "phind-codellama";
|
||||||
public static final String MEDLLAMA2 = "medllama2";
|
public static final String OPENCHAT = "openchat";
|
||||||
public static final String WIZARDLM_UNCENSORED = "wizardlm-uncensored";
|
public static final String ORCA2 = "orca2";
|
||||||
public static final String STARCODER = "starcoder";
|
public static final String FALCON = "falcon";
|
||||||
public static final String DOLPHIN22_MISTRAL = "dolphin2.2-mistral";
|
public static final String WIZARD_MATH = "wizard-math";
|
||||||
public static final String OPENCHAT = "openchat";
|
public static final String TINYDOLPHIN = "tinydolphin";
|
||||||
public static final String WIZARD_VICUNA = "wizard-vicuna";
|
public static final String NOUS_HERMES = "nous-hermes";
|
||||||
public static final String OPENHERMES25_MISTRAL = "openhermes2.5-mistral";
|
public static final String YI = "yi";
|
||||||
public static final String OPEN_ORCA_PLATYPUS2 = "open-orca-platypus2";
|
public static final String DOLPHIN_PHI = "dolphin-phi";
|
||||||
public static final String YI = "yi";
|
public static final String STARLING_LM = "starling-lm";
|
||||||
public static final String YARN_MISTRAL = "yarn-mistral";
|
public static final String STARCODER = "starcoder";
|
||||||
public static final String SAMANTHA_MISTRAL = "samantha-mistral";
|
public static final String CODEUP = "codeup";
|
||||||
public static final String SQLCODER = "sqlcoder";
|
public static final String MEDLLAMA2 = "medllama2";
|
||||||
public static final String YARN_LLAMA2 = "yarn-llama2";
|
public static final String STABLE_CODE = "stable-code";
|
||||||
public static final String MEDITRON = "meditron";
|
public static final String WIZARDLM_UNCENSORED = "wizardlm-uncensored";
|
||||||
public static final String STABLELM_ZEPHYR = "stablelm-zephyr";
|
public static final String BAKLLAVA = "bakllava";
|
||||||
public static final String OPENHERMES2_MISTRAL = "openhermes2-mistral";
|
public static final String EVERYTHINGLM = "everythinglm";
|
||||||
public static final String DEEPSEEK_LLM = "deepseek-llm";
|
public static final String SOLAR = "solar";
|
||||||
public static final String MISTRALLITE = "mistrallite";
|
public static final String STABLE_BELUGA = "stable-beluga";
|
||||||
public static final String DOLPHIN21_MISTRAL = "dolphin2.1-mistral";
|
public static final String SQLCODER = "sqlcoder";
|
||||||
public static final String WIZARDLM = "wizardlm";
|
public static final String YARN_MISTRAL = "yarn-mistral";
|
||||||
public static final String CODEBOOGA = "codebooga";
|
public static final String NOUS_HERMES2_MIXTRAL = "nous-hermes2-mixtral";
|
||||||
public static final String MAGICODER = "magicoder";
|
public static final String SAMANTHA_MISTRAL = "samantha-mistral";
|
||||||
public static final String GOLIATH = "goliath";
|
public static final String STABLELM_ZEPHYR = "stablelm-zephyr";
|
||||||
public static final String NEXUSRAVEN = "nexusraven";
|
public static final String MEDITRON = "meditron";
|
||||||
public static final String ALFRED = "alfred";
|
public static final String WIZARD_VICUNA = "wizard-vicuna";
|
||||||
public static final String XWINLM = "xwinlm";
|
public static final String STABLELM2 = "stablelm2";
|
||||||
public static final String BAKLLAVA = "bakllava";
|
public static final String MAGICODER = "magicoder";
|
||||||
|
public static final String YARN_LLAMA2 = "yarn-llama2";
|
||||||
|
public static final String NOUS_HERMES2 = "nous-hermes2";
|
||||||
|
public static final String DEEPSEEK_LLM = "deepseek-llm";
|
||||||
|
public static final String LLAMA_PRO = "llama-pro";
|
||||||
|
public static final String OPEN_ORCA_PLATYPUS2 = "open-orca-platypus2";
|
||||||
|
public static final String CODEBOOGA = "codebooga";
|
||||||
|
public static final String MISTRALLITE = "mistrallite";
|
||||||
|
public static final String NEXUSRAVEN = "nexusraven";
|
||||||
|
public static final String GOLIATH = "goliath";
|
||||||
|
public static final String NOMIC_EMBED_TEXT = "nomic-embed-text";
|
||||||
|
public static final String NOTUX = "notux";
|
||||||
|
public static final String ALFRED = "alfred";
|
||||||
|
public static final String MEGADOLPHIN = "megadolphin";
|
||||||
|
public static final String WIZARDLM = "wizardlm";
|
||||||
|
public static final String XWINLM = "xwinlm";
|
||||||
|
public static final String NOTUS = "notus";
|
||||||
|
public static final String DUCKDB_NSQL = "duckdb-nsql";
|
||||||
|
public static final String ALL_MINILM = "all-minilm";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,8 @@ import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatMessageRole;
|
|||||||
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestBuilder;
|
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestBuilder;
|
||||||
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestModel;
|
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestModel;
|
||||||
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatResult;
|
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatResult;
|
||||||
|
import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsRequestModel;
|
||||||
|
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;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -61,7 +63,7 @@ class TestRealAPIs {
|
|||||||
} catch (HttpConnectTimeoutException e) {
|
} catch (HttpConnectTimeoutException e) {
|
||||||
fail(e.getMessage());
|
fail(e.getMessage());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +75,7 @@ class TestRealAPIs {
|
|||||||
assertNotNull(ollamaAPI.listModels());
|
assertNotNull(ollamaAPI.listModels());
|
||||||
ollamaAPI.listModels().forEach(System.out::println);
|
ollamaAPI.listModels().forEach(System.out::println);
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,7 +90,7 @@ class TestRealAPIs {
|
|||||||
.anyMatch(model -> model.getModel().equalsIgnoreCase(config.getModel()));
|
.anyMatch(model -> model.getModel().equalsIgnoreCase(config.getModel()));
|
||||||
assertTrue(found);
|
assertTrue(found);
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,7 +103,7 @@ class TestRealAPIs {
|
|||||||
assertNotNull(modelDetails);
|
assertNotNull(modelDetails);
|
||||||
System.out.println(modelDetails);
|
System.out.println(modelDetails);
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,7 +121,7 @@ class TestRealAPIs {
|
|||||||
assertNotNull(result.getResponse());
|
assertNotNull(result.getResponse());
|
||||||
assertFalse(result.getResponse().isEmpty());
|
assertFalse(result.getResponse().isEmpty());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +147,7 @@ class TestRealAPIs {
|
|||||||
assertFalse(result.getResponse().isEmpty());
|
assertFalse(result.getResponse().isEmpty());
|
||||||
assertEquals(sb.toString().trim(), result.getResponse().trim());
|
assertEquals(sb.toString().trim(), result.getResponse().trim());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,7 +165,7 @@ class TestRealAPIs {
|
|||||||
assertNotNull(result.getResponse());
|
assertNotNull(result.getResponse());
|
||||||
assertFalse(result.getResponse().isEmpty());
|
assertFalse(result.getResponse().isEmpty());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,7 +185,7 @@ class TestRealAPIs {
|
|||||||
assertFalse(chatResult.getResponse().isBlank());
|
assertFalse(chatResult.getResponse().isBlank());
|
||||||
assertEquals(4,chatResult.getChatHistory().size());
|
assertEquals(4,chatResult.getChatHistory().size());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +207,7 @@ class TestRealAPIs {
|
|||||||
assertTrue(chatResult.getResponse().startsWith("NI"));
|
assertTrue(chatResult.getResponse().startsWith("NI"));
|
||||||
assertEquals(3, chatResult.getChatHistory().size());
|
assertEquals(3, chatResult.getChatHistory().size());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +232,7 @@ class TestRealAPIs {
|
|||||||
assertNotNull(chatResult);
|
assertNotNull(chatResult);
|
||||||
assertEquals(sb.toString().trim(), chatResult.getResponse().trim());
|
assertEquals(sb.toString().trim(), chatResult.getResponse().trim());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,7 +263,7 @@ class TestRealAPIs {
|
|||||||
|
|
||||||
|
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,7 +280,7 @@ class TestRealAPIs {
|
|||||||
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
|
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
|
||||||
assertNotNull(chatResult);
|
assertNotNull(chatResult);
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,7 +300,7 @@ class TestRealAPIs {
|
|||||||
assertNotNull(result.getResponse());
|
assertNotNull(result.getResponse());
|
||||||
assertFalse(result.getResponse().isEmpty());
|
assertFalse(result.getResponse().isEmpty());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,7 +324,7 @@ class TestRealAPIs {
|
|||||||
assertFalse(result.getResponse().isEmpty());
|
assertFalse(result.getResponse().isEmpty());
|
||||||
assertEquals(sb.toString().trim(), result.getResponse().trim());
|
assertEquals(sb.toString().trim(), result.getResponse().trim());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,7 +344,24 @@ class TestRealAPIs {
|
|||||||
assertNotNull(result.getResponse());
|
assertNotNull(result.getResponse());
|
||||||
assertFalse(result.getResponse().isEmpty());
|
assertFalse(result.getResponse().isEmpty());
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
||||||
throw new RuntimeException(e);
|
fail(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(3)
|
||||||
|
public void testEmbedding() {
|
||||||
|
testEndpointReachability();
|
||||||
|
try {
|
||||||
|
OllamaEmbeddingsRequestModel request = OllamaEmbeddingsRequestBuilder
|
||||||
|
.getInstance(config.getModel(), "What is the capital of France?").build();
|
||||||
|
|
||||||
|
List<Double> embeddings = ollamaAPI.generateEmbeddings(request);
|
||||||
|
|
||||||
|
assertNotNull(embeddings);
|
||||||
|
assertFalse(embeddings.isEmpty());
|
||||||
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
|
fail(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
package io.github.amithkoujalgi.ollama4j.unittests.jackson;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
|
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> {
|
||||||
|
|
||||||
|
protected ObjectMapper mapper = Utils.getObjectMapper();
|
||||||
|
|
||||||
|
protected String serializeRequest(T req) {
|
||||||
|
try {
|
||||||
|
return mapper.writeValueAsString(req);
|
||||||
|
} catch (JsonProcessingException e) {
|
||||||
|
fail("Could not serialize request!", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected T deserializeRequest(String jsonRequest, Class<T> requestClass) {
|
||||||
|
try {
|
||||||
|
return mapper.readValue(jsonRequest, requestClass);
|
||||||
|
} catch (JsonProcessingException e) {
|
||||||
|
fail("Could not deserialize jsonRequest!", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void assertEqualsAfterUnmarshalling(T unmarshalledRequest,
|
||||||
|
T req) {
|
||||||
|
assertEquals(req, unmarshalledRequest);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package io.github.amithkoujalgi.ollama4j.unittests.jackson;
|
package io.github.amithkoujalgi.ollama4j.unittests.jackson;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -10,21 +9,15 @@ import org.json.JSONObject;
|
|||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
|
|
||||||
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatMessageRole;
|
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatMessageRole;
|
||||||
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestBuilder;
|
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestBuilder;
|
||||||
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;
|
||||||
import io.github.amithkoujalgi.ollama4j.core.utils.Utils;
|
|
||||||
|
|
||||||
public class TestChatRequestSerialization {
|
public class TestChatRequestSerialization extends AbstractRequestSerializationTest<OllamaChatRequestModel>{
|
||||||
|
|
||||||
private OllamaChatRequestBuilder builder;
|
private OllamaChatRequestBuilder builder;
|
||||||
|
|
||||||
private ObjectMapper mapper = Utils.getObjectMapper();
|
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void init() {
|
public void init() {
|
||||||
builder = OllamaChatRequestBuilder.getInstance("DummyModel");
|
builder = OllamaChatRequestBuilder.getInstance("DummyModel");
|
||||||
@@ -32,10 +25,9 @@ public class TestChatRequestSerialization {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRequestOnlyMandatoryFields() {
|
public void testRequestOnlyMandatoryFields() {
|
||||||
OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt",
|
OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt").build();
|
||||||
List.of(new File("src/test/resources/dog-on-a-boat.jpg"))).build();
|
|
||||||
String jsonRequest = serializeRequest(req);
|
String jsonRequest = serializeRequest(req);
|
||||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest), req);
|
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -44,7 +36,7 @@ public class TestChatRequestSerialization {
|
|||||||
.withMessage(OllamaChatMessageRole.USER, "Some prompt")
|
.withMessage(OllamaChatMessageRole.USER, "Some prompt")
|
||||||
.build();
|
.build();
|
||||||
String jsonRequest = serializeRequest(req);
|
String jsonRequest = serializeRequest(req);
|
||||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest), req);
|
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -52,19 +44,34 @@ public class TestChatRequestSerialization {
|
|||||||
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 = serializeRequest(req);
|
||||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest), req);
|
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRequestWithOptions() {
|
public void testRequestWithOptions() {
|
||||||
OptionsBuilder b = new OptionsBuilder();
|
OptionsBuilder b = new OptionsBuilder();
|
||||||
OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt")
|
OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt")
|
||||||
.withOptions(b.setMirostat(1).build()).build();
|
.withOptions(b.setMirostat(1).build())
|
||||||
|
.withOptions(b.setTemperature(1L).build())
|
||||||
|
.withOptions(b.setMirostatEta(1L).build())
|
||||||
|
.withOptions(b.setMirostatTau(1L).build())
|
||||||
|
.withOptions(b.setNumGpu(1).build())
|
||||||
|
.withOptions(b.setSeed(1).build())
|
||||||
|
.withOptions(b.setTopK(1).build())
|
||||||
|
.withOptions(b.setTopP(1).build())
|
||||||
|
.build();
|
||||||
|
|
||||||
String jsonRequest = serializeRequest(req);
|
String jsonRequest = serializeRequest(req);
|
||||||
OllamaChatRequestModel deserializeRequest = deserializeRequest(jsonRequest);
|
OllamaChatRequestModel deserializeRequest = deserializeRequest(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("mirostat_eta"));
|
||||||
|
assertEquals(1.0, deserializeRequest.getOptions().get("mirostat_tau"));
|
||||||
|
assertEquals(1, deserializeRequest.getOptions().get("num_gpu"));
|
||||||
|
assertEquals(1, deserializeRequest.getOptions().get("seed"));
|
||||||
|
assertEquals(1, deserializeRequest.getOptions().get("top_k"));
|
||||||
|
assertEquals(1.0, deserializeRequest.getOptions().get("top_p"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -80,27 +87,27 @@ public class TestChatRequestSerialization {
|
|||||||
assertEquals("json", requestFormatProperty);
|
assertEquals("json", requestFormatProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String serializeRequest(OllamaChatRequestModel req) {
|
@Test
|
||||||
try {
|
public void testWithTemplate() {
|
||||||
return mapper.writeValueAsString(req);
|
OllamaChatRequestModel req = builder.withTemplate("System Template")
|
||||||
} catch (JsonProcessingException e) {
|
.build();
|
||||||
fail("Could not serialize request!", e);
|
String jsonRequest = serializeRequest(req);
|
||||||
return null;
|
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest, OllamaChatRequestModel.class), req);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private OllamaChatRequestModel deserializeRequest(String jsonRequest) {
|
@Test
|
||||||
try {
|
public void testWithStreaming() {
|
||||||
return mapper.readValue(jsonRequest, OllamaChatRequestModel.class);
|
OllamaChatRequestModel req = builder.withStreaming().build();
|
||||||
} catch (JsonProcessingException e) {
|
String jsonRequest = serializeRequest(req);
|
||||||
fail("Could not deserialize jsonRequest!", e);
|
assertEquals(deserializeRequest(jsonRequest, OllamaChatRequestModel.class).isStream(), true);
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertEqualsAfterUnmarshalling(OllamaChatRequestModel unmarshalledRequest,
|
@Test
|
||||||
OllamaChatRequestModel req) {
|
public void testWithKeepAlive() {
|
||||||
assertEquals(req, unmarshalledRequest);
|
String expectedKeepAlive = "5m";
|
||||||
|
OllamaChatRequestModel req = builder.withKeepAlive(expectedKeepAlive)
|
||||||
|
.build();
|
||||||
|
String jsonRequest = serializeRequest(req);
|
||||||
|
assertEquals(deserializeRequest(jsonRequest, OllamaChatRequestModel.class).getKeepAlive(), expectedKeepAlive);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package io.github.amithkoujalgi.ollama4j.unittests.jackson;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsRequestModel;
|
||||||
|
import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsRequestBuilder;
|
||||||
|
import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder;
|
||||||
|
|
||||||
|
public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializationTest<OllamaEmbeddingsRequestModel>{
|
||||||
|
|
||||||
|
private OllamaEmbeddingsRequestBuilder builder;
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void init() {
|
||||||
|
builder = OllamaEmbeddingsRequestBuilder.getInstance("DummyModel","DummyPrompt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRequestOnlyMandatoryFields() {
|
||||||
|
OllamaEmbeddingsRequestModel req = builder.build();
|
||||||
|
String jsonRequest = serializeRequest(req);
|
||||||
|
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaEmbeddingsRequestModel.class), req);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testRequestWithOptions() {
|
||||||
|
OptionsBuilder b = new OptionsBuilder();
|
||||||
|
OllamaEmbeddingsRequestModel req = builder
|
||||||
|
.withOptions(b.setMirostat(1).build()).build();
|
||||||
|
|
||||||
|
String jsonRequest = serializeRequest(req);
|
||||||
|
OllamaEmbeddingsRequestModel deserializeRequest = deserializeRequest(jsonRequest,OllamaEmbeddingsRequestModel.class);
|
||||||
|
assertEqualsAfterUnmarshalling(deserializeRequest, req);
|
||||||
|
assertEquals(1, deserializeRequest.getOptions().get("mirostat"));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,26 +1,20 @@
|
|||||||
package io.github.amithkoujalgi.ollama4j.unittests.jackson;
|
package io.github.amithkoujalgi.ollama4j.unittests.jackson;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
|
||||||
|
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
|
|
||||||
import io.github.amithkoujalgi.ollama4j.core.models.generate.OllamaGenerateRequestBuilder;
|
import io.github.amithkoujalgi.ollama4j.core.models.generate.OllamaGenerateRequestBuilder;
|
||||||
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;
|
||||||
import io.github.amithkoujalgi.ollama4j.core.utils.Utils;
|
|
||||||
|
|
||||||
public class TestGenerateRequestSerialization {
|
public class TestGenerateRequestSerialization extends AbstractRequestSerializationTest<OllamaGenerateRequestModel>{
|
||||||
|
|
||||||
private OllamaGenerateRequestBuilder builder;
|
private OllamaGenerateRequestBuilder builder;
|
||||||
|
|
||||||
private ObjectMapper mapper = Utils.getObjectMapper();
|
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
public void init() {
|
public void init() {
|
||||||
builder = OllamaGenerateRequestBuilder.getInstance("DummyModel");
|
builder = OllamaGenerateRequestBuilder.getInstance("DummyModel");
|
||||||
@@ -31,7 +25,7 @@ public class TestGenerateRequestSerialization {
|
|||||||
OllamaGenerateRequestModel req = builder.withPrompt("Some prompt").build();
|
OllamaGenerateRequestModel req = builder.withPrompt("Some prompt").build();
|
||||||
|
|
||||||
String jsonRequest = serializeRequest(req);
|
String jsonRequest = serializeRequest(req);
|
||||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest), req);
|
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest, OllamaGenerateRequestModel.class), req);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -41,7 +35,7 @@ public class TestGenerateRequestSerialization {
|
|||||||
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 = serializeRequest(req);
|
||||||
OllamaGenerateRequestModel deserializeRequest = deserializeRequest(jsonRequest);
|
OllamaGenerateRequestModel deserializeRequest = deserializeRequest(jsonRequest, OllamaGenerateRequestModel.class);
|
||||||
assertEqualsAfterUnmarshalling(deserializeRequest, req);
|
assertEqualsAfterUnmarshalling(deserializeRequest, req);
|
||||||
assertEquals(1, deserializeRequest.getOptions().get("mirostat"));
|
assertEquals(1, deserializeRequest.getOptions().get("mirostat"));
|
||||||
}
|
}
|
||||||
@@ -59,27 +53,4 @@ public class TestGenerateRequestSerialization {
|
|||||||
assertEquals("json", requestFormatProperty);
|
assertEquals("json", requestFormatProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
private String serializeRequest(OllamaGenerateRequestModel req) {
|
|
||||||
try {
|
|
||||||
return mapper.writeValueAsString(req);
|
|
||||||
} catch (JsonProcessingException e) {
|
|
||||||
fail("Could not serialize request!", e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private OllamaGenerateRequestModel deserializeRequest(String jsonRequest) {
|
|
||||||
try {
|
|
||||||
return mapper.readValue(jsonRequest, OllamaGenerateRequestModel.class);
|
|
||||||
} catch (JsonProcessingException e) {
|
|
||||||
fail("Could not deserialize jsonRequest!", e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void assertEqualsAfterUnmarshalling(OllamaGenerateRequestModel unmarshalledRequest,
|
|
||||||
OllamaGenerateRequestModel req) {
|
|
||||||
assertEquals(req, unmarshalledRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user