mirror of
				https://github.com/amithkoujalgi/ollama4j.git
				synced 2025-11-04 02:20:50 +01:00 
			
		
		
		
	Compare commits
	
		
			54 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4a91918e84 | ||
| 
						 | 
					ff3344616c | ||
| 
						 | 
					726fea5b74 | ||
| 
						 | 
					a09f1362e9 | ||
| 
						 | 
					4ef0821932 | ||
| 
						 | 
					2d3cf228cb | ||
| 
						 | 
					5b3713c69e | ||
| 
						 | 
					e9486cbb8e | ||
| 
						 | 
					057f0babeb | ||
| 
						 | 
					da146640ca | ||
| 
						 | 
					82be761b86 | ||
| 
						 | 
					9c3fc49df1 | ||
| 
						 | 
					5f19eb17ac | ||
| 
						 | 
					ecb04d6d82 | ||
| 
						 | 
					3fc7e9423c | ||
| 
						 | 
					405a08b330 | ||
| 
						 | 
					921f745435 | ||
| 
						 | 
					bedfec6bf9 | ||
| 
						 | 
					afa09e87a5 | ||
| 
						 | 
					baf2320ea6 | ||
| 
						 | 
					948a7444fb | ||
| 
						 | 
					ec0eb8b469 | ||
| 
						 | 
					8f33de7e59 | ||
| 
						 | 
					8c59e6511b | ||
| 
						 | 
					b93fc7623a | ||
| 
						 | 
					bd1a57c7e0 | ||
| 
						 | 
					7fabead249 | ||
| 
						 | 
					268a973d5e | ||
| 
						 | 
					d949a3cb69 | ||
| 
						 | 
					e2443ed68a | ||
| 
						 | 
					37193b1f5b | ||
| 
						 | 
					e33071ae38 | ||
| 
						 | 
					fffc8dc526 | ||
| 
						 | 
					def950cc9c | ||
| 
						 | 
					f4db7ca326 | ||
| 
						 | 
					18760250ea | ||
| 
						 | 
					233597efd1 | ||
| 
						 | 
					cec9f29eb7 | ||
| 
						 | 
					20cb92a418 | ||
| 
						 | 
					b0dc38954b | ||
| 
						 | 
					1479d0a494 | ||
| 
						 | 
					b328daee43 | ||
| 
						 | 
					b90c8bc622 | ||
| 
						 | 
					660a1b937a | ||
| 
						 | 
					fd961d7037 | ||
| 
						 | 
					b48f9550c3 | ||
| 
						 | 
					363969a275 | ||
| 
						 | 
					992625cf86 | ||
| 
						 | 
					bbebd26d07 | ||
| 
						 | 
					3aa0fc77cb | ||
| 
						 | 
					11a98a72a1 | ||
| 
						 | 
					422601c0fc | ||
| 
						 | 
					75e6576a13 | ||
| 
						 | 
					51dd3f3e1e | 
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							@@ -11,9 +11,9 @@ doxygen:
 | 
				
			|||||||
	doxygen Doxyfile
 | 
						doxygen Doxyfile
 | 
				
			||||||
 | 
					
 | 
				
			||||||
list-releases:
 | 
					list-releases:
 | 
				
			||||||
	curl 'https://central.sonatype.com/api/internal/browse/component/versions?sortField=normalizedVersion&sortDirection=asc&page=0&size=12&filter=namespace%3Aio.github.amithkoujalgi%2Cname%3Aollama4j' \
 | 
						curl 'https://central.sonatype.com/api/internal/browse/component/versions?sortField=normalizedVersion&sortDirection=desc&page=0&size=20&filter=namespace%3Aio.github.ollama4j%2Cname%3Aollama4j' \
 | 
				
			||||||
      --compressed \
 | 
					      --compressed \
 | 
				
			||||||
      --silent | jq '.components[].version'
 | 
					      --silent | jq -r '.components[].version'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
build-docs:
 | 
					build-docs:
 | 
				
			||||||
	npm i --prefix docs && npm run build --prefix docs
 | 
						npm i --prefix docs && npm run build --prefix docs
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										58
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								README.md
									
									
									
									
									
								
							@@ -4,13 +4,11 @@
 | 
				
			|||||||
  <img src='https://raw.githubusercontent.com/ollama4j/ollama4j/65a9d526150da8fcd98e2af6a164f055572bf722/ollama4j.jpeg' width='100' alt="ollama4j-icon">
 | 
					  <img src='https://raw.githubusercontent.com/ollama4j/ollama4j/65a9d526150da8fcd98e2af6a164f055572bf722/ollama4j.jpeg' width='100' alt="ollama4j-icon">
 | 
				
			||||||
</p>
 | 
					</p>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div align="center">
 | 
				
			||||||
