Ollama4j
A Java library (wrapper/binding) for Ollama server.
Loading...
Searching...
No Matches
OllamaGenerateEndpointCaller.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.request;
10
11import com.fasterxml.jackson.core.JsonProcessingException;
12import io.github.ollama4j.exceptions.OllamaException;
13import io.github.ollama4j.models.generate.OllamaGenerateResponseModel;
14import io.github.ollama4j.models.generate.OllamaGenerateStreamObserver;
15import io.github.ollama4j.models.generate.OllamaGenerateTokenHandler;
16import io.github.ollama4j.models.response.OllamaErrorResponse;
17import io.github.ollama4j.models.response.OllamaResult;
18import io.github.ollama4j.utils.OllamaRequestBody;
19import io.github.ollama4j.utils.Utils;
20import java.io.BufferedReader;
21import java.io.IOException;
22import java.io.InputStream;
23import java.io.InputStreamReader;
24import java.net.URI;
25import java.net.http.HttpClient;
26import java.net.http.HttpRequest;
27import java.net.http.HttpResponse;
28import java.nio.charset.StandardCharsets;
29import org.slf4j.Logger;
30import org.slf4j.LoggerFactory;
31
32@SuppressWarnings("resource")
34
35 private static final Logger LOG = LoggerFactory.getLogger(OllamaGenerateEndpointCaller.class);
36 public static final String endpoint = "/api/generate";
37
38 private OllamaGenerateStreamObserver responseStreamObserver;
39
40 public OllamaGenerateEndpointCaller(String host, Auth basicAuth, long requestTimeoutSeconds) {
41 super(host, basicAuth, requestTimeoutSeconds);
42 }
43
44 @Override
45 protected boolean parseResponseAndAddToBuffer(
46 String line, StringBuilder responseBuffer, StringBuilder thinkingBuffer) {
47 try {
48 OllamaGenerateResponseModel ollamaResponseModel =
49 Utils.getObjectMapper().readValue(line, OllamaGenerateResponseModel.class);
50 if (ollamaResponseModel.getResponse() != null) {
51 responseBuffer.append(ollamaResponseModel.getResponse());
52 }
53 if (ollamaResponseModel.getThinking() != null) {
54 thinkingBuffer.append(ollamaResponseModel.getThinking());
55 }
56 if (responseStreamObserver != null) {
57 responseStreamObserver.notify(ollamaResponseModel);
58 }
59 return ollamaResponseModel.isDone();
60 } catch (JsonProcessingException e) {
61 LOG.error("Error parsing the Ollama chat response!", e);
62 return true;
63 }
64 }
65
68 OllamaGenerateTokenHandler thinkingStreamHandler,
69 OllamaGenerateTokenHandler responseStreamHandler)
70 throws OllamaException, IOException, InterruptedException {
71 responseStreamObserver =
72 new OllamaGenerateStreamObserver(thinkingStreamHandler, responseStreamHandler);
73 return callSync(body);
74 }
75
86 @SuppressWarnings("DuplicatedCode")
87 public OllamaResult callSync(OllamaRequestBody body)
88 throws OllamaException, IOException, InterruptedException {
89 long startTime = System.currentTimeMillis();
90 HttpClient httpClient = HttpClient.newHttpClient();
91 URI uri = URI.create(getHost() + endpoint);
92 HttpRequest.Builder requestBuilder =
93 getRequestBuilderDefault(uri).POST(body.getBodyPublisher());
94 HttpRequest request = requestBuilder.build();
95 LOG.debug("Asking model: {}", body);
96 HttpResponse<InputStream> response =
97 httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());
98
99 int statusCode = response.statusCode();
100 InputStream responseBodyStream = response.body();
101 StringBuilder responseBuffer = new StringBuilder();
102 StringBuilder thinkingBuffer = new StringBuilder();
103 OllamaGenerateResponseModel ollamaGenerateResponseModel = null;
104 try (BufferedReader reader =
105 new BufferedReader(
106 new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
107 String line;
108 while ((line = reader.readLine()) != null) {
109 if (statusCode >= 400) {
110 LOG.warn("Error code: {}", statusCode);
111 OllamaErrorResponse ollamaResponseModel =
112 Utils.getObjectMapper().readValue(line, OllamaErrorResponse.class);
113 responseBuffer.append(ollamaResponseModel.getError());
114 } else {
115 boolean finished =
116 parseResponseAndAddToBuffer(line, responseBuffer, thinkingBuffer);
117 if (finished) {
118 ollamaGenerateResponseModel =
120 .readValue(line, OllamaGenerateResponseModel.class);
121 break;
122 }
123 }
124 }
125 }
126
127 if (statusCode != 200) {
128 LOG.error("Status code: {}", statusCode);
129 LOG.error("Response: {}", responseBuffer);
130 throw new OllamaException(responseBuffer.toString());
131 } else {
132 long endTime = System.currentTimeMillis();
133 OllamaResult ollamaResult =
134 new OllamaResult(
135 responseBuffer.toString(),
136 thinkingBuffer.toString(),
137 endTime - startTime,
138 statusCode);
139 ollamaResult.setModel(ollamaGenerateResponseModel.getModel());
140 ollamaResult.setCreatedAt(ollamaGenerateResponseModel.getCreatedAt());
141 ollamaResult.setDone(ollamaGenerateResponseModel.isDone());
142 ollamaResult.setDoneReason(ollamaGenerateResponseModel.getDoneReason());
143 ollamaResult.setContext(ollamaGenerateResponseModel.getContext());
144 ollamaResult.setTotalDuration(ollamaGenerateResponseModel.getTotalDuration());
145 ollamaResult.setLoadDuration(ollamaGenerateResponseModel.getLoadDuration());
146 ollamaResult.setPromptEvalCount(ollamaGenerateResponseModel.getPromptEvalCount());
147 ollamaResult.setPromptEvalDuration(ollamaGenerateResponseModel.getPromptEvalDuration());
148 ollamaResult.setEvalCount(ollamaGenerateResponseModel.getEvalCount());
149 ollamaResult.setEvalDuration(ollamaGenerateResponseModel.getEvalDuration());
150
151 LOG.debug("Model response: {}", ollamaResult);
152 return ollamaResult;
153 }
154 }
155}
void notify(OllamaGenerateResponseModel currentResponsePart)
OllamaGenerateEndpointCaller(String host, Auth basicAuth, long requestTimeoutSeconds)
OllamaResult call(OllamaRequestBody body, OllamaGenerateTokenHandler thinkingStreamHandler, OllamaGenerateTokenHandler responseStreamHandler)
boolean parseResponseAndAddToBuffer(String line, StringBuilder responseBuffer, StringBuilder thinkingBuffer)
static ObjectMapper getObjectMapper()
Definition Utils.java:32