mirror of
https://github.com/amithkoujalgi/ollama4j.git
synced 2025-11-03 18:10:42 +01:00
Compare commits
11 Commits
snyk-upgra
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a70925d842 | ||
|
|
256ea0b2a4 | ||
|
|
13ccba40f7 | ||
|
|
30e5598468 | ||
|
|
24a37ed858 | ||
|
|
fc63e1f786 | ||
|
|
6623c94e92 | ||
|
|
995fbb14ba | ||
|
|
4a1161b88a | ||
|
|
c628d1fa20 | ||
|
|
614f7422b6 |
@@ -209,7 +209,6 @@ To download/pull the model into your Ollama server, run the following command in
|
|||||||
|
|
||||||
```shell
|
```shell
|
||||||
ollama pull mistral
|
ollama pull mistral
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
You can list the models available on your model server by running the following command in your terminal.
|
You can list the models available on your model server by running the following command in your terminal.
|
||||||
|
|||||||
@@ -31,7 +31,19 @@ You could do that with ease with the `function calling` capabilities of the mode
|
|||||||
|
|
||||||
### Create Tools/Functions
|
### Create Tools/Functions
|
||||||
|
|
||||||
We can create static functions as our tools.
|
There are two ways to create and register your tools:
|
||||||
|
|
||||||
|
1. **Define static or regular methods and register them explicitly as tools.**
|
||||||
|
You can create standalone functions (static or instance methods) and manually associate them with your tool specifications.
|
||||||
|
|
||||||
|
2. **Use annotation-based tool discovery for automatic registration.**
|
||||||
|
By annotating your tool methods, you can leverage `registerAnnotatedTools()` to automatically scan your classpath, find all annotated tool functions, and register them without extra boilerplate.
|
||||||
|
|
||||||
|
Learn more about annotation-based tool registration [here](/apis-generate/chat-with-tools#annotation-based-tool-registration).
|
||||||
|
|
||||||
|
Choose the approach that best fits your project—manual for precise control, or annotation-based for easier scaling.
|
||||||
|
|
||||||
|
Let's start by exploring the first approach: manually defining and registering your tools/functions.
|
||||||
|
|
||||||
This function takes the arguments `location` and `fuelType` and performs an operation with these arguments and returns
|
This function takes the arguments `location` and `fuelType` and performs an operation with these arguments and returns
|
||||||
fuel price value.
|
fuel price value.
|
||||||
|
|||||||
4
pom.xml
4
pom.xml
@@ -284,7 +284,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-api</artifactId>
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
<version>6.0.0</version>
|
<version>6.0.1</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -302,7 +302,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.testcontainers</groupId>
|
<groupId>org.testcontainers</groupId>
|
||||||
<artifactId>ollama</artifactId>
|
<artifactId>ollama</artifactId>
|
||||||
<version>1.20.2</version>
|
<version>1.21.3</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -804,9 +804,21 @@ public class Ollama {
|
|||||||
ocm.setResponse(request.getPrompt());
|
ocm.setResponse(request.getPrompt());
|
||||||
chatRequest.setMessages(msgs);
|
chatRequest.setMessages(msgs);
|
||||||
msgs.add(ocm);
|
msgs.add(ocm);
|
||||||
|
|
||||||
|
// Merge request's tools and globally registered tools into a new list to avoid mutating the
|
||||||
|
// original request
|
||||||
|
List<Tools.Tool> allTools = new ArrayList<>();
|
||||||
|
if (request.getTools() != null) {
|
||||||
|
allTools.addAll(request.getTools());
|
||||||
|
}
|
||||||
|
List<Tools.Tool> registeredTools = this.getRegisteredTools();
|
||||||
|
if (registeredTools != null) {
|
||||||
|
allTools.addAll(registeredTools);
|
||||||
|
}
|
||||||
|
|
||||||
OllamaChatTokenHandler hdlr = null;
|
OllamaChatTokenHandler hdlr = null;
|
||||||
chatRequest.setUseTools(true);
|
chatRequest.setUseTools(true);
|
||||||
chatRequest.setTools(request.getTools());
|
chatRequest.setTools(allTools);
|
||||||
if (streamObserver != null) {
|
if (streamObserver != null) {
|
||||||
chatRequest.setStream(true);
|
chatRequest.setStream(true);
|
||||||
if (streamObserver.getResponseStreamHandler() != null) {
|
if (streamObserver.getResponseStreamHandler() != null) {
|
||||||
|
|||||||
@@ -44,10 +44,13 @@ public class OllamaChatEndpointCaller extends OllamaEndpointCaller {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses streamed Response line from ollama chat. Using {@link
|
* Parses streamed Response line from ollama chat. Using {@link
|
||||||
* com.fasterxml.jackson.databind.ObjectMapper#readValue(String, TypeReference)} should throw
|
* com.fasterxml.jackson.databind.ObjectMapper#readValue(String, TypeReference)}
|
||||||
|
* should throw
|
||||||
* {@link IllegalArgumentException} in case of null line or {@link
|
* {@link IllegalArgumentException} in case of null line or {@link
|
||||||
* com.fasterxml.jackson.core.JsonParseException} in case the JSON Object cannot be parsed to a
|
* com.fasterxml.jackson.core.JsonParseException} in case the JSON Object cannot
|
||||||
* {@link OllamaChatResponseModel}. Thus, the ResponseModel should never be null.
|
* be parsed to a
|
||||||
|
* {@link OllamaChatResponseModel}. Thus, the ResponseModel should never be
|
||||||
|
* null.
|
||||||
*
|
*
|
||||||
* @param line streamed line of ollama stream response
|
* @param line streamed line of ollama stream response
|
||||||
* @param responseBuffer Stringbuffer to add latest response message part to
|
* @param responseBuffer Stringbuffer to add latest response message part to
|
||||||
@@ -59,9 +62,11 @@ public class OllamaChatEndpointCaller extends OllamaEndpointCaller {
|
|||||||
try {
|
try {
|
||||||
OllamaChatResponseModel ollamaResponseModel =
|
OllamaChatResponseModel ollamaResponseModel =
|
||||||
Utils.getObjectMapper().readValue(line, OllamaChatResponseModel.class);
|
Utils.getObjectMapper().readValue(line, OllamaChatResponseModel.class);
|
||||||
// It seems that under heavy load Ollama responds with an empty chat message part in the
|
// It seems that under heavy load Ollama responds with an empty chat message
|
||||||
|
// part in the
|
||||||
// streamed response.
|
// streamed response.
|
||||||
// Thus, we null check the message and hope that the next streamed response has some
|
// Thus, we null check the message and hope that the next streamed response has
|
||||||
|
// some
|
||||||
// message content again.
|
// message content again.
|
||||||
OllamaChatMessage message = ollamaResponseModel.getMessage();
|
OllamaChatMessage message = ollamaResponseModel.getMessage();
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
@@ -118,7 +123,9 @@ public class OllamaChatEndpointCaller extends OllamaEndpointCaller {
|
|||||||
parseResponseAndAddToBuffer(line, responseBuffer, thinkingBuffer);
|
parseResponseAndAddToBuffer(line, responseBuffer, thinkingBuffer);
|
||||||
ollamaChatResponseModel =
|
ollamaChatResponseModel =
|
||||||
Utils.getObjectMapper().readValue(line, OllamaChatResponseModel.class);
|
Utils.getObjectMapper().readValue(line, OllamaChatResponseModel.class);
|
||||||
if (body.stream && ollamaChatResponseModel.getMessage().getToolCalls() != null) {
|
if (body.stream
|
||||||
|
&& ollamaChatResponseModel.getMessage() != null
|
||||||
|
&& ollamaChatResponseModel.getMessage().getToolCalls() != null) {
|
||||||
wantedToolsForStream = ollamaChatResponseModel.getMessage().getToolCalls();
|
wantedToolsForStream = ollamaChatResponseModel.getMessage().getToolCalls();
|
||||||
}
|
}
|
||||||
if (finished && body.stream) {
|
if (finished && body.stream) {
|
||||||
@@ -153,7 +160,8 @@ public class OllamaChatEndpointCaller extends OllamaEndpointCaller {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles error status codes and appends error messages to the response buffer. Returns true if
|
* Handles error status codes and appends error messages to the response buffer.
|
||||||
|
* Returns true if
|
||||||
* an error was handled, false otherwise.
|
* an error was handled, false otherwise.
|
||||||
*/
|
*/
|
||||||
private boolean handleErrorStatus(int statusCode, String line, StringBuilder responseBuffer)
|
private boolean handleErrorStatus(int statusCode, String line, StringBuilder responseBuffer)
|
||||||
|
|||||||
Reference in New Issue
Block a user