mirror of
https://github.com/amithkoujalgi/ollama4j.git
synced 2025-10-28 23:20:42 +01:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef4303fbbb | ||
|
|
2df9a9c69b | ||
|
|
6bb5d9f644 | ||
|
|
94b221248a | ||
|
|
2a887f5015 | ||
|
|
7e3dddf1bb | ||
|
|
fe95a7df2a | ||
|
|
98f6a30c6b | ||
|
|
00288053bf | ||
|
|
6a7feb98bd | ||
|
|
770d511067 | ||
|
|
b57fc1f818 | ||
|
|
01c5a8f07f | ||
|
|
243b8a3747 | ||
|
|
987fce7f07 | ||
|
|
657593be09 | ||
|
|
0afba7e3e3 | ||
|
|
ac00bb9029 | ||
|
|
67cb444d82 | ||
|
|
1914a29163 | ||
|
|
11201bc7c7 | ||
|
|
3a8b5257c0 | ||
|
|
00bb4e92dc | ||
|
|
7481c2ba0e | ||
|
|
9d336e257c | ||
|
|
2027171cb9 | ||
|
|
e06baf0d29 | ||
|
|
5d6a68a5bb | ||
|
|
41a5bb70bf | ||
|
|
c2ec62ba08 |
4
.github/workflows/maven-publish.yml
vendored
4
.github/workflows/maven-publish.yml
vendored
@@ -49,6 +49,10 @@ jobs:
|
|||||||
${{ runner.os }}-maven-
|
${{ runner.os }}-maven-
|
||||||
- name: Build
|
- name: Build
|
||||||
run: mvn -B -ntp clean install
|
run: mvn -B -ntp clean install
|
||||||
|
- name: Upload coverage reports to Codecov
|
||||||
|
uses: codecov/codecov-action@v3
|
||||||
|
env:
|
||||||
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
- name: Publish to GitHub Packages Apache Maven
|
- name: Publish to GitHub Packages Apache Maven
|
||||||
# if: >
|
# if: >
|
||||||
# github.event_name != 'pull_request' &&
|
# github.event_name != 'pull_request' &&
|
||||||
|
|||||||
74
README.md
74
README.md
@@ -2,8 +2,35 @@
|
|||||||
|
|
||||||
<img src='https://raw.githubusercontent.com/amithkoujalgi/ollama4j/65a9d526150da8fcd98e2af6a164f055572bf722/ollama4j.jpeg' width='100' alt="ollama4j-icon">
|
<img src='https://raw.githubusercontent.com/amithkoujalgi/ollama4j/65a9d526150da8fcd98e2af6a164f055572bf722/ollama4j.jpeg' width='100' alt="ollama4j-icon">
|
||||||
|
|
||||||
A Java library (wrapper/binding)
|
A Java library (wrapper/binding) for [Ollama](https://ollama.ai/) server.
|
||||||
for [Ollama](https://github.com/jmorganca/ollama/blob/main/docs/api.md) APIs.
|
|
||||||
|
Find more details on the [website](https://amithkoujalgi.github.io/ollama4j/).
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
[](https://codecov.io/gh/amithkoujalgi/ollama4j)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
- [How does it work?](#how-does-it-work)
|
||||||
|
- [Requirements](#requirements)
|
||||||
|
- [Installation](#installation)
|
||||||
|
- [API Spec](#api-spec)
|
||||||
|
- [Demo APIs](#try-out-the-apis-with-ollama-server)
|
||||||
|
- [Development](#development)
|
||||||
|
- [Contributions](#get-involved)
|
||||||
|
- [References](#references)
|
||||||
|
|
||||||
|
#### How does it work?
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
flowchart LR
|
flowchart LR
|
||||||
@@ -17,39 +44,19 @@ for [Ollama](https://github.com/jmorganca/ollama/blob/main/docs/api.md) APIs.
|
|||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
## Table of Contents
|
|
||||||
|
|
||||||
- [Requirements](#requirements)
|
|
||||||
- [Installation](#installation)
|
|
||||||
- [API Spec](#api-spec)
|
|
||||||
- [Demo APIs](#try-out-the-apis-with-ollama-server)
|
|
||||||
- [Development](#development)
|
|
||||||
- [Contributions](#get-involved)
|
|
||||||
|
|
||||||
#### Requirements
|
#### Requirements
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
[![][ollama-shield]][ollama] Or [![][ollama-docker-shield]][ollama-docker]
|
[![][ollama-shield]][ollama] **Or** [![][ollama-docker-shield]][ollama-docker]
|
||||||
|
|
||||||
[ollama]: https://ollama.ai/
|
[ollama]: https://ollama.ai/
|
||||||
|
|
||||||
[ollama-shield]: https://img.shields.io/badge/Ollama-Local_Installation-blue.svg?style=for-the-badge&labelColor=gray
|
[ollama-shield]: https://img.shields.io/badge/Ollama-Local_Installation-blue.svg?style=just-the-message&labelColor=gray
|
||||||
|
|
||||||
[ollama-docker]: https://hub.docker.com/r/ollama/ollama
|
[ollama-docker]: https://hub.docker.com/r/ollama/ollama
|
||||||
|
|
||||||
[ollama-docker-shield]: https://img.shields.io/badge/Ollama-Docker-blue.svg?style=for-the-badge&labelColor=gray
|
[ollama-docker-shield]: https://img.shields.io/badge/Ollama-Docker-blue.svg?style=just-the-message&labelColor=gray
|
||||||
|
|
||||||
#### Installation
|
#### Installation
|
||||||
|
|
||||||
@@ -60,21 +67,23 @@ 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.20</version>
|
<version>1.0.29</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
Latest release: 
|
Latest release:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
[![][lib-shield]][lib]
|
[![][lib-shield]][lib]
|
||||||
|
|
||||||
[lib]: https://central.sonatype.com/artifact/io.github.amithkoujalgi/ollama4j
|
[lib]: https://central.sonatype.com/artifact/io.github.amithkoujalgi/ollama4j
|
||||||
|
|
||||||
[lib-shield]: https://img.shields.io/badge/ollama4j-get_latest_version-blue.svg?style=for-the-badge&labelColor=gray
|
[lib-shield]: https://img.shields.io/badge/ollama4j-get_latest_version-blue.svg?style=just-the-message&labelColor=gray
|
||||||
|
|
||||||
#### API Spec
|
#### API Spec
|
||||||
|
|
||||||
Find the full `Javadoc` (API specifications) [here](https://amithkoujalgi.github.io/ollama4j/).
|
Find the full API specifications on the [website](https://amithkoujalgi.github.io/ollama4j/).
|
||||||
|
|
||||||
#### Development
|
#### Development
|
||||||
|
|
||||||
@@ -115,6 +124,7 @@ Actions CI workflow.
|
|||||||
- [x] Use lombok
|
- [x] Use lombok
|
||||||
- [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 additional params for `ask` APIs such as:
|
- [ ] Add additional params for `ask` APIs such as:
|
||||||
- `options`: additional model parameters for the Modelfile such as `temperature`
|
- `options`: additional model parameters for the Modelfile such as `temperature`
|
||||||
- `system`: system prompt to (overrides what is defined in the Modelfile)
|
- `system`: system prompt to (overrides what is defined in the Modelfile)
|
||||||
@@ -136,3 +146,7 @@ of contribution is much appreciated.
|
|||||||
|
|
||||||
The nomenclature and the icon have been adopted from the incredible [Ollama](https://ollama.ai/)
|
The nomenclature and the icon have been adopted from the incredible [Ollama](https://ollama.ai/)
|
||||||
project.
|
project.
|
||||||
|
|
||||||
|
### References
|
||||||
|
|
||||||
|
- [Ollama REST APIs](https://github.com/jmorganca/ollama/blob/main/docs/api.md)
|
||||||
@@ -3,6 +3,6 @@
|
|||||||
"position": 10,
|
"position": 10,
|
||||||
"link": {
|
"link": {
|
||||||
"type": "generated-index",
|
"type": "generated-index",
|
||||||
"description": "Specs of APIs and their usage."
|
"description": "Details of APIs to interact with LLMs."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
8
docs/docs/apis-extras/_category_.json
Normal file
8
docs/docs/apis-extras/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"label": "APIs - Extras",
|
||||||
|
"position": 10,
|
||||||
|
"link": {
|
||||||
|
"type": "generated-index",
|
||||||
|
"description": "Details of APIs to handle bunch of extra stuff."
|
||||||
|
}
|
||||||
|
}
|
||||||
24
docs/docs/apis-extras/basic-auth.md
Normal file
24
docs/docs/apis-extras/basic-auth.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Set Basic Authentication
|
||||||
|
|
||||||
|
This API lets you set the basic authentication for the Ollama client. This would help in scenarios where
|
||||||
|
Ollama server would be setup behind a gateway/reverse proxy with basic auth.
|
||||||
|
|
||||||
|
After configuring basic authentication, all subsequent requests will include the Basic Auth header.
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
String host = "http://localhost:11434/";
|
||||||
|
|
||||||
|
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||||
|
|
||||||
|
ollamaAPI.setBasicAuth("username", "password");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
20
docs/docs/apis-extras/ping.md
Normal file
20
docs/docs/apis-extras/ping.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 3
|
||||||
|
---
|
||||||
|
|
||||||
|
# Ping
|
||||||
|
|
||||||
|
This API lets you check the reachability of Ollama server.
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
String host = "http://localhost:11434/";
|
||||||
|
|
||||||
|
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||||
|
|
||||||
|
ollamaAPI.ping();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
21
docs/docs/apis-extras/request-timeout.md
Normal file
21
docs/docs/apis-extras/request-timeout.md
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 2
|
||||||
|
---
|
||||||
|
|
||||||
|
# Set Request Timeout
|
||||||
|
|
||||||
|
This API lets you set the request timeout for the Ollama client.
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
String host = "http://localhost:11434/";
|
||||||
|
|
||||||
|
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||||
|
|
||||||
|
ollamaAPI.setRequestTimeoutSeconds(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
23
docs/docs/apis-extras/verbosity.md
Normal file
23
docs/docs/apis-extras/verbosity.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
sidebar_position: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
# Set Verbosity
|
||||||
|
|
||||||
|
This API lets you set the verbosity of the Ollama client.
|
||||||
|
|
||||||
|
## Try asking a question about the model.
|
||||||
|
|
||||||
|
```java
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
String host = "http://localhost:11434/";
|
||||||
|
|
||||||
|
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||||
|
|
||||||
|
ollamaAPI.setVerbose(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -3,6 +3,6 @@
|
|||||||
"position": 4,
|
"position": 4,
|
||||||
"link": {
|
"link": {
|
||||||
"type": "generated-index",
|
"type": "generated-index",
|
||||||
"description": "Specs of APIs and their usage."
|
"description": "Details of APIs to manage LLMs."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
507
pom.xml
507
pom.xml
@@ -4,20 +4,20 @@
|
|||||||
|
|
||||||
<groupId>io.github.amithkoujalgi</groupId>
|
<groupId>io.github.amithkoujalgi</groupId>
|
||||||
<artifactId>ollama4j</artifactId>
|
<artifactId>ollama4j</artifactId>
|
||||||
<version>1.0.28</version>
|
<version>1.0.36</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>
|
||||||
<url>https://github.com/amithkoujalgi/ollama4j</url>
|
<url>https://github.com/amithkoujalgi/ollama4j</url>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>11</maven.compiler.source>
|
<maven.compiler.source>11</maven.compiler.source>
|
||||||
<maven.compiler.target>11</maven.compiler.target>
|
<maven.compiler.target>11</maven.compiler.target>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
|
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
|
||||||
<maven-failsafe-plugin.version>3.0.0-M5</maven-failsafe-plugin.version>
|
<maven-failsafe-plugin.version>3.0.0-M5</maven-failsafe-plugin.version>
|
||||||
<lombok.version>1.18.30</lombok.version>
|
<lombok.version>1.18.30</lombok.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<developers>
|
<developers>
|
||||||
<developer>
|
<developer>
|
||||||
@@ -28,230 +28,273 @@
|
|||||||
</developer>
|
</developer>
|
||||||
</developers>
|
</developers>
|
||||||
|
|
||||||
<licenses>
|
<licenses>
|
||||||
<license>
|
<license>
|
||||||
<name>MIT License</name>
|
<name>MIT License</name>
|
||||||
<url>https://raw.githubusercontent.com/amithkoujalgi/ollama4j/main/LICENSE</url>
|
<url>https://raw.githubusercontent.com/amithkoujalgi/ollama4j/main/LICENSE</url>
|
||||||
</license>
|
</license>
|
||||||
</licenses>
|
</licenses>
|
||||||
|
|
||||||
<scm>
|
<scm>
|
||||||
<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.28</tag>
|
<tag>v1.0.36</tag>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>3.3.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar-no-fork</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>3.5.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<!-- <plugin>-->
|
||||||
|
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
||||||
|
<!-- <artifactId>maven-gpg-plugin</artifactId>-->
|
||||||
|
<!-- <version>1.5</version>-->
|
||||||
|
<!-- <executions>-->
|
||||||
|
<!-- <execution>-->
|
||||||
|
<!-- <id>sign-artifacts</id>-->
|
||||||
|
<!-- <phase>verify</phase>-->
|
||||||
|
<!-- <goals>-->
|
||||||
|
<!-- <goal>sign</goal>-->
|
||||||
|
<!-- </goals>-->
|
||||||
|
<!-- <configuration>-->
|
||||||
|
<!-- <!– This is necessary for gpg to not try to use the pinentry programs –>-->
|
||||||
|
<!-- <gpgArguments>-->
|
||||||
|
<!-- <arg>--pinentry-mode</arg>-->
|
||||||
|
<!-- <arg>loopback</arg>-->
|
||||||
|
<!-- </gpgArguments>-->
|
||||||
|
<!-- </configuration>-->
|
||||||
|
<!-- </execution>-->
|
||||||
|
<!-- </executions>-->
|
||||||
|
<!-- </plugin>-->
|
||||||
|
<!-- Surefire Plugin for Unit Tests -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${maven-surefire-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<skipTests>${skipUnitTests}</skipTests>
|
||||||
|
<includes>
|
||||||
|
<include>**/unittests/*.java</include>
|
||||||
|
</includes>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<!-- Failsafe Plugin for Integration Tests -->
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
|
<version>${maven-failsafe-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<includes>
|
||||||
|
<include>**/integrationtests/*.java</include>
|
||||||
|
</includes>
|
||||||
|
<excludes>
|
||||||
|
<exclude>**/unittests/*.java</exclude>
|
||||||
|
</excludes>
|
||||||
|
<skipTests>${skipIntegrationTests}</skipTests>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>integration-test</goal>
|
||||||
|
<goal>verify</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-release-plugin</artifactId>
|
||||||
|
<version>3.0.1</version>
|
||||||
|
<configuration>
|
||||||
|
<!-- <goals>install</goals>-->
|
||||||
|
<tagNameFormat>v@{project.version}</tagNameFormat>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>${lombok.version}</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml.jackson.core</groupId>
|
||||||
|
<artifactId>jackson-databind</artifactId>
|
||||||
|
<version>2.15.3</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ch.qos.logback</groupId>
|
||||||
|
<artifactId>logback-classic</artifactId>
|
||||||
|
<version>1.4.12</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
<version>2.0.9</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<version>5.10.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.mockito</groupId>
|
||||||
|
<artifactId>mockito-core</artifactId>
|
||||||
|
<version>4.1.0</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<distributionManagement>
|
||||||
|
<snapshotRepository>
|
||||||
|
<id>ossrh</id>
|
||||||
|
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
|
||||||
|
</snapshotRepository>
|
||||||
|
<repository>
|
||||||
|
<id>ossrh</id>
|
||||||
|
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2</url>
|
||||||
|
</repository>
|
||||||
|
</distributionManagement>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>unit-tests</id>
|
||||||
|
<properties>
|
||||||
|
<test.env>unit</test.env>
|
||||||
|
<skipUnitTests>false</skipUnitTests>
|
||||||
|
<skipIntegrationTests>true</skipIntegrationTests>
|
||||||
|
</properties>
|
||||||
|
<activation>
|
||||||
|
<activeByDefault>true</activeByDefault>
|
||||||
|
</activation>
|
||||||
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<plugin>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<groupId>org.jacoco</groupId>
|
||||||
<artifactId>maven-source-plugin</artifactId>
|
<artifactId>jacoco-maven-plugin</artifactId>
|
||||||
<version>3.3.0</version>
|
<version>0.8.7</version>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
<id>attach-sources</id>
|
<goals>
|
||||||
<goals>
|
<goal>prepare-agent</goal>
|
||||||
<goal>jar-no-fork</goal>
|
</goals>
|
||||||
</goals>
|
</execution>
|
||||||
</execution>
|
<execution>
|
||||||
</executions>
|
<id>report</id>
|
||||||
</plugin>
|
<phase>test</phase>
|
||||||
<plugin>
|
<goals>
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<goal>report</goal>
|
||||||
<artifactId>maven-javadoc-plugin</artifactId>
|
</goals>
|
||||||
<version>3.5.0</version>
|
</execution>
|
||||||
<executions>
|
</executions>
|
||||||
<execution>
|
</plugin>
|
||||||
<id>attach-javadocs</id>
|
|
||||||
<goals>
|
|
||||||
<goal>jar</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<!-- <plugin>-->
|
|
||||||
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
|
||||||
<!-- <artifactId>maven-gpg-plugin</artifactId>-->
|
|
||||||
<!-- <version>1.5</version>-->
|
|
||||||
<!-- <executions>-->
|
|
||||||
<!-- <execution>-->
|
|
||||||
<!-- <id>sign-artifacts</id>-->
|
|
||||||
<!-- <phase>verify</phase>-->
|
|
||||||
<!-- <goals>-->
|
|
||||||
<!-- <goal>sign</goal>-->
|
|
||||||
<!-- </goals>-->
|
|
||||||
<!-- <configuration>-->
|
|
||||||
<!-- <!– This is necessary for gpg to not try to use the pinentry programs –>-->
|
|
||||||
<!-- <gpgArguments>-->
|
|
||||||
<!-- <arg>--pinentry-mode</arg>-->
|
|
||||||
<!-- <arg>loopback</arg>-->
|
|
||||||
<!-- </gpgArguments>-->
|
|
||||||
<!-- </configuration>-->
|
|
||||||
<!-- </execution>-->
|
|
||||||
<!-- </executions>-->
|
|
||||||
<!-- </plugin>-->
|
|
||||||
<!-- Surefire Plugin for Unit Tests -->
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
|
||||||
<version>${maven-surefire-plugin.version}</version>
|
|
||||||
<configuration>
|
|
||||||
<skipTests>${skipUnitTests}</skipTests>
|
|
||||||
<includes>
|
|
||||||
<include>**/unittests/*.java</include>
|
|
||||||
</includes>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
|
|
||||||
<!-- Failsafe Plugin for Integration Tests -->
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-failsafe-plugin</artifactId>
|
|
||||||
<version>${maven-failsafe-plugin.version}</version>
|
|
||||||
<configuration>
|
|
||||||
<includes>
|
|
||||||
<include>**/integrationtests/*.java</include>
|
|
||||||
</includes>
|
|
||||||
<excludes>
|
|
||||||
<exclude>**/unittests/*.java</exclude>
|
|
||||||
</excludes>
|
|
||||||
<skipTests>${skipIntegrationTests}</skipTests>
|
|
||||||
</configuration>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<goals>
|
|
||||||
<goal>integration-test</goal>
|
|
||||||
<goal>verify</goal>
|
|
||||||
</goals>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-release-plugin</artifactId>
|
|
||||||
<version>3.0.1</version>
|
|
||||||
<configuration>
|
|
||||||
<!-- <goals>install</goals>-->
|
|
||||||
<tagNameFormat>v@{project.version}</tagNameFormat>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
</profile>
|
||||||
|
<profile>
|
||||||
|
<id>integration-tests</id>
|
||||||
|
<properties>
|
||||||
|
<test.env>integration</test.env>
|
||||||
|
<skipUnitTests>true</skipUnitTests>
|
||||||
|
<skipIntegrationTests>false</skipIntegrationTests>
|
||||||
|
</properties>
|
||||||
|
</profile>
|
||||||
|
<profile>
|
||||||
|
<id>ci-cd</id>
|
||||||
|
<properties>
|
||||||
|
<test.env>unit</test.env>
|
||||||
|
<skipUnitTests>true</skipUnitTests>
|
||||||
|
<skipIntegrationTests>true</skipIntegrationTests>
|
||||||
|
</properties>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<!-- Prevent gpg from using pinentry programs. Fixes:
|
||||||
|
gpg: signing failed: Inappropriate ioctl for device -->
|
||||||
|
<gpgArguments>
|
||||||
|
<arg>--pinentry-mode</arg>
|
||||||
|
<arg>loopback</arg>
|
||||||
|
</gpgArguments>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.sonatype.plugins</groupId>
|
||||||
|
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||||
|
<version>1.6.13</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<configuration>
|
||||||
|
<serverId>ossrh</serverId>
|
||||||
|
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
|
||||||
|
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
<dependencies>
|
<plugin>
|
||||||
<dependency>
|
<groupId>org.jacoco</groupId>
|
||||||
<groupId>org.projectlombok</groupId>
|
<artifactId>jacoco-maven-plugin</artifactId>
|
||||||
<artifactId>lombok</artifactId>
|
<version>0.8.7</version>
|
||||||
<version>${lombok.version}</version>
|
<executions>
|
||||||
<scope>provided</scope>
|
<execution>
|
||||||
</dependency>
|
<goals>
|
||||||
<dependency>
|
<goal>prepare-agent</goal>
|
||||||
<groupId>com.fasterxml.jackson.core</groupId>
|
</goals>
|
||||||
<artifactId>jackson-databind</artifactId>
|
</execution>
|
||||||
<version>2.15.3</version>
|
<execution>
|
||||||
</dependency>
|
<id>report</id>
|
||||||
<dependency>
|
<phase>test</phase>
|
||||||
<groupId>ch.qos.logback</groupId>
|
<goals>
|
||||||
<artifactId>logback-classic</artifactId>
|
<goal>report</goal>
|
||||||
<version>1.3.11</version>
|
</goals>
|
||||||
<scope>test</scope>
|
</execution>
|
||||||
</dependency>
|
</executions>
|
||||||
<dependency>
|
</plugin>
|
||||||
<groupId>org.slf4j</groupId>
|
</plugins>
|
||||||
<artifactId>slf4j-api</artifactId>
|
</build>
|
||||||
<version>2.0.9</version>
|
</profile>
|
||||||
</dependency>
|
</profiles>
|
||||||
<dependency>
|
|
||||||
<groupId>org.junit.jupiter</groupId>
|
|
||||||
<artifactId>junit-jupiter-api</artifactId>
|
|
||||||
<version>5.10.0</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.mockito</groupId>
|
|
||||||
<artifactId>mockito-core</artifactId>
|
|
||||||
<version>4.1.0</version>
|
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
|
||||||
|
|
||||||
<distributionManagement>
|
|
||||||
<snapshotRepository>
|
|
||||||
<id>ossrh</id>
|
|
||||||
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
|
|
||||||
</snapshotRepository>
|
|
||||||
<repository>
|
|
||||||
<id>ossrh</id>
|
|
||||||
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2</url>
|
|
||||||
</repository>
|
|
||||||
</distributionManagement>
|
|
||||||
|
|
||||||
<profiles>
|
|
||||||
<profile>
|
|
||||||
<id>unit-tests</id>
|
|
||||||
<properties>
|
|
||||||
<test.env>unit</test.env>
|
|
||||||
<skipUnitTests>false</skipUnitTests>
|
|
||||||
<skipIntegrationTests>true</skipIntegrationTests>
|
|
||||||
</properties>
|
|
||||||
<activation>
|
|
||||||
<activeByDefault>true</activeByDefault>
|
|
||||||
</activation>
|
|
||||||
</profile>
|
|
||||||
<profile>
|
|
||||||
<id>integration-tests</id>
|
|
||||||
<properties>
|
|
||||||
<test.env>integration</test.env>
|
|
||||||
<skipUnitTests>true</skipUnitTests>
|
|
||||||
<skipIntegrationTests>false</skipIntegrationTests>
|
|
||||||
</properties>
|
|
||||||
</profile>
|
|
||||||
<profile>
|
|
||||||
<id>ci-cd</id>
|
|
||||||
<properties>
|
|
||||||
<test.env>unit</test.env>
|
|
||||||
<skipUnitTests>true</skipUnitTests>
|
|
||||||
<skipIntegrationTests>true</skipIntegrationTests>
|
|
||||||
</properties>
|
|
||||||
<build>
|
|
||||||
<plugins>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
|
||||||
<artifactId>maven-gpg-plugin</artifactId>
|
|
||||||
<version>3.1.0</version>
|
|
||||||
<executions>
|
|
||||||
<execution>
|
|
||||||
<id>sign-artifacts</id>
|
|
||||||
<phase>verify</phase>
|
|
||||||
<goals>
|
|
||||||
<goal>sign</goal>
|
|
||||||
</goals>
|
|
||||||
<configuration>
|
|
||||||
<!-- Prevent gpg from using pinentry programs. Fixes:
|
|
||||||
gpg: signing failed: Inappropriate ioctl for device -->
|
|
||||||
<gpgArguments>
|
|
||||||
<arg>--pinentry-mode</arg>
|
|
||||||
<arg>loopback</arg>
|
|
||||||
</gpgArguments>
|
|
||||||
</configuration>
|
|
||||||
</execution>
|
|
||||||
</executions>
|
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<groupId>org.sonatype.plugins</groupId>
|
|
||||||
<artifactId>nexus-staging-maven-plugin</artifactId>
|
|
||||||
<version>1.6.13</version>
|
|
||||||
<extensions>true</extensions>
|
|
||||||
<configuration>
|
|
||||||
<serverId>ossrh</serverId>
|
|
||||||
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
|
|
||||||
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
|
||||||
</configuration>
|
|
||||||
</plugin>
|
|
||||||
</plugins>
|
|
||||||
</build>
|
|
||||||
</profile>
|
|
||||||
</profiles>
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -37,6 +37,7 @@ public class OllamaAPI {
|
|||||||
private final String host;
|
private final String host;
|
||||||
private long requestTimeoutSeconds = 3;
|
private long requestTimeoutSeconds = 3;
|
||||||
private boolean verbose = true;
|
private boolean verbose = true;
|
||||||
|
private BasicAuth basicAuth;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates the Ollama API.
|
* Instantiates the Ollama API.
|
||||||
@@ -51,6 +52,11 @@ public class OllamaAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set request timeout in seconds. Default is 3 seconds.
|
||||||
|
*
|
||||||
|
* @param requestTimeoutSeconds the request timeout in seconds
|
||||||
|
*/
|
||||||
public void setRequestTimeoutSeconds(long requestTimeoutSeconds) {
|
public void setRequestTimeoutSeconds(long requestTimeoutSeconds) {
|
||||||
this.requestTimeoutSeconds = requestTimeoutSeconds;
|
this.requestTimeoutSeconds = requestTimeoutSeconds;
|
||||||
}
|
}
|
||||||
@@ -64,6 +70,16 @@ public class OllamaAPI {
|
|||||||
this.verbose = verbose;
|
this.verbose = verbose;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set basic authentication for accessing Ollama server that's behind a reverse-proxy/gateway.
|
||||||
|
*
|
||||||
|
* @param username the username
|
||||||
|
* @param password the password
|
||||||
|
*/
|
||||||
|
public void setBasicAuth(String username, String password) {
|
||||||
|
this.basicAuth = new BasicAuth(username, password);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* API to check the reachability of Ollama server.
|
* API to check the reachability of Ollama server.
|
||||||
*
|
*
|
||||||
@@ -75,11 +91,9 @@ public class OllamaAPI {
|
|||||||
HttpRequest httpRequest = null;
|
HttpRequest httpRequest = null;
|
||||||
try {
|
try {
|
||||||
httpRequest =
|
httpRequest =
|
||||||
HttpRequest.newBuilder()
|
getRequestBuilderDefault(new URI(url))
|
||||||
.uri(new URI(url))
|
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
.header("Content-type", "application/json")
|
.header("Content-type", "application/json")
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
|
||||||
.GET()
|
.GET()
|
||||||
.build();
|
.build();
|
||||||
} catch (URISyntaxException e) {
|
} catch (URISyntaxException e) {
|
||||||
@@ -107,11 +121,9 @@ public class OllamaAPI {
|
|||||||
String url = this.host + "/api/tags";
|
String url = this.host + "/api/tags";
|
||||||
HttpClient httpClient = HttpClient.newHttpClient();
|
HttpClient httpClient = HttpClient.newHttpClient();
|
||||||
HttpRequest httpRequest =
|
HttpRequest httpRequest =
|
||||||
HttpRequest.newBuilder()
|
getRequestBuilderDefault(new URI(url))
|
||||||
.uri(new URI(url))
|
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
.header("Content-type", "application/json")
|
.header("Content-type", "application/json")
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
|
||||||
.GET()
|
.GET()
|
||||||
.build();
|
.build();
|
||||||
HttpResponse<String> response =
|
HttpResponse<String> response =
|
||||||
@@ -138,12 +150,10 @@ public class OllamaAPI {
|
|||||||
String url = this.host + "/api/pull";
|
String url = this.host + "/api/pull";
|
||||||
String jsonData = new ModelRequest(modelName).toString();
|
String jsonData = new ModelRequest(modelName).toString();
|
||||||
HttpRequest request =
|
HttpRequest request =
|
||||||
HttpRequest.newBuilder()
|
getRequestBuilderDefault(new URI(url))
|
||||||
.uri(new URI(url))
|
|
||||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
|
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
.header("Content-type", "application/json")
|
.header("Content-type", "application/json")
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
|
||||||
.build();
|
.build();
|
||||||
HttpClient client = HttpClient.newHttpClient();
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
HttpResponse<InputStream> response =
|
HttpResponse<InputStream> response =
|
||||||
@@ -174,15 +184,13 @@ public class OllamaAPI {
|
|||||||
* @return the model details
|
* @return the model details
|
||||||
*/
|
*/
|
||||||
public ModelDetail getModelDetails(String modelName)
|
public ModelDetail getModelDetails(String modelName)
|
||||||
throws IOException, OllamaBaseException, InterruptedException {
|
throws IOException, OllamaBaseException, InterruptedException, URISyntaxException {
|
||||||
String url = this.host + "/api/show";
|
String url = this.host + "/api/show";
|
||||||
String jsonData = new ModelRequest(modelName).toString();
|
String jsonData = new ModelRequest(modelName).toString();
|
||||||
HttpRequest request =
|
HttpRequest request =
|
||||||
HttpRequest.newBuilder()
|
getRequestBuilderDefault(new URI(url))
|
||||||
.uri(URI.create(url))
|
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
.header("Content-type", "application/json")
|
.header("Content-type", "application/json")
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
|
||||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
|
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
|
||||||
.build();
|
.build();
|
||||||
HttpClient client = HttpClient.newHttpClient();
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
@@ -204,15 +212,13 @@ public class OllamaAPI {
|
|||||||
* @param modelFilePath the path to model file that exists on the Ollama server.
|
* @param modelFilePath the path to model file that exists on the Ollama server.
|
||||||
*/
|
*/
|
||||||
public void createModelWithFilePath(String modelName, String modelFilePath)
|
public void createModelWithFilePath(String modelName, String modelFilePath)
|
||||||
throws IOException, InterruptedException, OllamaBaseException {
|
throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
|
||||||
String url = this.host + "/api/create";
|
String url = this.host + "/api/create";
|
||||||
String jsonData = new CustomModelFilePathRequest(modelName, modelFilePath).toString();
|
String jsonData = new CustomModelFilePathRequest(modelName, modelFilePath).toString();
|
||||||
HttpRequest request =
|
HttpRequest request =
|
||||||
HttpRequest.newBuilder()
|
getRequestBuilderDefault(new URI(url))
|
||||||
.uri(URI.create(url))
|
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
.header("Content-Type", "application/json")
|
.header("Content-Type", "application/json")
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
|
||||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
.POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
||||||
.build();
|
.build();
|
||||||
HttpClient client = HttpClient.newHttpClient();
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
@@ -240,15 +246,13 @@ public class OllamaAPI {
|
|||||||
* @param modelFileContents the path to model file that exists on the Ollama server.
|
* @param modelFileContents the path to model file that exists on the Ollama server.
|
||||||
*/
|
*/
|
||||||
public void createModelWithModelFileContents(String modelName, String modelFileContents)
|
public void createModelWithModelFileContents(String modelName, String modelFileContents)
|
||||||
throws IOException, InterruptedException, OllamaBaseException {
|
throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
|
||||||
String url = this.host + "/api/create";
|
String url = this.host + "/api/create";
|
||||||
String jsonData = new CustomModelFileContentsRequest(modelName, modelFileContents).toString();
|
String jsonData = new CustomModelFileContentsRequest(modelName, modelFileContents).toString();
|
||||||
HttpRequest request =
|
HttpRequest request =
|
||||||
HttpRequest.newBuilder()
|
getRequestBuilderDefault(new URI(url))
|
||||||
.uri(URI.create(url))
|
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
.header("Content-Type", "application/json")
|
.header("Content-Type", "application/json")
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
|
||||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
.POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
||||||
.build();
|
.build();
|
||||||
HttpClient client = HttpClient.newHttpClient();
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
@@ -270,20 +274,17 @@ public class OllamaAPI {
|
|||||||
* Delete a model from Ollama server.
|
* Delete a model from Ollama server.
|
||||||
*
|
*
|
||||||
* @param modelName the name of the model to be deleted.
|
* @param modelName the name of the model to be deleted.
|
||||||
* @param ignoreIfNotPresent - ignore errors if the specified model is not present on Ollama
|
* @param ignoreIfNotPresent ignore errors if the specified model is not present on Ollama server.
|
||||||
* server.
|
|
||||||
*/
|
*/
|
||||||
public void deleteModel(String modelName, boolean ignoreIfNotPresent)
|
public void deleteModel(String modelName, boolean ignoreIfNotPresent)
|
||||||
throws IOException, InterruptedException, OllamaBaseException {
|
throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
|
||||||
String url = this.host + "/api/delete";
|
String url = this.host + "/api/delete";
|
||||||
String jsonData = new ModelRequest(modelName).toString();
|
String jsonData = new ModelRequest(modelName).toString();
|
||||||
HttpRequest request =
|
HttpRequest request =
|
||||||
HttpRequest.newBuilder()
|
getRequestBuilderDefault(new URI(url))
|
||||||
.uri(URI.create(url))
|
|
||||||
.method("DELETE", HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
.method("DELETE", HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
.header("Content-type", "application/json")
|
.header("Content-type", "application/json")
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
|
||||||
.build();
|
.build();
|
||||||
HttpClient client = HttpClient.newHttpClient();
|
HttpClient client = HttpClient.newHttpClient();
|
||||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
@@ -306,17 +307,14 @@ public class OllamaAPI {
|
|||||||
*/
|
*/
|
||||||
public List<Double> generateEmbeddings(String model, String prompt)
|
public List<Double> generateEmbeddings(String model, String prompt)
|
||||||
throws IOException, InterruptedException, OllamaBaseException {
|
throws IOException, InterruptedException, OllamaBaseException {
|
||||||
String url = this.host + "/api/embeddings";
|
URI uri = URI.create(this.host + "/api/embeddings");
|
||||||
String jsonData = new ModelEmbeddingsRequest(model, prompt).toString();
|
String jsonData = new ModelEmbeddingsRequest(model, prompt).toString();
|
||||||
HttpClient httpClient = HttpClient.newHttpClient();
|
HttpClient httpClient = HttpClient.newHttpClient();
|
||||||
HttpRequest request =
|
HttpRequest.Builder requestBuilder =
|
||||||
HttpRequest.newBuilder()
|
getRequestBuilderDefault(uri)
|
||||||
.uri(URI.create(url))
|
|
||||||
.header("Accept", "application/json")
|
.header("Accept", "application/json")
|
||||||
.header("Content-type", "application/json")
|
.POST(HttpRequest.BodyPublishers.ofString(jsonData));
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
HttpRequest request = requestBuilder.build();
|
||||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
|
|
||||||
.build();
|
|
||||||
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
|
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
|
||||||
int statusCode = response.statusCode();
|
int statusCode = response.statusCode();
|
||||||
String responseBody = response.body();
|
String responseBody = response.body();
|
||||||
@@ -333,12 +331,12 @@ public class OllamaAPI {
|
|||||||
* Ask a question to a model running on Ollama server. This is a sync/blocking call.
|
* Ask a question to a model running on Ollama server. This is a sync/blocking call.
|
||||||
*
|
*
|
||||||
* @param model the ollama model to ask the question to
|
* @param model the ollama model to ask the question to
|
||||||
* @param promptText the prompt/question text
|
* @param prompt the prompt/question text
|
||||||
* @return OllamaResult - that includes response text and time taken for response
|
* @return OllamaResult that includes response text and time taken for response
|
||||||
*/
|
*/
|
||||||
public OllamaResult ask(String model, String promptText)
|
public OllamaResult ask(String model, String prompt)
|
||||||
throws OllamaBaseException, IOException, InterruptedException {
|
throws OllamaBaseException, IOException, InterruptedException {
|
||||||
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, promptText);
|
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, prompt);
|
||||||
return askSync(ollamaRequestModel);
|
return askSync(ollamaRequestModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -348,15 +346,16 @@ public class OllamaAPI {
|
|||||||
* async/non-blocking call.
|
* async/non-blocking call.
|
||||||
*
|
*
|
||||||
* @param model the ollama model to ask the question to
|
* @param model the ollama model to ask the question to
|
||||||
* @param promptText the prompt/question text
|
* @param prompt the prompt/question text
|
||||||
* @return the ollama async result callback handle
|
* @return the ollama async result callback handle
|
||||||
*/
|
*/
|
||||||
public OllamaAsyncResultCallback askAsync(String model, String promptText) {
|
public OllamaAsyncResultCallback askAsync(String model, String prompt) {
|
||||||
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, promptText);
|
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, prompt);
|
||||||
HttpClient httpClient = HttpClient.newHttpClient();
|
|
||||||
URI uri = URI.create(this.host + "/api/generate");
|
URI uri = URI.create(this.host + "/api/generate");
|
||||||
OllamaAsyncResultCallback ollamaAsyncResultCallback =
|
OllamaAsyncResultCallback ollamaAsyncResultCallback =
|
||||||
new OllamaAsyncResultCallback(httpClient, uri, ollamaRequestModel, requestTimeoutSeconds);
|
new OllamaAsyncResultCallback(
|
||||||
|
getRequestBuilderDefault(uri), ollamaRequestModel, requestTimeoutSeconds);
|
||||||
ollamaAsyncResultCallback.start();
|
ollamaAsyncResultCallback.start();
|
||||||
return ollamaAsyncResultCallback;
|
return ollamaAsyncResultCallback;
|
||||||
}
|
}
|
||||||
@@ -366,17 +365,17 @@ public class OllamaAPI {
|
|||||||
* sync/blocking call.
|
* sync/blocking call.
|
||||||
*
|
*
|
||||||
* @param model the ollama model to ask the question to
|
* @param model the ollama model to ask the question to
|
||||||
* @param promptText the prompt/question text
|
* @param prompt the prompt/question text
|
||||||
* @param imageFiles the list of image files to use for the question
|
* @param imageFiles the list of image files to use for the question
|
||||||
* @return OllamaResult - that includes response text and time taken for response
|
* @return OllamaResult that includes response text and time taken for response
|
||||||
*/
|
*/
|
||||||
public OllamaResult askWithImageFiles(String model, String promptText, List<File> imageFiles)
|
public OllamaResult askWithImageFiles(String model, String prompt, List<File> imageFiles)
|
||||||
throws OllamaBaseException, IOException, InterruptedException {
|
throws OllamaBaseException, IOException, InterruptedException {
|
||||||
List<String> images = new ArrayList<>();
|
List<String> images = new ArrayList<>();
|
||||||
for (File imageFile : imageFiles) {
|
for (File imageFile : imageFiles) {
|
||||||
images.add(encodeFileToBase64(imageFile));
|
images.add(encodeFileToBase64(imageFile));
|
||||||
}
|
}
|
||||||
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, promptText, images);
|
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, prompt, images);
|
||||||
return askSync(ollamaRequestModel);
|
return askSync(ollamaRequestModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -385,17 +384,17 @@ public class OllamaAPI {
|
|||||||
* sync/blocking call.
|
* sync/blocking call.
|
||||||
*
|
*
|
||||||
* @param model the ollama model to ask the question to
|
* @param model the ollama model to ask the question to
|
||||||
* @param promptText the prompt/question text
|
* @param prompt the prompt/question text
|
||||||
* @param imageURLs the list of image URLs to use for the question
|
* @param imageURLs the list of image URLs to use for the question
|
||||||
* @return OllamaResult - that includes response text and time taken for response
|
* @return OllamaResult that includes response text and time taken for response
|
||||||
*/
|
*/
|
||||||
public OllamaResult askWithImageURLs(String model, String promptText, List<String> imageURLs)
|
public OllamaResult askWithImageURLs(String model, String prompt, List<String> imageURLs)
|
||||||
throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
|
throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
|
||||||
List<String> images = new ArrayList<>();
|
List<String> images = new ArrayList<>();
|
||||||
for (String imageURL : imageURLs) {
|
for (String imageURL : imageURLs) {
|
||||||
images.add(encodeByteArrayToBase64(loadImageBytesFromUrl(imageURL)));
|
images.add(encodeByteArrayToBase64(loadImageBytesFromUrl(imageURL)));
|
||||||
}
|
}
|
||||||
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, promptText, images);
|
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, prompt, images);
|
||||||
return askSync(ollamaRequestModel);
|
return askSync(ollamaRequestModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,14 +425,13 @@ public class OllamaAPI {
|
|||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
HttpClient httpClient = HttpClient.newHttpClient();
|
HttpClient httpClient = HttpClient.newHttpClient();
|
||||||
URI uri = URI.create(this.host + "/api/generate");
|
URI uri = URI.create(this.host + "/api/generate");
|
||||||
HttpRequest request =
|
HttpRequest.Builder requestBuilder =
|
||||||
HttpRequest.newBuilder(uri)
|
getRequestBuilderDefault(uri)
|
||||||
.POST(
|
.POST(
|
||||||
HttpRequest.BodyPublishers.ofString(
|
HttpRequest.BodyPublishers.ofString(
|
||||||
Utils.getObjectMapper().writeValueAsString(ollamaRequestModel)))
|
Utils.getObjectMapper().writeValueAsString(ollamaRequestModel)));
|
||||||
.header("Content-Type", "application/json")
|
HttpRequest request = requestBuilder.build();
|
||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
logger.debug("Ask model '" + ollamaRequestModel + "' ...");
|
||||||
.build();
|
|
||||||
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();
|
||||||
@@ -444,9 +442,16 @@ public class OllamaAPI {
|
|||||||
String line;
|
String line;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
if (statusCode == 404) {
|
if (statusCode == 404) {
|
||||||
|
logger.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) {
|
||||||
|
logger.warn("Status code: 401 (Unauthorized)");
|
||||||
|
OllamaErrorResponseModel ollamaResponseModel =
|
||||||
|
Utils.getObjectMapper()
|
||||||
|
.readValue("{\"error\":\"Unauthorized\"}", OllamaErrorResponseModel.class);
|
||||||
|
responseBuffer.append(ollamaResponseModel.getError());
|
||||||
} else {
|
} else {
|
||||||
OllamaResponseModel ollamaResponseModel =
|
OllamaResponseModel ollamaResponseModel =
|
||||||
Utils.getObjectMapper().readValue(line, OllamaResponseModel.class);
|
Utils.getObjectMapper().readValue(line, OllamaResponseModel.class);
|
||||||
@@ -457,10 +462,47 @@ public class OllamaAPI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (statusCode != 200) {
|
if (statusCode != 200) {
|
||||||
|
logger.error("Status code " + statusCode);
|
||||||
throw new OllamaBaseException(responseBuffer.toString());
|
throw new OllamaBaseException(responseBuffer.toString());
|
||||||
} else {
|
} else {
|
||||||
long endTime = System.currentTimeMillis();
|
long endTime = System.currentTimeMillis();
|
||||||
return new OllamaResult(responseBuffer.toString().trim(), endTime - startTime, statusCode);
|
return new OllamaResult(responseBuffer.toString().trim(), endTime - startTime, statusCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get default request builder.
|
||||||
|
*
|
||||||
|
* @param uri URI to get a HttpRequest.Builder
|
||||||
|
* @return HttpRequest.Builder
|
||||||
|
*/
|
||||||
|
private HttpRequest.Builder getRequestBuilderDefault(URI uri) {
|
||||||
|
HttpRequest.Builder requestBuilder =
|
||||||
|
HttpRequest.newBuilder(uri)
|
||||||
|
.header("Content-Type", "application/json")
|
||||||
|
.timeout(Duration.ofSeconds(requestTimeoutSeconds));
|
||||||
|
if (isBasicAuthCredentialsSet()) {
|
||||||
|
requestBuilder.header("Authorization", getBasicAuthHeaderValue());
|
||||||
|
}
|
||||||
|
return requestBuilder;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get basic authentication header value.
|
||||||
|
*
|
||||||
|
* @return basic authentication header value (encoded credentials)
|
||||||
|
*/
|
||||||
|
private String getBasicAuthHeaderValue() {
|
||||||
|
String credentialsToEncode = basicAuth.getUsername() + ":" + basicAuth.getPassword();
|
||||||
|
return "Basic " + Base64.getEncoder().encodeToString(credentialsToEncode.getBytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if Basic Auth credentials set.
|
||||||
|
*
|
||||||
|
* @return true when Basic Auth credentials set
|
||||||
|
*/
|
||||||
|
private boolean isBasicAuthCredentialsSet() {
|
||||||
|
return basicAuth != null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package io.github.amithkoujalgi.ollama4j.core.models;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class BasicAuth {
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
}
|
||||||
@@ -6,7 +6,6 @@ import java.io.BufferedReader;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.net.URI;
|
|
||||||
import java.net.http.HttpClient;
|
import java.net.http.HttpClient;
|
||||||
import java.net.http.HttpRequest;
|
import java.net.http.HttpRequest;
|
||||||
import java.net.http.HttpResponse;
|
import java.net.http.HttpResponse;
|
||||||
@@ -14,30 +13,44 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public class OllamaAsyncResultCallback extends Thread {
|
public class OllamaAsyncResultCallback extends Thread {
|
||||||
private final HttpClient client;
|
private final HttpRequest.Builder requestBuilder;
|
||||||
private final URI uri;
|
|
||||||
private final OllamaRequestModel ollamaRequestModel;
|
private final OllamaRequestModel ollamaRequestModel;
|
||||||
private final Queue<String> queue = new LinkedList<>();
|
private final Queue<String> queue = new LinkedList<>();
|
||||||
private String result;
|
private String result;
|
||||||
private boolean isDone;
|
private boolean isDone;
|
||||||
private boolean succeeded;
|
|
||||||
|
/**
|
||||||
|
* -- GETTER -- Returns the status of the request. Indicates if the request was successful or a
|
||||||
|
* failure. If the request was a failure, the `getResponse()` method will return the error
|
||||||
|
* message.
|
||||||
|
*/
|
||||||
|
@Getter private boolean succeeded;
|
||||||
|
|
||||||
private long requestTimeoutSeconds;
|
private long requestTimeoutSeconds;
|
||||||
|
|
||||||
private int httpStatusCode;
|
/**
|
||||||
private long responseTime = 0;
|
* -- GETTER -- Returns the HTTP response status code for the request that was made to Ollama
|
||||||
|
* server.
|
||||||
|
*/
|
||||||
|
@Getter private int httpStatusCode;
|
||||||
|
|
||||||
|
/** -- GETTER -- Returns the response time in milliseconds. */
|
||||||
|
@Getter private long responseTime = 0;
|
||||||
|
|
||||||
public OllamaAsyncResultCallback(
|
public OllamaAsyncResultCallback(
|
||||||
HttpClient client,
|
HttpRequest.Builder requestBuilder,
|
||||||
URI uri,
|
|
||||||
OllamaRequestModel ollamaRequestModel,
|
OllamaRequestModel ollamaRequestModel,
|
||||||
long requestTimeoutSeconds) {
|
long requestTimeoutSeconds) {
|
||||||
this.client = client;
|
this.requestBuilder = requestBuilder;
|
||||||
this.ollamaRequestModel = ollamaRequestModel;
|
this.ollamaRequestModel = ollamaRequestModel;
|
||||||
this.uri = uri;
|
|
||||||
this.isDone = false;
|
this.isDone = false;
|
||||||
this.result = "";
|
this.result = "";
|
||||||
this.queue.add("");
|
this.queue.add("");
|
||||||
@@ -46,10 +59,11 @@ public class OllamaAsyncResultCallback extends Thread {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
HttpClient httpClient = HttpClient.newHttpClient();
|
||||||
try {
|
try {
|
||||||
long startTime = System.currentTimeMillis();
|
long startTime = System.currentTimeMillis();
|
||||||
HttpRequest request =
|
HttpRequest request =
|
||||||
HttpRequest.newBuilder(uri)
|
requestBuilder
|
||||||
.POST(
|
.POST(
|
||||||
HttpRequest.BodyPublishers.ofString(
|
HttpRequest.BodyPublishers.ofString(
|
||||||
Utils.getObjectMapper().writeValueAsString(ollamaRequestModel)))
|
Utils.getObjectMapper().writeValueAsString(ollamaRequestModel)))
|
||||||
@@ -57,7 +71,7 @@ public class OllamaAsyncResultCallback extends Thread {
|
|||||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||||
.build();
|
.build();
|
||||||
HttpResponse<InputStream> response =
|
HttpResponse<InputStream> response =
|
||||||
client.send(request, HttpResponse.BodyHandlers.ofInputStream());
|
httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());
|
||||||
int statusCode = response.statusCode();
|
int statusCode = response.statusCode();
|
||||||
this.httpStatusCode = statusCode;
|
this.httpStatusCode = statusCode;
|
||||||
|
|
||||||
@@ -108,25 +122,6 @@ public class OllamaAsyncResultCallback extends Thread {
|
|||||||
return isDone;
|
return isDone;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the HTTP response status code for the request that was made to Ollama server.
|
|
||||||
*
|
|
||||||
* @return int - the status code for the request
|
|
||||||
*/
|
|
||||||
public int getHttpStatusCode() {
|
|
||||||
return httpStatusCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the status of the request. Indicates if the request was successful or a failure. If the
|
|
||||||
* request was a failure, the `getResponse()` method will return the error message.
|
|
||||||
*
|
|
||||||
* @return boolean - status
|
|
||||||
*/
|
|
||||||
public boolean isSucceeded() {
|
|
||||||
return succeeded;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the final response when the execution completes. Does not return intermediate results.
|
* Returns the final response when the execution completes. Does not return intermediate results.
|
||||||
*
|
*
|
||||||
@@ -140,15 +135,6 @@ public class OllamaAsyncResultCallback extends Thread {
|
|||||||
return queue;
|
return queue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the response time in milliseconds.
|
|
||||||
*
|
|
||||||
* @return long - response time in milliseconds.
|
|
||||||
*/
|
|
||||||
public long getResponseTime() {
|
|
||||||
return responseTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setRequestTimeoutSeconds(long requestTimeoutSeconds) {
|
public void setRequestTimeoutSeconds(long requestTimeoutSeconds) {
|
||||||
this.requestTimeoutSeconds = requestTimeoutSeconds;
|
this.requestTimeoutSeconds = requestTimeoutSeconds;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package io.github.amithkoujalgi.ollama4j.core.utils;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
public class Utils {
|
public class Utils {
|
||||||
public static ObjectMapper getObjectMapper() {
|
public static ObjectMapper getObjectMapper() {
|
||||||
return new ObjectMapper();
|
return new ObjectMapper();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,12 +11,13 @@ import io.github.amithkoujalgi.ollama4j.core.types.OllamaModelType;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.mockito.Mockito;
|
import org.mockito.Mockito;
|
||||||
|
|
||||||
class TestMockedAPIs {
|
class TestMockedAPIs {
|
||||||
@Test
|
@Test
|
||||||
void testMockPullModel() {
|
void testPullModel() {
|
||||||
OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
|
OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
|
||||||
String model = OllamaModelType.LLAMA2;
|
String model = OllamaModelType.LLAMA2;
|
||||||
try {
|
try {
|
||||||
@@ -49,7 +50,7 @@ class TestMockedAPIs {
|
|||||||
doNothing().when(ollamaAPI).createModelWithModelFileContents(model, modelFilePath);
|
doNothing().when(ollamaAPI).createModelWithModelFileContents(model, modelFilePath);
|
||||||
ollamaAPI.createModelWithModelFileContents(model, modelFilePath);
|
ollamaAPI.createModelWithModelFileContents(model, modelFilePath);
|
||||||
verify(ollamaAPI, times(1)).createModelWithModelFileContents(model, modelFilePath);
|
verify(ollamaAPI, times(1)).createModelWithModelFileContents(model, modelFilePath);
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,7 +63,7 @@ class TestMockedAPIs {
|
|||||||
doNothing().when(ollamaAPI).deleteModel(model, true);
|
doNothing().when(ollamaAPI).deleteModel(model, true);
|
||||||
ollamaAPI.deleteModel(model, true);
|
ollamaAPI.deleteModel(model, true);
|
||||||
verify(ollamaAPI, times(1)).deleteModel(model, true);
|
verify(ollamaAPI, times(1)).deleteModel(model, true);
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,7 +76,7 @@ class TestMockedAPIs {
|
|||||||
when(ollamaAPI.getModelDetails(model)).thenReturn(new ModelDetail());
|
when(ollamaAPI.getModelDetails(model)).thenReturn(new ModelDetail());
|
||||||
ollamaAPI.getModelDetails(model);
|
ollamaAPI.getModelDetails(model);
|
||||||
verify(ollamaAPI, times(1)).getModelDetails(model);
|
verify(ollamaAPI, times(1)).getModelDetails(model);
|
||||||
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,13 +109,43 @@ class TestMockedAPIs {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testAskWithImageFiles() {
|
||||||
|
OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
|
||||||
|
String model = OllamaModelType.LLAMA2;
|
||||||
|
String prompt = "some prompt text";
|
||||||
|
try {
|
||||||
|
when(ollamaAPI.askWithImageFiles(model, prompt, Collections.emptyList()))
|
||||||
|
.thenReturn(new OllamaResult("", 0, 200));
|
||||||
|
ollamaAPI.askWithImageFiles(model, prompt, Collections.emptyList());
|
||||||
|
verify(ollamaAPI, times(1)).askWithImageFiles(model, prompt, Collections.emptyList());
|
||||||
|
} catch (IOException | OllamaBaseException | InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testAskWithImageURLs() {
|
||||||
|
OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
|
||||||
|
String model = OllamaModelType.LLAMA2;
|
||||||
|
String prompt = "some prompt text";
|
||||||
|
try {
|
||||||
|
when(ollamaAPI.askWithImageURLs(model, prompt, Collections.emptyList()))
|
||||||
|
.thenReturn(new OllamaResult("", 0, 200));
|
||||||
|
ollamaAPI.askWithImageURLs(model, prompt, Collections.emptyList());
|
||||||
|
verify(ollamaAPI, times(1)).askWithImageURLs(model, prompt, Collections.emptyList());
|
||||||
|
} catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testAskAsync() {
|
void testAskAsync() {
|
||||||
OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
|
OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
|
||||||
String model = OllamaModelType.LLAMA2;
|
String model = OllamaModelType.LLAMA2;
|
||||||
String prompt = "some prompt text";
|
String prompt = "some prompt text";
|
||||||
when(ollamaAPI.askAsync(model, prompt))
|
when(ollamaAPI.askAsync(model, prompt))
|
||||||
.thenReturn(new OllamaAsyncResultCallback(null, null, null, 3));
|
.thenReturn(new OllamaAsyncResultCallback(null, null, 3));
|
||||||
ollamaAPI.askAsync(model, prompt);
|
ollamaAPI.askAsync(model, prompt);
|
||||||
verify(ollamaAPI, times(1)).askAsync(model, prompt);
|
verify(ollamaAPI, times(1)).askAsync(model, prompt);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user