A Java library (wrapper/binding) for [Ollama](https://ollama.ai/) server.
 | 
					A Java library (wrapper/binding) for Ollama server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Find more details on the [website](https://ollama4j.github.io/ollama4j/).
 | 
					Find more details on the [website](https://ollama4j.github.io/ollama4j/).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div align="center">
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||

 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||

 | 
					
 | 
				
			||||||
@@ -155,7 +153,7 @@ In your Maven project, add this dependency:
 | 
				
			|||||||
<dependency>
 | 
					<dependency>
 | 
				
			||||||
    <groupId>io.github.ollama4j</groupId>
 | 
					    <groupId>io.github.ollama4j</groupId>
 | 
				
			||||||
    <artifactId>ollama4j</artifactId>
 | 
					    <artifactId>ollama4j</artifactId>
 | 
				
			||||||
    <version>1.0.79</version>
 | 
					    <version>1.0.89</version>
 | 
				
			||||||
</dependency>
 | 
					</dependency>
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -211,7 +209,7 @@ In your Maven project, add this dependency:
 | 
				
			|||||||
<dependency>
 | 
					<dependency>
 | 
				
			||||||
    <groupId>io.github.ollama4j</groupId>
 | 
					    <groupId>io.github.ollama4j</groupId>
 | 
				
			||||||
    <artifactId>ollama4j</artifactId>
 | 
					    <artifactId>ollama4j</artifactId>
 | 
				
			||||||
    <version>1.0.79</version>
 | 
					    <version>1.0.89</version>
 | 
				
			||||||
</dependency>
 | 
					</dependency>
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -221,7 +219,7 @@ In your Maven project, add this dependency:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```groovy
 | 
					```groovy
 | 
				
			||||||
dependencies {
 | 
					dependencies {
 | 
				
			||||||
    implementation 'com.github.ollama4j:ollama4j:1.0.79'
 | 
					    implementation 'io.github.ollama4j:ollama4j:1.0.79'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -268,23 +266,29 @@ make integration-tests
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Newer artifacts are published via GitHub Actions CI workflow when a new release is created from `main` branch.
 | 
					Newer artifacts are published via GitHub Actions CI workflow when a new release is created from `main` branch.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Who's using Ollama4j?
 | 
					## ⭐ Give us a Star!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `Datafaker`: a library to generate fake data
 | 
					If you like or are using this project to build your own, please give us a star. It's a free way to show your support.
 | 
				
			||||||
    - https://github.com/datafaker-net/datafaker-experimental/tree/main/ollama-api
 | 
					 | 
				
			||||||
- `Vaadin Web UI`: UI-Tester for Interactions with Ollama via ollama4j
 | 
					 | 
				
			||||||
    - https://github.com/TEAMPB/ollama4j-vaadin-ui
 | 
					 | 
				
			||||||
- `ollama-translator`: Minecraft 1.20.6 spigot plugin allows to easily break language barriers by using ollama on the
 | 
					 | 
				
			||||||
  server to translate all messages into a specfic target language.
 | 
					 | 
				
			||||||
    - https://github.com/liebki/ollama-translator
 | 
					 | 
				
			||||||
- `Ollama4j Web UI`: A web UI for Ollama written in Java using Spring Boot and Vaadin framework and
 | 
					 | 
				
			||||||
  Ollama4j. https://github.com/ollama4j/ollama4j-web-ui
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### Traction
 | 
					## Who's using Ollama4j?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					| # | Project Name      | Description                                                                                                   | Link                                                                                                                                           |
 | 
				
			||||||
 | 
					|---|-------------------|---------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|
 | 
				
			||||||
 | 
					| 1 | Datafaker         | A library to generate fake data                                                                               | [GitHub](https://github.com/datafaker-net/datafaker-experimental/tree/main/ollama-api)                                                         |
 | 
				
			||||||
 | 
					| 2 | Vaadin Web UI     | UI-Tester for interactions with Ollama via ollama4j                                                           | [GitHub](https://github.com/TEAMPB/ollama4j-vaadin-ui)                                                                                         |
 | 
				
			||||||
 | 
					| 3 | ollama-translator | A Minecraft 1.20.6 Spigot plugin that translates all messages into a specific target language via Ollama      | [GitHub](https://github.com/liebki/ollama-translator)                                                                                          |
 | 
				
			||||||
 | 
					| 4 | AI Player         | A Minecraft mod that adds an intelligent "second player" to the game                                          | [GitHub](https://github.com/shasankp000/AI-Player), <br/> [Reddit Thread](https://www.reddit.com/r/fabricmc/comments/1e65x5s/comment/ldr2vcf/) |
 | 
				
			||||||
 | 
					| 5 | Ollama4j Web UI   | A web UI for Ollama written in Java using Spring Boot, Vaadin, and Ollama4j                                   | [GitHub](https://github.com/ollama4j/ollama4j-web-ui)                                                                                          |
 | 
				
			||||||
 | 
					| 6 | JnsCLI            | A command-line tool for Jenkins that manages jobs, builds, and configurations, with AI-powered error analysis | [GitHub](https://github.com/mirum8/jnscli)                                                                                                     |
 | 
				
			||||||
 | 
					| 7 | Katie Backend     | An open-source AI-based question-answering platform for accessing private domain knowledge                    | [GitHub](https://github.com/wyona/katie-backend)                                                                                               |
 | 
				
			||||||
 | 
					| 8 | TeleLlama3 Bot    | A question-answering Telegram bot                                                                             | [Repo](https://git.hiast.edu.sy/mohamadbashar.disoki/telellama3-bot)                                                                           |
 | 
				
			||||||
 | 
					| 9 | moqui-wechat      | A moqui-wechat component                                                                                      | [GitHub](https://github.com/heguangyong/moqui-wechat)                                                                                          |
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Traction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[](https://star-history.com/#ollama4j/ollama4j&Date)
 | 
					[](https://star-history.com/#ollama4j/ollama4j&Date)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Get Involved
 | 
					## Get Involved
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div align="center">
 | 
					<div align="center">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -312,6 +316,22 @@ Contributions are most welcome! Whether it's reporting a bug, proposing an enhan
 | 
				
			|||||||
with code - any sort
 | 
					with code - any sort
 | 
				
			||||||
of contribution is much appreciated.
 | 
					of contribution is much appreciated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 🏷️ License and Citation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The code is available under [MIT License](./LICENSE).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					If you find this project helpful in your research, please cite this work at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					@misc{ollama4j2024,
 | 
				
			||||||
 | 
					    author       = {Amith Koujalgi},
 | 
				
			||||||
 | 
					    title        = {Ollama4j: A Java Library (Wrapper/Binding) for Ollama Server},
 | 
				
			||||||
 | 
					    year         = {2024},
 | 
				
			||||||
 | 
					    month        = {January},
 | 
				
			||||||
 | 
					    url          = {https://github.com/ollama4j/ollama4j}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### References
 | 
					### References
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- [Ollama REST APIs](https://github.com/jmorganca/ollama/blob/main/docs/api.md)
 | 
					- [Ollama REST APIs](https://github.com/jmorganca/ollama/blob/main/docs/api.md)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -82,6 +82,33 @@ You will get a response similar to:
 | 
				
			|||||||
]
 | 
					]
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Conversational loop
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI();
 | 
				
			||||||
 | 
					        ollamaAPI.setRequestTimeoutSeconds(60);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance("<your-model>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaChatRequest requestModel = builder.withMessage(OllamaChatMessageRole.USER, "<your-first-message>").build();
 | 
				
			||||||
 | 
					        OllamaChatResult initialChatResult = ollamaAPI.chat(requestModel);
 | 
				
			||||||
 | 
					        System.out.println(initialChatResult.getResponse());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<OllamaChatMessage> history = initialChatResult.getChatHistory();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while (true) {
 | 
				
			||||||
 | 
					            OllamaChatResult chatResult = ollamaAPI.chat(builder.withMessages(history).withMessage(OllamaChatMessageRole.USER, "<your-new-message").build());
 | 
				
			||||||
 | 
					            System.out.println(chatResult.getResponse());
 | 
				
			||||||
 | 
					            history = chatResult.getChatHistory();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Create a conversation where the answer is streamed
 | 
					## Create a conversation where the answer is streamed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```java
 | 
					```java
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										65
									
								
								docs/docs/apis-generate/custom-roles.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								docs/docs/apis-generate/custom-roles.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					sidebar_position: 8
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Custom Roles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Allows to manage custom roles (apart from the base roles) for chat interactions with the models.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_Particularly helpful when you would need to use different roles that the newer models support other than the base
 | 
				
			||||||
 | 
					roles._
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_Base roles are `SYSTEM`, `USER`, `ASSISTANT`, `TOOL`._
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Add new role
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.chat.OllamaChatMessageRole;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaChatMessageRole customRole = ollamaAPI.addCustomRole("custom-role");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### List roles
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.chat.OllamaChatMessageRole;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<OllamaChatMessageRole> roles = ollamaAPI.listRoles();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Get role
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.chat.OllamaChatMessageRole;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<OllamaChatMessageRole> roles = ollamaAPI.getRole("custom-role");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@@ -8,12 +8,85 @@ Generate embeddings from a model.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Parameters:
 | 
					Parameters:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- `model`: name of model to generate embeddings from
 | 
				
			||||||
 | 
					- `input`: text/s to generate embeddings for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.types.OllamaModelType;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedRequestModel;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedResponseModel;
 | 
				
			||||||
 | 
					import java.util.Arrays;
 | 
				
			||||||
 | 
					import java.util.Collections;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaEmbedResponseModel embeddings = ollamaAPI.embed("all-minilm", Arrays.asList("Why is the sky blue?", "Why is the grass green?"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        System.out.println(embeddings);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Or, using the `OllamaEmbedRequestModel`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.types.OllamaModelType;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedRequestModel;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedResponseModel;import java.util.Arrays;
 | 
				
			||||||
 | 
					import java.util.Collections;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaEmbedResponseModel embeddings = ollamaAPI.embed(new OllamaEmbedRequestModel("all-minilm", Arrays.asList("Why is the sky blue?", "Why is the grass green?")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        System.out.println(embeddings);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You will get a response similar to:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    "model": "all-minilm",
 | 
				
			||||||
 | 
					    "embeddings": [[-0.034674067, 0.030984823, 0.0067988685]],
 | 
				
			||||||
 | 
					    "total_duration": 14173700,
 | 
				
			||||||
 | 
					    "load_duration": 1198800,
 | 
				
			||||||
 | 
					    "prompt_eval_count": 2
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					````
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:::note
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is a deprecated API
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Parameters:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- `model`: name of model to generate embeddings from
 | 
					- `model`: name of model to generate embeddings from
 | 
				
			||||||
- `prompt`: text to generate embeddings for
 | 
					- `prompt`: text to generate embeddings for
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```java
 | 
					```java
 | 
				
			||||||
import io.github.ollama4j.OllamaAPI;
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
import io.github.ollama4j.types.OllamaModelType;
 | 
					import io.github.ollama4j.types.OllamaModelType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class Main {
 | 
					public class Main {
 | 
				
			||||||
@@ -40,11 +113,6 @@ You will get a response similar to:
 | 
				
			|||||||
    0.009260174818336964,
 | 
					    0.009260174818336964,
 | 
				
			||||||
    0.23178744316101074,
 | 
					    0.23178744316101074,
 | 
				
			||||||
    -0.2916173040866852,
 | 
					    -0.2916173040866852,
 | 
				
			||||||
    -0.8924556970596313,
 | 
					    -0.8924556970596313
 | 
				
			||||||
    0.8785552978515625,
 | 
					 | 
				
			||||||
    -0.34576427936553955,
 | 
					 | 
				
			||||||
    0.5742510557174683,
 | 
					 | 
				
			||||||
    -0.04222835972905159,
 | 
					 | 
				
			||||||
    -0.137906014919281
 | 
					 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
sidebar_position: 4
 | 
					sidebar_position: 5
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Create Model
 | 
					# Create Model
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
sidebar_position: 5
 | 
					sidebar_position: 6
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Delete Model
 | 
					# Delete Model
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
sidebar_position: 3
 | 
					sidebar_position: 4
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Get Model Details
 | 
					# Get Model Details
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										133
									
								
								docs/docs/apis-model-management/list-library-models.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								docs/docs/apis-model-management/list-library-models.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,133 @@
 | 
				
			|||||||
 | 
					---
 | 
				
			||||||
 | 
					sidebar_position: 1
 | 
				
			||||||
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Models from Ollama Library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These API retrieves a list of models directly from the Ollama library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### List Models from Ollama Library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This API fetches available models from the Ollama library page, including details such as the model's name, pull count,
 | 
				
			||||||
 | 
					popular tags, tag count, and the last update time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java title="ListLibraryModels.java"
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.response.LibraryModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<LibraryModel> libraryModels = ollamaAPI.listModelsFromLibrary();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        System.out.println(libraryModels);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The following is the sample output:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					    LibraryModel(name=llama3.2-vision, description=Llama 3.2 Vision is a collection of instruction-tuned image reasoning generative models in 11B and 90B sizes., pullCount=21.1K, totalTags=9, popularTags=[vision, 11b, 90b], lastUpdated=yesterday), 
 | 
				
			||||||
 | 
					    LibraryModel(name=llama3.2, description=Meta's Llama 3.2 goes small with 1B and 3B models., pullCount=2.4M, totalTags=63, popularTags=[tools, 1b, 3b], lastUpdated=6 weeks ago)
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Get Tags of a Library Model
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This API Fetches the tags associated with a specific model from Ollama library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java title="GetLibraryModelTags.java"
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.response.LibraryModel;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.response.LibraryModelDetail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<LibraryModel> libraryModels = ollamaAPI.listModelsFromLibrary();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LibraryModelDetail libraryModelDetail = ollamaAPI.getLibraryModelDetails(libraryModels.get(0));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        System.out.println(libraryModelDetail);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The following is the sample output:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					LibraryModelDetail(
 | 
				
			||||||
 | 
					  model=LibraryModel(name=llama3.2-vision, description=Llama 3.2 Vision is a collection of instruction-tuned image reasoning generative models in 11B and 90B sizes., pullCount=21.1K, totalTags=9, popularTags=[vision, 11b, 90b], lastUpdated=yesterday), 
 | 
				
			||||||
 | 
					  tags=[
 | 
				
			||||||
 | 
					        LibraryModelTag(name=llama3.2-vision, tag=latest, size=7.9GB, lastUpdated=yesterday), 
 | 
				
			||||||
 | 
					        LibraryModelTag(name=llama3.2-vision, tag=11b, size=7.9GB, lastUpdated=yesterday), 
 | 
				
			||||||
 | 
					        LibraryModelTag(name=llama3.2-vision, tag=90b, size=55GB, lastUpdated=yesterday)
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Find a model from Ollama library
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This API finds a specific model using model `name` and `tag` from Ollama library.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java title="FindLibraryModel.java"
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.response.LibraryModelTag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LibraryModelTag libraryModelTag = ollamaAPI.findModelTagFromLibrary("qwen2.5", "7b");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        System.out.println(libraryModelTag);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The following is the sample output:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					LibraryModelTag(name=qwen2.5, tag=7b, size=4.7GB, lastUpdated=7 weeks ago)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Pull model using `LibraryModelTag`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can use `LibraryModelTag` to pull models into Ollama server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java title="PullLibraryModelTags.java"
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.response.LibraryModelTag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class Main {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String host = "http://localhost:11434/";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LibraryModelTag libraryModelTag = ollamaAPI.findModelTagFromLibrary("qwen2.5", "7b");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ollamaAPI.pullModel(libraryModelTag);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@@ -1,10 +1,10 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
sidebar_position: 1
 | 
					sidebar_position: 2
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# List Models
 | 
					# List Local Models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This API lets you list available models on the Ollama server.
 | 
					This API lets you list downloaded/available models on the Ollama server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```java title="ListModels.java"
 | 
					```java title="ListModels.java"
 | 
				
			||||||
import io.github.ollama4j.OllamaAPI;
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
---
 | 
					---
 | 
				
			||||||
sidebar_position: 2
 | 
					sidebar_position: 3
 | 
				
			||||||
---
 | 
					---
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Pull Model
 | 
					# Pull Model
 | 
				
			||||||
@@ -24,3 +24,11 @@ public class Main {
 | 
				
			|||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Once downloaded, you can see them when you use [list models](./list-models) API.
 | 
					Once downloaded, you can see them when you use [list models](./list-models) API.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:::info
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can even pull models using Ollama model library APIs. This looks up the models directly on the Ollama model library page. Refer
 | 
				
			||||||
 | 
					to [this](./list-library-models#pull-model-using-librarymodeltag).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					:::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -118,6 +118,24 @@ Create a new Java class in your project and add this code.
 | 
				
			|||||||
```java
 | 
					```java
 | 
				
			||||||
import io.github.ollama4j.OllamaAPI;
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class OllamaAPITest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = new OllamaAPI();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        boolean isOllamaServerReachable = ollamaAPI.ping();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        System.out.println("Is Ollama server running: " + isOllamaServerReachable);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					This uses the default Ollama host as `http://localhost:11434`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Specify a different Ollama host that you want to connect to.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```java
 | 
				
			||||||
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class OllamaAPITest {
 | 
					public class OllamaAPITest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static void main(String[] args) {
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
@@ -129,7 +147,7 @@ public class OllamaAPITest {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        boolean isOllamaServerReachable = ollamaAPI.ping();
 | 
					        boolean isOllamaServerReachable = ollamaAPI.ping();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        System.out.println("Is Ollama server alive: " + isOllamaServerReachable);
 | 
					        System.out.println("Is Ollama server running: " + isOllamaServerReachable);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,6 +58,10 @@ const config = {
 | 
				
			|||||||
                theme: {
 | 
					                theme: {
 | 
				
			||||||
                    customCss: './src/css/custom.css',
 | 
					                    customCss: './src/css/custom.css',
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
 | 
					                gtag: {
 | 
				
			||||||
 | 
					                    trackingID: 'G-G7FLH6FNDC',
 | 
				
			||||||
 | 
					                    anonymizeIP: false,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
            }),
 | 
					            }),
 | 
				
			||||||
        ],
 | 
					        ],
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										414
									
								
								docs/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										414
									
								
								docs/package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -9,6 +9,7 @@
 | 
				
			|||||||
      "version": "0.0.0",
 | 
					      "version": "0.0.0",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@docusaurus/core": "^3.4.0",
 | 
					        "@docusaurus/core": "^3.4.0",
 | 
				
			||||||
 | 
					        "@docusaurus/plugin-google-gtag": "^3.4.0",
 | 
				
			||||||
        "@docusaurus/preset-classic": "^3.4.0",
 | 
					        "@docusaurus/preset-classic": "^3.4.0",
 | 
				
			||||||
        "@docusaurus/theme-mermaid": "^3.4.0",
 | 
					        "@docusaurus/theme-mermaid": "^3.4.0",
 | 
				
			||||||
        "@mdx-js/react": "^3.0.0",
 | 
					        "@mdx-js/react": "^3.0.0",
 | 
				
			||||||
@@ -3382,24 +3383,6 @@
 | 
				
			|||||||
        "@types/ms": "*"
 | 
					        "@types/ms": "*"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@types/eslint": {
 | 
					 | 
				
			||||||
      "version": "8.56.0",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.0.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "@types/estree": "*",
 | 
					 | 
				
			||||||
        "@types/json-schema": "*"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/@types/eslint-scope": {
 | 
					 | 
				
			||||||
      "version": "3.7.7",
 | 
					 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
 | 
					 | 
				
			||||||
      "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
 | 
					 | 
				
			||||||
      "dependencies": {
 | 
					 | 
				
			||||||
        "@types/eslint": "*",
 | 
					 | 
				
			||||||
        "@types/estree": "*"
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    "node_modules/@types/estree": {
 | 
					    "node_modules/@types/estree": {
 | 
				
			||||||
      "version": "1.0.5",
 | 
					      "version": "1.0.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
 | 
				
			||||||
@@ -3690,9 +3673,10 @@
 | 
				
			|||||||
      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
 | 
					      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/ast": {
 | 
					    "node_modules/@webassemblyjs/ast": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.12.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
 | 
					      "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@webassemblyjs/helper-numbers": "1.11.6",
 | 
					        "@webassemblyjs/helper-numbers": "1.11.6",
 | 
				
			||||||
        "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
 | 
					        "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
 | 
				
			||||||
@@ -3701,22 +3685,26 @@
 | 
				
			|||||||
    "node_modules/@webassemblyjs/floating-point-hex-parser": {
 | 
					    "node_modules/@webassemblyjs/floating-point-hex-parser": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.11.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
 | 
					      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/helper-api-error": {
 | 
					    "node_modules/@webassemblyjs/helper-api-error": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.11.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
 | 
					      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/helper-buffer": {
 | 
					    "node_modules/@webassemblyjs/helper-buffer": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.12.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA=="
 | 
					      "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/helper-numbers": {
 | 
					    "node_modules/@webassemblyjs/helper-numbers": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.11.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
 | 
					      "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@webassemblyjs/floating-point-hex-parser": "1.11.6",
 | 
					        "@webassemblyjs/floating-point-hex-parser": "1.11.6",
 | 
				
			||||||
        "@webassemblyjs/helper-api-error": "1.11.6",
 | 
					        "@webassemblyjs/helper-api-error": "1.11.6",
 | 
				
			||||||
@@ -3726,23 +3714,26 @@
 | 
				
			|||||||
    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
 | 
					    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.11.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
 | 
					      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/helper-wasm-section": {
 | 
					    "node_modules/@webassemblyjs/helper-wasm-section": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.12.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
 | 
					      "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@webassemblyjs/ast": "1.11.6",
 | 
					        "@webassemblyjs/ast": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/helper-buffer": "1.11.6",
 | 
					        "@webassemblyjs/helper-buffer": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
 | 
					        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
 | 
				
			||||||
        "@webassemblyjs/wasm-gen": "1.11.6"
 | 
					        "@webassemblyjs/wasm-gen": "1.12.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/ieee754": {
 | 
					    "node_modules/@webassemblyjs/ieee754": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.11.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
 | 
					      "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@xtuc/ieee754": "^1.2.0"
 | 
					        "@xtuc/ieee754": "^1.2.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -3751,6 +3742,7 @@
 | 
				
			|||||||
      "version": "1.11.6",
 | 
					      "version": "1.11.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
 | 
					      "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
 | 
				
			||||||
 | 
					      "license": "Apache-2.0",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@xtuc/long": "4.2.2"
 | 
					        "@xtuc/long": "4.2.2"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -3758,29 +3750,32 @@
 | 
				
			|||||||
    "node_modules/@webassemblyjs/utf8": {
 | 
					    "node_modules/@webassemblyjs/utf8": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.11.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
 | 
					      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/wasm-edit": {
 | 
					    "node_modules/@webassemblyjs/wasm-edit": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.12.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
 | 
					      "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@webassemblyjs/ast": "1.11.6",
 | 
					        "@webassemblyjs/ast": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/helper-buffer": "1.11.6",
 | 
					        "@webassemblyjs/helper-buffer": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
 | 
					        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
 | 
				
			||||||
        "@webassemblyjs/helper-wasm-section": "1.11.6",
 | 
					        "@webassemblyjs/helper-wasm-section": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/wasm-gen": "1.11.6",
 | 
					        "@webassemblyjs/wasm-gen": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/wasm-opt": "1.11.6",
 | 
					        "@webassemblyjs/wasm-opt": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/wasm-parser": "1.11.6",
 | 
					        "@webassemblyjs/wasm-parser": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/wast-printer": "1.11.6"
 | 
					        "@webassemblyjs/wast-printer": "1.12.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/wasm-gen": {
 | 
					    "node_modules/@webassemblyjs/wasm-gen": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.12.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
 | 
					      "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@webassemblyjs/ast": "1.11.6",
 | 
					        "@webassemblyjs/ast": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
 | 
					        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
 | 
				
			||||||
        "@webassemblyjs/ieee754": "1.11.6",
 | 
					        "@webassemblyjs/ieee754": "1.11.6",
 | 
				
			||||||
        "@webassemblyjs/leb128": "1.11.6",
 | 
					        "@webassemblyjs/leb128": "1.11.6",
 | 
				
			||||||
@@ -3788,22 +3783,24 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/wasm-opt": {
 | 
					    "node_modules/@webassemblyjs/wasm-opt": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.12.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
 | 
					      "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@webassemblyjs/ast": "1.11.6",
 | 
					        "@webassemblyjs/ast": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/helper-buffer": "1.11.6",
 | 
					        "@webassemblyjs/helper-buffer": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/wasm-gen": "1.11.6",
 | 
					        "@webassemblyjs/wasm-gen": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/wasm-parser": "1.11.6"
 | 
					        "@webassemblyjs/wasm-parser": "1.12.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/wasm-parser": {
 | 
					    "node_modules/@webassemblyjs/wasm-parser": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.12.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
 | 
					      "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@webassemblyjs/ast": "1.11.6",
 | 
					        "@webassemblyjs/ast": "1.12.1",
 | 
				
			||||||
        "@webassemblyjs/helper-api-error": "1.11.6",
 | 
					        "@webassemblyjs/helper-api-error": "1.11.6",
 | 
				
			||||||
        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
 | 
					        "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
 | 
				
			||||||
        "@webassemblyjs/ieee754": "1.11.6",
 | 
					        "@webassemblyjs/ieee754": "1.11.6",
 | 
				
			||||||
@@ -3812,23 +3809,26 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@webassemblyjs/wast-printer": {
 | 
					    "node_modules/@webassemblyjs/wast-printer": {
 | 
				
			||||||
      "version": "1.11.6",
 | 
					      "version": "1.12.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
 | 
					      "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@webassemblyjs/ast": "1.11.6",
 | 
					        "@webassemblyjs/ast": "1.12.1",
 | 
				
			||||||
        "@xtuc/long": "4.2.2"
 | 
					        "@xtuc/long": "4.2.2"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@xtuc/ieee754": {
 | 
					    "node_modules/@xtuc/ieee754": {
 | 
				
			||||||
      "version": "1.2.0",
 | 
					      "version": "1.2.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
 | 
					      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
 | 
				
			||||||
 | 
					      "license": "BSD-3-Clause"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/@xtuc/long": {
 | 
					    "node_modules/@xtuc/long": {
 | 
				
			||||||
      "version": "4.2.2",
 | 
					      "version": "4.2.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
 | 
					      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
 | 
				
			||||||
 | 
					      "license": "Apache-2.0"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/accepts": {
 | 
					    "node_modules/accepts": {
 | 
				
			||||||
      "version": "1.3.8",
 | 
					      "version": "1.3.8",
 | 
				
			||||||
@@ -3872,10 +3872,11 @@
 | 
				
			|||||||
        "node": ">=0.4.0"
 | 
					        "node": ">=0.4.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/acorn-import-assertions": {
 | 
					    "node_modules/acorn-import-attributes": {
 | 
				
			||||||
      "version": "1.9.0",
 | 
					      "version": "1.9.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
 | 
				
			||||||
      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
 | 
					      "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "peerDependencies": {
 | 
					      "peerDependencies": {
 | 
				
			||||||
        "acorn": "^8"
 | 
					        "acorn": "^8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -4241,12 +4242,13 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/body-parser": {
 | 
					    "node_modules/body-parser": {
 | 
				
			||||||
      "version": "1.20.1",
 | 
					      "version": "1.20.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
 | 
					      "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "bytes": "3.1.2",
 | 
					        "bytes": "3.1.2",
 | 
				
			||||||
        "content-type": "~1.0.4",
 | 
					        "content-type": "~1.0.5",
 | 
				
			||||||
        "debug": "2.6.9",
 | 
					        "debug": "2.6.9",
 | 
				
			||||||
        "depd": "2.0.0",
 | 
					        "depd": "2.0.0",
 | 
				
			||||||
        "destroy": "1.2.0",
 | 
					        "destroy": "1.2.0",
 | 
				
			||||||
@@ -4254,7 +4256,7 @@
 | 
				
			|||||||
        "iconv-lite": "0.4.24",
 | 
					        "iconv-lite": "0.4.24",
 | 
				
			||||||
        "on-finished": "2.4.1",
 | 
					        "on-finished": "2.4.1",
 | 
				
			||||||
        "qs": "6.11.0",
 | 
					        "qs": "6.11.0",
 | 
				
			||||||
        "raw-body": "2.5.1",
 | 
					        "raw-body": "2.5.2",
 | 
				
			||||||
        "type-is": "~1.6.18",
 | 
					        "type-is": "~1.6.18",
 | 
				
			||||||
        "unpipe": "1.0.0"
 | 
					        "unpipe": "1.0.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -4267,6 +4269,7 @@
 | 
				
			|||||||
      "version": "3.1.2",
 | 
					      "version": "3.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
 | 
					      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.8"
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -4275,6 +4278,7 @@
 | 
				
			|||||||
      "version": "2.6.9",
 | 
					      "version": "2.6.9",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
 | 
				
			||||||
      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
					      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "ms": "2.0.0"
 | 
					        "ms": "2.0.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -4282,7 +4286,8 @@
 | 
				
			|||||||
    "node_modules/body-parser/node_modules/ms": {
 | 
					    "node_modules/body-parser/node_modules/ms": {
 | 
				
			||||||
      "version": "2.0.0",
 | 
					      "version": "2.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
 | 
					      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
 | 
				
			||||||
 | 
					      "license": "MIT"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/bonjour-service": {
 | 
					    "node_modules/bonjour-service": {
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.1.1",
 | 
				
			||||||
@@ -4331,11 +4336,12 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/braces": {
 | 
					    "node_modules/braces": {
 | 
				
			||||||
      "version": "3.0.2",
 | 
					      "version": "3.0.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
 | 
				
			||||||
      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
 | 
					      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "fill-range": "^7.0.1"
 | 
					        "fill-range": "^7.1.1"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=8"
 | 
					        "node": ">=8"
 | 
				
			||||||
@@ -4422,13 +4428,19 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/call-bind": {
 | 
					    "node_modules/call-bind": {
 | 
				
			||||||
      "version": "1.0.5",
 | 
					      "version": "1.0.7",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
 | 
				
			||||||
      "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
 | 
					      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "es-define-property": "^1.0.0",
 | 
				
			||||||
 | 
					        "es-errors": "^1.3.0",
 | 
				
			||||||
        "function-bind": "^1.1.2",
 | 
					        "function-bind": "^1.1.2",
 | 
				
			||||||
        "get-intrinsic": "^1.2.1",
 | 
					        "get-intrinsic": "^1.2.4",
 | 
				
			||||||
        "set-function-length": "^1.1.1"
 | 
					        "set-function-length": "^1.2.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "funding": {
 | 
					      "funding": {
 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
@@ -4922,6 +4934,7 @@
 | 
				
			|||||||
      "version": "1.0.5",
 | 
					      "version": "1.0.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
 | 
				
			||||||
      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
 | 
					      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.6"
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -4932,9 +4945,10 @@
 | 
				
			|||||||
      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
 | 
					      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/cookie": {
 | 
					    "node_modules/cookie": {
 | 
				
			||||||
      "version": "0.5.0",
 | 
					      "version": "0.6.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
 | 
					      "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.6"
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -5961,16 +5975,20 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/define-data-property": {
 | 
					    "node_modules/define-data-property": {
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.1.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
 | 
					      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "get-intrinsic": "^1.2.1",
 | 
					        "es-define-property": "^1.0.0",
 | 
				
			||||||
        "gopd": "^1.0.1",
 | 
					        "es-errors": "^1.3.0",
 | 
				
			||||||
        "has-property-descriptors": "^1.0.0"
 | 
					        "gopd": "^1.0.1"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.4"
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/define-lazy-prop": {
 | 
					    "node_modules/define-lazy-prop": {
 | 
				
			||||||
@@ -6301,9 +6319,10 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/enhanced-resolve": {
 | 
					    "node_modules/enhanced-resolve": {
 | 
				
			||||||
      "version": "5.15.0",
 | 
					      "version": "5.17.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
 | 
					      "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "graceful-fs": "^4.2.4",
 | 
					        "graceful-fs": "^4.2.4",
 | 
				
			||||||
        "tapable": "^2.2.0"
 | 
					        "tapable": "^2.2.0"
 | 
				
			||||||
@@ -6331,6 +6350,27 @@
 | 
				
			|||||||
        "is-arrayish": "^0.2.1"
 | 
					        "is-arrayish": "^0.2.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/es-define-property": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "get-intrinsic": "^1.2.4"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/es-errors": {
 | 
				
			||||||
 | 
					      "version": "1.3.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/es-module-lexer": {
 | 
					    "node_modules/es-module-lexer": {
 | 
				
			||||||
      "version": "1.4.1",
 | 
					      "version": "1.4.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
 | 
				
			||||||
@@ -6579,16 +6619,17 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/express": {
 | 
					    "node_modules/express": {
 | 
				
			||||||
      "version": "4.18.2",
 | 
					      "version": "4.19.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
 | 
					      "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "accepts": "~1.3.8",
 | 
					        "accepts": "~1.3.8",
 | 
				
			||||||
        "array-flatten": "1.1.1",
 | 
					        "array-flatten": "1.1.1",
 | 
				
			||||||
        "body-parser": "1.20.1",
 | 
					        "body-parser": "1.20.2",
 | 
				
			||||||
        "content-disposition": "0.5.4",
 | 
					        "content-disposition": "0.5.4",
 | 
				
			||||||
        "content-type": "~1.0.4",
 | 
					        "content-type": "~1.0.4",
 | 
				
			||||||
        "cookie": "0.5.0",
 | 
					        "cookie": "0.6.0",
 | 
				
			||||||
        "cookie-signature": "1.0.6",
 | 
					        "cookie-signature": "1.0.6",
 | 
				
			||||||
        "debug": "2.6.9",
 | 
					        "debug": "2.6.9",
 | 
				
			||||||
        "depd": "2.0.0",
 | 
					        "depd": "2.0.0",
 | 
				
			||||||
@@ -6825,9 +6866,10 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/fill-range": {
 | 
					    "node_modules/fill-range": {
 | 
				
			||||||
      "version": "7.0.1",
 | 
					      "version": "7.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
 | 
					      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "to-regex-range": "^5.0.1"
 | 
					        "to-regex-range": "^5.0.1"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -6904,15 +6946,16 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/follow-redirects": {
 | 
					    "node_modules/follow-redirects": {
 | 
				
			||||||
      "version": "1.15.3",
 | 
					      "version": "1.15.8",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.8.tgz",
 | 
				
			||||||
      "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
 | 
					      "integrity": "sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==",
 | 
				
			||||||
      "funding": [
 | 
					      "funding": [
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
          "type": "individual",
 | 
					          "type": "individual",
 | 
				
			||||||
          "url": "https://github.com/sponsors/RubenVerborgh"
 | 
					          "url": "https://github.com/sponsors/RubenVerborgh"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      ],
 | 
					      ],
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=4.0"
 | 
					        "node": ">=4.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -7139,15 +7182,20 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/get-intrinsic": {
 | 
					    "node_modules/get-intrinsic": {
 | 
				
			||||||
      "version": "1.2.2",
 | 
					      "version": "1.2.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
 | 
					      "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "es-errors": "^1.3.0",
 | 
				
			||||||
        "function-bind": "^1.1.2",
 | 
					        "function-bind": "^1.1.2",
 | 
				
			||||||
        "has-proto": "^1.0.1",
 | 
					        "has-proto": "^1.0.1",
 | 
				
			||||||
        "has-symbols": "^1.0.3",
 | 
					        "has-symbols": "^1.0.3",
 | 
				
			||||||
        "hasown": "^2.0.0"
 | 
					        "hasown": "^2.0.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
      "funding": {
 | 
					      "funding": {
 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -7206,7 +7254,8 @@
 | 
				
			|||||||
    "node_modules/glob-to-regexp": {
 | 
					    "node_modules/glob-to-regexp": {
 | 
				
			||||||
      "version": "0.4.1",
 | 
					      "version": "0.4.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
 | 
					      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
 | 
				
			||||||
 | 
					      "license": "BSD-2-Clause"
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/global-dirs": {
 | 
					    "node_modules/global-dirs": {
 | 
				
			||||||
      "version": "3.0.1",
 | 
					      "version": "3.0.1",
 | 
				
			||||||
@@ -7405,11 +7454,12 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/has-property-descriptors": {
 | 
					    "node_modules/has-property-descriptors": {
 | 
				
			||||||
      "version": "1.0.1",
 | 
					      "version": "1.0.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
 | 
					      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "get-intrinsic": "^1.2.2"
 | 
					        "es-define-property": "^1.0.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "funding": {
 | 
					      "funding": {
 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
@@ -7949,6 +7999,7 @@
 | 
				
			|||||||
      "version": "0.4.24",
 | 
					      "version": "0.4.24",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
 | 
				
			||||||
      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
 | 
					      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "safer-buffer": ">= 2.1.2 < 3"
 | 
					        "safer-buffer": ">= 2.1.2 < 3"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -8258,6 +8309,7 @@
 | 
				
			|||||||
      "version": "7.0.0",
 | 
					      "version": "7.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
 | 
					      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=0.12.0"
 | 
					        "node": ">=0.12.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -9105,6 +9157,7 @@
 | 
				
			|||||||
      "version": "0.3.0",
 | 
					      "version": "0.3.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
 | 
					      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.6"
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -11285,11 +11338,12 @@
 | 
				
			|||||||
      ]
 | 
					      ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/micromatch": {
 | 
					    "node_modules/micromatch": {
 | 
				
			||||||
      "version": "4.0.5",
 | 
					      "version": "4.0.8",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
 | 
				
			||||||
      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
 | 
					      "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "braces": "^3.0.2",
 | 
					        "braces": "^3.0.3",
 | 
				
			||||||
        "picomatch": "^2.3.1"
 | 
					        "picomatch": "^2.3.1"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
@@ -11543,9 +11597,13 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/object-inspect": {
 | 
					    "node_modules/object-inspect": {
 | 
				
			||||||
      "version": "1.13.1",
 | 
					      "version": "1.13.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
 | 
					      "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
      "funding": {
 | 
					      "funding": {
 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -12684,6 +12742,7 @@
 | 
				
			|||||||
      "version": "6.11.0",
 | 
					      "version": "6.11.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
 | 
					      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
 | 
				
			||||||
 | 
					      "license": "BSD-3-Clause",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "side-channel": "^1.0.4"
 | 
					        "side-channel": "^1.0.4"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -12749,9 +12808,10 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/raw-body": {
 | 
					    "node_modules/raw-body": {
 | 
				
			||||||
      "version": "2.5.1",
 | 
					      "version": "2.5.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
 | 
					      "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "bytes": "3.1.2",
 | 
					        "bytes": "3.1.2",
 | 
				
			||||||
        "http-errors": "2.0.0",
 | 
					        "http-errors": "2.0.0",
 | 
				
			||||||
@@ -12766,6 +12826,7 @@
 | 
				
			|||||||
      "version": "3.1.2",
 | 
					      "version": "3.1.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
 | 
					      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.8"
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -13886,14 +13947,17 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/set-function-length": {
 | 
					    "node_modules/set-function-length": {
 | 
				
			||||||
      "version": "1.1.1",
 | 
					      "version": "1.2.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
 | 
					      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "define-data-property": "^1.1.1",
 | 
					        "define-data-property": "^1.1.4",
 | 
				
			||||||
        "get-intrinsic": "^1.2.1",
 | 
					        "es-errors": "^1.3.0",
 | 
				
			||||||
 | 
					        "function-bind": "^1.1.2",
 | 
				
			||||||
 | 
					        "get-intrinsic": "^1.2.4",
 | 
				
			||||||
        "gopd": "^1.0.1",
 | 
					        "gopd": "^1.0.1",
 | 
				
			||||||
        "has-property-descriptors": "^1.0.0"
 | 
					        "has-property-descriptors": "^1.0.2"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.4"
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
@@ -13964,13 +14028,18 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/side-channel": {
 | 
					    "node_modules/side-channel": {
 | 
				
			||||||
      "version": "1.0.4",
 | 
					      "version": "1.0.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
 | 
				
			||||||
      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
 | 
					      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "call-bind": "^1.0.0",
 | 
					        "call-bind": "^1.0.7",
 | 
				
			||||||
        "get-intrinsic": "^1.0.2",
 | 
					        "es-errors": "^1.3.0",
 | 
				
			||||||
        "object-inspect": "^1.9.0"
 | 
					        "get-intrinsic": "^1.2.4",
 | 
				
			||||||
 | 
					        "object-inspect": "^1.13.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "funding": {
 | 
					      "funding": {
 | 
				
			||||||
        "url": "https://github.com/sponsors/ljharb"
 | 
					        "url": "https://github.com/sponsors/ljharb"
 | 
				
			||||||
@@ -14393,15 +14462,16 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/terser-webpack-plugin": {
 | 
					    "node_modules/terser-webpack-plugin": {
 | 
				
			||||||
      "version": "5.3.9",
 | 
					      "version": "5.3.10",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
 | 
				
			||||||
      "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
 | 
					      "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@jridgewell/trace-mapping": "^0.3.17",
 | 
					        "@jridgewell/trace-mapping": "^0.3.20",
 | 
				
			||||||
        "jest-worker": "^27.4.5",
 | 
					        "jest-worker": "^27.4.5",
 | 
				
			||||||
        "schema-utils": "^3.1.1",
 | 
					        "schema-utils": "^3.1.1",
 | 
				
			||||||
        "serialize-javascript": "^6.0.1",
 | 
					        "serialize-javascript": "^6.0.1",
 | 
				
			||||||
        "terser": "^5.16.8"
 | 
					        "terser": "^5.26.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 10.13.0"
 | 
					        "node": ">= 10.13.0"
 | 
				
			||||||
@@ -14534,6 +14604,7 @@
 | 
				
			|||||||
      "version": "5.0.1",
 | 
					      "version": "5.0.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
 | 
					      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "is-number": "^7.0.0"
 | 
					        "is-number": "^7.0.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -14603,6 +14674,7 @@
 | 
				
			|||||||
      "version": "1.6.18",
 | 
					      "version": "1.6.18",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
 | 
				
			||||||
      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
 | 
					      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "media-typer": "0.3.0",
 | 
					        "media-typer": "0.3.0",
 | 
				
			||||||
        "mime-types": "~2.1.24"
 | 
					        "mime-types": "~2.1.24"
 | 
				
			||||||
@@ -14615,6 +14687,7 @@
 | 
				
			|||||||
      "version": "1.52.0",
 | 
					      "version": "1.52.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
 | 
					      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">= 0.6"
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -14623,6 +14696,7 @@
 | 
				
			|||||||
      "version": "2.1.35",
 | 
					      "version": "2.1.35",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
 | 
				
			||||||
      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
 | 
					      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "mime-db": "1.52.0"
 | 
					        "mime-db": "1.52.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -15154,9 +15228,10 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/watchpack": {
 | 
					    "node_modules/watchpack": {
 | 
				
			||||||
      "version": "2.4.0",
 | 
					      "version": "2.4.2",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
 | 
				
			||||||
      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
 | 
					      "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "glob-to-regexp": "^0.4.1",
 | 
					        "glob-to-regexp": "^0.4.1",
 | 
				
			||||||
        "graceful-fs": "^4.1.2"
 | 
					        "graceful-fs": "^4.1.2"
 | 
				
			||||||
@@ -15188,33 +15263,33 @@
 | 
				
			|||||||
      "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
 | 
					      "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/webpack": {
 | 
					    "node_modules/webpack": {
 | 
				
			||||||
      "version": "5.89.0",
 | 
					      "version": "5.94.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
 | 
					      "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "@types/eslint-scope": "^3.7.3",
 | 
					        "@types/estree": "^1.0.5",
 | 
				
			||||||
        "@types/estree": "^1.0.0",
 | 
					        "@webassemblyjs/ast": "^1.12.1",
 | 
				
			||||||
        "@webassemblyjs/ast": "^1.11.5",
 | 
					        "@webassemblyjs/wasm-edit": "^1.12.1",
 | 
				
			||||||
        "@webassemblyjs/wasm-edit": "^1.11.5",
 | 
					        "@webassemblyjs/wasm-parser": "^1.12.1",
 | 
				
			||||||
        "@webassemblyjs/wasm-parser": "^1.11.5",
 | 
					 | 
				
			||||||
        "acorn": "^8.7.1",
 | 
					        "acorn": "^8.7.1",
 | 
				
			||||||
        "acorn-import-assertions": "^1.9.0",
 | 
					        "acorn-import-attributes": "^1.9.5",
 | 
				
			||||||
        "browserslist": "^4.14.5",
 | 
					        "browserslist": "^4.21.10",
 | 
				
			||||||
        "chrome-trace-event": "^1.0.2",
 | 
					        "chrome-trace-event": "^1.0.2",
 | 
				
			||||||
        "enhanced-resolve": "^5.15.0",
 | 
					        "enhanced-resolve": "^5.17.1",
 | 
				
			||||||
        "es-module-lexer": "^1.2.1",
 | 
					        "es-module-lexer": "^1.2.1",
 | 
				
			||||||
        "eslint-scope": "5.1.1",
 | 
					        "eslint-scope": "5.1.1",
 | 
				
			||||||
        "events": "^3.2.0",
 | 
					        "events": "^3.2.0",
 | 
				
			||||||
        "glob-to-regexp": "^0.4.1",
 | 
					        "glob-to-regexp": "^0.4.1",
 | 
				
			||||||
        "graceful-fs": "^4.2.9",
 | 
					        "graceful-fs": "^4.2.11",
 | 
				
			||||||
        "json-parse-even-better-errors": "^2.3.1",
 | 
					        "json-parse-even-better-errors": "^2.3.1",
 | 
				
			||||||
        "loader-runner": "^4.2.0",
 | 
					        "loader-runner": "^4.2.0",
 | 
				
			||||||
        "mime-types": "^2.1.27",
 | 
					        "mime-types": "^2.1.27",
 | 
				
			||||||
        "neo-async": "^2.6.2",
 | 
					        "neo-async": "^2.6.2",
 | 
				
			||||||
        "schema-utils": "^3.2.0",
 | 
					        "schema-utils": "^3.2.0",
 | 
				
			||||||
        "tapable": "^2.1.1",
 | 
					        "tapable": "^2.1.1",
 | 
				
			||||||
        "terser-webpack-plugin": "^5.3.7",
 | 
					        "terser-webpack-plugin": "^5.3.10",
 | 
				
			||||||
        "watchpack": "^2.4.0",
 | 
					        "watchpack": "^2.4.1",
 | 
				
			||||||
        "webpack-sources": "^3.2.3"
 | 
					        "webpack-sources": "^3.2.3"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "bin": {
 | 
					      "bin": {
 | 
				
			||||||
@@ -15268,9 +15343,10 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/webpack-dev-middleware": {
 | 
					    "node_modules/webpack-dev-middleware": {
 | 
				
			||||||
      "version": "5.3.3",
 | 
					      "version": "5.3.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
 | 
				
			||||||
      "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
 | 
					      "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "colorette": "^2.0.10",
 | 
					        "colorette": "^2.0.10",
 | 
				
			||||||
        "memfs": "^3.4.3",
 | 
					        "memfs": "^3.4.3",
 | 
				
			||||||
@@ -15375,9 +15451,10 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/webpack-dev-server/node_modules/ws": {
 | 
					    "node_modules/webpack-dev-server/node_modules/ws": {
 | 
				
			||||||
      "version": "8.15.1",
 | 
					      "version": "8.18.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==",
 | 
					      "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=10.0.0"
 | 
					        "node": ">=10.0.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -15619,9 +15696,10 @@
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "node_modules/ws": {
 | 
					    "node_modules/ws": {
 | 
				
			||||||
      "version": "7.5.9",
 | 
					      "version": "7.5.10",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
 | 
				
			||||||
      "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
 | 
					      "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
 | 
				
			||||||
 | 
					      "license": "MIT",
 | 
				
			||||||
      "engines": {
 | 
					      "engines": {
 | 
				
			||||||
        "node": ">=8.3.0"
 | 
					        "node": ">=8.3.0"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@
 | 
				
			|||||||
  },
 | 
					  },
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "@docusaurus/core": "^3.4.0",
 | 
					    "@docusaurus/core": "^3.4.0",
 | 
				
			||||||
 | 
					    "@docusaurus/plugin-google-gtag": "^3.4.0",
 | 
				
			||||||
    "@docusaurus/preset-classic": "^3.4.0",
 | 
					    "@docusaurus/preset-classic": "^3.4.0",
 | 
				
			||||||
    "@docusaurus/theme-mermaid": "^3.4.0",
 | 
					    "@docusaurus/theme-mermaid": "^3.4.0",
 | 
				
			||||||
    "@mdx-js/react": "^3.0.0",
 | 
					    "@mdx-js/react": "^3.0.0",
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										41
									
								
								docs/src/components/BuyMeACoffee/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								docs/src/components/BuyMeACoffee/index.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					import React from "react";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BuyMeACoffee extends React.Component {
 | 
				
			||||||
 | 
					  constructor(props) {
 | 
				
			||||||
 | 
					    super(props)
 | 
				
			||||||
 | 
					    let script = document.createElement("script");
 | 
				
			||||||
 | 
					    script.src = 'https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js';
 | 
				
			||||||
 | 
					    script.dataset.name = 'BMC-Widget';
 | 
				
			||||||
 | 
					    script.dataset.cfasync = 'false';
 | 
				
			||||||
 | 
					    script.dataset.id = 'amithkoujalgi';
 | 
				
			||||||
 | 
					    script.dataset.description = 'Support me on Buy me a coffee!';
 | 
				
			||||||
 | 
					    script.dataset.message = 'If you like my work and want to say thanks, or encourage me to do more, you can buy me a coffee! 😊';
 | 
				
			||||||
 | 
					    script.dataset.color = '#2e8555';
 | 
				
			||||||
 | 
					    script.dataset.position = 'Right';
 | 
				
			||||||
 | 
					    script.dataset.x_margin = '18';
 | 
				
			||||||
 | 
					    script.dataset.y_margin = '18';
 | 
				
			||||||
 | 
					    script.async = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    script.onload = function () {
 | 
				
			||||||
 | 
					      let evt = document.createEvent('Event');
 | 
				
			||||||
 | 
					      evt.initEvent('DOMContentLoaded', false, false);
 | 
				
			||||||
 | 
					      window.dispatchEvent(evt);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    this.script = script
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  componentDidMount() {
 | 
				
			||||||
 | 
					    document.head.appendChild(this.script)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // componentWillUnmount() {
 | 
				
			||||||
 | 
					  //   document.head.removeChild(this.script);
 | 
				
			||||||
 | 
					  //   document.body.removeChild(document.getElementById("bmc-wbtn"))
 | 
				
			||||||
 | 
					  // }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  render() {
 | 
				
			||||||
 | 
					    return null
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default BuyMeACoffee;
 | 
				
			||||||
@@ -38,3 +38,11 @@ header > h1,
 | 
				
			|||||||
h2 > a {
 | 
					h2 > a {
 | 
				
			||||||
    font-size: 2rem !important;
 | 
					    font-size: 2rem !important;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#bmc-wbtn{
 | 
				
			||||||
 | 
					    bottom: 15px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#bmc-wbtn + div{
 | 
				
			||||||
 | 
					    bottom:15px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -3,9 +3,10 @@ import Link from '@docusaurus/Link';
 | 
				
			|||||||
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
 | 
					import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
 | 
				
			||||||
import Layout from '@theme/Layout';
 | 
					import Layout from '@theme/Layout';
 | 
				
			||||||
import HomepageFeatures from '@site/src/components/HomepageFeatures';
 | 
					import HomepageFeatures from '@site/src/components/HomepageFeatures';
 | 
				
			||||||
 | 
					import BuyMeACoffee from '@site/src/components/BuyMeACoffee';
 | 
				
			||||||
import Heading from '@theme/Heading';
 | 
					import Heading from '@theme/Heading';
 | 
				
			||||||
import styles from './index.module.css';
 | 
					import styles from './index.module.css';
 | 
				
			||||||
 | 
					import BrowserOnly from '@docusaurus/BrowserOnly';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function HomepageHeader() {
 | 
					function HomepageHeader() {
 | 
				
			||||||
  const {siteConfig} = useDocusaurusContext();
 | 
					  const {siteConfig} = useDocusaurusContext();
 | 
				
			||||||
@@ -14,7 +15,8 @@ function HomepageHeader() {
 | 
				
			|||||||
      <Heading as="h1" className="hero__title">
 | 
					      <Heading as="h1" className="hero__title">
 | 
				
			||||||
        {siteConfig.title}
 | 
					        {siteConfig.title}
 | 
				
			||||||
      </Heading>
 | 
					      </Heading>
 | 
				
			||||||
            <img src="img/logo.svg" alt="Ollama4j Logo" className={styles.logo} style={{maxWidth: '20vh'}}/>
 | 
					      <img src="img/logo.svg" alt="Ollama4j Logo" className={styles.logo}
 | 
				
			||||||
 | 
					           style={{maxWidth: '20vh'}}/>
 | 
				
			||||||
      <p className="hero__subtitle">{siteConfig.tagline}</p>
 | 
					      <p className="hero__subtitle">{siteConfig.tagline}</p>
 | 
				
			||||||
      <div className={styles.buttons}>
 | 
					      <div className={styles.buttons}>
 | 
				
			||||||
        <Link
 | 
					        <Link
 | 
				
			||||||
@@ -35,6 +37,9 @@ export default function Home() {
 | 
				
			|||||||
    <HomepageHeader/>
 | 
					    <HomepageHeader/>
 | 
				
			||||||
    <main>
 | 
					    <main>
 | 
				
			||||||
      <HomepageFeatures/>
 | 
					      <HomepageFeatures/>
 | 
				
			||||||
 | 
					      <BrowserOnly>
 | 
				
			||||||
 | 
					        {() => <BuyMeACoffee />}
 | 
				
			||||||
 | 
					      </BrowserOnly>
 | 
				
			||||||
    </main>
 | 
					    </main>
 | 
				
			||||||
  </Layout>);
 | 
					  </Layout>);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								pom.xml
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								pom.xml
									
									
									
									
									
								
							@@ -63,6 +63,10 @@
 | 
				
			|||||||
                <groupId>org.apache.maven.plugins</groupId>
 | 
					                <groupId>org.apache.maven.plugins</groupId>
 | 
				
			||||||
                <artifactId>maven-javadoc-plugin</artifactId>
 | 
					                <artifactId>maven-javadoc-plugin</artifactId>
 | 
				
			||||||
                <version>3.5.0</version>
 | 
					                <version>3.5.0</version>
 | 
				
			||||||
 | 
					                <configuration>
 | 
				
			||||||
 | 
					                    <!-- to disable the "missing" warnings. Remove the doclint to enable warnings-->
 | 
				
			||||||
 | 
					                    <doclint>all,-missing</doclint>
 | 
				
			||||||
 | 
					                </configuration>
 | 
				
			||||||
                <executions>
 | 
					                <executions>
 | 
				
			||||||
                    <execution>
 | 
					                    <execution>
 | 
				
			||||||
                        <id>attach-javadocs</id>
 | 
					                        <id>attach-javadocs</id>
 | 
				
			||||||
@@ -136,6 +140,11 @@
 | 
				
			|||||||
            <version>${lombok.version}</version>
 | 
					            <version>${lombok.version}</version>
 | 
				
			||||||
            <scope>provided</scope>
 | 
					            <scope>provided</scope>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>org.jsoup</groupId>
 | 
				
			||||||
 | 
					            <artifactId>jsoup</artifactId>
 | 
				
			||||||
 | 
					            <version>1.18.1</version>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
        <dependency>
 | 
					        <dependency>
 | 
				
			||||||
            <groupId>com.fasterxml.jackson.core</groupId>
 | 
					            <groupId>com.fasterxml.jackson.core</groupId>
 | 
				
			||||||
            <artifactId>jackson-databind</artifactId>
 | 
					            <artifactId>jackson-databind</artifactId>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,14 +1,14 @@
 | 
				
			|||||||
package io.github.ollama4j;
 | 
					package io.github.ollama4j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import io.github.ollama4j.exceptions.OllamaBaseException;
 | 
					import io.github.ollama4j.exceptions.OllamaBaseException;
 | 
				
			||||||
 | 
					import io.github.ollama4j.exceptions.RoleNotFoundException;
 | 
				
			||||||
import io.github.ollama4j.exceptions.ToolInvocationException;
 | 
					import io.github.ollama4j.exceptions.ToolInvocationException;
 | 
				
			||||||
import io.github.ollama4j.exceptions.ToolNotFoundException;
 | 
					import io.github.ollama4j.exceptions.ToolNotFoundException;
 | 
				
			||||||
import io.github.ollama4j.models.chat.OllamaChatMessage;
 | 
					import io.github.ollama4j.models.chat.*;
 | 
				
			||||||
import io.github.ollama4j.models.chat.OllamaChatRequest;
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedRequestModel;
 | 
				
			||||||
import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
 | 
					 | 
				
			||||||
import io.github.ollama4j.models.chat.OllamaChatResult;
 | 
					 | 
				
			||||||
import io.github.ollama4j.models.embeddings.OllamaEmbeddingResponseModel;
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbeddingResponseModel;
 | 
				
			||||||
import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedResponseModel;
 | 
				
			||||||
import io.github.ollama4j.models.generate.OllamaGenerateRequest;
 | 
					import io.github.ollama4j.models.generate.OllamaGenerateRequest;
 | 
				
			||||||
import io.github.ollama4j.models.generate.OllamaStreamHandler;
 | 
					import io.github.ollama4j.models.generate.OllamaStreamHandler;
 | 
				
			||||||
import io.github.ollama4j.models.ps.ModelsProcessResponse;
 | 
					import io.github.ollama4j.models.ps.ModelsProcessResponse;
 | 
				
			||||||
@@ -18,8 +18,6 @@ import io.github.ollama4j.tools.*;
 | 
				
			|||||||
import io.github.ollama4j.utils.Options;
 | 
					import io.github.ollama4j.utils.Options;
 | 
				
			||||||
import io.github.ollama4j.utils.Utils;
 | 
					import io.github.ollama4j.utils.Utils;
 | 
				
			||||||
import lombok.Setter;
 | 
					import lombok.Setter;
 | 
				
			||||||
import org.slf4j.Logger;
 | 
					 | 
				
			||||||
import org.slf4j.LoggerFactory;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.*;
 | 
					import java.io.*;
 | 
				
			||||||
import java.net.URI;
 | 
					import java.net.URI;
 | 
				
			||||||
@@ -32,11 +30,19 @@ import java.nio.charset.StandardCharsets;
 | 
				
			|||||||
import java.nio.file.Files;
 | 
					import java.nio.file.Files;
 | 
				
			||||||
import java.time.Duration;
 | 
					import java.time.Duration;
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.*;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
 | 
					import org.slf4j.LoggerFactory;
 | 
				
			||||||
 | 
					import org.jsoup.Jsoup;
 | 
				
			||||||
 | 
					import org.jsoup.nodes.Document;
 | 
				
			||||||
 | 
					import org.jsoup.nodes.Element;
 | 
				
			||||||
 | 
					import org.jsoup.select.Elements;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The base Ollama API class.
 | 
					 * The base Ollama API class.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@SuppressWarnings("DuplicatedCode")
 | 
					@SuppressWarnings({"DuplicatedCode", "resource"})
 | 
				
			||||||
public class OllamaAPI {
 | 
					public class OllamaAPI {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static final Logger logger = LoggerFactory.getLogger(OllamaAPI.class);
 | 
					    private static final Logger logger = LoggerFactory.getLogger(OllamaAPI.class);
 | 
				
			||||||
@@ -58,7 +64,14 @@ public class OllamaAPI {
 | 
				
			|||||||
    private final ToolRegistry toolRegistry = new ToolRegistry();
 | 
					    private final ToolRegistry toolRegistry = new ToolRegistry();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Instantiates the Ollama API.
 | 
					     * Instantiates the Ollama API with default Ollama host: <a href="http://localhost:11434">http://localhost:11434</a>
 | 
				
			||||||
 | 
					     **/
 | 
				
			||||||
 | 
					    public OllamaAPI() {
 | 
				
			||||||
 | 
					        this.host = "http://localhost:11434";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Instantiates the Ollama API with specified Ollama host address.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param host the host address of Ollama server
 | 
					     * @param host the host address of Ollama server
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -90,12 +103,7 @@ public class OllamaAPI {
 | 
				
			|||||||
        HttpClient httpClient = HttpClient.newHttpClient();
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpRequest httpRequest = null;
 | 
					        HttpRequest httpRequest = null;
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            httpRequest =
 | 
					            httpRequest = getRequestBuilderDefault(new URI(url)).header("Accept", "application/json").header("Content-type", "application/json").GET().build();
 | 
				
			||||||
                    getRequestBuilderDefault(new URI(url))
 | 
					 | 
				
			||||||
                            .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                            .header("Content-type", "application/json")
 | 
					 | 
				
			||||||
                            .GET()
 | 
					 | 
				
			||||||
                            .build();
 | 
					 | 
				
			||||||
        } catch (URISyntaxException e) {
 | 
					        } catch (URISyntaxException e) {
 | 
				
			||||||
            throw new RuntimeException(e);
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -114,19 +122,17 @@ public class OllamaAPI {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Provides a list of running models and details about each model currently loaded into memory.
 | 
					     * Provides a list of running models and details about each model currently loaded into memory.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return ModelsProcessResponse
 | 
					     * @return ModelsProcessResponse containing details about the running models
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public ModelsProcessResponse ps() throws IOException, InterruptedException, OllamaBaseException {
 | 
					    public ModelsProcessResponse ps() throws IOException, InterruptedException, OllamaBaseException {
 | 
				
			||||||
        String url = this.host + "/api/ps";
 | 
					        String url = this.host + "/api/ps";
 | 
				
			||||||
        HttpClient httpClient = HttpClient.newHttpClient();
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpRequest httpRequest = null;
 | 
					        HttpRequest httpRequest = null;
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            httpRequest =
 | 
					            httpRequest = getRequestBuilderDefault(new URI(url)).header("Accept", "application/json").header("Content-type", "application/json").GET().build();
 | 
				
			||||||
                    getRequestBuilderDefault(new URI(url))
 | 
					 | 
				
			||||||
                            .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                            .header("Content-type", "application/json")
 | 
					 | 
				
			||||||
                            .GET()
 | 
					 | 
				
			||||||
                            .build();
 | 
					 | 
				
			||||||
        } catch (URISyntaxException e) {
 | 
					        } catch (URISyntaxException e) {
 | 
				
			||||||
            throw new RuntimeException(e);
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -135,69 +141,182 @@ public class OllamaAPI {
 | 
				
			|||||||
        int statusCode = response.statusCode();
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
        String responseString = response.body();
 | 
					        String responseString = response.body();
 | 
				
			||||||
        if (statusCode == 200) {
 | 
					        if (statusCode == 200) {
 | 
				
			||||||
            return Utils.getObjectMapper()
 | 
					            return Utils.getObjectMapper().readValue(responseString, ModelsProcessResponse.class);
 | 
				
			||||||
                    .readValue(responseString, ModelsProcessResponse.class);
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            throw new OllamaBaseException(statusCode + " - " + responseString);
 | 
					            throw new OllamaBaseException(statusCode + " - " + responseString);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * List available models from Ollama server.
 | 
					     * Lists available models from the Ollama server.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @return the list
 | 
					     * @return a list of models available on the server
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public List<Model> listModels()
 | 
					    public List<Model> listModels() throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
 | 
					 | 
				
			||||||
        String url = this.host + "/api/tags";
 | 
					        String url = this.host + "/api/tags";
 | 
				
			||||||
        HttpClient httpClient = HttpClient.newHttpClient();
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpRequest httpRequest =
 | 
					        HttpRequest httpRequest = getRequestBuilderDefault(new URI(url)).header("Accept", "application/json").header("Content-type", "application/json").GET().build();
 | 
				
			||||||
                getRequestBuilderDefault(new URI(url))
 | 
					        HttpResponse<String> response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
                        .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                        .header("Content-type", "application/json")
 | 
					 | 
				
			||||||
                        .GET()
 | 
					 | 
				
			||||||
                        .build();
 | 
					 | 
				
			||||||
        HttpResponse<String> response =
 | 
					 | 
				
			||||||
                httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
 | 
					 | 
				
			||||||
        int statusCode = response.statusCode();
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
        String responseString = response.body();
 | 
					        String responseString = response.body();
 | 
				
			||||||
        if (statusCode == 200) {
 | 
					        if (statusCode == 200) {
 | 
				
			||||||
            return Utils.getObjectMapper()
 | 
					            return Utils.getObjectMapper().readValue(responseString, ListModelsResponse.class).getModels();
 | 
				
			||||||
                    .readValue(responseString, ListModelsResponse.class)
 | 
					 | 
				
			||||||
                    .getModels();
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            throw new OllamaBaseException(statusCode + " - " + responseString);
 | 
					            throw new OllamaBaseException(statusCode + " - " + responseString);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Retrieves a list of models from the Ollama library. This method fetches the available models directly from Ollama
 | 
				
			||||||
 | 
					     * library page, including model details such as the name, pull count, popular tags, tag count, and the time when model was updated.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return A list of {@link LibraryModel} objects representing the models available in the Ollama library.
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  If the HTTP request fails or the response is not successful (non-200 status code).
 | 
				
			||||||
 | 
					     * @throws IOException          If an I/O error occurs during the HTTP request or response processing.
 | 
				
			||||||
 | 
					     * @throws InterruptedException If the thread executing the request is interrupted.
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   If there is an error creating the URI for the HTTP request.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public List<LibraryModel> listModelsFromLibrary() throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
 | 
				
			||||||
 | 
					        String url = "https://ollama.com/library";
 | 
				
			||||||
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
 | 
					        HttpRequest httpRequest = getRequestBuilderDefault(new URI(url)).header("Accept", "application/json").header("Content-type", "application/json").GET().build();
 | 
				
			||||||
 | 
					        HttpResponse<String> response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
 | 
					        String responseString = response.body();
 | 
				
			||||||
 | 
					        List<LibraryModel> models = new ArrayList<>();
 | 
				
			||||||
 | 
					        if (statusCode == 200) {
 | 
				
			||||||
 | 
					            Document doc = Jsoup.parse(responseString);
 | 
				
			||||||
 | 
					            Elements modelSections = doc.selectXpath("//*[@id='repo']/ul/li/a");
 | 
				
			||||||
 | 
					            for (Element e : modelSections) {
 | 
				
			||||||
 | 
					                LibraryModel model = new LibraryModel();
 | 
				
			||||||
 | 
					                Elements names = e.select("div > h2 > div > span");
 | 
				
			||||||
 | 
					                Elements desc = e.select("div > p");
 | 
				
			||||||
 | 
					                Elements pullCounts = e.select("div:nth-of-type(2) > p > span:first-of-type > span:first-of-type");
 | 
				
			||||||
 | 
					                Elements popularTags = e.select("div > div > span");
 | 
				
			||||||
 | 
					                Elements totalTags = e.select("div:nth-of-type(2) > p > span:nth-of-type(2) > span:first-of-type");
 | 
				
			||||||
 | 
					                Elements lastUpdatedTime = e.select("div:nth-of-type(2) > p > span:nth-of-type(3) > span:nth-of-type(2)");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (names.first() == null || names.isEmpty()) {
 | 
				
			||||||
 | 
					                    // if name cannot be extracted, skip.
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Optional.ofNullable(names.first()).map(Element::text).ifPresent(model::setName);
 | 
				
			||||||
 | 
					                model.setDescription(Optional.ofNullable(desc.first()).map(Element::text).orElse(""));
 | 
				
			||||||
 | 
					                model.setPopularTags(Optional.of(popularTags).map(tags -> tags.stream().map(Element::text).collect(Collectors.toList())).orElse(new ArrayList<>()));
 | 
				
			||||||
 | 
					                model.setPullCount(Optional.ofNullable(pullCounts.first()).map(Element::text).orElse(""));
 | 
				
			||||||
 | 
					                model.setTotalTags(Optional.ofNullable(totalTags.first()).map(Element::text).map(Integer::parseInt).orElse(0));
 | 
				
			||||||
 | 
					                model.setLastUpdated(Optional.ofNullable(lastUpdatedTime.first()).map(Element::text).orElse(""));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                models.add(model);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return models;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            throw new OllamaBaseException(statusCode + " - " + responseString);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Fetches the tags associated with a specific model from Ollama library.
 | 
				
			||||||
 | 
					     * This method fetches the available model tags directly from Ollama library model page, including model tag name, size and time when model was last updated
 | 
				
			||||||
 | 
					     * into a list of {@link LibraryModelTag} objects.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param libraryModel the {@link LibraryModel} object which contains the name of the library model
 | 
				
			||||||
 | 
					     *                     for which the tags need to be fetched.
 | 
				
			||||||
 | 
					     * @return a list of {@link LibraryModelTag} objects containing the extracted tags and their associated metadata.
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the HTTP response status code indicates an error (i.e., not 200 OK),
 | 
				
			||||||
 | 
					     *                              or if there is any other issue during the request or response processing.
 | 
				
			||||||
 | 
					     * @throws IOException          if an input/output exception occurs during the HTTP request or response handling.
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the thread is interrupted while waiting for the HTTP response.
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI format is incorrect or invalid.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public LibraryModelDetail getLibraryModelDetails(LibraryModel libraryModel) throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
 | 
				
			||||||
 | 
					        String url = String.format("https://ollama.com/library/%s/tags", libraryModel.getName());
 | 
				
			||||||
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
 | 
					        HttpRequest httpRequest = getRequestBuilderDefault(new URI(url)).header("Accept", "application/json").header("Content-type", "application/json").GET().build();
 | 
				
			||||||
 | 
					        HttpResponse<String> response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
 | 
					        String responseString = response.body();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        List<LibraryModelTag> libraryModelTags = new ArrayList<>();
 | 
				
			||||||
 | 
					        if (statusCode == 200) {
 | 
				
			||||||
 | 
					            Document doc = Jsoup.parse(responseString);
 | 
				
			||||||
 | 
					            Elements tagSections = doc.select("html > body > main > div > section > div > div > div:nth-child(n+2) > div");
 | 
				
			||||||
 | 
					            for (Element e : tagSections) {
 | 
				
			||||||
 | 
					                Elements tags = e.select("div > a > div");
 | 
				
			||||||
 | 
					                Elements tagsMetas = e.select("div > span");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                LibraryModelTag libraryModelTag = new LibraryModelTag();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (tags.first() == null || tags.isEmpty()) {
 | 
				
			||||||
 | 
					                    // if tag cannot be extracted, skip.
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                libraryModelTag.setName(libraryModel.getName());
 | 
				
			||||||
 | 
					                Optional.ofNullable(tags.first()).map(Element::text).ifPresent(libraryModelTag::setTag);
 | 
				
			||||||
 | 
					                libraryModelTag.setSize(Optional.ofNullable(tagsMetas.first()).map(element -> element.text().split("•")).filter(parts -> parts.length > 1).map(parts -> parts[1].trim()).orElse(""));
 | 
				
			||||||
 | 
					                libraryModelTag.setLastUpdated(Optional.ofNullable(tagsMetas.first()).map(element -> element.text().split("•")).filter(parts -> parts.length > 1).map(parts -> parts[2].trim()).orElse(""));
 | 
				
			||||||
 | 
					                libraryModelTags.add(libraryModelTag);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            LibraryModelDetail libraryModelDetail = new LibraryModelDetail();
 | 
				
			||||||
 | 
					            libraryModelDetail.setModel(libraryModel);
 | 
				
			||||||
 | 
					            libraryModelDetail.setTags(libraryModelTags);
 | 
				
			||||||
 | 
					            return libraryModelDetail;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            throw new OllamaBaseException(statusCode + " - " + responseString);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Finds a specific model using model name and tag from Ollama library.
 | 
				
			||||||
 | 
					     * <p>
 | 
				
			||||||
 | 
					     * This method retrieves the model from the Ollama library by its name, then fetches its tags.
 | 
				
			||||||
 | 
					     * It searches through the tags of the model to find one that matches the specified tag name.
 | 
				
			||||||
 | 
					     * If the model or the tag is not found, it throws a {@link NoSuchElementException}.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param modelName The name of the model to search for in the library.
 | 
				
			||||||
 | 
					     * @param tag       The tag name to search for within the specified model.
 | 
				
			||||||
 | 
					     * @return The {@link LibraryModelTag} associated with the specified model and tag.
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException    If there is a problem with the Ollama library operations.
 | 
				
			||||||
 | 
					     * @throws IOException            If an I/O error occurs during the operation.
 | 
				
			||||||
 | 
					     * @throws URISyntaxException     If there is an error with the URI syntax.
 | 
				
			||||||
 | 
					     * @throws InterruptedException   If the operation is interrupted.
 | 
				
			||||||
 | 
					     * @throws NoSuchElementException If the model or the tag is not found.
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public LibraryModelTag findModelTagFromLibrary(String modelName, String tag) throws OllamaBaseException, IOException, URISyntaxException, InterruptedException {
 | 
				
			||||||
 | 
					        List<LibraryModel> libraryModels = this.listModelsFromLibrary();
 | 
				
			||||||
 | 
					        LibraryModel libraryModel = libraryModels.stream().filter(model -> model.getName().equals(modelName)).findFirst().orElseThrow(() -> new NoSuchElementException(String.format("Model by name '%s' not found", modelName)));
 | 
				
			||||||
 | 
					        LibraryModelDetail libraryModelDetail = this.getLibraryModelDetails(libraryModel);
 | 
				
			||||||
 | 
					        LibraryModelTag libraryModelTag = libraryModelDetail.getTags().stream().filter(tagName -> tagName.getTag().equals(tag)).findFirst().orElseThrow(() -> new NoSuchElementException(String.format("Tag '%s' for model '%s' not found", tag, modelName)));
 | 
				
			||||||
 | 
					        return libraryModelTag;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Pull a model on the Ollama server from the list of <a
 | 
					     * Pull a model on the Ollama server from the list of <a
 | 
				
			||||||
     * href="https://ollama.ai/library">available models</a>.
 | 
					     * href="https://ollama.ai/library">available models</a>.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param modelName the name of the model
 | 
					     * @param modelName the name of the model
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void pullModel(String modelName)
 | 
					    public void pullModel(String modelName) throws OllamaBaseException, IOException, URISyntaxException, InterruptedException {
 | 
				
			||||||
            throws OllamaBaseException, IOException, URISyntaxException, InterruptedException {
 | 
					 | 
				
			||||||
        String url = this.host + "/api/pull";
 | 
					        String url = this.host + "/api/pull";
 | 
				
			||||||
        String jsonData = new ModelRequest(modelName).toString();
 | 
					        String jsonData = new ModelRequest(modelName).toString();
 | 
				
			||||||
        HttpRequest request =
 | 
					        HttpRequest request = getRequestBuilderDefault(new URI(url)).POST(HttpRequest.BodyPublishers.ofString(jsonData)).header("Accept", "application/json").header("Content-type", "application/json").build();
 | 
				
			||||||
                getRequestBuilderDefault(new URI(url))
 | 
					 | 
				
			||||||
                        .POST(HttpRequest.BodyPublishers.ofString(jsonData))
 | 
					 | 
				
			||||||
                        .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                        .header("Content-type", "application/json")
 | 
					 | 
				
			||||||
                        .build();
 | 
					 | 
				
			||||||
        HttpClient client = HttpClient.newHttpClient();
 | 
					        HttpClient client = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpResponse<InputStream> response =
 | 
					        HttpResponse<InputStream> response = client.send(request, HttpResponse.BodyHandlers.ofInputStream());
 | 
				
			||||||
                client.send(request, HttpResponse.BodyHandlers.ofInputStream());
 | 
					 | 
				
			||||||
        int statusCode = response.statusCode();
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
        InputStream responseBodyStream = response.body();
 | 
					        InputStream responseBodyStream = response.body();
 | 
				
			||||||
        String responseString = "";
 | 
					        String responseString = "";
 | 
				
			||||||
        try (BufferedReader reader =
 | 
					        try (BufferedReader reader = new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
 | 
				
			||||||
                     new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
 | 
					 | 
				
			||||||
            String line;
 | 
					            String line;
 | 
				
			||||||
            while ((line = reader.readLine()) != null) {
 | 
					            while ((line = reader.readLine()) != null) {
 | 
				
			||||||
                ModelPullResponse modelPullResponse =
 | 
					                ModelPullResponse modelPullResponse = Utils.getObjectMapper().readValue(line, ModelPullResponse.class);
 | 
				
			||||||
                        Utils.getObjectMapper().readValue(line, ModelPullResponse.class);
 | 
					 | 
				
			||||||
                if (verbose) {
 | 
					                if (verbose) {
 | 
				
			||||||
                    logger.info(modelPullResponse.getStatus());
 | 
					                    logger.info(modelPullResponse.getStatus());
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@@ -208,22 +327,37 @@ public class OllamaAPI {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Pulls a model using the specified Ollama library model tag.
 | 
				
			||||||
 | 
					     * The model is identified by a name and a tag, which are combined into a single identifier
 | 
				
			||||||
 | 
					     * in the format "name:tag" to pull the corresponding model.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param libraryModelTag the {@link LibraryModelTag} object containing the name and tag
 | 
				
			||||||
 | 
					     *                        of the model to be pulled.
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void pullModel(LibraryModelTag libraryModelTag) throws OllamaBaseException, IOException, URISyntaxException, InterruptedException {
 | 
				
			||||||
 | 
					        String tagToPull = String.format("%s:%s", libraryModelTag.getName(), libraryModelTag.getTag());
 | 
				
			||||||
 | 
					        pullModel(tagToPull);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Gets model details from the Ollama server.
 | 
					     * Gets model details from the Ollama server.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param modelName the model
 | 
					     * @param modelName the model
 | 
				
			||||||
     * @return the model details
 | 
					     * @return the model details
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public ModelDetail getModelDetails(String modelName)
 | 
					    public ModelDetail getModelDetails(String modelName) throws IOException, OllamaBaseException, InterruptedException, URISyntaxException {
 | 
				
			||||||
            throws IOException, OllamaBaseException, InterruptedException, URISyntaxException {
 | 
					 | 
				
			||||||
        String url = this.host + "/api/show";
 | 
					        String url = this.host + "/api/show";
 | 
				
			||||||
        String jsonData = new ModelRequest(modelName).toString();
 | 
					        String jsonData = new ModelRequest(modelName).toString();
 | 
				
			||||||
        HttpRequest request =
 | 
					        HttpRequest request = getRequestBuilderDefault(new URI(url)).header("Accept", "application/json").header("Content-type", "application/json").POST(HttpRequest.BodyPublishers.ofString(jsonData)).build();
 | 
				
			||||||
                getRequestBuilderDefault(new URI(url))
 | 
					 | 
				
			||||||
                        .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                        .header("Content-type", "application/json")
 | 
					 | 
				
			||||||
                        .POST(HttpRequest.BodyPublishers.ofString(jsonData))
 | 
					 | 
				
			||||||
                        .build();
 | 
					 | 
				
			||||||
        HttpClient client = HttpClient.newHttpClient();
 | 
					        HttpClient client = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
					        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
        int statusCode = response.statusCode();
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
@@ -241,17 +375,15 @@ public class OllamaAPI {
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param modelName     the name of the custom model to be created.
 | 
					     * @param modelName     the name of the custom model to be created.
 | 
				
			||||||
     * @param modelFilePath the path to model file that exists on the Ollama server.
 | 
					     * @param modelFilePath the path to model file that exists on the Ollama server.
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void createModelWithFilePath(String modelName, String modelFilePath)
 | 
					    public void createModelWithFilePath(String modelName, String modelFilePath) throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
 | 
				
			||||||
            throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
 | 
					 | 
				
			||||||
        String url = this.host + "/api/create";
 | 
					        String url = this.host + "/api/create";
 | 
				
			||||||
        String jsonData = new CustomModelFilePathRequest(modelName, modelFilePath).toString();
 | 
					        String jsonData = new CustomModelFilePathRequest(modelName, modelFilePath).toString();
 | 
				
			||||||
        HttpRequest request =
 | 
					        HttpRequest request = getRequestBuilderDefault(new URI(url)).header("Accept", "application/json").header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8)).build();
 | 
				
			||||||
                getRequestBuilderDefault(new URI(url))
 | 
					 | 
				
			||||||
                        .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                        .header("Content-Type", "application/json")
 | 
					 | 
				
			||||||
                        .POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
 | 
					 | 
				
			||||||
                        .build();
 | 
					 | 
				
			||||||
        HttpClient client = HttpClient.newHttpClient();
 | 
					        HttpClient client = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
					        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
        int statusCode = response.statusCode();
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
@@ -275,17 +407,15 @@ public class OllamaAPI {
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param modelName         the name of the custom model to be created.
 | 
					     * @param modelName         the name of the custom model to be created.
 | 
				
			||||||
     * @param modelFileContents the path to model file that exists on the Ollama server.
 | 
					     * @param modelFileContents the path to model file that exists on the Ollama server.
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void createModelWithModelFileContents(String modelName, String modelFileContents)
 | 
					    public void createModelWithModelFileContents(String modelName, String modelFileContents) throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
 | 
				
			||||||
            throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
 | 
					 | 
				
			||||||
        String url = this.host + "/api/create";
 | 
					        String url = this.host + "/api/create";
 | 
				
			||||||
        String jsonData = new CustomModelFileContentsRequest(modelName, modelFileContents).toString();
 | 
					        String jsonData = new CustomModelFileContentsRequest(modelName, modelFileContents).toString();
 | 
				
			||||||
        HttpRequest request =
 | 
					        HttpRequest request = getRequestBuilderDefault(new URI(url)).header("Accept", "application/json").header("Content-Type", "application/json").POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8)).build();
 | 
				
			||||||
                getRequestBuilderDefault(new URI(url))
 | 
					 | 
				
			||||||
                        .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                        .header("Content-Type", "application/json")
 | 
					 | 
				
			||||||
                        .POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
 | 
					 | 
				
			||||||
                        .build();
 | 
					 | 
				
			||||||
        HttpClient client = HttpClient.newHttpClient();
 | 
					        HttpClient client = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
					        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
        int statusCode = response.statusCode();
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
@@ -306,17 +436,15 @@ public class OllamaAPI {
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param modelName          the name of the model to be deleted.
 | 
					     * @param modelName          the name of the model to be deleted.
 | 
				
			||||||
     * @param ignoreIfNotPresent ignore errors if the specified model is not present on Ollama server.
 | 
					     * @param ignoreIfNotPresent ignore errors if the specified model is not present on Ollama server.
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void deleteModel(String modelName, boolean ignoreIfNotPresent)
 | 
					    public void deleteModel(String modelName, boolean ignoreIfNotPresent) throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
 | 
				
			||||||
            throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
 | 
					 | 
				
			||||||
        String url = this.host + "/api/delete";
 | 
					        String url = this.host + "/api/delete";
 | 
				
			||||||
        String jsonData = new ModelRequest(modelName).toString();
 | 
					        String jsonData = new ModelRequest(modelName).toString();
 | 
				
			||||||
        HttpRequest request =
 | 
					        HttpRequest request = getRequestBuilderDefault(new URI(url)).method("DELETE", HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8)).header("Accept", "application/json").header("Content-type", "application/json").build();
 | 
				
			||||||
                getRequestBuilderDefault(new URI(url))
 | 
					 | 
				
			||||||
                        .method("DELETE", HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
 | 
					 | 
				
			||||||
                        .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                        .header("Content-type", "application/json")
 | 
					 | 
				
			||||||
                        .build();
 | 
					 | 
				
			||||||
        HttpClient client = HttpClient.newHttpClient();
 | 
					        HttpClient client = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
					        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
        int statusCode = response.statusCode();
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
@@ -335,9 +463,13 @@ public class OllamaAPI {
 | 
				
			|||||||
     * @param model  name of model to generate embeddings from
 | 
					     * @param model  name of model to generate embeddings from
 | 
				
			||||||
     * @param prompt text to generate embeddings for
 | 
					     * @param prompt text to generate embeddings for
 | 
				
			||||||
     * @return embeddings
 | 
					     * @return embeddings
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @deprecated Use {@link #embed(String, List)} instead.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public List<Double> generateEmbeddings(String model, String prompt)
 | 
					    @Deprecated
 | 
				
			||||||
            throws IOException, InterruptedException, OllamaBaseException {
 | 
					    public List<Double> generateEmbeddings(String model, String prompt) throws IOException, InterruptedException, OllamaBaseException {
 | 
				
			||||||
        return generateEmbeddings(new OllamaEmbeddingsRequestModel(model, prompt));
 | 
					        return generateEmbeddings(new OllamaEmbeddingsRequestModel(model, prompt));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -346,28 +478,69 @@ public class OllamaAPI {
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     * @param modelRequest request for '/api/embeddings' endpoint
 | 
					     * @param modelRequest request for '/api/embeddings' endpoint
 | 
				
			||||||
     * @return embeddings
 | 
					     * @return embeddings
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @deprecated Use {@link #embed(OllamaEmbedRequestModel)} instead.
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
					    @Deprecated
 | 
				
			||||||
    public List<Double> generateEmbeddings(OllamaEmbeddingsRequestModel modelRequest) throws IOException, InterruptedException, OllamaBaseException {
 | 
					    public List<Double> generateEmbeddings(OllamaEmbeddingsRequestModel modelRequest) throws IOException, InterruptedException, OllamaBaseException {
 | 
				
			||||||
        URI uri = URI.create(this.host + "/api/embeddings");
 | 
					        URI uri = URI.create(this.host + "/api/embeddings");
 | 
				
			||||||
        String jsonData = modelRequest.toString();
 | 
					        String jsonData = modelRequest.toString();
 | 
				
			||||||
        HttpClient httpClient = HttpClient.newHttpClient();
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
        HttpRequest.Builder requestBuilder =
 | 
					        HttpRequest.Builder requestBuilder = getRequestBuilderDefault(uri).header("Accept", "application/json").POST(HttpRequest.BodyPublishers.ofString(jsonData));
 | 
				
			||||||
                getRequestBuilderDefault(uri)
 | 
					 | 
				
			||||||
                        .header("Accept", "application/json")
 | 
					 | 
				
			||||||
                        .POST(HttpRequest.BodyPublishers.ofString(jsonData));
 | 
					 | 
				
			||||||
        HttpRequest request = requestBuilder.build();
 | 
					        HttpRequest request = requestBuilder.build();
 | 
				
			||||||
        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
 | 
					        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
        int statusCode = response.statusCode();
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
        String responseBody = response.body();
 | 
					        String responseBody = response.body();
 | 
				
			||||||
        if (statusCode == 200) {
 | 
					        if (statusCode == 200) {
 | 
				
			||||||
            OllamaEmbeddingResponseModel embeddingResponse =
 | 
					            OllamaEmbeddingResponseModel embeddingResponse = Utils.getObjectMapper().readValue(responseBody, OllamaEmbeddingResponseModel.class);
 | 
				
			||||||
                    Utils.getObjectMapper().readValue(responseBody, OllamaEmbeddingResponseModel.class);
 | 
					 | 
				
			||||||
            return embeddingResponse.getEmbedding();
 | 
					            return embeddingResponse.getEmbedding();
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            throw new OllamaBaseException(statusCode + " - " + responseBody);
 | 
					            throw new OllamaBaseException(statusCode + " - " + responseBody);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Generate embeddings for a given text from a model
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param model  name of model to generate embeddings from
 | 
				
			||||||
 | 
					     * @param inputs text/s to generate embeddings for
 | 
				
			||||||
 | 
					     * @return embeddings
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public OllamaEmbedResponseModel embed(String model, List<String> inputs) throws IOException, InterruptedException, OllamaBaseException {
 | 
				
			||||||
 | 
					        return embed(new OllamaEmbedRequestModel(model, inputs));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Generate embeddings using a {@link OllamaEmbedRequestModel}.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param modelRequest request for '/api/embed' endpoint
 | 
				
			||||||
 | 
					     * @return embeddings
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public OllamaEmbedResponseModel embed(OllamaEmbedRequestModel modelRequest) throws IOException, InterruptedException, OllamaBaseException {
 | 
				
			||||||
 | 
					        URI uri = URI.create(this.host + "/api/embed");
 | 
				
			||||||
 | 
					        String jsonData = Utils.getObjectMapper().writeValueAsString(modelRequest);
 | 
				
			||||||
 | 
					        HttpClient httpClient = HttpClient.newHttpClient();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        HttpRequest request = HttpRequest.newBuilder(uri).header("Accept", "application/json").POST(HttpRequest.BodyPublishers.ofString(jsonData)).build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
 | 
				
			||||||
 | 
					        int statusCode = response.statusCode();
 | 
				
			||||||
 | 
					        String responseBody = response.body();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (statusCode == 200) {
 | 
				
			||||||
 | 
					            return Utils.getObjectMapper().readValue(responseBody, OllamaEmbedResponseModel.class);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            throw new OllamaBaseException(statusCode + " - " + responseBody);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Generate response for a question to a model running on Ollama server. This is a sync/blocking
 | 
					     * Generate response for a question to a model running on Ollama server. This is a sync/blocking
 | 
				
			||||||
@@ -380,9 +553,11 @@ public class OllamaAPI {
 | 
				
			|||||||
     *                      details on the options</a>
 | 
					     *                      details on the options</a>
 | 
				
			||||||
     * @param streamHandler optional callback consumer that will be applied every time a streamed response is received. If not set, the stream parameter of the request is set to false.
 | 
					     * @param streamHandler optional callback consumer that will be applied every time a streamed response is received. If not set, the stream parameter of the request is set to false.
 | 
				
			||||||
     * @return OllamaResult that includes response text and time taken for response
 | 
					     * @return OllamaResult that includes response text and time taken for response
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaResult generate(String model, String prompt, boolean raw, Options options, OllamaStreamHandler streamHandler)
 | 
					    public OllamaResult generate(String model, String prompt, boolean raw, Options options, OllamaStreamHandler streamHandler) throws OllamaBaseException, IOException, InterruptedException {
 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException {
 | 
					 | 
				
			||||||
        OllamaGenerateRequest ollamaRequestModel = new OllamaGenerateRequest(model, prompt);
 | 
					        OllamaGenerateRequest ollamaRequestModel = new OllamaGenerateRequest(model, prompt);
 | 
				
			||||||
        ollamaRequestModel.setRaw(raw);
 | 
					        ollamaRequestModel.setRaw(raw);
 | 
				
			||||||
        ollamaRequestModel.setOptions(options.getOptionsMap());
 | 
					        ollamaRequestModel.setOptions(options.getOptionsMap());
 | 
				
			||||||
@@ -399,13 +574,14 @@ public class OllamaAPI {
 | 
				
			|||||||
     * @param raw     In some cases, you may wish to bypass the templating system and provide a full prompt. In this case, you can use the raw parameter to disable templating. Also note that raw mode will not return a context.
 | 
					     * @param raw     In some cases, you may wish to bypass the templating system and provide a full prompt. In this case, you can use the raw parameter to disable templating. Also note that raw mode will not return a context.
 | 
				
			||||||
     * @param options Additional options or configurations to use when generating the response.
 | 
					     * @param options Additional options or configurations to use when generating the response.
 | 
				
			||||||
     * @return {@link OllamaResult}
 | 
					     * @return {@link OllamaResult}
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaResult generate(String model, String prompt, boolean raw, Options options)
 | 
					    public OllamaResult generate(String model, String prompt, boolean raw, Options options) throws OllamaBaseException, IOException, InterruptedException {
 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException {
 | 
					 | 
				
			||||||
        return generate(model, prompt, raw, options, null);
 | 
					        return generate(model, prompt, raw, options, null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Generates response using the specified AI model and prompt (in blocking mode), and then invokes a set of tools
 | 
					     * Generates response using the specified AI model and prompt (in blocking mode), and then invokes a set of tools
 | 
				
			||||||
     * on the generated response.
 | 
					     * on the generated response.
 | 
				
			||||||
@@ -414,13 +590,11 @@ public class OllamaAPI {
 | 
				
			|||||||
     * @param prompt  The input text or prompt to provide to the AI model.
 | 
					     * @param prompt  The input text or prompt to provide to the AI model.
 | 
				
			||||||
     * @param options Additional options or configurations to use when generating the response.
 | 
					     * @param options Additional options or configurations to use when generating the response.
 | 
				
			||||||
     * @return {@link OllamaToolsResult} An OllamaToolsResult object containing the response from the AI model and the results of invoking the tools on that output.
 | 
					     * @return {@link OllamaToolsResult} An OllamaToolsResult object containing the response from the AI model and the results of invoking the tools on that output.
 | 
				
			||||||
     * @throws OllamaBaseException  If there is an error related to the Ollama API or service.
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
     * @throws IOException          If there is an error related to input/output operations.
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
     * @throws InterruptedException If the method is interrupted while waiting for the AI model
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
     *                              to generate the response or for the tools to be invoked.
 | 
					 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaToolsResult generateWithTools(String model, String prompt, Options options)
 | 
					    public OllamaToolsResult generateWithTools(String model, String prompt, Options options) throws OllamaBaseException, IOException, InterruptedException, ToolInvocationException {
 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException, ToolInvocationException {
 | 
					 | 
				
			||||||
        boolean raw = true;
 | 
					        boolean raw = true;
 | 
				
			||||||
        OllamaToolsResult toolResult = new OllamaToolsResult();
 | 
					        OllamaToolsResult toolResult = new OllamaToolsResult();
 | 
				
			||||||
        Map<ToolFunctionCallSpec, Object> toolResults = new HashMap<>();
 | 
					        Map<ToolFunctionCallSpec, Object> toolResults = new HashMap<>();
 | 
				
			||||||
@@ -441,7 +615,6 @@ public class OllamaAPI {
 | 
				
			|||||||
        return toolResult;
 | 
					        return toolResult;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Generate response for a question to a model running on Ollama server and get a callback handle
 | 
					     * Generate response for a question to a model running on Ollama server and get a callback handle
 | 
				
			||||||
     * that can be used to check for status and get the response from the model later. This would be
 | 
					     * that can be used to check for status and get the response from the model later. This would be
 | 
				
			||||||
@@ -455,9 +628,7 @@ public class OllamaAPI {
 | 
				
			|||||||
        OllamaGenerateRequest ollamaRequestModel = new OllamaGenerateRequest(model, prompt);
 | 
					        OllamaGenerateRequest ollamaRequestModel = new OllamaGenerateRequest(model, prompt);
 | 
				
			||||||
        ollamaRequestModel.setRaw(raw);
 | 
					        ollamaRequestModel.setRaw(raw);
 | 
				
			||||||
        URI uri = URI.create(this.host + "/api/generate");
 | 
					        URI uri = URI.create(this.host + "/api/generate");
 | 
				
			||||||
        OllamaAsyncResultStreamer ollamaAsyncResultStreamer =
 | 
					        OllamaAsyncResultStreamer ollamaAsyncResultStreamer = new OllamaAsyncResultStreamer(getRequestBuilderDefault(uri), ollamaRequestModel, requestTimeoutSeconds);
 | 
				
			||||||
                new OllamaAsyncResultStreamer(
 | 
					 | 
				
			||||||
                        getRequestBuilderDefault(uri), ollamaRequestModel, requestTimeoutSeconds);
 | 
					 | 
				
			||||||
        ollamaAsyncResultStreamer.start();
 | 
					        ollamaAsyncResultStreamer.start();
 | 
				
			||||||
        return ollamaAsyncResultStreamer;
 | 
					        return ollamaAsyncResultStreamer;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -474,10 +645,11 @@ public class OllamaAPI {
 | 
				
			|||||||
     *                      details on the options</a>
 | 
					     *                      details on the options</a>
 | 
				
			||||||
     * @param streamHandler optional callback consumer that will be applied every time a streamed response is received. If not set, the stream parameter of the request is set to false.
 | 
					     * @param streamHandler optional callback consumer that will be applied every time a streamed response is received. If not set, the stream parameter of the request is set to false.
 | 
				
			||||||
     * @return OllamaResult that includes response text and time taken for response
 | 
					     * @return OllamaResult that includes response text and time taken for response
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaResult generateWithImageFiles(
 | 
					    public OllamaResult generateWithImageFiles(String model, String prompt, List<File> imageFiles, Options options, OllamaStreamHandler streamHandler) throws OllamaBaseException, IOException, InterruptedException {
 | 
				
			||||||
            String model, String prompt, List<File> imageFiles, Options options, OllamaStreamHandler streamHandler)
 | 
					 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException {
 | 
					 | 
				
			||||||
        List<String> images = new ArrayList<>();
 | 
					        List<String> images = new ArrayList<>();
 | 
				
			||||||
        for (File imageFile : imageFiles) {
 | 
					        for (File imageFile : imageFiles) {
 | 
				
			||||||
            images.add(encodeFileToBase64(imageFile));
 | 
					            images.add(encodeFileToBase64(imageFile));
 | 
				
			||||||
@@ -491,10 +663,12 @@ public class OllamaAPI {
 | 
				
			|||||||
     * Convenience method to call Ollama API without streaming responses.
 | 
					     * Convenience method to call Ollama API without streaming responses.
 | 
				
			||||||
     * <p>
 | 
					     * <p>
 | 
				
			||||||
     * Uses {@link #generateWithImageFiles(String, String, List, Options, OllamaStreamHandler)}
 | 
					     * Uses {@link #generateWithImageFiles(String, String, List, Options, OllamaStreamHandler)}
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaResult generateWithImageFiles(
 | 
					    public OllamaResult generateWithImageFiles(String model, String prompt, List<File> imageFiles, Options options) throws OllamaBaseException, IOException, InterruptedException {
 | 
				
			||||||
            String model, String prompt, List<File> imageFiles, Options options)
 | 
					 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException {
 | 
					 | 
				
			||||||
        return generateWithImageFiles(model, prompt, imageFiles, options, null);
 | 
					        return generateWithImageFiles(model, prompt, imageFiles, options, null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -510,10 +684,12 @@ public class OllamaAPI {
 | 
				
			|||||||
     *                      details on the options</a>
 | 
					     *                      details on the options</a>
 | 
				
			||||||
     * @param streamHandler optional callback consumer that will be applied every time a streamed response is received. If not set, the stream parameter of the request is set to false.
 | 
					     * @param streamHandler optional callback consumer that will be applied every time a streamed response is received. If not set, the stream parameter of the request is set to false.
 | 
				
			||||||
     * @return OllamaResult that includes response text and time taken for response
 | 
					     * @return OllamaResult that includes response text and time taken for response
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaResult generateWithImageURLs(
 | 
					    public OllamaResult generateWithImageURLs(String model, String prompt, List<String> imageURLs, Options options, OllamaStreamHandler streamHandler) throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
 | 
				
			||||||
            String model, String prompt, List<String> imageURLs, Options options, OllamaStreamHandler streamHandler)
 | 
					 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
 | 
					 | 
				
			||||||
        List<String> images = new ArrayList<>();
 | 
					        List<String> images = new ArrayList<>();
 | 
				
			||||||
        for (String imageURL : imageURLs) {
 | 
					        for (String imageURL : imageURLs) {
 | 
				
			||||||
            images.add(encodeByteArrayToBase64(Utils.loadImageBytesFromUrl(imageURL)));
 | 
					            images.add(encodeByteArrayToBase64(Utils.loadImageBytesFromUrl(imageURL)));
 | 
				
			||||||
@@ -527,14 +703,16 @@ public class OllamaAPI {
 | 
				
			|||||||
     * Convenience method to call Ollama API without streaming responses.
 | 
					     * Convenience method to call Ollama API without streaming responses.
 | 
				
			||||||
     * <p>
 | 
					     * <p>
 | 
				
			||||||
     * Uses {@link #generateWithImageURLs(String, String, List, Options, OllamaStreamHandler)}
 | 
					     * Uses {@link #generateWithImageURLs(String, String, List, Options, OllamaStreamHandler)}
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
 | 
					     * @throws URISyntaxException   if the URI for the request is malformed
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaResult generateWithImageURLs(String model, String prompt, List<String> imageURLs,
 | 
					    public OllamaResult generateWithImageURLs(String model, String prompt, List<String> imageURLs, Options options) throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
 | 
				
			||||||
                                              Options options)
 | 
					 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
 | 
					 | 
				
			||||||
        return generateWithImageURLs(model, prompt, imageURLs, options, null);
 | 
					        return generateWithImageURLs(model, prompt, imageURLs, options, null);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Ask a question to a model based on a given message stack (i.e. a chat history). Creates a synchronous call to the api
 | 
					     * Ask a question to a model based on a given message stack (i.e. a chat history). Creates a synchronous call to the api
 | 
				
			||||||
     * 'api/chat'.
 | 
					     * 'api/chat'.
 | 
				
			||||||
@@ -545,6 +723,9 @@ public class OllamaAPI {
 | 
				
			|||||||
     * @throws OllamaBaseException  any response code than 200 has been returned
 | 
					     * @throws OllamaBaseException  any response code than 200 has been returned
 | 
				
			||||||
     * @throws IOException          in case the responseStream can not be read
 | 
					     * @throws IOException          in case the responseStream can not be read
 | 
				
			||||||
     * @throws InterruptedException in case the server is not reachable or network issues happen
 | 
					     * @throws InterruptedException in case the server is not reachable or network issues happen
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaChatResult chat(String model, List<OllamaChatMessage> messages) throws OllamaBaseException, IOException, InterruptedException {
 | 
					    public OllamaChatResult chat(String model, List<OllamaChatMessage> messages) throws OllamaBaseException, IOException, InterruptedException {
 | 
				
			||||||
        OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(model);
 | 
					        OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(model);
 | 
				
			||||||
@@ -561,6 +742,9 @@ public class OllamaAPI {
 | 
				
			|||||||
     * @throws OllamaBaseException  any response code than 200 has been returned
 | 
					     * @throws OllamaBaseException  any response code than 200 has been returned
 | 
				
			||||||
     * @throws IOException          in case the responseStream can not be read
 | 
					     * @throws IOException          in case the responseStream can not be read
 | 
				
			||||||
     * @throws InterruptedException in case the server is not reachable or network issues happen
 | 
					     * @throws InterruptedException in case the server is not reachable or network issues happen
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaChatResult chat(OllamaChatRequest request) throws OllamaBaseException, IOException, InterruptedException {
 | 
					    public OllamaChatResult chat(OllamaChatRequest request) throws OllamaBaseException, IOException, InterruptedException {
 | 
				
			||||||
        return chat(request, null);
 | 
					        return chat(request, null);
 | 
				
			||||||
@@ -577,6 +761,9 @@ public class OllamaAPI {
 | 
				
			|||||||
     * @throws OllamaBaseException  any response code than 200 has been returned
 | 
					     * @throws OllamaBaseException  any response code than 200 has been returned
 | 
				
			||||||
     * @throws IOException          in case the responseStream can not be read
 | 
					     * @throws IOException          in case the responseStream can not be read
 | 
				
			||||||
     * @throws InterruptedException in case the server is not reachable or network issues happen
 | 
					     * @throws InterruptedException in case the server is not reachable or network issues happen
 | 
				
			||||||
 | 
					     * @throws OllamaBaseException  if the response indicates an error status
 | 
				
			||||||
 | 
					     * @throws IOException          if an I/O error occurs during the HTTP request
 | 
				
			||||||
 | 
					     * @throws InterruptedException if the operation is interrupted
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public OllamaChatResult chat(OllamaChatRequest request, OllamaStreamHandler streamHandler) throws OllamaBaseException, IOException, InterruptedException {
 | 
					    public OllamaChatResult chat(OllamaChatRequest request, OllamaStreamHandler streamHandler) throws OllamaBaseException, IOException, InterruptedException {
 | 
				
			||||||
        OllamaChatEndpointCaller requestCaller = new OllamaChatEndpointCaller(host, basicAuth, requestTimeoutSeconds, verbose);
 | 
					        OllamaChatEndpointCaller requestCaller = new OllamaChatEndpointCaller(host, basicAuth, requestTimeoutSeconds, verbose);
 | 
				
			||||||
@@ -594,6 +781,37 @@ public class OllamaAPI {
 | 
				
			|||||||
        toolRegistry.addFunction(toolSpecification.getFunctionName(), toolSpecification.getToolDefinition());
 | 
					        toolRegistry.addFunction(toolSpecification.getFunctionName(), toolSpecification.getToolDefinition());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Adds a custom role.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param roleName the name of the custom role to be added
 | 
				
			||||||
 | 
					     * @return the newly created OllamaChatMessageRole
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public OllamaChatMessageRole addCustomRole(String roleName) {
 | 
				
			||||||
 | 
					        return OllamaChatMessageRole.newCustomRole(roleName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Lists all available roles.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return a list of available OllamaChatMessageRole objects
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public List<OllamaChatMessageRole> listRoles() {
 | 
				
			||||||
 | 
					        return OllamaChatMessageRole.getRoles();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Retrieves a specific role by name.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param roleName the name of the role to retrieve
 | 
				
			||||||
 | 
					     * @return the OllamaChatMessageRole associated with the given name
 | 
				
			||||||
 | 
					     * @throws RoleNotFoundException if the role with the specified name does not exist
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public OllamaChatMessageRole getRole(String roleName) throws RoleNotFoundException {
 | 
				
			||||||
 | 
					        return OllamaChatMessageRole.getRole(roleName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // technical private methods //
 | 
					    // technical private methods //
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static String encodeFileToBase64(File file) throws IOException {
 | 
					    private static String encodeFileToBase64(File file) throws IOException {
 | 
				
			||||||
@@ -604,11 +822,8 @@ public class OllamaAPI {
 | 
				
			|||||||
        return Base64.getEncoder().encodeToString(bytes);
 | 
					        return Base64.getEncoder().encodeToString(bytes);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private OllamaResult generateSyncForOllamaRequestModel(
 | 
					    private OllamaResult generateSyncForOllamaRequestModel(OllamaGenerateRequest ollamaRequestModel, OllamaStreamHandler streamHandler) throws OllamaBaseException, IOException, InterruptedException {
 | 
				
			||||||
            OllamaGenerateRequest ollamaRequestModel, OllamaStreamHandler streamHandler)
 | 
					        OllamaGenerateEndpointCaller requestCaller = new OllamaGenerateEndpointCaller(host, basicAuth, requestTimeoutSeconds, verbose);
 | 
				
			||||||
            throws OllamaBaseException, IOException, InterruptedException {
 | 
					 | 
				
			||||||
        OllamaGenerateEndpointCaller requestCaller =
 | 
					 | 
				
			||||||
                new OllamaGenerateEndpointCaller(host, basicAuth, requestTimeoutSeconds, verbose);
 | 
					 | 
				
			||||||
        OllamaResult result;
 | 
					        OllamaResult result;
 | 
				
			||||||
        if (streamHandler != null) {
 | 
					        if (streamHandler != null) {
 | 
				
			||||||
            ollamaRequestModel.setStream(true);
 | 
					            ollamaRequestModel.setStream(true);
 | 
				
			||||||
@@ -626,10 +841,7 @@ public class OllamaAPI {
 | 
				
			|||||||
     * @return HttpRequest.Builder
 | 
					     * @return HttpRequest.Builder
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private HttpRequest.Builder getRequestBuilderDefault(URI uri) {
 | 
					    private HttpRequest.Builder getRequestBuilderDefault(URI uri) {
 | 
				
			||||||
        HttpRequest.Builder requestBuilder =
 | 
					        HttpRequest.Builder requestBuilder = HttpRequest.newBuilder(uri).header("Content-Type", "application/json").timeout(Duration.ofSeconds(requestTimeoutSeconds));
 | 
				
			||||||
                HttpRequest.newBuilder(uri)
 | 
					 | 
				
			||||||
                        .header("Content-Type", "application/json")
 | 
					 | 
				
			||||||
                        .timeout(Duration.ofSeconds(requestTimeoutSeconds));
 | 
					 | 
				
			||||||
        if (isBasicAuthCredentialsSet()) {
 | 
					        if (isBasicAuthCredentialsSet()) {
 | 
				
			||||||
            requestBuilder.header("Authorization", getBasicAuthHeaderValue());
 | 
					            requestBuilder.header("Authorization", getBasicAuthHeaderValue());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -655,7 +867,6 @@ public class OllamaAPI {
 | 
				
			|||||||
        return basicAuth != null;
 | 
					        return basicAuth != null;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    private Object invokeTool(ToolFunctionCallSpec toolFunctionCallSpec) throws ToolInvocationException {
 | 
					    private Object invokeTool(ToolFunctionCallSpec toolFunctionCallSpec) throws ToolInvocationException {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            String methodName = toolFunctionCallSpec.getName();
 | 
					            String methodName = toolFunctionCallSpec.getName();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,8 @@
 | 
				
			|||||||
 | 
					package io.github.ollama4j.exceptions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class RoleNotFoundException extends Exception {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public RoleNotFoundException(String s) {
 | 
				
			||||||
 | 
					        super(s);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 | 
				
			|||||||
import io.github.ollama4j.utils.FileToBase64Serializer;
 | 
					import io.github.ollama4j.utils.FileToBase64Serializer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lombok.AllArgsConstructor;
 | 
					import lombok.AllArgsConstructor;
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
import lombok.NoArgsConstructor;
 | 
					import lombok.NoArgsConstructor;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,19 +1,53 @@
 | 
				
			|||||||
package io.github.ollama4j.models.chat;
 | 
					package io.github.ollama4j.models.chat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.annotation.JsonValue;
 | 
					import com.fasterxml.jackson.annotation.JsonValue;
 | 
				
			||||||
 | 
					import io.github.ollama4j.exceptions.RoleNotFoundException;
 | 
				
			||||||
 | 
					import lombok.Getter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Defines the possible Chat Message roles.
 | 
					 * Defines the possible Chat Message roles.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public enum OllamaChatMessageRole {
 | 
					@Getter
 | 
				
			||||||
    SYSTEM("system"),
 | 
					public class OllamaChatMessageRole {
 | 
				
			||||||
    USER("user"),
 | 
					    private static final List<OllamaChatMessageRole> roles = new ArrayList<>();
 | 
				
			||||||
    ASSISTANT("assistant");
 | 
					
 | 
				
			||||||
 | 
					    public static final OllamaChatMessageRole SYSTEM = new OllamaChatMessageRole("system");
 | 
				
			||||||
 | 
					    public static final OllamaChatMessageRole USER = new OllamaChatMessageRole("user");
 | 
				
			||||||
 | 
					    public static final OllamaChatMessageRole ASSISTANT = new OllamaChatMessageRole("assistant");
 | 
				
			||||||
 | 
					    public static final OllamaChatMessageRole TOOL = new OllamaChatMessageRole("tool");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @JsonValue
 | 
					    @JsonValue
 | 
				
			||||||
    private String roleName;
 | 
					    private final String roleName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private OllamaChatMessageRole(String roleName){
 | 
					    private OllamaChatMessageRole(String roleName) {
 | 
				
			||||||
        this.roleName = roleName;
 | 
					        this.roleName = roleName;
 | 
				
			||||||
 | 
					        roles.add(this);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static OllamaChatMessageRole newCustomRole(String roleName) {
 | 
				
			||||||
 | 
					        OllamaChatMessageRole customRole = new OllamaChatMessageRole(roleName);
 | 
				
			||||||
 | 
					        roles.add(customRole);
 | 
				
			||||||
 | 
					        return customRole;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static List<OllamaChatMessageRole> getRoles() {
 | 
				
			||||||
 | 
					        return new ArrayList<>(roles);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static OllamaChatMessageRole getRole(String roleName) throws RoleNotFoundException {
 | 
				
			||||||
 | 
					        for (OllamaChatMessageRole role : roles) {
 | 
				
			||||||
 | 
					            if (role.roleName.equals(roleName)) {
 | 
				
			||||||
 | 
					                return role;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        throw new RoleNotFoundException("Invalid role name: " + roleName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String toString() {
 | 
				
			||||||
 | 
					        return roleName;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,10 @@
 | 
				
			|||||||
package io.github.ollama4j.models.chat;
 | 
					package io.github.ollama4j.models.chat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.github.ollama4j.utils.Options;
 | 
				
			||||||
 | 
					import io.github.ollama4j.utils.Utils;
 | 
				
			||||||
 | 
					import org.slf4j.Logger;
 | 
				
			||||||
 | 
					import org.slf4j.LoggerFactory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
import java.io.IOException;
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.net.URISyntaxException;
 | 
					import java.net.URISyntaxException;
 | 
				
			||||||
@@ -8,12 +13,6 @@ import java.util.ArrayList;
 | 
				
			|||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.slf4j.Logger;
 | 
					 | 
				
			||||||
import org.slf4j.LoggerFactory;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import io.github.ollama4j.utils.Options;
 | 
					 | 
				
			||||||
import io.github.ollama4j.utils.Utils;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Helper class for creating {@link OllamaChatRequest} objects using the builder-pattern.
 | 
					 * Helper class for creating {@link OllamaChatRequest} objects using the builder-pattern.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -21,88 +20,85 @@ public class OllamaChatRequestBuilder {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private static final Logger LOG = LoggerFactory.getLogger(OllamaChatRequestBuilder.class);
 | 
					    private static final Logger LOG = LoggerFactory.getLogger(OllamaChatRequestBuilder.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private OllamaChatRequestBuilder(String model, List<OllamaChatMessage> messages){
 | 
					    private OllamaChatRequestBuilder(String model, List<OllamaChatMessage> messages) {
 | 
				
			||||||
        request = new OllamaChatRequest(model, messages);
 | 
					        request = new OllamaChatRequest(model, messages);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private OllamaChatRequest request;
 | 
					    private OllamaChatRequest request;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static OllamaChatRequestBuilder getInstance(String model){
 | 
					    public static OllamaChatRequestBuilder getInstance(String model) {
 | 
				
			||||||
        return new OllamaChatRequestBuilder(model, new ArrayList<>());
 | 
					        return new OllamaChatRequestBuilder(model, new ArrayList<>());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequest build(){
 | 
					    public OllamaChatRequest build() {
 | 
				
			||||||
        return request;
 | 
					        return request;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void reset(){
 | 
					    public void reset() {
 | 
				
			||||||
        request = new OllamaChatRequest(request.getModel(), new ArrayList<>());
 | 
					        request = new OllamaChatRequest(request.getModel(), new ArrayList<>());
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequestBuilder withMessage(OllamaChatMessageRole role, String content, List<File> images){
 | 
					    public OllamaChatRequestBuilder withMessage(OllamaChatMessageRole role, String content, List<File> images) {
 | 
				
			||||||
        List<OllamaChatMessage> messages = this.request.getMessages();
 | 
					        List<OllamaChatMessage> messages = this.request.getMessages();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        List<byte[]> binaryImages = images.stream().map(file -> {
 | 
					        List<byte[]> binaryImages = images.stream().map(file -> {
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                return Files.readAllBytes(file.toPath());
 | 
					                return Files.readAllBytes(file.toPath());
 | 
				
			||||||
            } catch (IOException e) {
 | 
					            } catch (IOException e) {
 | 
				
			||||||
                LOG.warn(String.format("File '%s' could not be accessed, will not add to message!",file.toPath()), e);
 | 
					                LOG.warn("File '{}' could not be accessed, will not add to message!", file.toPath(), e);
 | 
				
			||||||
                return new byte[0];
 | 
					                return new byte[0];
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }).collect(Collectors.toList());
 | 
					        }).collect(Collectors.toList());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        messages.add(new OllamaChatMessage(role,content,binaryImages));
 | 
					        messages.add(new OllamaChatMessage(role, content, binaryImages));
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequestBuilder withMessage(OllamaChatMessageRole role, String content, String... imageUrls){
 | 
					    public OllamaChatRequestBuilder withMessage(OllamaChatMessageRole role, String content, String... imageUrls) {
 | 
				
			||||||
        List<OllamaChatMessage> messages = this.request.getMessages();
 | 
					        List<OllamaChatMessage> messages = this.request.getMessages();
 | 
				
			||||||
        List<byte[]> binaryImages = null;
 | 
					        List<byte[]> binaryImages = null;
 | 
				
			||||||
        if(imageUrls.length>0){
 | 
					        if (imageUrls.length > 0) {
 | 
				
			||||||
            binaryImages = new ArrayList<>();
 | 
					            binaryImages = new ArrayList<>();
 | 
				
			||||||
            for (String imageUrl : imageUrls) {
 | 
					            for (String imageUrl : imageUrls) {
 | 
				
			||||||
                try{
 | 
					                try {
 | 
				
			||||||
                    binaryImages.add(Utils.loadImageBytesFromUrl(imageUrl));
 | 
					                    binaryImages.add(Utils.loadImageBytesFromUrl(imageUrl));
 | 
				
			||||||
                }
 | 
					                } catch (URISyntaxException e) {
 | 
				
			||||||
                    catch (URISyntaxException e){
 | 
					                    LOG.warn("URL '{}' could not be accessed, will not add to message!", imageUrl, e);
 | 
				
			||||||
                        LOG.warn(String.format("URL '%s' could not be accessed, will not add to message!",imageUrl), e);
 | 
					                } catch (IOException e) {
 | 
				
			||||||
                }
 | 
					                    LOG.warn("Content of URL '{}' could not be read, will not add to message!", imageUrl, e);
 | 
				
			||||||
                catch (IOException e){
 | 
					 | 
				
			||||||
                    LOG.warn(String.format("Content of URL '%s' could not be read, will not add to message!",imageUrl), e);
 | 
					 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        messages.add(new OllamaChatMessage(role,content,binaryImages));
 | 
					        messages.add(new OllamaChatMessage(role, content, binaryImages));
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequestBuilder withMessages(List<OllamaChatMessage> messages){
 | 
					    public OllamaChatRequestBuilder withMessages(List<OllamaChatMessage> messages) {
 | 
				
			||||||
        this.request.getMessages().addAll(messages);
 | 
					        return new OllamaChatRequestBuilder(request.getModel(), messages);
 | 
				
			||||||
        return this;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequestBuilder withOptions(Options options){
 | 
					    public OllamaChatRequestBuilder withOptions(Options options) {
 | 
				
			||||||
        this.request.setOptions(options.getOptionsMap());
 | 
					        this.request.setOptions(options.getOptionsMap());
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequestBuilder withGetJsonResponse(){
 | 
					    public OllamaChatRequestBuilder withGetJsonResponse() {
 | 
				
			||||||
        this.request.setReturnFormatJson(true);
 | 
					        this.request.setReturnFormatJson(true);
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequestBuilder withTemplate(String template){
 | 
					    public OllamaChatRequestBuilder withTemplate(String template) {
 | 
				
			||||||
        this.request.setTemplate(template);
 | 
					        this.request.setTemplate(template);
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequestBuilder withStreaming(){
 | 
					    public OllamaChatRequestBuilder withStreaming() {
 | 
				
			||||||
        this.request.setStream(true);
 | 
					        this.request.setStream(true);
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatRequestBuilder withKeepAlive(String keepAlive){
 | 
					    public OllamaChatRequestBuilder withKeepAlive(String keepAlive) {
 | 
				
			||||||
        this.request.setKeepAlive(keepAlive);
 | 
					        this.request.setKeepAlive(keepAlive);
 | 
				
			||||||
        return this;
 | 
					        return this;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,12 +8,11 @@ import io.github.ollama4j.models.response.OllamaResult;
 | 
				
			|||||||
 * Specific chat-API result that contains the chat history sent to the model and appends the answer as {@link OllamaChatResult} given by the
 | 
					 * Specific chat-API result that contains the chat history sent to the model and appends the answer as {@link OllamaChatResult} given by the
 | 
				
			||||||
 * {@link OllamaChatMessageRole#ASSISTANT} role.
 | 
					 * {@link OllamaChatMessageRole#ASSISTANT} role.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class OllamaChatResult extends OllamaResult{
 | 
					public class OllamaChatResult extends OllamaResult {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private List<OllamaChatMessage> chatHistory;
 | 
					    private List<OllamaChatMessage> chatHistory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public OllamaChatResult(String response, long responseTime, int httpStatusCode,
 | 
					    public OllamaChatResult(String response, long responseTime, int httpStatusCode, List<OllamaChatMessage> chatHistory) {
 | 
				
			||||||
            List<OllamaChatMessage> chatHistory) {
 | 
					 | 
				
			||||||
        super(response, responseTime, httpStatusCode);
 | 
					        super(response, responseTime, httpStatusCode);
 | 
				
			||||||
        this.chatHistory = chatHistory;
 | 
					        this.chatHistory = chatHistory;
 | 
				
			||||||
        appendAnswerToChatHistory(response);
 | 
					        appendAnswerToChatHistory(response);
 | 
				
			||||||
@@ -23,10 +22,8 @@ public class OllamaChatResult extends OllamaResult{
 | 
				
			|||||||
        return chatHistory;
 | 
					        return chatHistory;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private void appendAnswerToChatHistory(String answer){
 | 
					    private void appendAnswerToChatHistory(String answer) {
 | 
				
			||||||
        OllamaChatMessage assistantMessage = new OllamaChatMessage(OllamaChatMessageRole.ASSISTANT, answer);
 | 
					        OllamaChatMessage assistantMessage = new OllamaChatMessage(OllamaChatMessageRole.ASSISTANT, answer);
 | 
				
			||||||
        this.chatHistory.add(assistantMessage);
 | 
					        this.chatHistory.add(assistantMessage);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					package io.github.ollama4j.models.embeddings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.github.ollama4j.utils.Options;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Builderclass to easily create Requests for Embedding models using ollama.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class OllamaEmbedRequestBuilder {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final OllamaEmbedRequestModel request;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private OllamaEmbedRequestBuilder(String model, List<String> input) {
 | 
				
			||||||
 | 
					        this.request = new OllamaEmbedRequestModel(model,input);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static OllamaEmbedRequestBuilder getInstance(String model, String... input){
 | 
				
			||||||
 | 
					        return new OllamaEmbedRequestBuilder(model, List.of(input));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public OllamaEmbedRequestBuilder withOptions(Options options){
 | 
				
			||||||
 | 
					        this.request.setOptions(options.getOptionsMap());
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public OllamaEmbedRequestBuilder withKeepAlive(String keepAlive){
 | 
				
			||||||
 | 
					        this.request.setKeepAlive(keepAlive);
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public OllamaEmbedRequestBuilder withoutTruncate(){
 | 
				
			||||||
 | 
					        this.request.setTruncate(false);
 | 
				
			||||||
 | 
					        return this;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public OllamaEmbedRequestModel build() {
 | 
				
			||||||
 | 
					        return this.request;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,41 @@
 | 
				
			|||||||
 | 
					package io.github.ollama4j.models.embeddings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonProperty;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.core.JsonProcessingException;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					import lombok.NoArgsConstructor;
 | 
				
			||||||
 | 
					import lombok.NonNull;
 | 
				
			||||||
 | 
					import lombok.RequiredArgsConstructor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static io.github.ollama4j.utils.Utils.getObjectMapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
 | 
					@NoArgsConstructor
 | 
				
			||||||
 | 
					public class OllamaEmbedRequestModel {
 | 
				
			||||||
 | 
					    @NonNull
 | 
				
			||||||
 | 
					    private String model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @NonNull
 | 
				
			||||||
 | 
					    private List<String> input;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private Map<String, Object> options;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty(value = "keep_alive")
 | 
				
			||||||
 | 
					    private String keepAlive;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty(value = "truncate")
 | 
				
			||||||
 | 
					    private Boolean truncate = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public String toString() {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
 | 
				
			||||||
 | 
					        } catch (JsonProcessingException e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,25 @@
 | 
				
			|||||||
 | 
					package io.github.ollama4j.models.embeddings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonProperty;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@SuppressWarnings("unused")
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class OllamaEmbedResponseModel {
 | 
				
			||||||
 | 
					    @JsonProperty("model")
 | 
				
			||||||
 | 
					    private String model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("embeddings")
 | 
				
			||||||
 | 
					    private List<List<Double>> embeddings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("total_duration")
 | 
				
			||||||
 | 
					    private long totalDuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("load_duration")
 | 
				
			||||||
 | 
					    private long loadDuration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("prompt_eval_count")
 | 
				
			||||||
 | 
					    private int promptEvalCount;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -7,6 +7,7 @@ import lombok.Data;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@SuppressWarnings("unused")
 | 
					@SuppressWarnings("unused")
 | 
				
			||||||
@Data
 | 
					@Data
 | 
				
			||||||
 | 
					@Deprecated(since="1.0.90")
 | 
				
			||||||
public class OllamaEmbeddingResponseModel {
 | 
					public class OllamaEmbeddingResponseModel {
 | 
				
			||||||
    @JsonProperty("embedding")
 | 
					    @JsonProperty("embedding")
 | 
				
			||||||
    private List<Double> embedding;
 | 
					    private List<Double> embedding;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,7 @@ package io.github.ollama4j.models.embeddings;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import io.github.ollama4j.utils.Options;
 | 
					import io.github.ollama4j.utils.Options;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Deprecated(since="1.0.90")
 | 
				
			||||||
public class OllamaEmbeddingsRequestBuilder {
 | 
					public class OllamaEmbeddingsRequestBuilder {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private OllamaEmbeddingsRequestBuilder(String model, String prompt){
 | 
					    private OllamaEmbeddingsRequestBuilder(String model, String prompt){
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,7 @@ import lombok.RequiredArgsConstructor;
 | 
				
			|||||||
@Data
 | 
					@Data
 | 
				
			||||||
@RequiredArgsConstructor
 | 
					@RequiredArgsConstructor
 | 
				
			||||||
@NoArgsConstructor
 | 
					@NoArgsConstructor
 | 
				
			||||||
 | 
					@Deprecated(since="1.0.90")
 | 
				
			||||||
public class OllamaEmbeddingsRequestModel {
 | 
					public class OllamaEmbeddingsRequestModel {
 | 
				
			||||||
  @NonNull
 | 
					  @NonNull
 | 
				
			||||||
  private String model;
 | 
					  private String model;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,7 @@
 | 
				
			|||||||
package io.github.ollama4j.models.ps;
 | 
					package io.github.ollama4j.models.ps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonProperty;
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
import lombok.NoArgsConstructor;
 | 
					import lombok.NoArgsConstructor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -7,29 +9,55 @@ import java.util.List;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Data
 | 
					@Data
 | 
				
			||||||
@NoArgsConstructor
 | 
					@NoArgsConstructor
 | 
				
			||||||
 | 
					@JsonIgnoreProperties(ignoreUnknown = true)
 | 
				
			||||||
public class ModelsProcessResponse {
 | 
					public class ModelsProcessResponse {
 | 
				
			||||||
 | 
					    @JsonProperty("models")
 | 
				
			||||||
    private List<ModelProcess> models;
 | 
					    private List<ModelProcess> models;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Data
 | 
					    @Data
 | 
				
			||||||
    @NoArgsConstructor
 | 
					    @NoArgsConstructor
 | 
				
			||||||
    public static class ModelProcess {
 | 
					    public static class ModelProcess {
 | 
				
			||||||
 | 
					        @JsonProperty("name")
 | 
				
			||||||
        private String name;
 | 
					        private String name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("model")
 | 
				
			||||||
        private String model;
 | 
					        private String model;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("size")
 | 
				
			||||||
        private long size;
 | 
					        private long size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("digest")
 | 
				
			||||||
        private String digest;
 | 
					        private String digest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("details")
 | 
				
			||||||
        private ModelDetails details;
 | 
					        private ModelDetails details;
 | 
				
			||||||
        private String expiresAt;
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("expires_at")
 | 
				
			||||||
 | 
					        private String expiresAt; // Consider using LocalDateTime if you need to process date/time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("size_vram")
 | 
				
			||||||
        private long sizeVram;
 | 
					        private long sizeVram;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Data
 | 
					    @Data
 | 
				
			||||||
    @NoArgsConstructor
 | 
					    @NoArgsConstructor
 | 
				
			||||||
    public static class ModelDetails {
 | 
					    public static class ModelDetails {
 | 
				
			||||||
 | 
					        @JsonProperty("parent_model")
 | 
				
			||||||
        private String parentModel;
 | 
					        private String parentModel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("format")
 | 
				
			||||||
        private String format;
 | 
					        private String format;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("family")
 | 
				
			||||||
        private String family;
 | 
					        private String family;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("families")
 | 
				
			||||||
        private List<String> families;
 | 
					        private List<String> families;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("parameter_size")
 | 
				
			||||||
        private String parameterSize;
 | 
					        private String parameterSize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @JsonProperty("quantization_level")
 | 
				
			||||||
        private String quantizationLevel;
 | 
					        private String quantizationLevel;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,9 @@
 | 
				
			|||||||
package io.github.ollama4j.models.request;
 | 
					package io.github.ollama4j.models.request;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.fasterxml.jackson.core.JsonProcessingException;
 | 
					import com.fasterxml.jackson.core.JsonProcessingException;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.core.type.TypeReference;
 | 
				
			||||||
import io.github.ollama4j.exceptions.OllamaBaseException;
 | 
					import io.github.ollama4j.exceptions.OllamaBaseException;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.chat.OllamaChatMessage;
 | 
				
			||||||
import io.github.ollama4j.models.response.OllamaResult;
 | 
					import io.github.ollama4j.models.response.OllamaResult;
 | 
				
			||||||
import io.github.ollama4j.models.chat.OllamaChatResponseModel;
 | 
					import io.github.ollama4j.models.chat.OllamaChatResponseModel;
 | 
				
			||||||
import io.github.ollama4j.models.chat.OllamaChatStreamObserver;
 | 
					import io.github.ollama4j.models.chat.OllamaChatStreamObserver;
 | 
				
			||||||
@@ -31,14 +33,30 @@ public class OllamaChatEndpointCaller extends OllamaEndpointCaller {
 | 
				
			|||||||
        return "/api/chat";
 | 
					        return "/api/chat";
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Parses streamed Response line from ollama chat.
 | 
				
			||||||
 | 
					     * Using {@link com.fasterxml.jackson.databind.ObjectMapper#readValue(String, TypeReference)} should throw
 | 
				
			||||||
 | 
					     * {@link IllegalArgumentException} in case of null line or {@link com.fasterxml.jackson.core.JsonParseException}
 | 
				
			||||||
 | 
					     * in case the JSON Object cannot be parsed to a {@link OllamaChatResponseModel}. Thus, the ResponseModel should
 | 
				
			||||||
 | 
					     * never be null.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param line streamed line of ollama stream response
 | 
				
			||||||
 | 
					     * @param responseBuffer Stringbuffer to add latest response message part to
 | 
				
			||||||
 | 
					     * @return TRUE, if ollama-Response has 'done' state
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    protected boolean parseResponseAndAddToBuffer(String line, StringBuilder responseBuffer) {
 | 
					    protected boolean parseResponseAndAddToBuffer(String line, StringBuilder responseBuffer) {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            OllamaChatResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaChatResponseModel.class);
 | 
					            OllamaChatResponseModel ollamaResponseModel = Utils.getObjectMapper().readValue(line, OllamaChatResponseModel.class);
 | 
				
			||||||
            responseBuffer.append(ollamaResponseModel.getMessage().getContent());
 | 
					            // it seems that under heavy load ollama responds with an empty chat message part in the streamed response
 | 
				
			||||||
 | 
					            // thus, we null check the message and hope that the next streamed response has some message content again
 | 
				
			||||||
 | 
					            OllamaChatMessage message = ollamaResponseModel.getMessage();
 | 
				
			||||||
 | 
					            if(message != null) {
 | 
				
			||||||
 | 
					                responseBuffer.append(message.getContent());
 | 
				
			||||||
                if (streamObserver != null) {
 | 
					                if (streamObserver != null) {
 | 
				
			||||||
                    streamObserver.notify(ollamaResponseModel);
 | 
					                    streamObserver.notify(ollamaResponseModel);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            return ollamaResponseModel.isDone();
 | 
					            return ollamaResponseModel.isDone();
 | 
				
			||||||
        } catch (JsonProcessingException e) {
 | 
					        } catch (JsonProcessingException e) {
 | 
				
			||||||
            LOG.error("Error parsing the Ollama chat response!", e);
 | 
					            LOG.error("Error parsing the Ollama chat response!", e);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,16 @@
 | 
				
			|||||||
 | 
					package io.github.ollama4j.models.response;
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class LibraryModel {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String name;
 | 
				
			||||||
 | 
					    private String description;
 | 
				
			||||||
 | 
					    private String pullCount;
 | 
				
			||||||
 | 
					    private int totalTags;
 | 
				
			||||||
 | 
					    private List<String> popularTags = new ArrayList<>();
 | 
				
			||||||
 | 
					    private String lastUpdated;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					package io.github.ollama4j.models.response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class LibraryModelDetail {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private LibraryModel model;
 | 
				
			||||||
 | 
					    private List<LibraryModelTag> tags;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					package io.github.ollama4j.models.response;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class LibraryModelTag {
 | 
				
			||||||
 | 
					    private String name;
 | 
				
			||||||
 | 
					    private String tag;
 | 
				
			||||||
 | 
					    private String size;
 | 
				
			||||||
 | 
					    private String lastUpdated;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -10,10 +10,9 @@ package io.github.ollama4j.types;
 | 
				
			|||||||
public class OllamaModelType {
 | 
					public class OllamaModelType {
 | 
				
			||||||
    public static final String GEMMA = "gemma";
 | 
					    public static final String GEMMA = "gemma";
 | 
				
			||||||
    public static final String GEMMA2 = "gemma2";
 | 
					    public static final String GEMMA2 = "gemma2";
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static final String LLAMA2 = "llama2";
 | 
					    public static final String LLAMA2 = "llama2";
 | 
				
			||||||
    public static final String LLAMA3 = "llama3";
 | 
					    public static final String LLAMA3 = "llama3";
 | 
				
			||||||
 | 
					    public static final String LLAMA3_1 = "llama3.1";
 | 
				
			||||||
    public static final String MISTRAL = "mistral";
 | 
					    public static final String MISTRAL = "mistral";
 | 
				
			||||||
    public static final String MIXTRAL = "mixtral";
 | 
					    public static final String MIXTRAL = "mixtral";
 | 
				
			||||||
    public static final String LLAVA = "llava";
 | 
					    public static final String LLAVA = "llava";
 | 
				
			||||||
@@ -33,7 +32,6 @@ public class OllamaModelType {
 | 
				
			|||||||
    public static final String ZEPHYR = "zephyr";
 | 
					    public static final String ZEPHYR = "zephyr";
 | 
				
			||||||
    public static final String OPENHERMES = "openhermes";
 | 
					    public static final String OPENHERMES = "openhermes";
 | 
				
			||||||
    public static final String QWEN = "qwen";
 | 
					    public static final String QWEN = "qwen";
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public static final String QWEN2 = "qwen2";
 | 
					    public static final String QWEN2 = "qwen2";
 | 
				
			||||||
    public static final String WIZARDCODER = "wizardcoder";
 | 
					    public static final String WIZARDCODER = "wizardcoder";
 | 
				
			||||||
    public static final String LLAMA2_CHINESE = "llama2-chinese";
 | 
					    public static final String LLAMA2_CHINESE = "llama2-chinese";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package io.github.ollama4j.utils;
 | 
					package io.github.ollama4j.utils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.util.HashMap;
 | 
					import java.util.HashMap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Builder class for creating options for Ollama model. */
 | 
					/** Builder class for creating options for Ollama model. */
 | 
				
			||||||
@@ -207,6 +208,34 @@ public class OptionsBuilder {
 | 
				
			|||||||
    return this;
 | 
					    return this;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Alternative to the top_p, and aims to ensure a balance of qualityand variety. The parameter p
 | 
				
			||||||
 | 
					   * represents the minimum probability for a token to be considered, relative to the probability
 | 
				
			||||||
 | 
					   * of the most likely token. For example, with p=0.05 and the most likely token having a
 | 
				
			||||||
 | 
					   * probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  public OptionsBuilder setMinP(float value) {
 | 
				
			||||||
 | 
					    options.getOptionsMap().put("min_p", value);
 | 
				
			||||||
 | 
					    return this;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * Allows passing an option not formally supported by the library
 | 
				
			||||||
 | 
					   * @param name The option name for the parameter.
 | 
				
			||||||
 | 
					   * @param value The value for the "{name}" parameter.
 | 
				
			||||||
 | 
					   * @return The updated OptionsBuilder.
 | 
				
			||||||
 | 
					   * @throws IllegalArgumentException if parameter has an unsupported type
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  public OptionsBuilder setCustomOption(String name, Object value) throws IllegalArgumentException {
 | 
				
			||||||
 | 
					    if (!(value instanceof Integer || value instanceof Float || value instanceof String)) {
 | 
				
			||||||
 | 
					      throw new IllegalArgumentException("Invalid type for parameter. Allowed types are: Integer, Float, or String.");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    options.getOptionsMap().put(name, value);
 | 
				
			||||||
 | 
					    return this;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /**
 | 
					  /**
 | 
				
			||||||
   * Builds the options map.
 | 
					   * Builds the options map.
 | 
				
			||||||
   *
 | 
					   *
 | 
				
			||||||
@@ -215,4 +244,6 @@ public class OptionsBuilder {
 | 
				
			|||||||
  public Options build() {
 | 
					  public Options build() {
 | 
				
			||||||
    return options;
 | 
					    return options;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -80,6 +80,18 @@ class TestRealAPIs {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    @Order(2)
 | 
				
			||||||
 | 
					    void testListModelsFromLibrary() {
 | 
				
			||||||
 | 
					        testEndpointReachability();
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            assertNotNull(ollamaAPI.listModelsFromLibrary());
 | 
				
			||||||
 | 
					            ollamaAPI.listModelsFromLibrary().forEach(System.out::println);
 | 
				
			||||||
 | 
					        } catch (IOException | OllamaBaseException | InterruptedException | URISyntaxException e) {
 | 
				
			||||||
 | 
					            fail(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
    @Order(2)
 | 
					    @Order(2)
 | 
				
			||||||
    void testPullModel() {
 | 
					    void testPullModel() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,10 @@ package io.github.ollama4j.unittests;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import io.github.ollama4j.OllamaAPI;
 | 
					import io.github.ollama4j.OllamaAPI;
 | 
				
			||||||
import io.github.ollama4j.exceptions.OllamaBaseException;
 | 
					import io.github.ollama4j.exceptions.OllamaBaseException;
 | 
				
			||||||
 | 
					import io.github.ollama4j.exceptions.RoleNotFoundException;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.chat.OllamaChatMessageRole;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedRequestModel;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedResponseModel;
 | 
				
			||||||
import io.github.ollama4j.models.response.ModelDetail;
 | 
					import io.github.ollama4j.models.response.ModelDetail;
 | 
				
			||||||
import io.github.ollama4j.models.response.OllamaAsyncResultStreamer;
 | 
					import io.github.ollama4j.models.response.OllamaAsyncResultStreamer;
 | 
				
			||||||
import io.github.ollama4j.models.response.OllamaResult;
 | 
					import io.github.ollama4j.models.response.OllamaResult;
 | 
				
			||||||
@@ -14,7 +18,9 @@ import java.io.IOException;
 | 
				
			|||||||
import java.net.URISyntaxException;
 | 
					import java.net.URISyntaxException;
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
import java.util.Collections;
 | 
					import java.util.Collections;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.junit.jupiter.api.Assertions.*;
 | 
				
			||||||
import static org.mockito.Mockito.*;
 | 
					import static org.mockito.Mockito.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestMockedAPIs {
 | 
					class TestMockedAPIs {
 | 
				
			||||||
@@ -97,6 +103,34 @@ class TestMockedAPIs {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    void testEmbed() {
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
 | 
				
			||||||
 | 
					        String model = OllamaModelType.LLAMA2;
 | 
				
			||||||
 | 
					        List<String> inputs = List.of("some prompt text");
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            when(ollamaAPI.embed(model, inputs)).thenReturn(new OllamaEmbedResponseModel());
 | 
				
			||||||
 | 
					            ollamaAPI.embed(model, inputs);
 | 
				
			||||||
 | 
					            verify(ollamaAPI, times(1)).embed(model, inputs);
 | 
				
			||||||
 | 
					        } catch (IOException | OllamaBaseException | InterruptedException e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    void testEmbedWithEmbedRequestModel() {
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
 | 
				
			||||||
 | 
					        String model = OllamaModelType.LLAMA2;
 | 
				
			||||||
 | 
					        List<String> inputs = List.of("some prompt text");
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            when(ollamaAPI.embed(new OllamaEmbedRequestModel(model, inputs))).thenReturn(new OllamaEmbedResponseModel());
 | 
				
			||||||
 | 
					            ollamaAPI.embed(new OllamaEmbedRequestModel(model, inputs));
 | 
				
			||||||
 | 
					            verify(ollamaAPI, times(1)).embed(new OllamaEmbedRequestModel(model, inputs));
 | 
				
			||||||
 | 
					        } catch (IOException | OllamaBaseException | InterruptedException e) {
 | 
				
			||||||
 | 
					            throw new RuntimeException(e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
    void testAsk() {
 | 
					    void testAsk() {
 | 
				
			||||||
        OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
 | 
					        OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
 | 
				
			||||||
@@ -161,4 +195,68 @@ class TestMockedAPIs {
 | 
				
			|||||||
        ollamaAPI.generateAsync(model, prompt, false);
 | 
					        ollamaAPI.generateAsync(model, prompt, false);
 | 
				
			||||||
        verify(ollamaAPI, times(1)).generateAsync(model, prompt, false);
 | 
					        verify(ollamaAPI, times(1)).generateAsync(model, prompt, false);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    void testAddCustomRole() {
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = mock(OllamaAPI.class);
 | 
				
			||||||
 | 
					        String roleName = "custom-role";
 | 
				
			||||||
 | 
					        OllamaChatMessageRole expectedRole = OllamaChatMessageRole.newCustomRole(roleName);
 | 
				
			||||||
 | 
					        when(ollamaAPI.addCustomRole(roleName)).thenReturn(expectedRole);
 | 
				
			||||||
 | 
					        OllamaChatMessageRole customRole = ollamaAPI.addCustomRole(roleName);
 | 
				
			||||||
 | 
					        assertEquals(expectedRole, customRole);
 | 
				
			||||||
 | 
					        verify(ollamaAPI, times(1)).addCustomRole(roleName);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    void testListRoles() {
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = Mockito.mock(OllamaAPI.class);
 | 
				
			||||||
 | 
					        OllamaChatMessageRole role1 = OllamaChatMessageRole.newCustomRole("role1");
 | 
				
			||||||
 | 
					        OllamaChatMessageRole role2 = OllamaChatMessageRole.newCustomRole("role2");
 | 
				
			||||||
 | 
					        List<OllamaChatMessageRole> expectedRoles = List.of(role1, role2);
 | 
				
			||||||
 | 
					        when(ollamaAPI.listRoles()).thenReturn(expectedRoles);
 | 
				
			||||||
 | 
					        List<OllamaChatMessageRole> actualRoles = ollamaAPI.listRoles();
 | 
				
			||||||
 | 
					        assertEquals(expectedRoles, actualRoles);
 | 
				
			||||||
 | 
					        verify(ollamaAPI, times(1)).listRoles();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    void testGetRoleNotFound() {
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = mock(OllamaAPI.class);
 | 
				
			||||||
 | 
					        String roleName = "non-existing-role";
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            when(ollamaAPI.getRole(roleName)).thenThrow(new RoleNotFoundException("Role not found"));
 | 
				
			||||||
 | 
					        } catch (RoleNotFoundException exception) {
 | 
				
			||||||
 | 
					            throw new RuntimeException("Failed to run test: testGetRoleNotFound");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            ollamaAPI.getRole(roleName);
 | 
				
			||||||
 | 
					            fail("Expected RoleNotFoundException not thrown");
 | 
				
			||||||
 | 
					        } catch (RoleNotFoundException exception) {
 | 
				
			||||||
 | 
					            assertEquals("Role not found", exception.getMessage());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            verify(ollamaAPI, times(1)).getRole(roleName);
 | 
				
			||||||
 | 
					        } catch (RoleNotFoundException exception) {
 | 
				
			||||||
 | 
					            throw new RuntimeException("Failed to run test: testGetRoleNotFound");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    void testGetRoleFound() {
 | 
				
			||||||
 | 
					        OllamaAPI ollamaAPI = mock(OllamaAPI.class);
 | 
				
			||||||
 | 
					        String roleName = "existing-role";
 | 
				
			||||||
 | 
					        OllamaChatMessageRole expectedRole = OllamaChatMessageRole.newCustomRole(roleName);
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            when(ollamaAPI.getRole(roleName)).thenReturn(expectedRole);
 | 
				
			||||||
 | 
					        } catch (RoleNotFoundException exception) {
 | 
				
			||||||
 | 
					            throw new RuntimeException("Failed to run test: testGetRoleFound");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            OllamaChatMessageRole actualRole = ollamaAPI.getRole(roleName);
 | 
				
			||||||
 | 
					            assertEquals(expectedRole, actualRole);
 | 
				
			||||||
 | 
					            verify(ollamaAPI, times(1)).getRole(roleName);
 | 
				
			||||||
 | 
					        } catch (RoleNotFoundException exception) {
 | 
				
			||||||
 | 
					            throw new RuntimeException("Failed to run test: testGetRoleFound");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package io.github.ollama4j.unittests.jackson;
 | 
					package io.github.ollama4j.unittests.jackson;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
					import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
				
			||||||
 | 
					import static org.junit.jupiter.api.Assertions.assertThrowsExactly;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.File;
 | 
					import java.io.File;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@@ -59,6 +60,10 @@ public class TestChatRequestSerialization extends AbstractSerializationTest<Olla
 | 
				
			|||||||
            .withOptions(b.setSeed(1).build())
 | 
					            .withOptions(b.setSeed(1).build())
 | 
				
			||||||
            .withOptions(b.setTopK(1).build())
 | 
					            .withOptions(b.setTopK(1).build())
 | 
				
			||||||
            .withOptions(b.setTopP(1).build())
 | 
					            .withOptions(b.setTopP(1).build())
 | 
				
			||||||
 | 
					            .withOptions(b.setMinP(1).build())
 | 
				
			||||||
 | 
					            .withOptions(b.setCustomOption("cust_float", 1.0f).build())
 | 
				
			||||||
 | 
					            .withOptions(b.setCustomOption("cust_int", 1).build())
 | 
				
			||||||
 | 
					            .withOptions(b.setCustomOption("cust_str", "custom").build())
 | 
				
			||||||
            .build();
 | 
					            .build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        String jsonRequest = serialize(req);
 | 
					        String jsonRequest = serialize(req);
 | 
				
			||||||
@@ -72,6 +77,20 @@ public class TestChatRequestSerialization extends AbstractSerializationTest<Olla
 | 
				
			|||||||
        assertEquals(1, deserializeRequest.getOptions().get("seed"));
 | 
					        assertEquals(1, deserializeRequest.getOptions().get("seed"));
 | 
				
			||||||
        assertEquals(1, deserializeRequest.getOptions().get("top_k"));
 | 
					        assertEquals(1, deserializeRequest.getOptions().get("top_k"));
 | 
				
			||||||
        assertEquals(1.0, deserializeRequest.getOptions().get("top_p"));
 | 
					        assertEquals(1.0, deserializeRequest.getOptions().get("top_p"));
 | 
				
			||||||
 | 
					        assertEquals(1.0, deserializeRequest.getOptions().get("min_p"));
 | 
				
			||||||
 | 
					        assertEquals(1.0, deserializeRequest.getOptions().get("cust_float"));
 | 
				
			||||||
 | 
					        assertEquals(1, deserializeRequest.getOptions().get("cust_int"));
 | 
				
			||||||
 | 
					        assertEquals("custom", deserializeRequest.getOptions().get("cust_str"));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Test
 | 
				
			||||||
 | 
					    public void testRequestWithInvalidCustomOption() {
 | 
				
			||||||
 | 
					        OptionsBuilder b = new OptionsBuilder();
 | 
				
			||||||
 | 
					        assertThrowsExactly(IllegalArgumentException.class, () -> {
 | 
				
			||||||
 | 
					                OllamaChatRequest req = builder.withMessage(OllamaChatMessageRole.USER, "Some prompt")
 | 
				
			||||||
 | 
					                .withOptions(b.setCustomOption("cust_obj", new Object()).build())
 | 
				
			||||||
 | 
					                .build();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Test
 | 
					    @Test
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,36 +1,37 @@
 | 
				
			|||||||
package io.github.ollama4j.unittests.jackson;
 | 
					package io.github.ollama4j.unittests.jackson;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
					import static org.junit.jupiter.api.Assertions.assertEquals;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedRequestBuilder;
 | 
				
			||||||
 | 
					import io.github.ollama4j.models.embeddings.OllamaEmbedRequestModel;
 | 
				
			||||||
import org.junit.jupiter.api.BeforeEach;
 | 
					import org.junit.jupiter.api.BeforeEach;
 | 
				
			||||||
import org.junit.jupiter.api.Test;
 | 
					import org.junit.jupiter.api.Test;
 | 
				
			||||||
import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestModel;
 | 
					 | 
				
			||||||
import io.github.ollama4j.models.embeddings.OllamaEmbeddingsRequestBuilder;
 | 
					 | 
				
			||||||
import io.github.ollama4j.utils.OptionsBuilder;
 | 
					import io.github.ollama4j.utils.OptionsBuilder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class TestEmbeddingsRequestSerialization extends AbstractSerializationTest<OllamaEmbeddingsRequestModel> {
 | 
					public class TestEmbedRequestSerialization extends AbstractSerializationTest<OllamaEmbedRequestModel> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private OllamaEmbeddingsRequestBuilder builder;
 | 
					        private OllamaEmbedRequestBuilder builder;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @BeforeEach
 | 
					        @BeforeEach
 | 
				
			||||||
        public void init() {
 | 
					        public void init() {
 | 
				
			||||||
            builder = OllamaEmbeddingsRequestBuilder.getInstance("DummyModel","DummyPrompt");
 | 
					            builder = OllamaEmbedRequestBuilder.getInstance("DummyModel","DummyPrompt");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            @Test
 | 
					            @Test
 | 
				
			||||||
    public void testRequestOnlyMandatoryFields() {
 | 
					    public void testRequestOnlyMandatoryFields() {
 | 
				
			||||||
        OllamaEmbeddingsRequestModel req = builder.build();
 | 
					        OllamaEmbedRequestModel req = builder.build();
 | 
				
			||||||
        String jsonRequest = serialize(req);
 | 
					        String jsonRequest = serialize(req);
 | 
				
			||||||
        assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaEmbeddingsRequestModel.class), req);
 | 
					        assertEqualsAfterUnmarshalling(deserialize(jsonRequest,OllamaEmbedRequestModel.class), req);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Test
 | 
					        @Test
 | 
				
			||||||
        public void testRequestWithOptions() {
 | 
					        public void testRequestWithOptions() {
 | 
				
			||||||
            OptionsBuilder b = new OptionsBuilder();
 | 
					            OptionsBuilder b = new OptionsBuilder();
 | 
				
			||||||
            OllamaEmbeddingsRequestModel req = builder
 | 
					            OllamaEmbedRequestModel req = builder
 | 
				
			||||||
                    .withOptions(b.setMirostat(1).build()).build();
 | 
					                    .withOptions(b.setMirostat(1).build()).build();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            String jsonRequest = serialize(req);
 | 
					            String jsonRequest = serialize(req);
 | 
				
			||||||
            OllamaEmbeddingsRequestModel deserializeRequest = deserialize(jsonRequest,OllamaEmbeddingsRequestModel.class);
 | 
					            OllamaEmbedRequestModel deserializeRequest = deserialize(jsonRequest,OllamaEmbedRequestModel.class);
 | 
				
			||||||
            assertEqualsAfterUnmarshalling(deserializeRequest, req);
 | 
					            assertEqualsAfterUnmarshalling(deserializeRequest, req);
 | 
				
			||||||
            assertEquals(1, deserializeRequest.getOptions().get("mirostat"));
 | 
					            assertEquals(1, deserializeRequest.getOptions().get("mirostat"));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
		Reference in New Issue
	
	Block a user