forked from Mirror/ollama4j
Compare commits
20 Commits
v1.0.68
...
bb0785140b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb0785140b | ||
|
|
e33ad1a1e3 | ||
|
|
cd60c506cb | ||
|
|
b55925df28 | ||
|
|
3a9b8c309d | ||
|
|
bf07159522 | ||
|
|
f8ca4d041d | ||
|
|
9c6a55f7b0 | ||
|
|
2866d83a2f | ||
|
|
45e5d07581 | ||
|
|
3a264cb6bb | ||
|
|
e1b9d42771 | ||
|
|
1a086c37c0 | ||
|
|
54edba144c | ||
|
|
3ed3187ba9 | ||
|
|
b7cd81a7f5 | ||
|
|
e750c2d7f9 | ||
|
|
62f16131f3 | ||
|
|
2cbaf12d7c | ||
|
|
e2d555d404 |
26
README.md
26
README.md
@@ -67,10 +67,29 @@ In your Maven project, add this dependency:
|
||||
<dependency>
|
||||
<groupId>io.github.amithkoujalgi</groupId>
|
||||
<artifactId>ollama4j</artifactId>
|
||||
<version>1.0.57</version>
|
||||
<version>1.0.70</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
In your Gradle project, add the dependency using the Kotlin DSL or the Groovy DSL:
|
||||
|
||||
```kotlin
|
||||
dependencies {
|
||||
|
||||
val ollama4jVersion = "1.0.70"
|
||||
|
||||
implementation("io.github.amithkoujalgi:ollama4j:$ollama4jVersion")
|
||||
}
|
||||
```
|
||||
|
||||
```groovy
|
||||
dependencies {
|
||||
implementation("io.github.amithkoujalgi:ollama4j:1.0.70")
|
||||
}
|
||||
```
|
||||
|
||||
Latest release:
|
||||
|
||||

