Ollama4j
A Java library (wrapper/binding) for Ollama server.
Loading...
Searching...
No Matches
OllamaGenerateEndpointCaller.java
Go to the documentation of this file.
1package io.github.ollama4j.models.request;
2
3import com.fasterxml.jackson.core.JsonProcessingException;
4import io.github.ollama4j.exceptions.OllamaBaseException;
5import io.github.ollama4j.models.generate.OllamaGenerateResponseModel;
6import io.github.ollama4j.models.generate.OllamaGenerateStreamObserver;
7import io.github.ollama4j.models.generate.OllamaStreamHandler;
8import io.github.ollama4j.models.response.OllamaErrorResponse;
9import io.github.ollama4j.models.response.OllamaResult;
10import io.github.ollama4j.utils.OllamaRequestBody;
11import io.github.ollama4j.utils.Utils;
12import org.slf4j.Logger;
13import org.slf4j.LoggerFactory;
14
15import java.io.BufferedReader;
16import java.io.IOException;
17import java.io.InputStream;
18import java.io.InputStreamReader;
19import java.net.URI;
20import java.net.http.HttpClient;
21import java.net.http.HttpRequest;
22import java.net.http.HttpResponse;
23import java.nio.charset.StandardCharsets;
24
25@SuppressWarnings("resource")
27
28 private static final Logger LOG = LoggerFactory.getLogger(OllamaGenerateEndpointCaller.class);
29
30 private OllamaGenerateStreamObserver responseStreamObserver;
31
32 public OllamaGenerateEndpointCaller(String host, Auth basicAuth, long requestTimeoutSeconds, boolean verbose) {
33 super(host, basicAuth, requestTimeoutSeconds, verbose);
34 }
35
36 @Override
37 protected String getEndpointSuffix() {
38 return "/api/generate";
39 }
40
41 @Override
42 protected boolean parseResponseAndAddToBuffer(String line, StringBuilder responseBuffer, StringBuilder thinkingBuffer) {
43 try {
44 OllamaGenerateResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaGenerateResponseModel.class);
45 if (ollamaResponseModel.getResponse() != null) {
46 responseBuffer.append(ollamaResponseModel.getResponse());
47 }
48 if (ollamaResponseModel.getThinking() != null) {
49 thinkingBuffer.append(ollamaResponseModel.getThinking());
50 }
51 if (responseStreamObserver != null) {
52 responseStreamObserver.notify(ollamaResponseModel);
53 }
54 return ollamaResponseModel.isDone();
55 } catch (JsonProcessingException e) {
56 LOG.error("Error parsing the Ollama chat response!", e);
57 return true;
58 }
59 }
60
61 public OllamaResult call(OllamaRequestBody body, OllamaStreamHandler thinkingStreamHandler, OllamaStreamHandler responseStreamHandler) throws OllamaBaseException, IOException, InterruptedException {
62 responseStreamObserver = new OllamaGenerateStreamObserver(thinkingStreamHandler, responseStreamHandler);
63 return callSync(body);
64 }
65
75 @SuppressWarnings("DuplicatedCode")
76 public OllamaResult callSync(OllamaRequestBody body) throws OllamaBaseException, IOException, InterruptedException {
77 // Create Request
78 long startTime = System.currentTimeMillis();
79 HttpClient httpClient = HttpClient.newHttpClient();
80 URI uri = URI.create(getHost() + getEndpointSuffix());
81 HttpRequest.Builder requestBuilder = getRequestBuilderDefault(uri).POST(body.getBodyPublisher());
82 HttpRequest request = requestBuilder.build();
83 if (isVerbose()) LOG.info("Asking model: {}", body);
84 HttpResponse<InputStream> response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());
85
86 int statusCode = response.statusCode();
87 InputStream responseBodyStream = response.body();
88 StringBuilder responseBuffer = new StringBuilder();
89 StringBuilder thinkingBuffer = new StringBuilder();
90 OllamaGenerateResponseModel ollamaGenerateResponseModel = null;
91 try (BufferedReader reader = new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
92 String line;
93 while ((line = reader.readLine()) != null) {
94 if (statusCode == 404) {
95 LOG.warn("Status code: 404 (Not Found)");
96 OllamaErrorResponse ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaErrorResponse.class);
97 responseBuffer.append(ollamaResponseModel.getError());
98 } else if (statusCode == 401) {
99 LOG.warn("Status code: 401 (Unauthorized)");
100 OllamaErrorResponse ollamaResponseModel = Utils.getObjectMapper().readValue("{\"error\":\"Unauthorized\"}", OllamaErrorResponse.class);
101 responseBuffer.append(ollamaResponseModel.getError());
102 } else if (statusCode == 400) {
103 LOG.warn("Status code: 400 (Bad Request)");
104 OllamaErrorResponse ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaErrorResponse.class);
105 responseBuffer.append(ollamaResponseModel.getError());
106 } else {
107 boolean finished = parseResponseAndAddToBuffer(line, responseBuffer, thinkingBuffer);
108 if (finished) {
109 ollamaGenerateResponseModel = Utils.getObjectMapper().readValue(line, OllamaGenerateResponseModel.class);
110 break;
111 }
112 }
113 }
114 }
115
116 if (statusCode != 200) {
117 LOG.error("Status code: {}", statusCode);
118 throw new OllamaBaseException(responseBuffer.toString());
119 } else {
120 long endTime = System.currentTimeMillis();
121 OllamaResult ollamaResult = new OllamaResult(responseBuffer.toString(), thinkingBuffer.toString(), endTime - startTime, statusCode);
122
123 ollamaResult.setModel(ollamaGenerateResponseModel.getModel());
124 ollamaResult.setCreatedAt(ollamaGenerateResponseModel.getCreatedAt());
125 ollamaResult.setDone(ollamaGenerateResponseModel.isDone());
126 ollamaResult.setDoneReason(ollamaGenerateResponseModel.getDoneReason());
127 ollamaResult.setContext(ollamaGenerateResponseModel.getContext());
128 ollamaResult.setTotalDuration(ollamaGenerateResponseModel.getTotalDuration());
129 ollamaResult.setLoadDuration(ollamaGenerateResponseModel.getLoadDuration());
130 ollamaResult.setPromptEvalCount(ollamaGenerateResponseModel.getPromptEvalCount());
131 ollamaResult.setPromptEvalDuration(ollamaGenerateResponseModel.getPromptEvalDuration());
132 ollamaResult.setEvalCount(ollamaGenerateResponseModel.getEvalCount());
133 ollamaResult.setEvalDuration(ollamaGenerateResponseModel.getEvalDuration());
134
135 if (isVerbose()) LOG.info("Model response: {}", ollamaResult);
136 return ollamaResult;
137 }
138 }
139}
OllamaEndpointCaller(String host, Auth auth, long requestTimeoutSeconds, boolean verbose)
OllamaResult call(OllamaRequestBody body, OllamaStreamHandler thinkingStreamHandler, OllamaStreamHandler responseStreamHandler)
OllamaGenerateEndpointCaller(String host, Auth basicAuth, long requestTimeoutSeconds, boolean verbose)
boolean parseResponseAndAddToBuffer(String line, StringBuilder responseBuffer, StringBuilder thinkingBuffer)
static ObjectMapper getObjectMapper()
Definition Utils.java:19