Ollama4j
A Java library (wrapper/binding) for Ollama server.
Loading...
Searching...
No Matches
OllamaAsyncResultStreamer.java
Go to the documentation of this file.
1/*
2 * Ollama4j - Java library for interacting with Ollama server.
3 * Copyright (c) 2025 Amith Koujalgi and contributors.
4 *
5 * Licensed under the MIT License (the "License");
6 * you may not use this file except in compliance with the License.
7 *
8*/
9package io.github.ollama4j.models.response;
10
11import io.github.ollama4j.exceptions.OllamaException;
12import io.github.ollama4j.models.generate.OllamaGenerateRequest;
13import io.github.ollama4j.models.generate.OllamaGenerateResponseModel;
14import io.github.ollama4j.utils.Constants;
15import io.github.ollama4j.utils.Utils;
16import java.io.BufferedReader;
17import java.io.IOException;
18import java.io.InputStream;
19import java.io.InputStreamReader;
20import java.net.http.HttpClient;
21import java.net.http.HttpRequest;
22import java.net.http.HttpResponse;
23import java.nio.charset.StandardCharsets;
24import java.time.Duration;
25import lombok.Data;
26import lombok.EqualsAndHashCode;
27import lombok.Getter;
28import lombok.Setter;
29
30@Data
31@EqualsAndHashCode(callSuper = true)
32@SuppressWarnings("unused")
33public class OllamaAsyncResultStreamer extends Thread {
34 private final HttpRequest.Builder requestBuilder;
35 private final OllamaGenerateRequest ollamaRequestModel;
36 private final OllamaResultStream thinkingResponseStream = new OllamaResultStream();
37 private final OllamaResultStream responseStream = new OllamaResultStream();
38 private String completeResponse;
39 private String completeThinkingResponse;
40
46 @Getter private boolean succeeded;
47
48 @Setter private long requestTimeoutSeconds;
49
54 @Getter private int httpStatusCode;
55
59 @Getter private long responseTime = 0;
60
62 HttpRequest.Builder requestBuilder,
63 OllamaGenerateRequest ollamaRequestModel,
64 long requestTimeoutSeconds) {
65 this.requestBuilder = requestBuilder;
66 this.ollamaRequestModel = ollamaRequestModel;
67 this.completeResponse = "";
68 this.responseStream.add("");
69 this.requestTimeoutSeconds = requestTimeoutSeconds;
70 }
71
72 @Override
73 public void run() {
74 ollamaRequestModel.setStream(true);
75 HttpClient httpClient = HttpClient.newHttpClient();
76 long startTime = System.currentTimeMillis();
77 try {
78 HttpRequest request =
79 requestBuilder
80 .POST(
81 HttpRequest.BodyPublishers.ofString(
83 .writeValueAsString(ollamaRequestModel)))
84 .header(
85 Constants.HttpConstants.HEADER_KEY_CONTENT_TYPE,
86 Constants.HttpConstants.APPLICATION_JSON)
87 .timeout(Duration.ofSeconds(requestTimeoutSeconds))
88 .build();
89 HttpResponse<InputStream> response =
90 httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());
91 int statusCode = response.statusCode();
92 this.httpStatusCode = statusCode;
93
94 InputStream responseBodyStream = response.body();
95 BufferedReader reader = null;
96 try {
97 reader =
98 new BufferedReader(
99 new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8));
100 String line;
101 StringBuilder thinkingBuffer = new StringBuilder();
102 StringBuilder responseBuffer = new StringBuilder();
103 while ((line = reader.readLine()) != null) {
104 if (statusCode == 404) {
105 OllamaErrorResponse ollamaResponseModel =
106 Utils.getObjectMapper().readValue(line, OllamaErrorResponse.class);
107 responseStream.add(ollamaResponseModel.getError());
108 responseBuffer.append(ollamaResponseModel.getError());
109 } else {
110 OllamaGenerateResponseModel ollamaResponseModel =
112 .readValue(line, OllamaGenerateResponseModel.class);
113 String thinkingTokens = ollamaResponseModel.getThinking();
114 String responseTokens = ollamaResponseModel.getResponse();
115 if (thinkingTokens == null) {
116 thinkingTokens = "";
117 }
118 if (responseTokens == null) {
119 responseTokens = "";
120 }
121 thinkingResponseStream.add(thinkingTokens);
122 responseStream.add(responseTokens);
123 if (!ollamaResponseModel.isDone()) {
124 responseBuffer.append(responseTokens);
125 thinkingBuffer.append(thinkingTokens);
126 }
127 }
128 }
129 this.succeeded = true;
130 this.completeThinkingResponse = thinkingBuffer.toString();
131 this.completeResponse = responseBuffer.toString();
132 long endTime = System.currentTimeMillis();
133 responseTime = endTime - startTime;
134 } finally {
135 if (reader != null) {
136 try {
137 reader.close();
138 } catch (IOException e) {
139 /* do nothing */
140 }
141 }
142 if (responseBodyStream != null) {
143 try {
144 responseBodyStream.close();
145 } catch (IOException e) {
146 /* do nothing */
147 }
148 }
149 }
150 if (statusCode != 200) {
151 throw new OllamaException(this.completeResponse);
152 }
153 } catch (InterruptedException e) {
154 Thread.currentThread().interrupt();
155 this.succeeded = false;
156 this.completeResponse = "[FAILED] " + e.getMessage();
157 } catch (IOException | OllamaException e) {
158 this.succeeded = false;
159 this.completeResponse = "[FAILED] " + e.getMessage();
160 }
161 }
162}
OllamaAsyncResultStreamer(HttpRequest.Builder requestBuilder, OllamaGenerateRequest ollamaRequestModel, long requestTimeoutSeconds)
static ObjectMapper getObjectMapper()
Definition Utils.java:32