Ollama4j
A Java library (wrapper/binding) for Ollama server.
Loading...
Searching...
No Matches
OllamaAsyncResultStreamer.java
Go to the documentation of this file.
1package io.github.ollama4j.models.response;
2
3import io.github.ollama4j.exceptions.OllamaBaseException;
4import io.github.ollama4j.models.generate.OllamaGenerateRequest;
5import io.github.ollama4j.models.generate.OllamaGenerateResponseModel;
6import io.github.ollama4j.utils.Constants;
7import io.github.ollama4j.utils.Utils;
8import lombok.Data;
9import lombok.EqualsAndHashCode;
10import lombok.Getter;
11import lombok.Setter;
12
13import java.io.BufferedReader;
14import java.io.IOException;
15import java.io.InputStream;
16import java.io.InputStreamReader;
17import java.net.http.HttpClient;
18import java.net.http.HttpRequest;
19import java.net.http.HttpResponse;
20import java.nio.charset.StandardCharsets;
21import java.time.Duration;
22
23@Data
24@EqualsAndHashCode(callSuper = true)
25@SuppressWarnings("unused")
26public class OllamaAsyncResultStreamer extends Thread {
27 private final HttpRequest.Builder requestBuilder;
28 private final OllamaGenerateRequest ollamaRequestModel;
29 private final OllamaResultStream thinkingResponseStream = new OllamaResultStream();
30 private final OllamaResultStream responseStream = new OllamaResultStream();
31 private String completeResponse;
32 private String completeThinkingResponse;
33
34
40 @Getter
41 private boolean succeeded;
42
43 @Setter
44 private long requestTimeoutSeconds;
45
50 @Getter
51 private int httpStatusCode;
52
56 @Getter
57 private long responseTime = 0;
58
59 public OllamaAsyncResultStreamer(HttpRequest.Builder requestBuilder, OllamaGenerateRequest ollamaRequestModel, long requestTimeoutSeconds) {
60 this.requestBuilder = requestBuilder;
61 this.ollamaRequestModel = ollamaRequestModel;
62 this.completeResponse = "";
63 this.responseStream.add("");
64 this.requestTimeoutSeconds = requestTimeoutSeconds;
65 }
66
67 @Override
68 public void run() {
69 ollamaRequestModel.setStream(true);
70 HttpClient httpClient = HttpClient.newHttpClient();
71 long startTime = System.currentTimeMillis();
72 try {
73 HttpRequest request = requestBuilder.POST(HttpRequest.BodyPublishers.ofString(Utils.getObjectMapper().writeValueAsString(ollamaRequestModel))).header(Constants.HttpConstants.HEADER_KEY_CONTENT_TYPE, Constants.HttpConstants.APPLICATION_JSON).timeout(Duration.ofSeconds(requestTimeoutSeconds)).build();
74 HttpResponse<InputStream> response = httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());
75 int statusCode = response.statusCode();
76 this.httpStatusCode = statusCode;
77
78 InputStream responseBodyStream = response.body();
79 BufferedReader reader = null;
80 try {
81 reader = new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8));
82 String line;
83 StringBuilder thinkingBuffer = new StringBuilder();
84 StringBuilder responseBuffer = new StringBuilder();
85 while ((line = reader.readLine()) != null) {
86 if (statusCode == 404) {
87 OllamaErrorResponse ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaErrorResponse.class);
88 responseStream.add(ollamaResponseModel.getError());
89 responseBuffer.append(ollamaResponseModel.getError());
90 } else {
91 OllamaGenerateResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaGenerateResponseModel.class);
92 String thinkingTokens = ollamaResponseModel.getThinking();
93 String responseTokens = ollamaResponseModel.getResponse();
94 if (thinkingTokens == null) {
95 thinkingTokens = "";
96 }
97 if (responseTokens == null) {
98 responseTokens = "";
99 }
100 thinkingResponseStream.add(thinkingTokens);
101 responseStream.add(responseTokens);
102 if (!ollamaResponseModel.isDone()) {
103 responseBuffer.append(responseTokens);
104 thinkingBuffer.append(thinkingTokens);
105 }
106 }
107 }
108 this.succeeded = true;
109 this.completeThinkingResponse = thinkingBuffer.toString();
110 this.completeResponse = responseBuffer.toString();
111 long endTime = System.currentTimeMillis();
112 responseTime = endTime - startTime;
113 } finally {
114 if (reader != null) {
115 try {
116 reader.close();
117 } catch (IOException e) {
118 // Optionally log or handle
119 }
120 }
121 if (responseBodyStream != null) {
122 try {
123 responseBodyStream.close();
124 } catch (IOException e) {
125 // Optionally log or handle
126 }
127 }
128 }
129 if (statusCode != 200) {
130 throw new OllamaBaseException(this.completeResponse);
131 }
132 } catch (IOException | InterruptedException | OllamaBaseException e) {
133 this.succeeded = false;
134 this.completeResponse = "[FAILED] " + e.getMessage();
135 }
136 }
137
138}
OllamaAsyncResultStreamer(HttpRequest.Builder requestBuilder, OllamaGenerateRequest ollamaRequestModel, long requestTimeoutSeconds)
static ObjectMapper getObjectMapper()
Definition Utils.java:19