|
||||
@@ -116,6 +135,9 @@ Actions CI workflow.
|
||||
- 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
|
||||
|
||||
@@ -157,4 +179,4 @@ project.
|
||||
|
||||
### References
|
||||
|
||||
- [Ollama REST APIs](https://github.com/jmorganca/ollama/blob/main/docs/api.md)
|
||||
- [Ollama REST APIs](https://github.com/jmorganca/ollama/blob/main/docs/api.md)
|
||||
|
||||
11
pom.xml
11
pom.xml
@@ -4,7 +4,7 @@
|
||||
|
||||
<groupId>io.github.amithkoujalgi</groupId>
|
||||
<artifactId>ollama4j</artifactId>
|
||||
<version>1.0.68</version>
|
||||
<version>1.0.73-SNAPSHOT</version>
|
||||
|
||||
<name>Ollama4j</name>
|
||||
<description>Java library for interacting with Ollama API.</description>
|
||||
@@ -39,7 +39,7 @@
|
||||
<connection>scm:git:git@github.com:amithkoujalgi/ollama4j.git</connection>
|
||||
<developerConnection>scm:git:https://github.com/amithkoujalgi/ollama4j.git</developerConnection>
|
||||
<url>https://github.com/amithkoujalgi/ollama4j</url>
|
||||
<tag>v1.0.68</tag>
|
||||
<tag>v1.0.16</tag>
|
||||
</scm>
|
||||
|
||||
<build>
|
||||
@@ -149,7 +149,12 @@
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<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>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.models;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.OffsetDateTime;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import io.github.amithkoujalgi.ollama4j.core.utils.Utils;
|
||||
@@ -11,7 +14,9 @@ public class Model {
|
||||
private String name;
|
||||
private String model;
|
||||
@JsonProperty("modified_at")
|
||||
private String modifiedAt;
|
||||
private OffsetDateTime modifiedAt;
|
||||
@JsonProperty("expires_at")
|
||||
private OffsetDateTime expiresAt;
|
||||
private String digest;
|
||||
private long size;
|
||||
@JsonProperty("details")
|
||||
|
||||
@@ -8,10 +8,18 @@ import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
|
||||
public class Utils {
|
||||
|
||||
private static ObjectMapper objectMapper;
|
||||
|
||||
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)
|
||||
|
||||
@@ -6,30 +6,30 @@ import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import io.github.amithkoujalgi.ollama4j.core.utils.Utils;
|
||||
|
||||
public abstract class AbstractRequestSerializationTest<T> {
|
||||
public abstract class AbstractSerializationTest<T> {
|
||||
|
||||
protected ObjectMapper mapper = Utils.getObjectMapper();
|
||||
|
||||
protected String serializeRequest(T req) {
|
||||
protected String serialize(T obj) {
|
||||
try {
|
||||
return mapper.writeValueAsString(req);
|
||||
return mapper.writeValueAsString(obj);
|
||||
} catch (JsonProcessingException e) {
|
||||
fail("Could not serialize request!", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected T deserializeRequest(String jsonRequest, Class<T> requestClass) {
|
||||
protected T deserialize(String jsonObject, Class<T> deserializationClass) {
|
||||
try {
|
||||
return mapper.readValue(jsonRequest, requestClass);
|
||||
return mapper.readValue(jsonObject, deserializationClass);
|
||||
} catch (JsonProcessingException e) {
|
||||
fail("Could not deserialize jsonRequest!", e);
|
||||
fail("Could not deserialize jsonObject!", e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected void assertEqualsAfterUnmarshalling(T unmarshalledRequest,
|
||||
protected void assertEqualsAfterUnmarshalling(T unmarshalledObject,
|
||||
T req) {
|
||||
assertEquals(req, unmarshalledRequest);
|
||||
assertEquals(req, unmarshalledObject);
|
||||
}
|
||||
}
|
||||
@@ -14,7 +14,7 @@ import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestBuilde
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.chat.OllamaChatRequestModel;
|
||||
import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder;
|
||||
|
||||
public class TestChatRequestSerialization extends AbstractRequestSerializationTest<OllamaChatRequestModel>{
|
||||
public class TestChatRequestSerialization extends AbstractSerializationTest<OllamaChatRequestModel> {
|
||||
|
||||
private OllamaChatRequestBuilder builder;
|
||||
|
||||
@@ -26,8 +26,8 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe
|
||||
@Test
|
||||
public void testRequestOnlyMandatoryFields() {
|
||||
OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt").build();
|
||||
String jsonRequest = serializeRequest(req);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req);
|
||||
String jsonRequest = serialize(req);
|
||||
assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -35,16 +35,16 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe
|
||||
OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.SYSTEM, "System prompt")
|
||||
.withMessage(OllamaChatMessageRole.USER, "Some prompt")
|
||||
.build();
|
||||
String jsonRequest = serializeRequest(req);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req);
|
||||
String jsonRequest = serialize(req);
|
||||
assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRequestWithMessageAndImage() {
|
||||
OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt",
|
||||
List.of(new File("src/test/resources/dog-on-a-boat.jpg"))).build();
|
||||
String jsonRequest = serializeRequest(req);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaChatRequestModel.class), req);
|
||||
String jsonRequest = serialize(req);
|
||||
assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaChatRequestModel.class), req);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -61,8 +61,8 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe
|
||||
.withOptions(b.setTopP(1).build())
|
||||
.build();
|
||||
|
||||
String jsonRequest = serializeRequest(req);
|
||||
OllamaChatRequestModel deserializeRequest = deserializeRequest(jsonRequest, OllamaChatRequestModel.class);
|
||||
String jsonRequest = serialize(req);
|
||||
OllamaChatRequestModel deserializeRequest = deserialize(jsonRequest, OllamaChatRequestModel.class);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest, req);
|
||||
assertEquals(1, deserializeRequest.getOptions().get("mirostat"));
|
||||
assertEquals(1.0, deserializeRequest.getOptions().get("temperature"));
|
||||
@@ -79,7 +79,7 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe
|
||||
OllamaChatRequestModel req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt")
|
||||
.withGetJsonResponse().build();
|
||||
|
||||
String jsonRequest = serializeRequest(req);
|
||||
String jsonRequest = serialize(req);
|
||||
// no jackson deserialization as format property is not boolean ==> omit as deserialization
|
||||
// of request is never used in real code anyways
|
||||
JSONObject jsonObject = new JSONObject(jsonRequest);
|
||||
@@ -91,15 +91,15 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe
|
||||
public void testWithTemplate() {
|
||||
OllamaChatRequestModel req = builder.withTemplate("System Template")
|
||||
.build();
|
||||
String jsonRequest = serializeRequest(req);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest, OllamaChatRequestModel.class), req);
|
||||
String jsonRequest = serialize(req);
|
||||
assertEqualsAfterUnmarshalling(deserialize(jsonRequest, OllamaChatRequestModel.class), req);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWithStreaming() {
|
||||
OllamaChatRequestModel req = builder.withStreaming().build();
|
||||
String jsonRequest = serializeRequest(req);
|
||||
assertEquals(deserializeRequest(jsonRequest, OllamaChatRequestModel.class).isStream(), true);
|
||||
String jsonRequest = serialize(req);
|
||||
assertEquals(deserialize(jsonRequest, OllamaChatRequestModel.class).isStream(), true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -107,7 +107,7 @@ public class TestChatRequestSerialization extends AbstractRequestSerializationTe
|
||||
String expectedKeepAlive = "5m";
|
||||
OllamaChatRequestModel req = builder.withKeepAlive(expectedKeepAlive)
|
||||
.build();
|
||||
String jsonRequest = serializeRequest(req);
|
||||
assertEquals(deserializeRequest(jsonRequest, OllamaChatRequestModel.class).getKeepAlive(), expectedKeepAlive);
|
||||
String jsonRequest = serialize(req);
|
||||
assertEquals(deserialize(jsonRequest, OllamaChatRequestModel.class).getKeepAlive(), expectedKeepAlive);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsR
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.embeddings.OllamaEmbeddingsRequestBuilder;
|
||||
import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder;
|
||||
|
||||
public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializationTest<OllamaEmbeddingsRequestModel>{
|
||||
public class TestEmbeddingsRequestSerialization extends AbstractSerializationTest<OllamaEmbeddingsRequestModel> {
|
||||
|
||||
private OllamaEmbeddingsRequestBuilder builder;
|
||||
|
||||
@@ -19,8 +19,8 @@ public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializa
|
||||
@Test
|
||||
public void testRequestOnlyMandatoryFields() {
|
||||
OllamaEmbeddingsRequestModel req = builder.build();
|
||||
String jsonRequest = serializeRequest(req);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest,OllamaEmbeddingsRequestModel.class), req);
|
||||
String jsonRequest = serialize(req);
|
||||
assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaEmbeddingsRequestModel.class), req);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -29,8 +29,8 @@ public class TestEmbeddingsRequestSerialization extends AbstractRequestSerializa
|
||||
OllamaEmbeddingsRequestModel req = builder
|
||||
.withOptions(b.setMirostat(1).build()).build();
|
||||
|
||||
String jsonRequest = serializeRequest(req);
|
||||
OllamaEmbeddingsRequestModel deserializeRequest = deserializeRequest(jsonRequest,OllamaEmbeddingsRequestModel.class);
|
||||
String jsonRequest = serialize(req);
|
||||
OllamaEmbeddingsRequestModel deserializeRequest = deserialize(jsonRequest,OllamaEmbeddingsRequestModel.class);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest, req);
|
||||
assertEquals(1, deserializeRequest.getOptions().get("mirostat"));
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ import io.github.amithkoujalgi.ollama4j.core.models.generate.OllamaGenerateReque
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.generate.OllamaGenerateRequestModel;
|
||||
import io.github.amithkoujalgi.ollama4j.core.utils.OptionsBuilder;
|
||||
|
||||
public class TestGenerateRequestSerialization extends AbstractRequestSerializationTest<OllamaGenerateRequestModel>{
|
||||
public class TestGenerateRequestSerialization extends AbstractSerializationTest<OllamaGenerateRequestModel> {
|
||||
|
||||
private OllamaGenerateRequestBuilder builder;
|
||||
|
||||
@@ -24,8 +24,8 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati
|
||||
public void testRequestOnlyMandatoryFields() {
|
||||
OllamaGenerateRequestModel req = builder.withPrompt("Some prompt").build();
|
||||
|
||||
String jsonRequest = serializeRequest(req);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest(jsonRequest, OllamaGenerateRequestModel.class), req);
|
||||
String jsonRequest = serialize(req);
|
||||
assertEqualsAfterUnmarshalling(deserialize(jsonRequest, OllamaGenerateRequestModel.class), req);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -34,8 +34,8 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati
|
||||
OllamaGenerateRequestModel req =
|
||||
builder.withPrompt("Some prompt").withOptions(b.setMirostat(1).build()).build();
|
||||
|
||||
String jsonRequest = serializeRequest(req);
|
||||
OllamaGenerateRequestModel deserializeRequest = deserializeRequest(jsonRequest, OllamaGenerateRequestModel.class);
|
||||
String jsonRequest = serialize(req);
|
||||
OllamaGenerateRequestModel deserializeRequest = deserialize(jsonRequest, OllamaGenerateRequestModel.class);
|
||||
assertEqualsAfterUnmarshalling(deserializeRequest, req);
|
||||
assertEquals(1, deserializeRequest.getOptions().get("mirostat"));
|
||||
}
|
||||
@@ -45,7 +45,7 @@ public class TestGenerateRequestSerialization extends AbstractRequestSerializati
|
||||
OllamaGenerateRequestModel req =
|
||||
builder.withPrompt("Some prompt").withGetJsonResponse().build();
|
||||
|
||||
String jsonRequest = serializeRequest(req);
|
||||
String jsonRequest = serialize(req);
|
||||
// no jackson deserialization as format property is not boolean ==> omit as deserialization
|
||||
// of request is never used in real code anyways
|
||||
JSONObject jsonObject = new JSONObject(jsonRequest);
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
package io.github.amithkoujalgi.ollama4j.unittests.jackson;
|
||||
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.Model;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
public class TestModelRequestSerialization extends AbstractSerializationTest<Model> {
|
||||
|
||||
@Test
|
||||
public void testDeserializationOfModelResponseWithOffsetTime(){
|
||||
String serializedTestStringWithOffsetTime = "{\n"
|
||||
+ "\"name\": \"codellama:13b\",\n"
|
||||
+ "\"modified_at\": \"2023-11-04T14:56:49.277302595-07:00\",\n"
|
||||
+ "\"size\": 7365960935,\n"
|
||||
+ "\"digest\": \"9f438cb9cd581fc025612d27f7c1a6669ff83a8bb0ed86c94fcf4c5440555697\",\n"
|
||||
+ "\"details\": {\n"
|
||||
+ "\"format\": \"gguf\",\n"
|
||||
+ "\"family\": \"llama\",\n"
|
||||
+ "\"families\": null,\n"
|
||||
+ "\"parameter_size\": \"13B\",\n"
|
||||
+ "\"quantization_level\": \"Q4_0\"\n"
|
||||
+ "}}";
|
||||
deserialize(serializedTestStringWithOffsetTime,Model.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDeserializationOfModelResponseWithZuluTime(){
|
||||
String serializedTestStringWithZuluTimezone = "{\n"
|
||||
+ "\"name\": \"codellama:13b\",\n"
|
||||
+ "\"modified_at\": \"2023-11-04T14:56:49.277302595Z\",\n"
|
||||
+ "\"size\": 7365960935,\n"
|
||||
+ "\"digest\": \"9f438cb9cd581fc025612d27f7c1a6669ff83a8bb0ed86c94fcf4c5440555697\",\n"
|
||||
+ "\"details\": {\n"
|
||||
+ "\"format\": \"gguf\",\n"
|
||||
+ "\"family\": \"llama\",\n"
|
||||
+ "\"families\": null,\n"
|
||||
+ "\"parameter_size\": \"13B\",\n"
|
||||
+ "\"quantization_level\": \"Q4_0\"\n"
|
||||
+ "}}";
|
||||
deserialize(serializedTestStringWithZuluTimezone,Model.class);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user