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.response.OllamaErrorResponse;
6import io.github.ollama4j.models.response.OllamaResult;
7import io.github.ollama4j.models.generate.OllamaGenerateResponseModel;
8import io.github.ollama4j.models.generate.OllamaGenerateStreamObserver;
9import io.github.ollama4j.models.generate.OllamaStreamHandler;
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
26
27 private static final Logger LOG = LoggerFactory.getLogger(OllamaGenerateEndpointCaller.class);
28
29 private OllamaGenerateStreamObserver streamObserver;
30
31 public OllamaGenerateEndpointCaller(String host, BasicAuth basicAuth, long requestTimeoutSeconds, boolean verbose) {
32 super(host, basicAuth, requestTimeoutSeconds, verbose);
33 }
34
35 @Override
36 protected String getEndpointSuffix() {
37 return "/api/generate";
38 }
39
40 @Override
41 protected boolean parseResponseAndAddToBuffer(String line, StringBuilder responseBuffer) {
42 try {
43 OllamaGenerateResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaGenerateResponseModel.class);
44 responseBuffer.append(ollamaResponseModel.getResponse());
45 if (streamObserver != null) {
46 streamObserver.notify(ollamaResponseModel);
47 }
48 return ollamaResponseModel.isDone();
49 } catch (JsonProcessingException e) {
50 LOG.error("Error parsing the Ollama chat response!", e);
51 return true;
52 }
53 }
54
56 throws OllamaBaseException, IOException, InterruptedException {
57 streamObserver = new OllamaGenerateStreamObserver(streamHandler);
58 return callSync(body);
59 }
60
70 public OllamaResult callSync(OllamaRequestBody body) throws OllamaBaseException, IOException, InterruptedException {
71 // Create Request
72 long startTime = System.currentTimeMillis();
73 HttpClient httpClient = HttpClient.newHttpClient();
74 URI uri = URI.create(getHost() + getEndpointSuffix());
75 HttpRequest.Builder requestBuilder =
77 .POST(
78 body.getBodyPublisher());
79 HttpRequest request = requestBuilder.build();
80 if (isVerbose()) LOG.info("Asking model: " + body.toString());
81 HttpResponse<InputStream> response =
82 httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());
83
84 int statusCode = response.statusCode();
85 InputStream responseBodyStream = response.body();
86 StringBuilder responseBuffer = new StringBuilder();
87 try (BufferedReader reader =
88 new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
89 String line;
90 while ((line = reader.readLine()) != null) {
91 if (statusCode == 404) {
92 LOG.warn("Status code: 404 (Not Found)");
93 OllamaErrorResponse ollamaResponseModel =
94 Utils.getObjectMapper().readValue(line, OllamaErrorResponse.class);
95 responseBuffer.append(ollamaResponseModel.getError());
96 } else if (statusCode == 401) {
97 LOG.warn("Status code: 401 (Unauthorized)");
98 OllamaErrorResponse ollamaResponseModel =
100 .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,
105 OllamaErrorResponse.class);
106 responseBuffer.append(ollamaResponseModel.getError());
107 } else {
108 boolean finished = parseResponseAndAddToBuffer(line, responseBuffer);
109 if (finished) {
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 =
122 new OllamaResult(responseBuffer.toString().trim(), endTime - startTime, statusCode);
123 if (isVerbose()) LOG.info("Model response: " + ollamaResult);
124 return ollamaResult;
125 }
126 }
127}
OllamaEndpointCaller(String host, BasicAuth basicAuth, long requestTimeoutSeconds, boolean verbose)
OllamaResult call(OllamaRequestBody body, OllamaStreamHandler streamHandler)
boolean parseResponseAndAddToBuffer(String line, StringBuilder responseBuffer)
OllamaGenerateEndpointCaller(String host, BasicAuth basicAuth, long requestTimeoutSeconds, boolean verbose)
static ObjectMapper getObjectMapper()
Definition Utils.java:17