1package io.github.ollama4j;
3import com.fasterxml.jackson.core.JsonParseException;
4import com.fasterxml.jackson.databind.JsonNode;
5import com.fasterxml.jackson.databind.ObjectMapper;
6import io.github.ollama4j.exceptions.OllamaBaseException;
7import io.github.ollama4j.exceptions.RoleNotFoundException;
8import io.github.ollama4j.exceptions.ToolInvocationException;
9import io.github.ollama4j.exceptions.ToolNotFoundException;
10import io.github.ollama4j.models.chat.*;
11import io.github.ollama4j.models.embeddings.OllamaEmbedRequestModel;
12import io.github.ollama4j.models.embeddings.OllamaEmbedResponseModel;
13import io.github.ollama4j.models.embeddings.OllamaEmbeddingResponseModel;
14import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
15import io.github.ollama4j.models.generate.OllamaGenerateRequest;
16import io.github.ollama4j.models.generate.OllamaStreamHandler;
17import io.github.ollama4j.models.generate.OllamaTokenHandler;
18import io.github.ollama4j.models.ps.ModelsProcessResponse;
19import io.github.ollama4j.models.request.*;
20import io.github.ollama4j.models.response.*;
21import io.github.ollama4j.tools.*;
22import io.github.ollama4j.tools.annotations.OllamaToolService;
23import io.github.ollama4j.tools.annotations.ToolProperty;
24import io.github.ollama4j.tools.annotations.ToolSpec;
25import io.github.ollama4j.utils.Options;
26import io.github.ollama4j.utils.Utils;
28import org.jsoup.Jsoup;
29import org.jsoup.nodes.Document;
30import org.jsoup.nodes.Element;
31import org.jsoup.select.Elements;
32import org.slf4j.Logger;
33import org.slf4j.LoggerFactory;
36import java.lang.reflect.InvocationTargetException;
37import java.lang.reflect.Method;
38import java.lang.reflect.Parameter;
40import java.net.URISyntaxException;
41import java.net.http.HttpClient;
42import java.net.http.HttpConnectTimeoutException;
43import java.net.http.HttpRequest;
44import java.net.http.HttpResponse;
45import java.nio.charset.StandardCharsets;
46import java.nio.file.Files;
47import java.time.Duration;
49import java.util.stream.Collectors;
54@SuppressWarnings({
"DuplicatedCode",
"resource" })
57 private static final Logger logger = LoggerFactory.getLogger(
OllamaAPI.class);
58 private final String host;
64 private long requestTimeoutSeconds = 10;
70 private boolean verbose =
true;
73 private int maxChatToolCallRetries = 3;
77 private int numberOfRetriesForModelPull = 0;
80 this.numberOfRetriesForModelPull = numberOfRetriesForModelPull;
90 this.host =
"http://localhost:11434";
99 if (host.endsWith(
"/")) {
100 this.host = host.substring(0, host.length() - 1);
105 logger.info(
"Ollama API initialized with host: " + this.host);
117 this.auth =
new BasicAuth(username, password);
136 String url = this.host +
"/api/tags";
137 HttpClient httpClient = HttpClient.newHttpClient();
138 HttpRequest httpRequest =
null;
140 httpRequest = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
141 .header(
"Content-type",
"application/json").GET().build();
142 }
catch (URISyntaxException e) {
143 throw new RuntimeException(e);
145 HttpResponse<String>
response =
null;
147 response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
148 }
catch (HttpConnectTimeoutException e) {
150 }
catch (IOException | InterruptedException e) {
151 throw new RuntimeException(e);
153 int statusCode =
response.statusCode();
154 return statusCode == 200;
167 String url = this.host +
"/api/ps";
168 HttpClient httpClient = HttpClient.newHttpClient();
169 HttpRequest httpRequest =
null;
171 httpRequest = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
172 .header(
"Content-type",
"application/json").GET().build();
173 }
catch (URISyntaxException e) {
174 throw new RuntimeException(e);
176 HttpResponse<String>
response =
null;
177 response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
178 int statusCode =
response.statusCode();
179 String responseString =
response.body();
180 if (statusCode == 200) {
197 String url = this.host +
"/api/tags";
198 HttpClient httpClient = HttpClient.newHttpClient();
199 HttpRequest httpRequest = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
200 .header(
"Content-type",
"application/json").GET().build();
201 HttpResponse<String>
response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
202 int statusCode =
response.statusCode();
203 String responseString =
response.body();
204 if (statusCode == 200) {
230 String url =
"https://ollama.com/library";
231 HttpClient httpClient = HttpClient.newHttpClient();
232 HttpRequest httpRequest = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
233 .header(
"Content-type",
"application/json").GET().build();
234 HttpResponse<String>
response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
235 int statusCode =
response.statusCode();
236 String responseString =
response.body();
237 List<LibraryModel> models =
new ArrayList<>();
238 if (statusCode == 200) {
239 Document doc = Jsoup.parse(responseString);
240 Elements modelSections = doc.selectXpath(
"//*[@id='repo']/ul/li/a");
241 for (Element e : modelSections) {
243 Elements names = e.select(
"div > h2 > div > span");
244 Elements desc = e.select(
"div > p");
245 Elements pullCounts = e.select(
"div:nth-of-type(2) > p > span:first-of-type > span:first-of-type");
246 Elements popularTags = e.select(
"div > div > span");
247 Elements totalTags = e.select(
"div:nth-of-type(2) > p > span:nth-of-type(2) > span:first-of-type");
248 Elements lastUpdatedTime = e
249 .select(
"div:nth-of-type(2) > p > span:nth-of-type(3) > span:nth-of-type(2)");
251 if (names.first() ==
null || names.isEmpty()) {
255 Optional.ofNullable(names.first()).map(Element::text).ifPresent(model::setName);
256 model.setDescription(Optional.ofNullable(desc.first()).map(Element::text).orElse(
""));
257 model.setPopularTags(Optional.of(popularTags)
258 .map(tags -> tags.stream().map(Element::text).collect(Collectors.toList()))
259 .orElse(
new ArrayList<>()));
260 model.setPullCount(Optional.ofNullable(pullCounts.first()).map(Element::text).orElse(
""));
262 Optional.ofNullable(totalTags.first()).map(Element::text).map(Integer::parseInt).orElse(0));
263 model.setLastUpdated(Optional.ofNullable(lastUpdatedTime.first()).map(Element::text).orElse(
""));
297 String url = String.format(
"https://ollama.com/library/%s/tags", libraryModel.getName());
298 HttpClient httpClient = HttpClient.newHttpClient();
299 HttpRequest httpRequest = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
300 .header(
"Content-type",
"application/json").GET().build();
301 HttpResponse<String>
response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
302 int statusCode =
response.statusCode();
303 String responseString =
response.body();
305 List<LibraryModelTag> libraryModelTags =
new ArrayList<>();
306 if (statusCode == 200) {
307 Document doc = Jsoup.parse(responseString);
308 Elements tagSections = doc
309 .select(
"html > body > main > div > section > div > div > div:nth-child(n+2) > div");
310 for (Element e : tagSections) {
311 Elements tags = e.select(
"div > a > div");
312 Elements tagsMetas = e.select(
"div > span");
316 if (tags.first() ==
null || tags.isEmpty()) {
320 libraryModelTag.setName(libraryModel.getName());
321 Optional.ofNullable(tags.first()).map(Element::text).ifPresent(libraryModelTag::setTag);
322 libraryModelTag.setSize(Optional.ofNullable(tagsMetas.first()).map(element -> element.text().split(
"•"))
323 .filter(parts -> parts.length > 1).map(parts -> parts[1].trim()).orElse(
""));
325 .setLastUpdated(Optional.ofNullable(tagsMetas.first()).map(element -> element.text().split(
"•"))
326 .filter(parts -> parts.length > 1).map(parts -> parts[2].trim()).orElse(
""));
327 libraryModelTags.add(libraryModelTag);
330 libraryModelDetail.setModel(libraryModel);
331 libraryModelDetail.setTags(libraryModelTags);
332 return libraryModelDetail;
362 LibraryModel libraryModel = libraryModels.stream().filter(model -> model.getName().equals(modelName))
363 .findFirst().orElseThrow(
364 () ->
new NoSuchElementException(String.format(
"Model by name '%s' not found", modelName)));
366 LibraryModelTag libraryModelTag = libraryModelDetail.getTags().stream()
367 .filter(tagName -> tagName.getTag().equals(tag)).findFirst()
368 .orElseThrow(() ->
new NoSuchElementException(
369 String.format(
"Tag '%s' for model '%s' not found", tag, modelName)));
370 return libraryModelTag;
385 if (numberOfRetriesForModelPull == 0) {
386 this.doPullModel(modelName);
388 int numberOfRetries = 0;
389 while (numberOfRetries < numberOfRetriesForModelPull) {
391 this.doPullModel(modelName);
394 logger.error(
"Failed to pull model " + modelName +
", retrying...");
399 "Failed to pull model " + modelName +
" after " + numberOfRetriesForModelPull +
" retries");
403 private void doPullModel(String modelName)
405 String url = this.host +
"/api/pull";
407 HttpRequest request = getRequestBuilderDefault(
new URI(url))
408 .POST(HttpRequest.BodyPublishers.ofString(jsonData))
409 .header(
"Accept",
"application/json")
410 .header(
"Content-type",
"application/json")
412 HttpClient client = HttpClient.newHttpClient();
413 HttpResponse<InputStream> response = client.send(request, HttpResponse.BodyHandlers.ofInputStream());
414 int statusCode = response.statusCode();
415 InputStream responseBodyStream = response.body();
416 String responseString =
"";
417 boolean success =
false;
418 try (BufferedReader reader =
new BufferedReader(
419 new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
421 while ((line = reader.readLine()) !=
null) {
423 if (modelPullResponse !=
null && modelPullResponse.getStatus() !=
null) {
425 logger.info(modelName +
": " + modelPullResponse.getStatus());
428 if (
"success".equalsIgnoreCase(modelPullResponse.getStatus())) {
432 logger.error(
"Received null or invalid status for model pull.");
437 logger.error(
"Model pull failed or returned invalid status.");
440 if (statusCode != 200) {
446 String url = this.host +
"/api/version";
447 HttpClient httpClient = HttpClient.newHttpClient();
448 HttpRequest httpRequest = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
449 .header(
"Content-type",
"application/json").GET().build();
450 HttpResponse<String>
response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
451 int statusCode =
response.statusCode();
452 String responseString =
response.body();
453 if (statusCode == 200) {
476 String tagToPull = String.format(
"%s:%s", libraryModelTag.getName(), libraryModelTag.getTag());
492 String url = this.host +
"/api/show";
494 HttpRequest
request = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
495 .header(
"Content-type",
"application/json").POST(HttpRequest.BodyPublishers.ofString(jsonData)).build();
496 HttpClient client = HttpClient.newHttpClient();
497 HttpResponse<String>
response = client.send(
request, HttpResponse.BodyHandlers.ofString());
498 int statusCode =
response.statusCode();
499 String responseBody =
response.body();
500 if (statusCode == 200) {
523 String url = this.host +
"/api/create";
525 HttpRequest
request = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
526 .header(
"Content-Type",
"application/json")
527 .POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8)).build();
528 HttpClient client = HttpClient.newHttpClient();
529 HttpResponse<String>
response = client.send(
request, HttpResponse.BodyHandlers.ofString());
530 int statusCode =
response.statusCode();
531 String responseString =
response.body();
532 if (statusCode != 200) {
538 if (responseString.contains(
"error")) {
542 logger.info(responseString);
563 String url = this.host +
"/api/create";
565 HttpRequest
request = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
566 .header(
"Content-Type",
"application/json")
567 .POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8)).build();
568 HttpClient client = HttpClient.newHttpClient();
569 HttpResponse<String>
response = client.send(
request, HttpResponse.BodyHandlers.ofString());
570 int statusCode =
response.statusCode();
571 String responseString =
response.body();
572 if (statusCode != 200) {
575 if (responseString.contains(
"error")) {
579 logger.info(responseString);
596 String url = this.host +
"/api/create";
597 String jsonData = customModelRequest.toString();
598 HttpRequest
request = getRequestBuilderDefault(
new URI(url)).header(
"Accept",
"application/json")
599 .header(
"Content-Type",
"application/json")
600 .POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8)).build();
601 HttpClient client = HttpClient.newHttpClient();
602 HttpResponse<String>
response = client.send(
request, HttpResponse.BodyHandlers.ofString());
603 int statusCode =
response.statusCode();
604 String responseString =
response.body();
605 if (statusCode != 200) {
608 if (responseString.contains(
"error")) {
612 logger.info(responseString);
627 public void deleteModel(String modelName,
boolean ignoreIfNotPresent)
629 String url = this.host +
"/api/delete";
631 HttpRequest
request = getRequestBuilderDefault(
new URI(url))
632 .method(
"DELETE", HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
633 .header(
"Accept",
"application/json").header(
"Content-type",
"application/json").build();
634 HttpClient client = HttpClient.newHttpClient();
635 HttpResponse<String>
response = client.send(
request, HttpResponse.BodyHandlers.ofString());
636 int statusCode =
response.statusCode();
637 String responseBody =
response.body();
638 if (statusCode == 404 && responseBody.contains(
"model") && responseBody.contains(
"not found")) {
641 if (statusCode != 200) {
676 URI uri = URI.create(this.host +
"/api/embeddings");
677 String jsonData = modelRequest.toString();
678 HttpClient httpClient = HttpClient.newHttpClient();
679 HttpRequest.Builder requestBuilder = getRequestBuilderDefault(uri).header(
"Accept",
"application/json")
680 .POST(HttpRequest.BodyPublishers.ofString(jsonData));
681 HttpRequest
request = requestBuilder.build();
682 HttpResponse<String>
response = httpClient.send(
request, HttpResponse.BodyHandlers.ofString());
683 int statusCode =
response.statusCode();
684 String responseBody =
response.body();
685 if (statusCode == 200) {
688 return embeddingResponse.getEmbedding();
720 URI uri = URI.create(this.host +
"/api/embed");
722 HttpClient httpClient = HttpClient.newHttpClient();
724 HttpRequest
request = HttpRequest.newBuilder(uri).header(
"Accept",
"application/json")
725 .POST(HttpRequest.BodyPublishers.ofString(jsonData)).build();
727 HttpResponse<String>
response = httpClient.send(
request, HttpResponse.BodyHandlers.ofString());
728 int statusCode =
response.statusCode();
729 String responseBody =
response.body();
731 if (statusCode == 200) {
760 ollamaRequestModel.setRaw(raw);
761 ollamaRequestModel.setOptions(options.getOptionsMap());
762 return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler);
781 URI uri = URI.create(this.host +
"/api/generate");
783 Map<String, Object> requestBody =
new HashMap<>();
784 requestBody.put(
"model", model);
785 requestBody.put(
"prompt", prompt);
786 requestBody.put(
"stream",
false);
787 requestBody.put(
"format", format);
790 HttpClient httpClient = HttpClient.newHttpClient();
792 HttpRequest
request = HttpRequest.newBuilder(uri)
793 .header(
"Content-Type",
"application/json")
794 .POST(HttpRequest.BodyPublishers.ofString(jsonData))
797 HttpResponse<String>
response = httpClient.send(
request, HttpResponse.BodyHandlers.ofString());
798 int statusCode =
response.statusCode();
799 String responseBody =
response.body();
801 if (statusCode == 200) {
805 structuredResult.getResponseTime(), statusCode);
834 return generate(model, prompt, raw, options,
null);
858 Map<ToolFunctionCallSpec, Object> toolResults =
new HashMap<>();
860 if (!prompt.startsWith(
"[AVAILABLE_TOOLS]")) {
863 promptBuilder.withToolSpecification(spec);
865 promptBuilder.withPrompt(prompt);
866 prompt = promptBuilder.build();
870 toolResult.setModelResult(result);
872 String toolsResponse = result.getResponse();
873 if (toolsResponse.contains(
"[TOOL_CALLS]")) {
874 toolsResponse = toolsResponse.replace(
"[TOOL_CALLS]",
"");
877 List<ToolFunctionCallSpec> toolFunctionCallSpecs =
new ArrayList<>();
880 if (!toolsResponse.isEmpty()) {
883 JsonNode jsonNode = objectMapper.readTree(toolsResponse);
884 }
catch (JsonParseException e) {
885 logger.warn(
"Response from model does not contain any tool calls. Returning the response as is.");
888 toolFunctionCallSpecs = objectMapper.readValue(
893 toolResults.put(toolFunctionCallSpec, invokeTool(toolFunctionCallSpec));
895 toolResult.setToolResults(toolResults);
912 ollamaRequestModel.setRaw(raw);
913 URI uri = URI.create(this.host +
"/api/generate");
915 getRequestBuilderDefault(uri), ollamaRequestModel, requestTimeoutSeconds);
916 ollamaAsyncResultStreamer.start();
917 return ollamaAsyncResultStreamer;
942 List<String> images =
new ArrayList<>();
943 for (File imageFile : imageFiles) {
944 images.add(encodeFileToBase64(imageFile));
947 ollamaRequestModel.setOptions(options.getOptionsMap());
948 return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler);
990 List<String> images =
new ArrayList<>();
991 for (String imageURL : imageURLs) {
995 ollamaRequestModel.setOptions(options.getOptionsMap());
996 return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler);
1031 List<String> encodedImages =
new ArrayList<>();
1032 for (
byte[] image : images) {
1033 encodedImages.add(encodeByteArrayToBase64(image));
1036 ollamaRequestModel.setOptions(options.getOptionsMap());
1037 return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler);
1150 request.setTools(toolRegistry.getRegisteredSpecs().stream().map(
Tools.ToolSpecification::getToolPrompt)
1151 .collect(Collectors.toList()));
1153 if (tokenHandler !=
null) {
1155 result = requestCaller.
call(
request, tokenHandler);
1161 List<OllamaChatToolCalls> toolCalls = result.getResponseModel().getMessage().getToolCalls();
1162 int toolCallTries = 0;
1163 while (toolCalls !=
null && !toolCalls.isEmpty() && toolCallTries < maxChatToolCallRetries) {
1165 String toolName = toolCall.getFunction().getName();
1166 ToolFunction toolFunction = toolRegistry.getToolFunction(toolName);
1167 if (toolFunction ==
null) {
1170 Map<String, Object> arguments = toolCall.getFunction().getArguments();
1171 Object res = toolFunction.
apply(arguments);
1173 "[TOOL_RESULTS]" + toolName +
"(" + arguments.keySet() +
") : " + res +
"[/TOOL_RESULTS]"));
1176 if (tokenHandler !=
null) {
1177 result = requestCaller.
call(
request, tokenHandler);
1181 toolCalls = result.getResponseModel().getMessage().getToolCalls();
1197 toolRegistry.addTool(toolSpecification.getFunctionName(), toolSpecification);
1199 logger.debug(
"Registered tool: {}", toolSpecification.getFunctionName());
1215 toolRegistry.addTool(toolSpecification.getFunctionName(), toolSpecification);
1233 Class<?> callerClass =
null;
1235 callerClass = Class.forName(Thread.currentThread().getStackTrace()[2].getClassName());
1236 }
catch (ClassNotFoundException e) {
1237 throw new RuntimeException(e);
1241 if (ollamaToolServiceAnnotation ==
null) {
1242 throw new IllegalStateException(callerClass +
" is not annotated as " +
OllamaToolService.class);
1245 Class<?>[] providers = ollamaToolServiceAnnotation.
providers();
1246 for (Class<?> provider : providers) {
1249 }
catch (InstantiationException | NoSuchMethodException | IllegalAccessException
1250 | InvocationTargetException e) {
1251 throw new RuntimeException(e);
1269 Class<?> objectClass =
object.getClass();
1270 Method[] methods = objectClass.getMethods();
1271 for (Method m : methods) {
1273 if (toolSpec ==
null) {
1276 String operationName = !toolSpec.
name().isBlank() ? toolSpec.
name() : m.getName();
1277 String operationDesc = !toolSpec.
desc().isBlank() ? toolSpec.
desc() : operationName;
1280 LinkedHashMap<String, String> methodParams =
new LinkedHashMap<>();
1281 for (Parameter parameter : m.getParameters()) {
1283 String propType = parameter.getType().getTypeName();
1284 if (toolPropertyAnn ==
null) {
1285 methodParams.put(parameter.getName(),
null);
1288 String propName = !toolPropertyAnn.
name().isBlank() ? toolPropertyAnn.
name() : parameter.getName();
1289 methodParams.put(propName, propType);
1291 .description(toolPropertyAnn.
desc()).required(toolPropertyAnn.
required()).build());
1294 List<String> reqProps = params.entrySet().stream().filter(e -> e.getValue().isRequired())
1295 .map(Map.Entry::getKey).collect(Collectors.toList());
1297 Tools.ToolSpecification toolSpecification =
Tools.
ToolSpecification.builder().functionName(operationName)
1298 .functionDescription(operationDesc)
1302 .builder().type(
"object").properties(params).required(reqProps).build())
1308 toolSpecification.setToolFunction(reflectionalToolFunction);
1309 toolRegistry.addTool(toolSpecification.getFunctionName(), toolSpecification);
1354 private static String encodeFileToBase64(File file)
throws IOException {
1355 return Base64.getEncoder().encodeToString(Files.readAllBytes(file.toPath()));
1364 private static String encodeByteArrayToBase64(
byte[] bytes) {
1365 return Base64.getEncoder().encodeToString(bytes);
1391 if (streamHandler !=
null) {
1392 ollamaRequestModel.setStream(
true);
1393 result = requestCaller.
call(ollamaRequestModel, streamHandler);
1395 result = requestCaller.
callSync(ollamaRequestModel);
1406 private HttpRequest.Builder getRequestBuilderDefault(URI uri) {
1407 HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).header(
"Content-Type",
"application/json")
1408 .timeout(Duration.ofSeconds(requestTimeoutSeconds));
1409 if (isBasicAuthCredentialsSet()) {
1412 return requestBuilder;
1420 private boolean isBasicAuthCredentialsSet() {
1421 return auth !=
null;
1426 String methodName = toolFunctionCallSpec.getName();
1427 Map<String, Object> arguments = toolFunctionCallSpec.getArguments();
1430 logger.debug(
"Invoking function {} with arguments {}", methodName, arguments);
1432 if (
function ==
null) {
1434 "No such tool: " + methodName +
". Please register the tool before invoking it.");
1436 return function.
apply(arguments);
1437 }
catch (Exception e) {
OllamaResult generateWithImageFiles(String model, String prompt, List< File > imageFiles, Options options, OllamaStreamHandler streamHandler)
OllamaChatResult chat(OllamaChatRequest request)
ModelDetail getModelDetails(String modelName)
List< Double > generateEmbeddings(OllamaEmbeddingsRequestModel modelRequest)
List< Model > listModels()
void setBearerAuth(String bearerToken)
OllamaResult generateWithImages(String model, String prompt, List< byte[]> images, Options options, OllamaStreamHandler streamHandler)
OllamaAsyncResultStreamer generateAsync(String model, String prompt, boolean raw)
OllamaResult generate(String model, String prompt, Map< String, Object > format)
OllamaChatResult chat(String model, List< OllamaChatMessage > messages)
List< Double > generateEmbeddings(String model, String prompt)
void pullModel(String modelName)
void setBasicAuth(String username, String password)
OllamaResult generate(String model, String prompt, boolean raw, Options options, OllamaStreamHandler streamHandler)
OllamaChatResult chat(OllamaChatRequest request, OllamaStreamHandler streamHandler)
void deleteModel(String modelName, boolean ignoreIfNotPresent)
void createModelWithFilePath(String modelName, String modelFilePath)
OllamaResult generate(String model, String prompt, boolean raw, Options options)
ModelsProcessResponse ps()
LibraryModelTag findModelTagFromLibrary(String modelName, String tag)
OllamaChatMessageRole getRole(String roleName)
OllamaChatMessageRole addCustomRole(String roleName)
void pullModel(LibraryModelTag libraryModelTag)
OllamaResult generateWithImages(String model, String prompt, List< byte[]> images, Options options)
List< OllamaChatMessageRole > listRoles()
LibraryModelDetail getLibraryModelDetails(LibraryModel libraryModel)
OllamaResult generateWithImageURLs(String model, String prompt, List< String > imageURLs, Options options, OllamaStreamHandler streamHandler)
OllamaEmbedResponseModel embed(OllamaEmbedRequestModel modelRequest)
void registerTool(Tools.ToolSpecification toolSpecification)
void setNumberOfRetriesForModelPull(int numberOfRetriesForModelPull)
void registerAnnotatedTools(Object object)
void registerAnnotatedTools()
List< LibraryModel > listModelsFromLibrary()
void registerTools(List< Tools.ToolSpecification > toolSpecifications)
OllamaChatResult chatStreaming(OllamaChatRequest request, OllamaTokenHandler tokenHandler)
OllamaToolsResult generateWithTools(String model, String prompt, Options options)
void createModel(CustomModelRequest customModelRequest)
OllamaResult generateWithImageURLs(String model, String prompt, List< String > imageURLs, Options options)
OllamaEmbedResponseModel embed(String model, List< String > inputs)
void createModelWithModelFileContents(String modelName, String modelFileContents)
OllamaResult generateWithImageFiles(String model, String prompt, List< File > imageFiles, Options options)
static List< OllamaChatMessageRole > getRoles()
static OllamaChatMessageRole newCustomRole(String roleName)
static OllamaChatMessageRole getRole(String roleName)
static final OllamaChatMessageRole TOOL
OllamaChatRequestBuilder withMessages(List< OllamaChatMessage > messages)
OllamaChatRequest build()
static OllamaChatRequestBuilder getInstance(String model)
abstract String getAuthHeaderValue()
OllamaChatResult call(OllamaChatRequest body, OllamaTokenHandler tokenHandler)
OllamaChatResult callSync(OllamaChatRequest body)
OllamaResult call(OllamaRequestBody body, OllamaStreamHandler streamHandler)
OllamaResult callSync(OllamaRequestBody body)
static byte[] loadImageBytesFromUrl(String imageUrl)
static ObjectMapper getObjectMapper()