Compare commits

..

438 Commits

Author SHA1 Message Date
amithkoujalgi
7ce89a3e89 Update Javadoc in Agent class to reflect changes in the interact method signature, now including an OllamaChatStreamObserver parameter for improved conversation handling. 2025-10-20 22:31:04 +05:30
Amith Koujalgi
fe43e87e1a Enhance agent documentation with detailed YAML configuration instructions and benefits. Update CodeEmbed component to support customizable language for syntax highlighting. Refactor Agent class to improve Javadoc comments and method signatures for better clarity and functionality. 2025-10-20 20:07:15 +05:30
Amith Koujalgi
d55d1c0fd9 Update Javadoc comments in Ollama and Agent classes to reflect correct method references for chat request construction and agent instantiation. 2025-10-19 14:34:21 +05:30
Amith Koujalgi
f0e5a9e172 Add documentation for the new Agent feature and update sidebar positions for Metrics and API categories. Adjust code examples in various API documentation to reflect correct paths and improve clarity. Enhance the Agent class with an equals and hash code method for better functionality. 2025-10-19 14:03:10 +05:30
amithkoujalgi
866c08f590 Remove SampleAgent class and associated YAML configuration file, streamlining the project by eliminating example implementations and their dependencies. 2025-10-19 11:22:16 +05:30
amithkoujalgi
bec634dd37 Refactor Agent class to include request timeout configuration and enhance interactive input display. Remove commented-out code for clarity. Update SampleAgent to utilize YAML configuration for agent instantiation. 2025-10-18 20:19:43 +05:30
amithkoujalgi
cbf65fef48 Add YAML support for Agent configuration and enhance Agent class to load tools from YAML. Introduce custom prompt functionality and refactor constructor to accept additional parameters. Update SampleAgent to demonstrate YAML loading. 2025-10-13 14:34:03 +05:30
amithkoujalgi
6df57c4a23 Enhance SampleAgent with improved Javadoc comments for tool specifications and descriptions, clarifying usage and parameters for weather, calculator, and hotel booking tools. 2025-10-11 00:00:42 +05:30
amithkoujalgi
da6d20d118 Add default target to Makefile, enhance Ollama class to use tools, and introduce Agent and SampleAgent classes for interactive tool usage. Update Javadoc generation message and improve error handling in endpoint callers. 2025-10-10 23:56:31 +05:30
Amith Koujalgi
64c629775a Refactor OllamaChatRequest and OllamaGenerateRequest to remove builder classes, implement builder-like methods directly in the request classes, and enhance request handling with additional options and image support. Update integration tests to reflect these changes.
Some checks failed
Mark stale issues / stale (push) Failing after 12s
Mark stale issues and PRs / stale (push) Failing after 8s
CodeQL / Analyze (java) (push) Failing after 11s
CodeQL / Analyze (javascript) (push) Failing after 10s
2025-10-07 18:33:22 +05:30
Amith Koujalgi
46f2d62fed Merge pull request #208 from ollama4j/dependabot/npm_and_yarn/docs/react-dom-19.2.0
Some checks failed
CodeQL / Analyze (java) (push) Failing after 13s
CodeQL / Analyze (javascript) (push) Failing after 12s
Mark stale issues / stale (push) Failing after 43s
Mark stale issues and PRs / stale (push) Failing after 1m30s
Bump react-dom from 19.1.1 to 19.2.0 in /docs
2025-10-06 23:28:31 +05:30
dependabot[bot]
b91943066e Bump react-dom from 19.1.1 to 19.2.0 in /docs
Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) from 19.1.1 to 19.2.0.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.0/packages/react-dom)

---
updated-dependencies:
- dependency-name: react-dom
  dependency-version: 19.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 17:57:36 +00:00
Amith Koujalgi
58d73637bb Merge pull request #207 from ollama4j/dependabot/npm_and_yarn/docs/react-19.2.0
Bump react from 19.1.1 to 19.2.0 in /docs
2025-10-06 23:26:19 +05:30
Amith Koujalgi
0ffaac65d4 Add new logo 2025-10-06 23:25:10 +05:30
Amith Koujalgi
4ce9c4c191 Add new logo 2025-10-06 23:23:42 +05:30
dependabot[bot]
4681b1986f Bump react from 19.1.1 to 19.2.0 in /docs
Bumps [react](https://github.com/facebook/react/tree/HEAD/packages/react) from 19.1.1 to 19.2.0.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.0/packages/react)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-06 00:36:12 +00:00
Amith Koujalgi
89d42fd469 Merge pull request #206 from ollama4j/docs
Some checks failed
Mark stale issues / stale (push) Failing after 23s
Mark stale issues and PRs / stale (push) Failing after 1m19s
CodeQL / Analyze (java) (push) Failing after 15s
CodeQL / Analyze (javascript) (push) Failing after 13s
Update metrics.md
2025-10-01 01:24:33 +05:30
amithkoujalgi
8a903f695e Update metrics.md 2025-10-01 01:24:03 +05:30
amithkoujalgi
3a20af25f1 Merge branch 'main' of https://github.com/ollama4j/ollama4j 2025-10-01 01:16:50 +05:30
Amith Koujalgi
24046b6660 Merge pull request #205 from ollama4j/refactor
Add metrics documentation for Ollama4j library
2025-10-01 01:15:45 +05:30
amithkoujalgi
453112d09f Add metrics documentation for Ollama4j library
- Introduced a new `metrics.md` file detailing the metrics available in the Ollama4j library, including total requests, response time, error rate, and active sessions.
- Provided examples of accessing metrics in Java and integrating with monitoring tools like Prometheus and Grafana.
- Included a warning note indicating that the documentation is a work in progress.
2025-10-01 01:14:21 +05:30
Amith Koujalgi
42a0034728 Merge pull request #203 from ollama4j/dependabot/npm_and_yarn/docs/docusaurus/preset-classic-3.9.1
Some checks failed
CodeQL / Analyze (javascript) (push) Failing after 9s
CodeQL / Analyze (java) (push) Failing after 12s
Mark stale issues and PRs / stale (push) Failing after 1m31s
Mark stale issues / stale (push) Failing after 15s
Bump @docusaurus/preset-classic from 3.9.0 to 3.9.1 in /docs
2025-09-29 23:34:32 +05:30
dependabot[bot]
d8d660be8d Bump @docusaurus/preset-classic from 3.9.0 to 3.9.1 in /docs
Bumps [@docusaurus/preset-classic](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-preset-classic) from 3.9.0 to 3.9.1.
- [Release notes](https://github.com/facebook/docusaurus/releases)
- [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/docusaurus/commits/v3.9.1/packages/docusaurus-preset-classic)

---
updated-dependencies:
- dependency-name: "@docusaurus/preset-classic"
  dependency-version: 3.9.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 18:02:34 +00:00
Amith Koujalgi
c5a2d583c7 Merge pull request #202 from ollama4j/dependabot/npm_and_yarn/docs/docusaurus/theme-mermaid-3.9.1
Bump @docusaurus/theme-mermaid from 3.9.0 to 3.9.1 in /docs
2025-09-29 23:30:55 +05:30
dependabot[bot]
cd656264cf Bump @docusaurus/theme-mermaid from 3.9.0 to 3.9.1 in /docs
Bumps [@docusaurus/theme-mermaid](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-theme-mermaid) from 3.9.0 to 3.9.1.
- [Release notes](https://github.com/facebook/docusaurus/releases)
- [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/docusaurus/commits/v3.9.1/packages/docusaurus-theme-mermaid)

---
updated-dependencies:
- dependency-name: "@docusaurus/theme-mermaid"
  dependency-version: 3.9.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 14:24:20 +00:00
Amith Koujalgi
272c8204c7 Merge pull request #201 from ollama4j/dependabot/maven/org.jacoco-jacoco-maven-plugin-0.8.13
Some checks failed
CodeQL / Analyze (javascript) (push) Failing after 11s
CodeQL / Analyze (java) (push) Failing after 14s
Mark stale issues / stale (push) Failing after 21s
Bump org.jacoco:jacoco-maven-plugin from 0.8.7 to 0.8.13
2025-09-29 19:05:43 +05:30
Amith Koujalgi
23c7321b63 Merge pull request #200 from ollama4j/dependabot/maven/org.apache.maven.plugins-maven-compiler-plugin-3.14.1
Bump org.apache.maven.plugins:maven-compiler-plugin from 3.14.0 to 3.14.1
2025-09-29 19:05:27 +05:30
Amith Koujalgi
e24a38f89f Merge pull request #199 from ollama4j/dependabot/npm_and_yarn/docs/docusaurus/plugin-google-gtag-3.9.1
Bump @docusaurus/plugin-google-gtag from 3.9.0 to 3.9.1 in /docs
2025-09-29 19:05:15 +05:30
Amith Koujalgi
5847cfc94c Merge pull request #198 from ollama4j/dependabot/maven/io.github.git-commit-id-git-commit-id-maven-plugin-9.0.2
Bump io.github.git-commit-id:git-commit-id-maven-plugin from 9.0.1 to 9.0.2
2025-09-29 19:05:02 +05:30
Amith Koujalgi
05d5958307 Merge pull request #197 from ollama4j/dependabot/maven/org.mockito-mockito-core-5.20.0
Bump org.mockito:mockito-core from 4.1.0 to 5.20.0
2025-09-29 19:04:48 +05:30
Amith Koujalgi
ffa81cb7df Merge pull request #196 from ollama4j/dependabot/npm_and_yarn/docs/docusaurus/module-type-aliases-3.9.1
Bump @docusaurus/module-type-aliases from 3.9.0 to 3.9.1 in /docs
2025-09-29 19:04:22 +05:30
Amith Koujalgi
bd231e639d Merge pull request #195 from ollama4j/dependabot/maven/com.diffplug.spotless-spotless-maven-plugin-3.0.0
Bump com.diffplug.spotless:spotless-maven-plugin from 2.46.1 to 3.0.0
2025-09-29 19:04:01 +05:30
Amith Koujalgi
73a0a48eab Merge pull request #194 from ollama4j/refactor
Refactor OllamaAPI to Ollama class and update documentation
2025-09-29 14:12:34 +05:30
amithkoujalgi
fd18a247d7 Update GitHub Actions workflow to use Makefile for test execution
- Replaced Maven commands with Makefile targets for running unit and integration tests in the GitHub Actions workflow.
- Updated the commands to `make unit-tests` and `make integration-tests-basic` for improved consistency and maintainability.
2025-09-29 11:15:21 +05:30
amithkoujalgi
501c35fa44 Refactor integration test targets in Makefile and update workflow
- Renamed integration test targets in the Makefile for clarity: `integration-tests` to `integration-tests-all` and added `integration-tests-basic`.
- Updated GitHub Actions workflow to run the new `integration-tests-basic` target.
- Cleaned up the `WithAuth` test class by removing unused imports and simplifying method signatures.
2025-09-29 10:36:13 +05:30
amithkoujalgi
f114181fe2 Update documentation and refactor code to replace OllamaAPI with Ollama
- Replaced all instances of `OllamaAPI` with `Ollama` in documentation and code examples for consistency.
- Enhanced the configuration for handling broken markdown links in Docusaurus.
- Updated integration tests and example code snippets to reflect the new class structure.
2025-09-29 09:31:32 +05:30
dependabot[bot]
b347faff83 Bump org.jacoco:jacoco-maven-plugin from 0.8.7 to 0.8.13
Bumps [org.jacoco:jacoco-maven-plugin](https://github.com/jacoco/jacoco) from 0.8.7 to 0.8.13.
- [Release notes](https://github.com/jacoco/jacoco/releases)
- [Commits](https://github.com/jacoco/jacoco/compare/v0.8.7...v0.8.13)

---
updated-dependencies:
- dependency-name: org.jacoco:jacoco-maven-plugin
  dependency-version: 0.8.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 00:39:08 +00:00
dependabot[bot]
16e14ddd1c Bump org.apache.maven.plugins:maven-compiler-plugin
Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.14.0 to 3.14.1.
- [Release notes](https://github.com/apache/maven-compiler-plugin/releases)
- [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.14.0...maven-compiler-plugin-3.14.1)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-compiler-plugin
  dependency-version: 3.14.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 00:39:07 +00:00
dependabot[bot]
2117d42f60 Bump @docusaurus/plugin-google-gtag from 3.9.0 to 3.9.1 in /docs
Bumps [@docusaurus/plugin-google-gtag](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-plugin-google-gtag) from 3.9.0 to 3.9.1.
- [Release notes](https://github.com/facebook/docusaurus/releases)
- [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/docusaurus/commits/v3.9.1/packages/docusaurus-plugin-google-gtag)

---
updated-dependencies:
- dependency-name: "@docusaurus/plugin-google-gtag"
  dependency-version: 3.9.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 00:38:59 +00:00
dependabot[bot]
79b8dbaefd Bump io.github.git-commit-id:git-commit-id-maven-plugin
Bumps [io.github.git-commit-id:git-commit-id-maven-plugin](https://github.com/git-commit-id/git-commit-id-maven-plugin) from 9.0.1 to 9.0.2.
- [Release notes](https://github.com/git-commit-id/git-commit-id-maven-plugin/releases)
- [Commits](https://github.com/git-commit-id/git-commit-id-maven-plugin/compare/v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: io.github.git-commit-id:git-commit-id-maven-plugin
  dependency-version: 9.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 00:38:48 +00:00
dependabot[bot]
04f5c28052 Bump org.mockito:mockito-core from 4.1.0 to 5.20.0
Bumps [org.mockito:mockito-core](https://github.com/mockito/mockito) from 4.1.0 to 5.20.0.
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v4.1.0...v5.20.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-core
  dependency-version: 5.20.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 00:38:48 +00:00
dependabot[bot]
a4da036389 Bump @docusaurus/module-type-aliases from 3.9.0 to 3.9.1 in /docs
Bumps [@docusaurus/module-type-aliases](https://github.com/facebook/docusaurus/tree/HEAD/packages/docusaurus-module-type-aliases) from 3.9.0 to 3.9.1.
- [Release notes](https://github.com/facebook/docusaurus/releases)
- [Changelog](https://github.com/facebook/docusaurus/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/docusaurus/commits/v3.9.1/packages/docusaurus-module-type-aliases)

---
updated-dependencies:
- dependency-name: "@docusaurus/module-type-aliases"
  dependency-version: 3.9.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 00:38:34 +00:00
dependabot[bot]
a73cf015d6 Bump com.diffplug.spotless:spotless-maven-plugin from 2.46.1 to 3.0.0
Bumps [com.diffplug.spotless:spotless-maven-plugin](https://github.com/diffplug/spotless) from 2.46.1 to 3.0.0.
- [Release notes](https://github.com/diffplug/spotless/releases)
- [Changelog](https://github.com/diffplug/spotless/blob/main/CHANGES.md)
- [Commits](https://github.com/diffplug/spotless/compare/maven/2.46.1...lib/3.0.0)

---
updated-dependencies:
- dependency-name: com.diffplug.spotless:spotless-maven-plugin
  dependency-version: 3.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-29 00:38:19 +00:00
amithkoujalgi
35bf3de62a Refactor OllamaAPI to Ollama class and update documentation
- Replaced instances of `OllamaAPI` with `Ollama` across the codebase for consistency.
- Updated example code snippets in documentation to reflect the new class name.
- Enhanced metrics collection setup in the documentation.
- Added integration tests for the new `Ollama` class to ensure functionality remains intact.
2025-09-28 23:30:02 +05:30
Amith Koujalgi
6fce6ec777 Merge pull request #183 from ollama4j/refactor
Some checks failed
Mark stale issues / stale (push) Failing after 21s
Mark stale issues and PRs / stale (push) Failing after 1m33s
CodeQL / Analyze (javascript) (push) Failing after 11s
CodeQL / Analyze (java) (push) Failing after 13s
Refactor: with breaking changes
2025-09-28 23:11:19 +05:30
amithkoujalgi
61fe8b2b56 Refactor model response classes and update API methods
- Renamed `ModelProcessesResponse` to `ModelProcessesResult` and updated all related references in the codebase.
- Introduced `OllamaEmbedResult` class to replace `OllamaEmbedResponse`, ensuring consistency across the API.
- Updated method signatures in `OllamaAPI` to reflect the new class names and adjusted integration tests accordingly.
2025-09-28 22:52:24 +05:30
amithkoujalgi
dd1022a990 Add Javadoc generation to Makefile and refactor model classes
- Introduced a new `javadoc` target in the Makefile to generate Javadocs.
- Refactored model classes: renamed `ModelsProcessResponse` to `ModelProcessesResponse` and updated related references.
- Updated `OllamaEmbedRequestModel` and `OllamaEmbedResponseModel` to `OllamaEmbedRequest` and `OllamaEmbedResponse`, respectively, across the codebase.
- Added new classes for `OllamaEmbedRequest` and `OllamaEmbedResponse` to improve clarity and maintainability.
2025-09-28 22:46:37 +05:30
amithkoujalgi
36f7d14c68 Refactor OllamaAPI exception handling to properly manage InterruptedException and improve logging. Remove unused Logback Classic dependency from pom.xml and clean up commented-out code in integration tests. 2025-09-28 22:28:48 +05:30
amithkoujalgi
e9a4599714 Refactor exception handling by replacing OllamaBaseException with OllamaException across the codebase. Update relevant method signatures and import statements accordingly. 2025-09-28 22:01:17 +05:30
amithkoujalgi
e06507a06b Merge branch 'main' into refactor 2025-09-28 18:09:55 +05:30
amithkoujalgi
195b54e07e Update README.md 2025-09-28 18:09:37 +05:30
Amith Koujalgi
b05242873d Merge pull request #186 from ollama4j/dependabot/npm_and_yarn/docs/iconify/react-6.0.2
Some checks failed
CodeQL / Analyze (java) (push) Failing after 13s
CodeQL / Analyze (javascript) (push) Failing after 12s
Bump @iconify/react from 6.0.1 to 6.0.2 in /docs
2025-09-28 18:09:06 +05:30
Amith Koujalgi
eccb052de8 Merge pull request #187 from ollama4j/dependabot/maven/org.sonatype.plugins-nexus-staging-maven-plugin-1.7.0
Bump org.sonatype.plugins:nexus-staging-maven-plugin from 1.6.13 to 1.7.0
2025-09-28 18:08:53 +05:30
Amith Koujalgi
077dd36b3c Merge pull request #185 from ollama4j/dependabot/npm_and_yarn/docs/docsearch/js-4.0.1
Bump @docsearch/js from 3.9.0 to 4.0.1 in /docs
2025-09-28 18:08:38 +05:30
Amith Koujalgi
6405b36854 Merge pull request #188 from ollama4j/dependabot/maven/org.apache.maven.plugins-maven-surefire-plugin-3.5.4
Bump org.apache.maven.plugins:maven-surefire-plugin from 3.0.0-M5 to 3.5.4
2025-09-28 18:08:21 +05:30
Amith Koujalgi
99f413282c Merge pull request #189 from ollama4j/dependabot/maven/org.junit.jupiter-junit-jupiter-api-5.13.4
Bump org.junit.jupiter:junit-jupiter-api from 5.10.0 to 5.13.4
2025-09-28 18:07:41 +05:30
Amith Koujalgi
b3e5af30ab Merge pull request #190 from ollama4j/dependabot/maven/org.apache.maven.plugins-maven-javadoc-plugin-3.12.0
Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.11.3 to 3.12.0
2025-09-28 18:07:19 +05:30
dependabot[bot]
b8b2bb5f7a Bump @docsearch/js from 3.9.0 to 4.0.1 in /docs
Bumps [@docsearch/js](https://github.com/algolia/docsearch/tree/HEAD/packages/docsearch-js) from 3.9.0 to 4.0.1.
- [Release notes](https://github.com/algolia/docsearch/releases)
- [Changelog](https://github.com/algolia/docsearch/blob/main/CHANGELOG.md)
- [Commits](https://github.com/algolia/docsearch/commits/v4.0.1/packages/docsearch-js)

---
updated-dependencies:
- dependency-name: "@docsearch/js"
  dependency-version: 4.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-28 12:36:56 +00:00
Amith Koujalgi
806fa726c1 Merge pull request #191 from ollama4j/dependabot/maven/org.apache.maven.plugins-maven-gpg-plugin-3.2.8
Bump org.apache.maven.plugins:maven-gpg-plugin from 1.5 to 3.2.8
2025-09-28 18:06:55 +05:30
dependabot[bot]
1f0ea0ac4d Bump @iconify/react from 6.0.1 to 6.0.2 in /docs
Bumps [@iconify/react](https://github.com/iconify/iconify/tree/HEAD/components/react) from 6.0.1 to 6.0.2.
- [Commits](https://github.com/iconify/iconify/commits/HEAD/components/react)

---
updated-dependencies:
- dependency-name: "@iconify/react"
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-28 12:36:50 +00:00
Amith Koujalgi
0b271383fd Merge pull request #192 from ollama4j/snyk-upgrade-a5c4786f199d07c639f3f45c8622620f
[Snyk] Upgrade org.projectlombok:lombok from 1.18.38 to 1.18.40
2025-09-28 18:06:28 +05:30
Amith Koujalgi
11e77a9151 Merge pull request #193 from ollama4j/snyk-fix-af47e785104167f9b9eb8c2947b32c00
[Snyk] Fix for 3 vulnerabilities
2025-09-28 18:05:43 +05:30
snyk-bot
143f7f47a2 fix: docs/package.json & docs/package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-WEBPACKDEVSERVER-10300775
- https://snyk.io/vuln/SNYK-JS-INFLIGHT-6095116
- https://snyk.io/vuln/SNYK-JS-WEBPACKDEVSERVER-10300777
2025-09-28 08:48:44 +00:00
snyk-bot
3ea9d5021e fix: upgrade org.projectlombok:lombok from 1.18.38 to 1.18.40
Snyk has created this PR to upgrade org.projectlombok:lombok from 1.18.38 to 1.18.40.

See this package in maven:
org.projectlombok:lombok

See this project in Snyk:
https://app.snyk.io/org/koujalgi.amith/project/e4176cf5-c6db-4650-af21-3778aa308d33?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-09-27 07:51:05 +00:00
amithkoujalgi
031076b498 Update readme 2025-09-26 23:35:46 +05:30
amithkoujalgi
305bab9819 Refactor OllamaAPI and related classes for improved embedding model support and tool registration
This update modifies the OllamaAPI class to enhance support for embedding models by renaming related classes and introducing new request and response models. The OllamaEmbedRequestModel and OllamaEmbedResponseModel classes have been added, along with their corresponding builder class. Additionally, the tool registration process has been improved with the introduction of annotations for automatic tool discovery. Deprecated methods and commented-out code have been removed for clarity, and Javadoc comments have been updated for consistency across the API.
2025-09-26 22:13:55 +05:30
amithkoujalgi
f5ca5bdca3 Refactor OllamaAPI and related classes to enhance tool management and request handling
This update modifies the OllamaAPI class and associated request classes to improve the handling of tools. The ToolRegistry now manages a list of Tools.Tool objects instead of ToolSpecification, streamlining tool registration and retrieval. The OllamaGenerateRequest and OllamaChatRequest classes have been updated to reflect this change, ensuring consistency across the API. Additionally, several deprecated methods and commented-out code have been removed for clarity. Integration tests have been adjusted to accommodate these changes, enhancing overall test reliability.
2025-09-26 01:26:22 +05:30
amithkoujalgi
fe82550637 Refactor OllamaAPI and related classes for improved functionality and code clarity
This update removes deprecated methods from the OllamaAPI class, enhancing the overall structure and readability. The OllamaGenerateRequest class has been updated to include a list of tools, and the generate methods have been refactored to streamline request handling. Additionally, the WeatherTool class has been removed, and a new sample tool specification has been added for demonstration purposes. Changes in pom.xml include commented-out dependencies for better clarity.
2025-09-25 18:10:18 +05:30
amithkoujalgi
53e4b413ec Refactor unloadModel test in OllamaAPIIntegrationTest for improved exception handling
Updated the shouldUnloadModel test to use a constant for the model name and assert that no exceptions are thrown during the unload operation. This change enhances the clarity and reliability of the test by focusing on exception handling rather than checking the model's presence in the process list.
2025-09-24 00:57:05 +05:30
amithkoujalgi
07878ddf36 Refactor OllamaAPI and related classes for improved request handling and builder pattern integration
This update refactors the OllamaAPI class and its associated request builders to enhance the handling of generate requests and chat requests. The OllamaGenerateRequest and OllamaChatRequest classes now utilize builder patterns for better readability and maintainability. Additionally, deprecated methods have been removed or marked, and integration tests have been updated to reflect these changes, ensuring consistent usage of the new request structures.
2025-09-24 00:54:09 +05:30
amithkoujalgi
cc232c1383 Refactor OllamaAPI and endpoint callers for improved error handling and metrics recording
Refactor OllamaAPI and endpoint callers for improved error handling and metrics recording

Enhanced the OllamaAPI class by adding detailed error handling and metrics recording for API calls. Updated the OllamaChatEndpointCaller and OllamaGenerateEndpointCaller to use static endpoint constants instead of method suffixes, improving code clarity. Adjusted Javadoc comments for consistency and readability across the classes.
2025-09-23 19:00:44 +05:30
amithkoujalgi
52c60d9d18 Update OllamaAPI.java
Refactor OllamaAPI documentation for clarity and consistency

Updated Javadoc comments throughout the OllamaAPI class to enhance readability and maintain consistency in formatting. Adjusted line breaks and spacing in comments for improved presentation. No functional changes were made to the code.
2025-09-23 18:33:44 +05:30
amithkoujalgi
d400998fa2 Refactor MetricsRecorder and OllamaAPI for improved label handling and documentation clarity 2025-09-23 18:08:57 +05:30
amithkoujalgi
827bedb696 Add Prometheus metrics integration and refactor API error handling
Introduces Prometheus metrics support with a new MetricsRecorder and documentation (METRICS.md). Refactors OllamaAPI methods to improve error handling, reduce checked exceptions, and record metrics for API calls. Updates dependencies in pom.xml to include Prometheus and Guava. Adds MetricsRecorder class and updates tests for metrics integration.
2025-09-23 16:51:26 +05:30
dependabot[bot]
54c48cb106 Bump org.apache.maven.plugins:maven-gpg-plugin from 1.5 to 3.2.8
Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 1.5 to 3.2.8.
- [Release notes](https://github.com/apache/maven-gpg-plugin/releases)
- [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-1.5...maven-gpg-plugin-3.2.8)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-gpg-plugin
  dependency-version: 3.2.8
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-22 00:47:17 +00:00
dependabot[bot]
944178abce Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.11.3 to 3.12.0
Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.11.3 to 3.12.0.
- [Release notes](https://github.com/apache/maven-javadoc-plugin/releases)
- [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.11.3...maven-javadoc-plugin-3.12.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-javadoc-plugin
  dependency-version: 3.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-22 00:47:02 +00:00
dependabot[bot]
9defbb7991 Bump org.junit.jupiter:junit-jupiter-api from 5.10.0 to 5.13.4
Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit-framework) from 5.10.0 to 5.13.4.
- [Release notes](https://github.com/junit-team/junit-framework/releases)
- [Commits](https://github.com/junit-team/junit-framework/compare/r5.10.0...r5.13.4)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter-api
  dependency-version: 5.13.4
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-22 00:46:47 +00:00
dependabot[bot]
c857453654 Bump org.apache.maven.plugins:maven-surefire-plugin
Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.0.0-M5 to 3.5.4.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.0.0-M5...surefire-3.5.4)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-surefire-plugin
  dependency-version: 3.5.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-22 00:46:43 +00:00
dependabot[bot]
d3495c1def Bump org.sonatype.plugins:nexus-staging-maven-plugin
Bumps org.sonatype.plugins:nexus-staging-maven-plugin from 1.6.13 to 1.7.0.

---
updated-dependencies:
- dependency-name: org.sonatype.plugins:nexus-staging-maven-plugin
  dependency-version: 1.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-22 00:44:54 +00:00
amithkoujalgi
a9f6d4671c Set keepAlive to 0m in OllamaAPI requests
Added keepAlive parameter with value '0m' to OllamaAPI requests for improved connection handling. Updated integration test to enable tool usage and commented out a test for raw mode and thinking with new model handling.
2025-09-20 23:12:35 +05:30
Amith Koujalgi
5ef1ea906d Remove modelKeepAliveTime property and related code
Eliminated the modelKeepAliveTime field from OllamaAPI and OllamaChatRequest, along with its usage in integration tests and configuration. This streamlines configuration and request handling by removing an unused or deprecated parameter.
2025-09-20 17:48:21 +05:30
Amith Koujalgi
d6f5b5c313 Update workflow and improve test logging
Added environment configuration for GitHub Pages deployment in the build workflow and removed unused environment variable from test workflow. Enhanced logging in OllamaAPIIntegrationTest to include the external host address.
2025-09-20 15:51:31 +05:30
Amith Koujalgi
f0c6ce2b8d Set USE_EXTERNAL_OLLAMA_HOST env in test workflow
Adds USE_EXTERNAL_OLLAMA_HOST environment variable set to 'false' for the run-tests job in the build-on-pull-request workflow. This ensures tests do not use an external Ollama host during pull request builds.
2025-09-20 15:44:47 +05:30
amithkoujalgi
f60491885f Remove commented pre-commit command from Makefile
Deleted an unused, commented-out pre-commit command from the apply-formatting target to clean up the Makefile.
2025-09-20 15:40:18 +05:30
amithkoujalgi
7a2a307a0a Add local format-code hook to pre-commit config
Introduces a new local hook 'format-code' that runs 'make apply-formatting' to ensure code formatting is applied automatically during pre-commit. The hook is set to always run.
2025-09-20 15:40:02 +05:30
Amith Koujalgi
f6d52114b8 Merge pull request #184 from ollama4j/snyk-upgrade-af836a84c3838d755d6d2452ec92d418
Some checks failed
CodeQL / Analyze (java) (push) Failing after 11s
CodeQL / Analyze (javascript) (push) Failing after 10s
Mark stale issues / stale (push) Failing after 20s
Mark stale issues and PRs / stale (push) Failing after 1m31s
[Snyk] Upgrade org.jsoup:jsoup from 1.18.1 to 1.21.2
2025-09-20 14:47:46 +05:30
amithkoujalgi
cac94e0faf Refactor tool handling and add model unload support
Replaces the 'clientHandlesTools' flag with 'useTools' for tool execution control, defaulting to true. Adds support for model unloading via keep_alive parameter. Updates chat request and builder to use the new flag. Improves integration tests and documentation to reflect these changes. Fixes constructor order in OllamaGenerateStreamObserver and adds ignoreUnknown to ModelsProcessResponse.
2025-09-20 14:46:46 +05:30
snyk-bot
e4c14863fb fix: upgrade org.jsoup:jsoup from 1.18.1 to 1.21.2
Snyk has created this PR to upgrade org.jsoup:jsoup from 1.18.1 to 1.21.2.

See this package in maven:
org.jsoup:jsoup

See this project in Snyk:
https://app.snyk.io/org/koujalgi.amith/project/e4176cf5-c6db-4650-af21-3778aa308d33?utm_source=github&utm_medium=referral&page=upgrade-pr
2025-09-20 08:11:20 +00:00
amithkoujalgi
6147c7d697 Add Javadoc comments to integration tests
Added detailed Javadoc comments to test methods and utility functions in OllamaAPIIntegrationTest.java to improve documentation and clarify test scenarios, usage, and expected outcomes. No functional changes were made.
2025-09-20 00:54:54 +05:30
amithkoujalgi
751b11881f Update thinking tool model in integration tests
Replaced the 'deepseek-r1:1.5b' model with 'qwen3:0.6b' for thinking tool tests in OllamaAPIIntegrationTest. Also made minor formatting improvements to comments and string concatenations for better readability.
2025-09-20 00:02:52 +05:30
amithkoujalgi
5da9bc8626 Refactor test method names for clarity
Renamed test methods in OllamaAPIIntegrationTest to use descriptive 'should...' naming conventions, improving readability and clarity of test intent. Removed redundant comments and streamlined assertions for conciseness.
2025-09-19 23:51:32 +05:30
amithkoujalgi
90613c0ec1 Update WithAuth.java 2025-09-19 19:07:42 +05:30
amithkoujalgi
cb0f71ba63 Refactor token handler interfaces and improve streaming
Renamed and refactored token handler interfaces for chat and generate modules to improve clarity and separation. Updated related classes and method signatures to use new handler types. Enhanced error handling and logging in chat and generate request builders. Updated tests and integration code to use new handler classes and configuration properties. Suppressed verbose logs from Docker and Testcontainers in test logging configuration.
2025-09-19 18:05:38 +05:30
amithkoujalgi
d118958ac1 Change logging level from info to debug
Updated OllamaAPI to use LOG.debug instead of LOG.info for model pull status messages. Also changed the root logging level in logback.xml from info to debug to allow debug messages to be displayed during tests.
2025-09-18 02:20:07 +05:30
amithkoujalgi
8df36a9b98 Update GitHub workflows to use JDK 21 (Oracle)
All workflows now use JDK 21 with the Oracle distribution instead of JDK 17 or 11 with Temurin. This ensures consistency and leverages the latest Java features and security updates.
2025-09-18 02:00:55 +05:30
amithkoujalgi
5b71c8eacf Update OllamaEmbedRequestModel.java 2025-09-18 01:53:28 +05:30
amithkoujalgi
0aeabcc963 Refactor error handling and update tests
Refactored error handling in OllamaChatEndpointCaller by extracting status code checks into a helper method. Improved logging for image loading errors in OllamaChatRequestBuilder. Updated integration and unit tests to relax assertions and clarify comments. Minor documentation formatting fixes and Makefile improvement for reproducible npm installs.
2025-09-18 01:50:23 +05:30
amithkoujalgi
7788f954d6 Improve error handling and code clarity across modules
Enhanced error handling for image URL loading in OllamaChatRequestBuilder, ensuring exceptions are thrown and logged appropriately. Updated test cases to reflect new exception behavior. Improved documentation and code clarity in WeatherTool and test classes. Refactored JSON parsing in response models for conciseness. Minor cleanup in pom.xml and integration test comments for better maintainability.
2025-09-18 01:22:12 +05:30
amithkoujalgi
fe87c4ccc8 Update CI workflows to use JDK 21 with Oracle distribution
Changed Java version from 11 to 21 and switched distribution from 'adopt-hotspot' to 'oracle' in build and documentation publishing workflows for improved compatibility and support.
2025-09-17 21:45:27 +05:30
amithkoujalgi
4f02b299c3 Handle all exceptions when loading image URLs in chat builder
Replaced separate IOException and InterruptedException handling with a single catch for Exception in OllamaChatRequestBuilder, ensuring that any failure when loading image URLs is logged and does not break message building. Updated related unit test to verify builder robustness and usability after invalid image URL input.
2025-09-17 21:41:12 +05:30
amithkoujalgi
274da54d50 Skip unreliable tool call assertions in integration tests
Commented out tool call assertions in OllamaAPIIntegrationTest due to inconsistent model behavior, making the scenario difficult to reproduce reliably. Updated WithAuth test to check for non-null 'isNoon' instead of strict equality.
2025-09-17 21:23:50 +05:30
amithkoujalgi
ca400cfbba Merge branch 'main' into refactor 2025-09-17 21:11:23 +05:30
amithkoujalgi
e437ba8128 Update OllamaAPIIntegrationTest.java 2025-09-17 21:10:48 +05:30
Amith Koujalgi
5e9f515c66 Merge pull request #182 from ollama4j/dependabot/maven/org.apache.maven.plugins-maven-failsafe-plugin-3.5.4
Some checks failed
CodeQL / Analyze (javascript) (push) Failing after 10s
CodeQL / Analyze (java) (push) Failing after 14s
Mark stale issues / stale (push) Failing after 19s
Mark stale issues and PRs / stale (push) Failing after 1m31s
Bump org.apache.maven.plugins:maven-failsafe-plugin from 3.5.3 to 3.5.4
2025-09-17 21:10:17 +05:30
Amith Koujalgi
5bfdfa2aa1 Merge pull request #181 from ollama4j/dependabot/maven/com.fasterxml.jackson.datatype-jackson-datatype-jsr310-2.20.0
Bump com.fasterxml.jackson.datatype:jackson-datatype-jsr310 from 2.17.1 to 2.20.0
2025-09-17 21:09:57 +05:30
Amith Koujalgi
14666357bd Merge pull request #180 from ollama4j/dependabot/maven/com.fasterxml.jackson.core-jackson-databind-2.20.0
Bump com.fasterxml.jackson.core:jackson-databind from 2.17.1 to 2.20.0
2025-09-17 21:09:38 +05:30
Amith Koujalgi
b53a391492 Merge pull request #179 from ollama4j/dependabot/maven/org.apache.maven.plugins-maven-javadoc-plugin-3.11.3
Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.11.2 to 3.11.3
2025-09-17 21:09:17 +05:30
Amith Koujalgi
dab2111f10 Merge pull request #178 from ollama4j/dependabot/maven/ch.qos.logback-logback-classic-1.5.18
Bump ch.qos.logback:logback-classic from 1.5.6 to 1.5.18
2025-09-17 21:06:09 +05:30
amithkoujalgi
c15048954c Update OllamaAPIIntegrationTest.java 2025-09-17 20:54:50 +05:30
amithkoujalgi
ba3d8925f2 Refactor integration tests and update Makefile targets
Refactored OllamaAPIIntegrationTest to simplify stream handlers and remove unused StringBuffer variables. Updated Makefile to ensure formatting is applied before running test targets. Adjusted logback.xml pattern to use full logger name for improved logging clarity.
2025-09-17 20:49:53 +05:30
amithkoujalgi
300f1691e7 Remove hardcoded Ollama host in integration test
Eliminated hardcoded values for 'useExternalOllamaHost' and 'ollamaHost' in OllamaAPIIntegrationTest. The test now relies solely on environment variables for configuration.
2025-09-17 20:38:20 +05:30
amithkoujalgi
a1b5756107 Update Ollama host and clean up integration tests
Changed the remote Ollama host IP in Makefile and test setup to 192.168.29.229. Fixed a typo in a test method name and removed unused StringBuffer variables and related assertions from OllamaAPIIntegrationTest.
2025-09-17 20:28:58 +05:30
amithkoujalgi
b1d3ee54a5 Refactor JSON logging and utility methods
Replaced manual pretty-printing of JSON in OllamaAPI with a new Utils.toJSON method for cleaner logging. Added private constructors to utility classes to prevent instantiation. Updated test and sample code for improved clarity and randomness.
2025-09-17 20:05:18 +05:30
amithkoujalgi
4df4ea1930 Remove deprecated embedding and library model classes
Deleted deprecated classes related to embeddings and library models, including OllamaEmbeddingResponseModel, OllamaEmbeddingsRequestBuilder, OllamaEmbeddingsRequestModel, LibraryModel, LibraryModelDetail, LibraryModelTag, and OllamaModelType. Updated OllamaAPI to remove references to these classes and improve documentation, exception handling, and code clarity.
2025-09-17 19:47:07 +05:30
amithkoujalgi
2f83a5c98c Improve Makefile output and update pre-commit config
Added colored echo statements to Makefile targets for clearer output and improved developer experience. Updated commitizen hook in .pre-commit-config.yaml to v4.9.1 for latest features and fixes.
2025-09-17 11:56:57 +05:30
Amith Koujalgi
cae8b6e1e4 Update Makefile 2025-09-17 11:17:02 +05:30
Amith Koujalgi
da21bdcf85 Update Makefile 2025-09-17 11:14:01 +05:30
Amith Koujalgi
ac92766c6c Add Spotless plugin and update copyright headers
Introduced the Spotless Maven plugin for code formatting in pom.xml. Updated copyright headers to include 'and contributors' and changed the year to 2025 in all main source files. Minor formatting and import order improvements applied throughout the codebase.
2025-09-17 11:10:55 +05:30
Amith Koujalgi
329381b1ee Refactor and reorganize API docs structure
Moved and renamed several API documentation files for better organization, updated sidebar positions, and merged image generation docs. Added logging documentation and updated Makefile commands for docs build and serve. Improved clarity and consistency in API doc titles and structure.
2025-09-17 10:34:50 +05:30
Amith Koujalgi
fc1f842f6b refactor: enhance generateWithTools method in OllamaAPI
- Updated the generateWithTools method to include a streamHandler parameter for improved response handling.
- Enhanced method documentation to clarify functionality, usage, and error handling.
- Improved the prompt augmentation process by detailing tool invocation based on model output.
2025-09-16 11:00:52 +05:30
Amith Koujalgi
70519e3309 Add configurable timeouts for image URL loading
Introduces connect and read timeout settings for loading images from URLs in OllamaAPI and OllamaChatRequestBuilder. Refactors Utils to use HttpClient for image retrieval with timeout support and improves error handling and logging. Updates unit tests to verify builder robustness against malformed URLs.
2025-09-16 10:31:32 +05:30
Amith Koujalgi
656802b343 refactor: clean up and deprecate unused methods in OllamaAPI and related classes
- Removed deprecated methods and unused imports from `OllamaAPI`.
- Updated method signatures to improve clarity and consistency.
- Refactored embedding request handling to utilize `OllamaEmbedRequestModel`.
- Adjusted integration tests to reflect changes in method usage and removed obsolete tests.
- Enhanced code readability by standardizing formatting and comments across various classes.
2025-09-16 00:27:11 +05:30
Amith Koujalgi
44c6236243 refactor: rename generateAsync method to generate and update image handling in OllamaAPI
- Renamed `generateAsync` to `generate` for clarity.
- Consolidated image handling in `generateWithImages` to accept multiple image types (File, byte[], String).
- Updated request format handling in `OllamaCommonRequest` and related classes to use a more flexible format property.
- Adjusted integration and unit tests to reflect changes in method signatures and functionality.
2025-09-15 23:35:53 +05:30
Amith Koujalgi
51501cf5e1 Merge pull request #177 from ollama4j/dependabot/npm_and_yarn/docs/react-19.1.1
Some checks failed
CodeQL / Analyze (java) (push) Failing after 27s
CodeQL / Analyze (javascript) (push) Failing after 26s
Mark stale issues / stale (push) Failing after 17s
Mark stale issues and PRs / stale (push) Failing after 1m32s
Bump react from 18.2.0 to 19.1.1 in /docs
2025-09-15 20:11:50 +05:30
Amith Koujalgi
9dabf678e5 Merge pull request #176 from ollama4j/dependabot/github_actions/actions/stale-10
Bump actions/stale from 8 to 10
2025-09-15 20:11:37 +05:30
Amith Koujalgi
e2231a0dbd Merge pull request #175 from ollama4j/dependabot/github_actions/actions/checkout-5
Bump actions/checkout from 3 to 5
2025-09-15 20:11:22 +05:30
Amith Koujalgi
f4ce7e2ec6 Merge pull request #174 from twosom/client-handles-tools-support
feat: add client-side tool handling option
2025-09-15 20:10:58 +05:30
twosom
9fd908bb71 docs: add documentation for client-managed tool calls 2025-09-15 22:57:50 +09:00
dependabot[bot]
c3eedb4785 Bump org.apache.maven.plugins:maven-failsafe-plugin from 3.5.3 to 3.5.4
Bumps [org.apache.maven.plugins:maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 3.5.3 to 3.5.4.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.5.3...surefire-3.5.4)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-failsafe-plugin
  dependency-version: 3.5.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 00:42:17 +00:00
dependabot[bot]
f6f4dfb9f7 Bump com.fasterxml.jackson.datatype:jackson-datatype-jsr310
Bumps com.fasterxml.jackson.datatype:jackson-datatype-jsr310 from 2.17.1 to 2.20.0.

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310
  dependency-version: 2.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 00:41:55 +00:00
dependabot[bot]
739f5213a6 Bump com.fasterxml.jackson.core:jackson-databind from 2.17.1 to 2.20.0
Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.17.1 to 2.20.0.
- [Commits](https://github.com/FasterXML/jackson/commits)

---
updated-dependencies:
- dependency-name: com.fasterxml.jackson.core:jackson-databind
  dependency-version: 2.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 00:41:52 +00:00
dependabot[bot]
79ebce842d Bump org.apache.maven.plugins:maven-javadoc-plugin from 3.11.2 to 3.11.3
Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.11.2 to 3.11.3.
- [Release notes](https://github.com/apache/maven-javadoc-plugin/releases)
- [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.11.2...maven-javadoc-plugin-3.11.3)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-javadoc-plugin
  dependency-version: 3.11.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 00:40:42 +00:00
dependabot[bot]
bafd84b0c9 Bump ch.qos.logback:logback-classic from 1.5.6 to 1.5.18
Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.6 to 1.5.18.
- [Release notes](https://github.com/qos-ch/logback/releases)
- [Commits](https://github.com/qos-ch/logback/compare/v_1.5.6...v_1.5.18)

---
updated-dependencies:
- dependency-name: ch.qos.logback:logback-classic
  dependency-version: 1.5.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 00:40:11 +00:00
dependabot[bot]
cad2654fa2 Bump react from 18.2.0 to 19.1.1 in /docs
Bumps [react](https://github.com/facebook/react/tree/HEAD/packages/react) from 18.2.0 to 19.1.1.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.1.1/packages/react)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.1.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 00:40:10 +00:00
dependabot[bot]
dcde3d7738 Bump actions/stale from 8 to 10
Bumps [actions/stale](https://github.com/actions/stale) from 8 to 10.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v8...v10)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '10'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 00:36:34 +00:00
dependabot[bot]
5c76ab69a5 Bump actions/checkout from 3 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-15 00:35:34 +00:00
twosom
7bd3bed5e4 feat: add client-side tool handling option 2025-09-13 21:21:00 +09:00
amithkoujalgi
356bd0b81f Merge remote-tracking branch 'origin/main'
Some checks failed
Mark stale issues / stale (push) Successful in 38s
Mark stale issues and PRs / stale (push) Successful in 1m26s
CodeQL / Analyze (javascript) (push) Failing after 22s
CodeQL / Analyze (java) (push) Failing after 26s
2025-09-11 18:52:06 +05:30
Amith Koujalgi
898c34a157 Merge pull request #158 from ollama4j/dependabot/maven/org.testcontainers-nginx-1.21.3
Some checks failed
CodeQL / Analyze (java) (push) Failing after 1m39s
CodeQL / Analyze (javascript) (push) Failing after 1m39s
Bump org.testcontainers:nginx from 1.20.0 to 1.21.3
2025-09-11 10:06:25 +05:30
Amith Koujalgi
d037f45f94 Merge pull request #159 from ollama4j/dependabot/github_actions/actions/setup-node-5
Bump actions/setup-node from 3 to 5
2025-09-11 10:06:12 +05:30
Amith Koujalgi
1e487fb6ea Merge pull request #160 from ollama4j/dependabot/github_actions/actions/upload-pages-artifact-4
Bump actions/upload-pages-artifact from 3 to 4
2025-09-11 10:05:48 +05:30
Amith Koujalgi
2ad0b03863 Merge pull request #161 from ollama4j/dependabot/maven/org.apache.maven.plugins-maven-failsafe-plugin-3.5.3
Bump org.apache.maven.plugins:maven-failsafe-plugin from 3.0.0-M5 to 3.5.3
2025-09-11 10:05:34 +05:30
Amith Koujalgi
8e2be82a2b Merge pull request #162 from ollama4j/dependabot/maven/org.json-json-20250517
Bump org.json:json from 20240205 to 20250517
2025-09-11 10:04:35 +05:30
Amith Koujalgi
1d4d9fa48c Merge pull request #163 from ollama4j/dependabot/github_actions/actions/setup-java-5
Bump actions/setup-java from 3 to 5
2025-09-11 10:03:40 +05:30
Amith Koujalgi
704ed81ad9 Merge pull request #164 from ollama4j/dependabot/maven/org.sonatype.central-central-publishing-maven-plugin-0.8.0
Bump org.sonatype.central:central-publishing-maven-plugin from 0.5.0 to 0.8.0
2025-09-11 10:03:23 +05:30
Amith Koujalgi
8a7554efb8 Merge pull request #165 from ollama4j/dependabot/maven/org.slf4j-slf4j-api-2.0.17
Bump org.slf4j:slf4j-api from 2.0.9 to 2.0.17
2025-09-11 10:03:04 +05:30
Amith Koujalgi
dcc6cdf20f Merge pull request #166 from ollama4j/dependabot/github_actions/mattnotmitt/doxygen-action-1.12.0
Bump mattnotmitt/doxygen-action from 1.1.0 to 1.12.0
2025-09-11 10:02:41 +05:30
Amith Koujalgi
390b1e4ba3 Merge pull request #167 from ollama4j/dependabot/github_actions/actions/setup-python-6
Bump actions/setup-python from 5 to 6
2025-09-11 10:02:15 +05:30
Amith Koujalgi
d48fd02a99 Merge pull request #168 from ollama4j/dependabot/npm_and_yarn/docs/react-dom-19.1.1
Bump react-dom from 18.2.0 to 19.1.1 in /docs
2025-09-11 10:01:36 +05:30
Amith Koujalgi
05bb69db58 Merge pull request #169 from ollama4j/dependabot/npm_and_yarn/docs/clsx-2.1.1
Bump clsx from 2.0.0 to 2.1.1 in /docs
2025-09-11 09:59:31 +05:30
dependabot[bot]
fb8a88d8f9 Bump clsx from 2.0.0 to 2.1.1 in /docs
Bumps [clsx](https://github.com/lukeed/clsx) from 2.0.0 to 2.1.1.
- [Release notes](https://github.com/lukeed/clsx/releases)
- [Commits](https://github.com/lukeed/clsx/compare/v2.0.0...v2.1.1)

---
updated-dependencies:
- dependency-name: clsx
  dependency-version: 2.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-11 04:27:00 +00:00
Amith Koujalgi
4f418794fd Merge pull request #170 from ollama4j/dependabot/npm_and_yarn/docs/mdx-js/react-3.1.1
Bump @mdx-js/react from 3.0.0 to 3.1.1 in /docs
2025-09-11 09:55:44 +05:30
dependabot[bot]
52d68ad80a Bump @mdx-js/react from 3.0.0 to 3.1.1 in /docs
Bumps [@mdx-js/react](https://github.com/mdx-js/mdx/tree/HEAD/packages/react) from 3.0.0 to 3.1.1.
- [Release notes](https://github.com/mdx-js/mdx/releases)
- [Changelog](https://github.com/mdx-js/mdx/blob/main/changelog.md)
- [Commits](https://github.com/mdx-js/mdx/commits/3.1.1/packages/react)

---
updated-dependencies:
- dependency-name: "@mdx-js/react"
  dependency-version: 3.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:45:21 +00:00
dependabot[bot]
7da308b563 Bump react-dom from 18.2.0 to 19.1.1 in /docs
Bumps [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) from 18.2.0 to 19.1.1.
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.1.1/packages/react-dom)

---
updated-dependencies:
- dependency-name: react-dom
  dependency-version: 19.1.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:45:18 +00:00
amithkoujalgi
e24ff2c652 Merge remote-tracking branch 'origin/main' 2025-09-10 21:14:43 +05:30
Amith Koujalgi
94aa7669d9 Merge pull request #171 from ollama4j/dependabot/npm_and_yarn/docs/prism-react-renderer-2.4.1
Some checks failed
CodeQL / Analyze (javascript) (push) Failing after 6m2s
CodeQL / Analyze (java) (push) Failing after 6m6s
Mark stale issues / stale (push) Successful in 36s
Mark stale issues and PRs / stale (push) Successful in 1m35s
Bump prism-react-renderer from 2.3.1 to 2.4.1 in /docs
2025-09-10 21:14:14 +05:30
Amith Koujalgi
44e590caa3 Merge pull request #172 from ollama4j/dependabot/npm_and_yarn/docs/iconify/react-6.0.1
Bump @iconify/react from 5.2.1 to 6.0.1 in /docs
2025-09-10 21:14:01 +05:30
dependabot[bot]
37e429cfca Bump @iconify/react from 5.2.1 to 6.0.1 in /docs
Bumps [@iconify/react](https://github.com/iconify/iconify/tree/HEAD/components/react) from 5.2.1 to 6.0.1.
- [Commits](https://github.com/iconify/iconify/commits/HEAD/components/react)

---
updated-dependencies:
- dependency-name: "@iconify/react"
  dependency-version: 6.0.1
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:35:22 +00:00
dependabot[bot]
599874eba2 Bump prism-react-renderer from 2.3.1 to 2.4.1 in /docs
Bumps [prism-react-renderer](https://github.com/FormidableLabs/prism-react-renderer) from 2.3.1 to 2.4.1.
- [Release notes](https://github.com/FormidableLabs/prism-react-renderer/releases)
- [Commits](https://github.com/FormidableLabs/prism-react-renderer/compare/prism-react-renderer@2.3.1...prism-react-renderer@2.4.1)

---
updated-dependencies:
- dependency-name: prism-react-renderer
  dependency-version: 2.4.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:35:13 +00:00
dependabot[bot]
b4c1899561 Bump actions/setup-python from 5 to 6
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:42 +00:00
dependabot[bot]
faf847a742 Bump org.slf4j:slf4j-api from 2.0.9 to 2.0.17
Bumps org.slf4j:slf4j-api from 2.0.9 to 2.0.17.

---
updated-dependencies:
- dependency-name: org.slf4j:slf4j-api
  dependency-version: 2.0.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:39 +00:00
dependabot[bot]
77c9a42b2d Bump mattnotmitt/doxygen-action from 1.1.0 to 1.12.0
Bumps [mattnotmitt/doxygen-action](https://github.com/mattnotmitt/doxygen-action) from 1.1.0 to 1.12.0.
- [Release notes](https://github.com/mattnotmitt/doxygen-action/releases)
- [Commits](https://github.com/mattnotmitt/doxygen-action/compare/v1.1.0...v1.12.0)

---
updated-dependencies:
- dependency-name: mattnotmitt/doxygen-action
  dependency-version: 1.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:39 +00:00
dependabot[bot]
9ea10b8455 Bump org.sonatype.central:central-publishing-maven-plugin
Bumps [org.sonatype.central:central-publishing-maven-plugin](https://github.com/sonatype/central-publishing-maven-plugin) from 0.5.0 to 0.8.0.
- [Commits](https://github.com/sonatype/central-publishing-maven-plugin/commits)

---
updated-dependencies:
- dependency-name: org.sonatype.central:central-publishing-maven-plugin
  dependency-version: 0.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:37 +00:00
dependabot[bot]
e8a7675845 Bump actions/setup-java from 3 to 5
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3 to 5.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v3...v5)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:36 +00:00
dependabot[bot]
e29ae93c53 Bump org.json:json from 20240205 to 20250517
Bumps [org.json:json](https://github.com/douglascrockford/JSON-java) from 20240205 to 20250517.
- [Release notes](https://github.com/douglascrockford/JSON-java/releases)
- [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md)
- [Commits](https://github.com/douglascrockford/JSON-java/commits)

---
updated-dependencies:
- dependency-name: org.json:json
  dependency-version: '20250517'
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:34 +00:00
dependabot[bot]
3ee93f9534 Bump org.apache.maven.plugins:maven-failsafe-plugin
Bumps [org.apache.maven.plugins:maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 3.0.0-M5 to 3.5.3.
- [Release notes](https://github.com/apache/maven-surefire/releases)
- [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.0.0-M5...surefire-3.5.3)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-failsafe-plugin
  dependency-version: 3.5.3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:31 +00:00
dependabot[bot]
bf8878d40c Bump actions/upload-pages-artifact from 3 to 4
Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 3 to 4.
- [Release notes](https://github.com/actions/upload-pages-artifact/releases)
- [Commits](https://github.com/actions/upload-pages-artifact/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/upload-pages-artifact
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:30 +00:00
dependabot[bot]
fc077819a9 Bump org.testcontainers:nginx from 1.20.0 to 1.21.3
Bumps [org.testcontainers:nginx](https://github.com/testcontainers/testcontainers-java) from 1.20.0 to 1.21.3.
- [Release notes](https://github.com/testcontainers/testcontainers-java/releases)
- [Changelog](https://github.com/testcontainers/testcontainers-java/blob/main/CHANGELOG.md)
- [Commits](https://github.com/testcontainers/testcontainers-java/compare/1.20.0...1.21.3)

---
updated-dependencies:
- dependency-name: org.testcontainers:nginx
  dependency-version: 1.21.3
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:27 +00:00
dependabot[bot]
281eb6560d Bump actions/setup-node from 3 to 5
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 3 to 5.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v3...v5)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-10 15:34:27 +00:00
Amith Koujalgi
74fbafeb3f Merge pull request #157 from ollama4j/tests
Tests
2025-09-10 21:03:38 +05:30
amithkoujalgi
56c3f90559 Comment out pre-commit run step in GitHub workflow to prevent execution during CI 2025-09-10 20:00:54 +05:30
amithkoujalgi
27a2d68e9b Enhance GitHub workflows and templates
- Updated dependabot configuration to include Maven, GitHub Actions, and npm with weekly update schedules and limits on open pull requests.
- Added a pull request template to standardize contributions and ensure necessary information is provided.
- Introduced issue templates for bug reports and feature requests to streamline issue tracking and enhance user experience.
- Created workflows for CodeQL analysis, pre-commit checks, and stale issue management to improve code quality and maintainability.
2025-09-10 19:10:13 +05:30
amithkoujalgi
085fe3a9b0 Add CODEOWNERS file to define repository ownership 2025-09-10 18:52:46 +05:30
amithkoujalgi
bb1adacc7f Add CONTRIBUTING.md and SECURITY.md files
- Introduced a CONTRIBUTING.md file to guide contributors on setup, coding guidelines, and pull request processes.
- Added a SECURITY.md file outlining the security policy, reporting vulnerabilities, and responsible disclosure procedures.
2025-09-10 18:49:45 +05:30
amithkoujalgi
fdc2e39646 Refactor logging in OllamaAPI and ConsoleOutputStreamHandler
- Changed logger variable names from 'logger' to 'LOG' for consistency.
- Updated logging statements in OllamaAPI to use the new 'LOG' variable.
- Modified ConsoleOutputStreamHandler to log messages using 'LOG' instead of printing directly to the console.
2025-09-10 18:08:01 +05:30
amithkoujalgi
773cb4af78 Refactor verbosity handling in OllamaAPI
- Removed the verbose logging feature from the OllamaAPI class and related classes.
- Updated logging statements to use debug level instead of info for model requests and responses.
- Cleaned up related test cases to reflect the removal of verbosity settings.
2025-09-10 18:02:28 +05:30
amithkoujalgi
9036d9e7c6 Add unit tests for annotations, serialization, and tool functions
- Introduced TestAnnotations.java to validate OllamaToolService and ToolProperty annotations.
- Added TestBooleanToJsonFormatFlagSerializer.java to test serialization of Boolean values.
- Created TestFileToBase64Serializer.java for testing byte array serialization to Base64.
- Implemented TestOllamaChatMessage.java to ensure correct JSON representation of chat messages.
- Developed TestOllamaChatMessageRole.java to verify role registration and custom role creation.
- Added TestOllamaChatRequestBuilder.java to test message handling and request building.
- Created TestOllamaRequestBody.java to validate request body serialization.
- Implemented TestOllamaToolsResult.java to ensure correct transformation of tool results.
- Added TestOptionsAndUtils.java to test options builder and utility functions.
- Created TestReflectionalToolFunction.java to validate method invocation and argument handling.
- Implemented TestToolRegistry.java to ensure tool registration and retrieval functionality.
- Developed TestToolsPromptBuilder.java to verify prompt builder includes tools and prompts correctly.
- Added serialization tests in TestChatRequestSerialization.java and TestEmbedRequestSerialization.java.
2025-09-10 17:31:41 +05:30
amithkoujalgi
fddd753a48 Add unit tests for authentication, options, tool registry, and prompt builder
- Created TestAuth.java to validate BasicAuth and BearerAuth header generation.
- Added TestOptionsAndUtils.java to test OptionsBuilder and utility functions.
- Implemented TestToolRegistry.java to ensure tool registration and retrieval functionality.
- Developed TestToolsPromptBuilder.java to verify prompt builder includes tools and prompts correctly.
2025-09-10 17:06:47 +05:30
amithkoujalgi
b42cee36ae Merge remote-tracking branch 'origin/main' 2025-09-10 16:58:09 +05:30
Amith Koujalgi
4694d31e2c Update README.md 2025-09-10 09:37:19 +05:30
Amith Koujalgi
4abecd1d76 Update README.md 2025-09-10 09:35:24 +05:30
Amith Koujalgi
5ae999078c Merge pull request #156 from ollama4j/amithkoujalgi-patch-2
Amithkoujalgi patch 2
2025-09-10 09:29:04 +05:30
amithkoujalgi
538db8f484 Update README.md 2025-09-10 09:28:37 +05:30
Amith Koujalgi
ca79831c1e Update README.md 2025-09-10 08:43:06 +05:30
Amith Koujalgi
255173c6ac Create CITATION.cff 2025-09-10 08:41:07 +05:30
Amith Koujalgi
8d197f963d Merge pull request #155 from ollama4j/dependabot/npm_and_yarn/docs/npm_and_yarn-6ea9762674
All checks were successful
Mark stale issues / stale (push) Successful in 32s
Bump brace-expansion from 1.1.11 to 1.1.12 in /docs in the npm_and_yarn group across 1 directory
2025-09-05 20:42:27 +05:30
Amith Koujalgi
3c5107f113 Merge pull request #154 from ollama4j/amithkoujalgi-patch-1
Create dependabot.yml
2025-09-05 20:41:52 +05:30
dependabot[bot]
80ee58ba1e Bump brace-expansion
Bumps the npm_and_yarn group with 1 update in the /docs directory: [brace-expansion](https://github.com/juliangruber/brace-expansion).


Updates `brace-expansion` from 1.1.11 to 1.1.12
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-05 10:40:50 +00:00
Amith Koujalgi
d219168451 Create dependabot.yml 2025-09-05 16:09:59 +05:30
Amith Koujalgi
977b85f8ea Merge pull request #153 from sebastianbeattie/patch-1
All checks were successful
Mark stale issues / stale (push) Successful in 30s
Update maven version in README.md
2025-09-04 23:12:04 +05:30
Seb Beattie
9b31fa5390 Update maven version in README.md 2025-09-04 10:55:11 +01:00
Amith Koujalgi
0e0c83a065 Merge pull request #151 from ollama4j/docs-updates
All checks were successful
Mark stale issues / stale (push) Successful in 32s
2025-08-31 23:47:30 +05:30
amithkoujalgi
3ddfd4fb4e Update README.md 2025-08-31 22:23:09 +05:30
amithkoujalgi
a093be5581 Update OllamaAPI.java 2025-08-31 22:02:43 +05:30
Amith Koujalgi
cfd784b919 Merge pull request #150 from ollama4j/docs-updates
All checks were successful
Mark stale issues / stale (push) Successful in 40s
Update docs and dependencies
2025-08-31 20:00:08 +05:30
amithkoujalgi
a3ebe6c992 Update docs and dependencies
Improved descriptions in README and blog posts, removed outdated info from pull-model API docs, and updated several npm dependencies in package.json and package-lock.json for better compatibility and security.
2025-08-31 19:59:29 +05:30
Amith Koujalgi
4eefb81a0b Merge pull request #148 from ollama4j/doc-updates
Add docs for thinking APIs and update examples
2025-08-31 19:37:15 +05:30
amithkoujalgi
f914707536 Add docs for thinking APIs and update examples
Added new documentation for 'chat-with-thinking' and 'generate-thinking' APIs, including usage examples and streamed output. Updated existing API docs to improve example clarity, response formatting, and added more interactive output using TypewriterTextarea. Removed deprecated 'list-library-models' doc and made minor README updates.
2025-08-31 19:36:43 +05:30
Amith Koujalgi
931d5dd520 Merge pull request #145 from ollama4j/thinking-support
Thinking support
2025-08-31 17:44:58 +05:30
amithkoujalgi
b216d1b647 Refactor imports and add fields to OllamaStructuredResult
Reorders and deduplicates import statements across multiple files for consistency and clarity. Adds additional fields to OllamaStructuredResult and ensures OllamaResult is populated with these fields. Updates tests and minor code style improvements throughout the codebase.
2025-08-31 16:46:32 +05:30
amithkoujalgi
4de3d98b79 Update generate.md 2025-08-31 16:00:07 +05:30
amithkoujalgi
6fa5c323b8 Refactor stream handler and update test model usage
Simplified ConsoleOutputStreamHandler to print messages directly without substring logic. Updated WithAuth integration test to use the THINKING_MODEL ('gpt-oss:20b') instead of GENERAL_PURPOSE_MODEL ('gemma3:270m') for model pulling and generation.
2025-08-31 15:56:40 +05:30
amithkoujalgi
c754bd11da Refactor OllamaAPI for improved async handling and response streaming
Updated OllamaAPI to support separate thinking and response stream handlers, enhancing the asynchronous generation of responses. Adjusted related models and observers to accommodate new streaming logic. Improved the handling of response data in OllamaResult and OllamaGenerateResponseModel, adding new properties for better tracking of response metrics. Refined integration tests to reflect changes in method signatures and ensure proper logging of streamed responses.
2025-08-31 14:02:42 +05:30
amithkoujalgi
5f5fa8ecae Deprecate findModelTagFromLibrary and simplify WeatherTool
Marked findModelTagFromLibrary as deprecated in OllamaAPI due to reliance on unstable HTML structure. Simplified WeatherTool by removing external API calls and returning a static weather response for demonstration purposes.
2025-08-31 01:33:57 +05:30
amithkoujalgi
6ae6f4f25b Update run-tests.yml 2025-08-30 21:31:54 +05:30
amithkoujalgi
6b69284497 Update workflow job names and refine integration tests
Added descriptive names to jobs in the GitHub Actions workflow for better clarity. In integration tests, replaced GENERAL_PURPOSE_MODEL with TOOLS_MODEL in relevant tests and adjusted logging within lambda expressions for improved output handling.
2025-08-30 21:30:16 +05:30
amithkoujalgi
52d7dbd7ce Update build-on-pull-request.yml 2025-08-30 21:10:54 +05:30
amithkoujalgi
2070753c5e Update run-tests.yml 2025-08-30 21:05:30 +05:30
Amith Koujalgi
c1f7fb78d9 Merge branch 'main' into thinking-support 2025-08-30 21:01:50 +05:30
amithkoujalgi
b71cf87ec2 Update build-on-pull-request.yml 2025-08-30 21:00:37 +05:30
amithkoujalgi
0965c3046e Update build-on-pull-request.yml 2025-08-30 20:57:17 +05:30
amithkoujalgi
8e50bc8d75 Update OllamaAPIIntegrationTest.java 2025-08-30 20:54:18 +05:30
amithkoujalgi
be5b77c4ac Refactor tool tests and improve tool argument handling
Refactored integration tests to use a reusable employeeFinderTool method and improved assertions for tool call results. Updated tool argument formatting in OllamaAPI for clearer output. Modified AnnotatedTool to use 'numberOfHearts' instead of 'amountOfHearts' and simplified the sayHello method signature and output. Removed redundant and duplicate test code for tool streaming.
2025-08-30 20:53:14 +05:30
amithkoujalgi
6078db6157 Update GitHub Actions workflows for PRs and tests
Enables all pull request event types in build-on-pull-request.yml and cleans up formatting. Removes redundant step for copying workflow file in run-tests.yml to streamline the workflow.
2025-08-30 20:04:42 +05:30
amithkoujalgi
97f457575d Remove sample prompt utilities and update integration tests
Deleted SamplePrompts.java and sample-db-prompt-template.txt as they are no longer needed. Updated OllamaAPIIntegrationTest to use a new TOOLS_MODEL constant, refactored tool registration and prompt descriptions for employee details, and improved test assertions for tool-based chat interactions.
2025-08-30 20:01:35 +05:30
amithkoujalgi
4df59d8862 Refactor test steps to use run-tests workflow
Replaces separate Maven unit and integration test steps with a call to the reusable run-tests.yml workflow, passing the current branch as input. This simplifies the workflow and centralizes test execution logic.
2025-08-30 18:13:58 +05:30
amithkoujalgi
621004e6d8 Fix logging for model pull retry 2025-08-30 18:10:33 +05:30
Amith Koujalgi
74b2ab13e7 Merge pull request #146 from ollama4j/amithkoujalgi-patch-1
All checks were successful
Mark stale issues / stale (push) Successful in 34s
Update run-tests.yml
2025-08-30 18:09:47 +05:30
Amith Koujalgi
8fef5148d9 Update run-tests.yml 2025-08-30 18:09:35 +05:30
amithkoujalgi
b91f6e6b25 Enhance GitHub Actions workflow for dynamic branch testing
- Added a step to check out the target branch specified in the workflow input.
- Implemented a conditional step to use the workflow file from the checked-out branch, improving flexibility and error handling in CI processes.
2025-08-30 18:06:06 +05:30
amithkoujalgi
0ec20d14b0 Enhance CI workflow and refactor integration tests
- Added setup step for Ollama installation in the GitHub Actions workflow.
- Updated environment variables for integration tests to utilize an external Ollama host.
- Refactored test method names in OllamaAPIIntegrationTest for clarity and consistency, changing 'testAskModel' to 'testGenerate'.
- Introduced new tests for image processing from URLs and files, while removing outdated tests for improved test suite relevance.
2025-08-30 18:00:04 +05:30
amithkoujalgi
c705432510 Increase model pull retry delay and attempts
Raised the base delay for model pull retries from 1s to 3s and updated log output to show seconds instead of milliseconds. Also increased the number of retries for model pull in integration tests from 3 to 5 to improve robustness.
2025-08-30 17:04:02 +05:30
amithkoujalgi
de379d73b2 Refactor OllamaAPI for readability and add EqualsAndHashCode to BearerAuth
Reformatted method signatures, chained calls, and comments in OllamaAPI for improved readability and maintainability. Added @EqualsAndHashCode(callSuper = false) to BearerAuth to ensure proper equality checks, and reformatted its code for consistency.
2025-08-30 16:59:05 +05:30
amithkoujalgi
ad1bf658a9 Enhance OllamaAPI with improved timeout and retry mechanisms
- Updated request timeout default to 10 seconds for API calls.
- Added verbose logging option with default set to true.
- Introduced maxChatToolCallRetries to control retry attempts during chat interactions.
- Implemented numberOfRetriesForModelPull with exponential backoff for model retrieval failures.
- Refactored pullModel method to include retry logic and improved error handling.
2025-08-30 16:49:43 +05:30
amithkoujalgi
ab9b95dbed Update THINKING_TOOL_MODEL constant in OllamaAPIIntegrationTest to gpt-oss:20b 2025-08-30 15:50:08 +05:30
amithkoujalgi
7f37233c72 Update THINKING_TOOL_MODEL constant in OllamaAPIIntegrationTest to version 1.7b 2025-08-30 15:45:08 +05:30
amithkoujalgi
77aa3b85d1 Refactor WithAuth integration test for improved structure and functionality
- Restored the WithAuth class and updated it to include a new general-purpose model.
- Enhanced the setup method to initialize the OllamaAPI with bearer authentication.
- Added tests to validate the API's behavior with correct and incorrect authentication tokens.
- Updated the structured output test to reflect changes in the model and prompt.
- Improved logging for better traceability during test execution.
2025-08-30 15:07:32 +05:30
amithkoujalgi
863c978d12 Refactor OllamaAPIIntegrationTest and AnnotatedTool for improved clarity and consistency
- Updated model constants in OllamaAPIIntegrationTest to enhance readability and maintainability.
- Changed method visibility from public to package-private where appropriate.
- Refactored assertions in testListModelsAPI for better validation.
- Cleaned up formatting in AnnotatedTool methods for consistency.
- Added a new image resource (roses.jpg) for testing purposes.
2025-08-30 15:02:51 +05:30
amithkoujalgi
cc950b893e Refactor OllamaAPI to use Constants for HTTP headers and improve logging format
- Introduced a new Constants class to centralize HTTP header values.
- Updated OllamaAPI methods to utilize Constants for "Content-Type" and "Accept" headers.
- Enhanced logging statements to use parameterized messages for better performance and readability.
- Added a test for the ping method in OllamaAPIIntegrationTest to ensure connectivity.
2025-08-30 13:01:01 +05:30
amithkoujalgi
f085b633af Update OllamaAPIIntegrationTest.java 2025-08-30 12:14:09 +05:30
amithkoujalgi
3d0b3eeb7f Add tool deregistration and update integration tests
Introduces a method to deregister all tools in OllamaAPI and ToolRegistry. Updates integration tests to use new models, refactors prompts and assertions, and removes the TimeOfDay class. The WithAuth test is now fully commented out.
2025-08-30 12:01:32 +05:30
Amith Koujalgi
4a69df4476 remove unused model pull in testListModelsAPI 2025-08-29 17:08:48 +05:30
Amith Koujalgi
639249d346 Update Lombok version and adjust project build output timestamp formatting 2025-08-29 17:00:49 +05:30
amithkoujalgi
8d9ee006ee Refactor OllamaAPI and chat models to support 'thinking' responses
- Introduced a 'thinking' field in OllamaChatMessage to capture intermediate reasoning.
- Updated OllamaChatRequest to include a 'think' parameter for chat requests.
- Modified OllamaChatRequestBuilder to facilitate setting the 'think' parameter.
- Enhanced response handling in OllamaChatStreamObserver and OllamaGenerateStreamObserver to manage 'thinking' content.
- Updated integration tests to validate the new 'thinking' functionality in chat and generation methods.
2025-08-28 12:44:43 +05:30
amithkoujalgi
14642e9856 Enhance OllamaAPI with 'think' parameter and response handling
- Added 'think' parameter to the generate methods in OllamaAPI to enable step-by-step reasoning for model responses.
- Updated OllamaGenerateRequest and OllamaGenerateResponseModel to include 'thinking' field.
- Modified response handling in OllamaGenerateStreamObserver to incorporate 'thinking' responses.
- Updated integration tests to validate the new functionality, including tests for generating responses with thinking enabled.
- Refactored related methods and classes for consistency and clarity.
2025-08-28 10:03:07 +05:30
Amith Koujalgi
3efd7712be Merge pull request #143 from ollama4j/small-fixes
All checks were successful
Mark stale issues / stale (push) Successful in 33s
Small fixes
2025-08-27 21:18:15 +05:30
Amith Koujalgi
d2417b0082 Merge pull request #144 from trly/fix/update-pullmodel-to-handle-errors
fix: handle ollama error responses
2025-08-27 21:18:03 +05:30
Travis Lyons
bae903f8ca fix: handle ollama error responses
fixes: #138

- Added error field to ModelPullResponse
  - Enhanced error handling in doPullModel to check for errors in response body and throw OllamaBaseException with the specific error message
2025-08-20 11:51:49 -04:00
Amith Koujalgi
1e17e258b6 Merge pull request #141 from p00temkin/thinking
All checks were successful
Mark stale issues / stale (push) Successful in 29s
Ignore thinking key to allow gpt-oss replies to be processed
2025-08-16 09:34:20 +05:30
amithkoujalgi
cc13a580fa Update WithAuth.java 2025-08-16 09:27:40 +05:30
amithkoujalgi
54d8cf4cd9 Add WeatherTool and integration test with auth proxy
Introduces WeatherTool for fetching weather data via OpenWeatherMap API and its tool specification. Adds an integration test (WithAuth) using Testcontainers to verify OllamaAPI connectivity through an NGINX proxy with bearer token authentication. Also updates pom.xml to include the testcontainers-nginx dependency and minor improvements to OllamaAPI for request headers and Javadoc formatting. TypewriterTextarea now supports text alignment, with homepage header using center alignment.
2025-08-15 23:16:24 +05:30
p00temkin
03da285d1c Ignore thinking key to allow gpt-oss replies to be processed 2025-08-12 14:52:31 +02:00
Amith Koujalgi
339f788832 Merge pull request #133 from ollama4j/docs-updates
All checks were successful
Mark stale issues / stale (push) Successful in 42s
Update index.js
2025-04-20 00:33:32 +05:30
amithkoujalgi
ccf738127d Update index.js 2025-04-20 00:33:00 +05:30
Amith Koujalgi
b90c7a027a Merge pull request #132 from ollama4j/docs-updates
Updated docs
2025-04-20 00:11:12 +05:30
amithkoujalgi
2b0506a393 Updated docs 2025-04-20 00:10:37 +05:30
Amith Koujalgi
81278be964 Merge pull request #131 from ollama4j/docs-updates
Updated docs
2025-04-19 23:36:47 +05:30
amithkoujalgi
cef4a00d17 Updated docs 2025-04-19 23:36:03 +05:30
Amith Koujalgi
9083c3ace3 Merge pull request #130 from ollama4j/docs-updates
Updated docs
2025-04-19 23:25:06 +05:30
amithkoujalgi
79923451d0 Updated docs 2025-04-19 23:24:44 +05:30
Amith Koujalgi
02168e6fd9 Merge pull request #129 from ollama4j/docs-updates
Updated docs
2025-04-19 23:16:09 +05:30
amithkoujalgi
a3debc0983 Updated docs 2025-04-19 23:15:27 +05:30
Amith Koujalgi
9a0908f504 Merge pull request #128 from ollama4j/docs-updates
Updated docs
2025-04-19 22:14:09 +05:30
amithkoujalgi
4d03673d8c Updated docs 2025-04-19 22:11:36 +05:30
Amith Koujalgi
c4ebd5cd31 Merge pull request #127 from ollama4j/docs-updates
Updated docs
2025-04-19 00:24:08 +05:30
amithkoujalgi
43361ff271 Updated docs 2025-04-19 00:23:27 +05:30
Amith Koujalgi
f1d9fc154a Merge pull request #126 from ollama4j/docs-updates
Updated docs
2025-04-19 00:19:27 +05:30
amithkoujalgi
9811d9f7fd Updated docs 2025-04-19 00:16:23 +05:30
Amith Koujalgi
63e2fc2c49 Merge pull request #125 from ollama4j/docs-updates
All checks were successful
Mark stale issues / stale (push) Successful in 57s
Docs updates
2025-04-18 23:03:10 +05:30
amithkoujalgi
63b3bcb71e Updated docs 2025-04-18 23:02:32 +05:30
amithkoujalgi
9d9bc53e0b Updated docs 2025-04-18 22:52:08 +05:30
amithkoujalgi
8fd203931d Updated docs 2025-04-18 22:45:30 +05:30
amithkoujalgi
9c181486a5 Added CodeEmbed component to embed code snippets in markdowns 2025-04-18 12:15:49 +05:30
amithkoujalgi
2b036c8a62 Added CodeEmbed component to embed code snippets in markdowns 2025-04-17 20:31:01 +05:30
Amith Koujalgi
ec0ebc9654 Update list-library-models.md 2025-04-17 18:39:07 +05:30
Amith Koujalgi
c2e4e3fa7f Merge pull request #124 from ollama4j/113-tests-fix
All checks were successful
Mark stale issues / stale (push) Successful in 42s
Added search for docs
2025-04-16 21:43:36 +05:30
amithkoujalgi
d6a57560fe added search for docs 2025-04-16 21:41:33 +05:30
Amith Koujalgi
a4c47216f5 Merge pull request #123 from ollama4j/amithkoujalgi-patch-1
Update README.md
2025-04-16 21:16:19 +05:30
Amith Koujalgi
202fbef8b7 Update README.md 2025-04-16 21:15:49 +05:30
Amith Koujalgi
48d0a494ee Merge pull request #119 from ollama4j/113-tests-fix
All checks were successful
Mark stale issues / stale (push) Successful in 27s
[Fix]: NPE when tool not found
2025-04-06 23:34:53 +05:30
amithkoujalgi
b2e1330ec0 Updated 'build-docs' to 'docs' and 'start-docs' to 'docs-dev' for clarity.
Updated a workflow to run tests and build docs on pull requests.
2025-04-06 23:22:29 +05:30
amithkoujalgi
a2d95a052a - Updated Makefile to add a new remote integration test command.
- Updated docs – Enhanced DBQueryFunction to validate input arguments and throw a RuntimeException if required arguments are missing.
- Updated docs – Refactored tool specifications for fuel price, weather, and employee details to use a unified prompt function structure.  (Addresses #116).
- Improved javadoc for `chatStreaming()` API. (Addresses #115).
- Introduced `ToolInvocationException` to handle errors during tool invocation in OllamaAPI. (Addresses #117).
- Updated integration tests to include `ToolInvocationException` in method signatures for better error handling.
2025-04-06 23:05:26 +05:30
Amith Koujalgi
d86217dd0b Merge pull request #114 from ollama4j/113-tests-fix
All checks were successful
Mark stale issues / stale (push) Successful in 39s
Tests fix
2025-03-25 22:30:56 +05:30
amithkoujalgi
70b4a7961a Used smaller-sized images for the test cases 2025-03-25 21:56:45 +05:30
amithkoujalgi
0248f21654 Used smaller-sized images for the test cases 2025-03-25 21:34:13 +05:30
Amith Koujalgi
252ea50717 Update OllamaAPIIntegrationTest.java 2025-03-25 20:40:58 +05:30
Amith Koujalgi
1155a9be9f Merge pull request #113 from bavardage/support-handing-images-as-byte-arrays
add api methods to support passing images as byte[]
2025-03-25 20:36:12 +05:30
Benjamin Duffield
bc87d0c7ec add api methods to support passing images as byte[] 2025-03-25 14:00:18 +00:00
Amith Koujalgi
a895e3a0ea Merge pull request #112 from ollama4j/structured-output
Add structured response model
2025-03-25 18:59:56 +05:30
amithkoujalgi
68acedfd0a Merge branch 'structured-output' of https://github.com/ollama4j/ollama4j into structured-output 2025-03-25 00:22:22 +05:30
amithkoujalgi
be08f11027 Update OllamaAPIIntegrationTest.java 2025-03-25 00:20:25 +05:30
amithkoujalgi
b9b18271a1 Support for structured output
Added support for structured output
2025-03-24 23:45:01 +05:30
amithkoujalgi
12aa38cab0 updated doc 2025-03-24 23:43:20 +05:30
amithkoujalgi
b05f1d9b12 Refactor imports in OllamaAPIIntegrationTest for improved clarity and organization 2025-03-24 23:33:35 +05:30
Amith Koujalgi
bc2a931586 Enhance OllamaAPI and OllamaResult for improved model pulling and structured responses
- Added a retry mechanism in OllamaAPI for model pulling, allowing configurable retries.
- Introduced new methods in OllamaResult for structured response handling, including parsing JSON responses into a Map or specific class types.
- Updated integration tests to validate the new functionality and ensure robust testing of model interactions.
- Improved code formatting and consistency across the OllamaAPI and integration test classes.
2025-03-24 21:40:20 +05:30
Amith Koujalgi
1bda78e35b revert OllamaResult.java
Signed-off-by: Amith Koujalgi <koujalgi.amith@gmail.com>
2025-03-24 18:24:09 +05:30
Amith Koujalgi
e7e71f6421 Enhance integration tests and Makefile for external Ollama host support
- Updated the Makefile to include a new target for local integration tests with external Ollama host configuration.
- Modified the OllamaAPIIntegrationTest to dynamically set the Ollama host based on environment variables, allowing for both external and Testcontainers usage.
- Refactored model pulling logic in tests to use constants for model names, improving readability and maintainability.
2025-03-24 17:59:24 +05:30
Amith Koujalgi
57f874921c Add Windows installation note for Chocolatey in README
- Added a note in the README.md to guide Windows users on installing Chocolatey Package Manager and using it to install `make`.
- Suggested running the installation command with administrator privileges for better success.
2025-03-24 15:48:01 +05:30
Amith Koujalgi
2d7902167b Enhance OllamaAPI and documentation for structured responses
- Updated OllamaAPI to return an instance of OllamaResult instead of OllamaStructuredResult for structured responses.
- Removed the obsolete OllamaStructuredResult class.
- Added new methods in OllamaResult for retrieving structured responses as a Map or mapped to a specific class type.
- Updated integration tests to validate the new structured response functionality.
- Improved Makefile with a new full-build target for building the project.
2025-03-24 15:30:00 +05:30
amithkoujalgi
407b7eb280 Refactor OllamaAPI documentation and add structured response model
- Improved formatting and readability of comments in OllamaAPI.java.
- Introduced OllamaStructuredResult class to handle structured responses from the Ollama API.
- Updated integration tests to include a new test for structured output from the API.
- Cleaned up imports and ensured consistent code style across the OllamaAPIIntegrationTest class.
2025-03-24 00:25:20 +05:30
amithkoujalgi
e62a7511db Merge remote-tracking branch 'origin/main'
All checks were successful
Mark stale issues / stale (push) Successful in 38s
2025-03-23 22:21:42 +05:30
Amith Koujalgi
c904a69b09 Merge pull request #110 from ollama4j/integration-tests-updates
All checks were successful
Mark stale issues / stale (push) Successful in 40s
Updated docs
2025-03-19 08:50:22 +05:30
Amith Koujalgi
11bf20c405 Updated docs 2025-03-19 08:49:58 +05:30
Amith Koujalgi
c3273ea8ca Merge pull request #109 from ollama4j/integration-tests-updates
Updated docs
2025-03-19 08:32:00 +05:30
Amith Koujalgi
f6a29842b5 Updated docs 2025-03-19 08:31:10 +05:30
Amith Koujalgi
3781ea7a51 Merge pull request #108 from ollama4j/integration-tests-updates
Add blog post about tooling with Couchbase
2025-03-19 08:20:39 +05:30
Amith Koujalgi
6f1da25f7e Updated GH action 2025-03-19 08:20:09 +05:30
Amith Koujalgi
e74ef7115c Add blog post about tooling with couchbase 2025-03-19 08:08:39 +05:30
Amith Koujalgi
c9db51a71e Merge pull request #107 from ollama4j/integration-tests-updates
All checks were successful
Mark stale issues / stale (push) Successful in 21s
test
2025-03-18 23:29:21 +05:30
Amith Koujalgi
681a692ca9 Updated integration tests 2025-03-18 23:18:42 +05:30
Amith Koujalgi
9a6065fdb3 Updated integration tests 2025-03-18 23:07:19 +05:30
Amith Koujalgi
e245d9633f Updated integration tests 2025-03-18 22:54:56 +05:30
Amith Koujalgi
590364dd53 test 2025-03-18 22:33:29 +05:30
Amith Koujalgi
bb4e7477bd Merge pull request #106 from ollama4j/integration-tests-updates
test
2025-03-18 22:32:38 +05:30
Amith Koujalgi
c33c1c8315 test 2025-03-18 22:23:06 +05:30
Amith Koujalgi
05eecdccaa Merge pull request #105 from ollama4j/integration-tests-refactor
Integration tests refactor
2025-03-18 22:17:33 +05:30
Amith Koujalgi
26bb2f9bab Updated GH workflow 2025-03-18 22:15:58 +05:30
Amith Koujalgi
bbafc95577 Updated GH workflow 2025-03-18 22:13:39 +05:30
Amith Koujalgi
bee09aa626 Updated integration tests 2025-03-18 22:03:04 +05:30
Amith Koujalgi
8aa6e3b066 Updated integration tests 2025-03-18 21:41:20 +05:30
Amith Koujalgi
d40912c638 Merge remote-tracking branch 'origin/main' into integration-tests-refactor 2025-03-18 20:54:04 +05:30
Amith Koujalgi
ba0444194f Merge pull request #98 from csware/bearertoken
Support bearer token
2025-03-18 20:30:08 +05:30
Amith Koujalgi
ac3f505aa6 Switch image model to "moondream" in integration test 2025-03-11 13:12:55 +05:30
Amith Koujalgi
7e5ca53fda Merge remote-tracking branch 'origin/integration-tests-refactor' into integration-tests-refactor
# Conflicts:
#	Makefile
#	README.md
2025-03-11 12:28:39 +05:30
Amith Koujalgi
2b0238b9e8 Ensure Docker availability in dev setup and integration tests
Updated `README.md` to include Docker as a prerequisite for running integration tests using Testcontainers. Modified the `Makefile` to check for Docker installation during the dev environment setup.
2025-03-11 12:26:35 +05:30
amithkoujalgi
469a0fe491 Refactor
- Remove TestRealAPIs and enhance OllamaAPIIntegrationTest
- Add dev setup instruction
2025-03-11 12:26:08 +05:30
Amith Koujalgi
983a3617f0 Add dev setup instructions and update pre-commit config 2025-03-11 12:15:19 +05:30
Amith Koujalgi
b638b981c9 Remove unnecessary blank lines from pom.xml
Cleaned up redundant blank lines at the end of the pom.xml file to ensure consistent formatting. This helps improve code readability and adheres to standard practices.
2025-03-11 12:05:11 +05:30
amithkoujalgi
fe5078891f Remove TestRealAPIs and enhance OllamaAPIIntegrationTest 2025-03-11 11:41:51 +05:30
Amith Koujalgi
44b4de9ed9 Merge pull request #102 from ollama4j/update-pre-commit-hook
All checks were successful
Mark stale issues / stale (push) Successful in 31s
update-pre-commit-hook
2025-03-11 10:38:05 +05:30
amithkoujalgi
854c0b4acf test GH action 2025-03-11 10:35:06 +05:30
Amith Koujalgi
18c5d06a6c Merge pull request #101 from ollama4j/update-pre-commit-hook
update-pre-commit-hook
2025-03-11 10:34:10 +05:30
amithkoujalgi
22b403d0b0 Remove unnecessary write permission for packages in workflow 2025-03-11 10:33:14 +05:30
amithkoujalgi
ee0493eb57 Rename and adjust workflows for PR builds and testing.
Renamed the PR-related workflow for clarity and replaced `build-on-pr-create.yml` with `build-and-test-on-pr-open.yml` for better naming consistency. Also commented out the push trigger in `run-tests.yml` to refine its activation criteria.
2025-03-11 10:19:34 +05:30
Amith Koujalgi
f966b4b74e Merge pull request #100 from ollama4j/update-pre-commit-hook
update-pre-commit-hook
2025-03-11 10:18:06 +05:30
amithkoujalgi
1dadbacd2c Enable no-commit-to-branch pre-commit hook. 2025-03-11 10:12:03 +05:30
amithkoujalgi
714c16c216 Merge remote-tracking branch 'origin/main' 2025-03-11 10:10:46 +05:30
amithkoujalgi
cf2c510b23 Add integration test step to CI workflow
Previously, only unit tests were run during the PR workflow. This update introduces a separate step to run integration tests, ensuring broader test coverage. It enhances build verification by validating both unit and integration aspects.
2025-03-11 10:10:14 +05:30
amithkoujalgi
a0bcc47b2e Add pre-commit configuration file
test
2025-03-11 10:08:57 +05:30
amithkoujalgi
57ecbc2572 Add pre-commit configuration file
test
2025-03-11 10:00:11 +05:30
amithkoujalgi
99beb3e6d0 Add pre-commit configuration file
test
2025-03-11 09:31:12 +05:30
amithkoujalgi
7756eed9a0 Add pre-commit configuration file
Introduce a pre-commit-config.yaml to automate code quality checks and enforce best practices. Includes hooks for file validation, formatting, and commit message standardization, as well as Java-specific quality tools. This ensures consistent coding standards and reduces manual errors.
2025-03-11 09:29:57 +05:30
amithkoujalgi
b795117f0a Add integration test step to CI workflow
Some checks failed
Run Unit and Integration Tests / run-tests (push) Failing after 2m2s
Mark stale issues / stale (push) Successful in 15s
Previously, only unit tests were run during the PR workflow. This update introduces a separate step to run integration tests, ensuring broader test coverage. It enhances build verification by validating both unit and integration aspects.
2025-03-11 00:20:01 +05:30
amithkoujalgi
0d091d1826 Update integration test 2025-03-11 00:06:30 +05:30
amithkoujalgi
9fd77a6743 Add branch trigger for tests and update README with badge
Added a trigger to run tests on pushes to the main branch in the GitHub Actions workflow. Also updated the README to include a badge linking to the test workflow for better visibility.
2025-03-11 00:02:13 +05:30
amithkoujalgi
57a962148b Update workflow name and job for clarity in testing
Renamed the workflow to specify both unit and integration tests. Adjusted the job name to better reflect its purpose and ensured clear descriptions for inputs. These changes enhance readability and intent in the CI configuration.
2025-03-10 23:58:03 +05:30
amithkoujalgi
3c64f2099f Add GPG plugin with test-skipping configuration
Integrated the Maven GPG plugin to sign artifacts during the "verify" phase, with the ability to skip it during tests using a new `skipGpgPluginDuringTests` property. Enhanced the build profiles to manage GPG signing selectively, ensuring smoother test and build workflows.
2025-03-10 23:53:02 +05:30
amithkoujalgi
a9c7f4e5e0 Rename TestAPIsTest to OllamaAPIIntegrationTest 2025-03-10 23:44:18 +05:30
amithkoujalgi
e7f58d4e0d Add integration tests and enhance test configurations
Introduced integration tests for various API functionalities, ensuring comprehensive coverage. Updated test dependencies in `pom.xml` and added handling for unknown JSON properties in the `Model` class. Also included configuration to support running unit and integration tests in the CI workflow.
2025-03-10 23:40:44 +05:30
Sven Strickroth
138497b30f Introduce BearerAuth class
Signed-off-by: Sven Strickroth <email@cs-ware.de>
2025-03-10 14:55:38 +01:00
Sven Strickroth
3a792090e2 Support bearer token
May be use as follows:
```
ollamaAPI.setBasicAuth(new BasicAuth() {
	@Override
	public String getBasicAuthHeaderValue() { return "Bearer [sometext]"; }
});
```

Signed-off-by: Sven Strickroth <email@cs-ware.de>
2025-03-10 14:39:54 +01:00
amithkoujalgi
7ef859bba5 clean up
All checks were successful
Mark stale issues / stale (push) Successful in 31s
2025-03-09 20:29:34 +05:30
amithkoujalgi
3c30593e1e clean up
All checks were successful
Mark stale issues / stale (push) Successful in 31s
2025-03-08 17:44:00 +05:30
amithkoujalgi
98b794ca2b Add a test GitHub Actions workflow to publish to a GitHub repository, Maven repository, and GitHub Pages 2025-03-08 17:24:29 +05:30
amithkoujalgi
bc90a15a68 Add "Examples" link to navbar and footer
Added a link to the "Examples" repository in both the navbar and the "Usage" section of the footer. This improves accessibility to code examples, providing users with an easier way to explore practical use cases.
2025-03-08 16:45:43 +05:30
amithkoujalgi
bb4689e94b Add examples section and GitHub links to docs and README
Introduced an examples section in the README to highlight the `ollama4j-examples` repository. Added an iframe and link in the chat API documentation for better reference. Adjusted formatting for improved readability and consistency.
2025-03-08 16:34:00 +05:30
amithkoujalgi
6739c93edc Refactor workflows and update dependencies.
Renamed workflow for clearer purpose and updated project dependencies across multiple packages to newer versions. Improved the `pom.xml` Maven config by adding a build phase and output directory for Javadoc generation. Upgraded several NPM packages, removing deprecated versions and adding license metadata for better dependency management.
2025-03-08 16:05:17 +05:30
amithkoujalgi
c8c30d703b Refactor code to enhance robustness and clarity
Refactored `OllamaChatMessageRole` to simplify custom role creation, guarding against nulls in `OllamaToolsResult`, and made `OllamaChatResult` properties immutable. Improved error handling in `OllamaAPI`, added verbose logs, and ensured safer JSON parsing for tool responses. Introduced `@JsonIgnoreProperties` for better deserialization support.
2025-03-08 15:46:43 +05:30
Amith Koujalgi
419b0369c9 Merge pull request #93 from hboutemy/reproducible-builds
All checks were successful
Mark stale issues / stale (push) Successful in 34s
enable Reproducible Builds
2025-02-28 21:57:31 +05:30
Hervé Boutemy
d9a94b95e1 enable Reproducible Builds 2025-02-23 18:02:15 +01:00
Amith Koujalgi
db1db948c8 Merge pull request #94 from hboutemy/release
All checks were successful
Mark stale issues / stale (push) Successful in 28s
use release flag instead of old source/target
2025-02-23 19:48:26 +05:30
Hervé Boutemy
41ad780224 use release flag instead of old source/target 2025-02-21 17:14:54 +01:00
Amith Koujalgi
cb58c6a9b0 Updated README.md
All checks were successful
Mark stale issues / stale (push) Successful in 10s
2025-02-17 23:47:48 +05:30
Amith Koujalgi
d1115e0b35 Updated README.md 2025-02-17 23:47:11 +05:30
Amith Koujalgi
740bd3750b Merge pull request #92 from ollama4j/90
Addresses issue where creation of model was failing
2025-02-17 22:37:20 +05:30
Amith Koujalgi
c9aa6c9e08 Merge branch 'main' into 90 2025-02-17 22:35:38 +05:30
Amith Koujalgi
71bba6ee0d Added GH action to run tests 2025-02-17 22:33:02 +05:30
Amith Koujalgi
27b2201ff9 Added GH action to run tests 2025-02-17 22:31:56 +05:30
Amith Koujalgi
23d23c4ad7 Added new createModel API to make it conform to Ollama's new API - https://github.com/ollama/ollama/blob/main/docs/api.md#create-a-model 2025-02-17 22:25:25 +05:30
amithkoujalgi
e409ff1cf9 Update OllamaAPI.java
All checks were successful
Mark stale issues / stale (push) Successful in 14s
2025-02-03 08:56:49 +05:30
amithkoujalgi
9a12cebb68 Update README.md 2025-02-01 23:13:35 +05:30
amithkoujalgi
24f5bc4fec Delete close-issue.yml 2025-02-01 09:10:46 +05:30
Amith Koujalgi
d7c313417b Update label-issue-stale.yml 2025-02-01 09:03:57 +05:30
Amith Koujalgi
b67b4c7eb5 Update publish-docs.yml
Some checks failed
Close inactive issues / close-issues (push) Has been cancelled
2025-02-01 00:10:37 +05:30
Amith Koujalgi
ab70201844 Merge pull request #89 from kwongiho/main
Add support for deepseek-r1 model
2025-02-01 00:00:26 +05:30
kwongiho
ac8a40a017 Add support for deepseek-r1 model 2025-01-30 21:32:29 +09:00
Amith Koujalgi
1ac65f821b Update label-issue-stale.yml 2025-01-29 00:34:17 +05:30
Amith Koujalgi
d603c4b94b Update label-issue-stale.yml 2025-01-29 00:17:34 +05:30
Amith Koujalgi
a418cbc1dc Create label-issue-stale.yml 2025-01-29 00:17:11 +05:30
Amith Koujalgi
785dd12730 Update close-issue.yml 2025-01-28 23:52:22 +05:30
Amith Koujalgi
dda807d818 Merge pull request #88 from seeseemelk/feature/token-streamer
Add ability to stream tokens in chat
2025-01-26 17:37:22 +05:30
Amith Koujalgi
a06a4025fa Merge pull request #87 from seeseemelk/feature/annotated-objects
Add support for registering object instances
2025-01-26 17:35:58 +05:30
761fbc3398 Add support for streaming tokens 2025-01-24 15:05:33 +01:00
a96dc11679 Fix random test failure 2025-01-24 15:05:32 +01:00
b2b3febdaa Add support for registering object instances instead of only through the @OllamaToolService annotation 2025-01-24 13:38:47 +01:00
amithkoujalgi
f27bea11d5 Merge branch 'main' of https://github.com/ollama4j/ollama4j 2025-01-14 10:44:13 +05:30
amithkoujalgi
9503451d5a Create close-issue.yml 2025-01-14 10:42:58 +05:30
Amith Koujalgi
04bae4ca6a Update README.md 2025-01-14 10:06:30 +05:30
Amith Koujalgi
3e33b8df62 Update README.md 2025-01-13 20:08:42 +05:30
Amith Koujalgi
a494053263 Merge pull request #85 from AgentSchmecker/feature/annotationBasedTools
Feature/annotation based tools
2025-01-04 23:52:51 +05:30
Markus Klenke
260c57ca84 Removes system.err lines 2024-12-27 23:10:08 +01:00
Markus Klenke
db008de0ca Adds documentation for annotation based Tool registration 2024-12-27 23:07:35 +01:00
Markus Klenke
1b38466f44 Adds BigDecimal type for ToolProperty typeCast 2024-12-27 23:05:08 +01:00
Markus Klenke
26ec00dab8 Adds Javadoc for new classes and annotations 2024-12-27 22:33:44 +01:00
Markus Klenke
5e6971cc4a Adds first approach to annotation based tool callings using basic java reflection 2024-12-27 22:20:34 +01:00
Amith Koujalgi
8b3417ecda Merge pull request #82 from AgentSchmecker/feature/toolextension_for_chat_model
Enable chat API to use Tools
2024-12-17 12:03:56 +05:30
Markus Klenke
35f5f34196 Adds doc for tool-based chat API calls 2024-12-09 23:30:05 +01:00
Markus Klenke
d8c3edd55f Parametrizes the max chat tool call retries for a single chat request 2024-12-09 23:29:43 +01:00
Markus Klenke
7ffbc5d3f2 Adds implicit tool calling for streamed chat requests (requires Ollama v0.4.6) 2024-12-09 23:07:25 +01:00
Markus Klenke
c4b7830614 Fixes merge conflicts 2024-12-07 01:18:12 +01:00
Markus Klenke
69f6fd81cf Enables in chat tool calling 2024-12-07 01:17:08 +01:00
Markus Klenke
b6a293add7 Makes changes to OllamaChatResult backwards compatible 2024-12-07 01:17:08 +01:00
Markus Klenke
25694a8bc9 extends ollamaChatResult to have full access to OllamaChatResult 2024-12-07 01:17:01 +01:00
Markus Klenke
12bb10392e Extends ChatModels to use Tools and ToolCalls 2024-12-07 01:16:25 +01:00
Markus Klenke
e9c33ab0b2 Extends chat API to automatically load registered Tools 2024-12-07 01:16:25 +01:00
Markus Klenke
903a8176cd Extends ToolSpec to have PromptDef for ChatRequests 2024-12-07 01:16:25 +01:00
Amith Koujalgi
4a91918e84 Merge pull request #81 from AgentSchmecker/bugfix/79
Fixes for #78 and #79
2024-12-05 16:42:30 +05:30
Markus Klenke
ff3344616c Fixes NPE in #78 2024-12-04 22:57:48 +01:00
Markus Klenke
726fea5b74 Fixes #79 2024-12-04 22:28:00 +01:00
Markus Klenke
a09f1362e9 Adds Builder for EmbedRequests and deprecates old Embedding Models 2024-12-02 22:48:33 +01:00
amithkoujalgi
4ef0821932 updated README.md
Update README.md
2024-11-09 01:01:38 +05:30
amithkoujalgi
2d3cf228cb added findModelTagFromLibrary API 2024-11-08 12:37:58 +05:30
amithkoujalgi
5b3713c69e added getLibraryModelDetails API and pullModel API with LibraryModelTag 2024-11-08 11:23:47 +05:30
Amith Koujalgi
e9486cbb8e Merge pull request #76 from ollama4j/model-listing
updated `listModelsFromLibrary` API
2024-11-08 10:05:19 +05:30
amithkoujalgi
057f0babeb updated listModelsFromLibrary API
updated `listModelsFromLibrary` API
2024-11-08 10:02:27 +05:30
Amith Koujalgi
da146640ca Update README.md 2024-11-08 00:08:13 +05:30
Amith Koujalgi
82be761b86 Merge pull request #75 from ollama4j/model-listing
`listModelsFromLibrary` API
2024-11-07 23:54:56 +05:30
amithkoujalgi
9c3fc49df1 added listModelsFromLibrary API 2024-11-07 23:53:11 +05:30
Amith Koujalgi
5f19eb17ac Update OllamaAPI.java 2024-11-07 21:53:41 +05:30
Amith Koujalgi
ecb04d6d82 Cleanup 2024-10-31 21:22:17 +05:30
Amith Koujalgi
3fc7e9423c Updated docs 2024-10-31 17:57:02 +05:30
Amith Koujalgi
405a08b330 Updated docs 2024-10-31 16:25:05 +05:30
Amith Koujalgi
921f745435 Custom roles support
Adds support for custom roles using `OllamaChatMessageRole`
2024-10-31 16:15:21 +05:30
Amith Koujalgi
bedfec6bf9 Update generate-embeddings.md 2024-10-30 11:07:40 +05:30
Amith Koujalgi
afa09e87a5 Update OllamaAPI.java 2024-10-30 11:02:37 +05:30
Amith Koujalgi
baf2320ea6 Updated javadoc 2024-10-30 11:01:23 +05:30
Amith Koujalgi
948a7444fb Update README.md 2024-10-30 00:54:33 +05:30
Amith Koujalgi
ec0eb8b469 Update README.md 2024-10-30 00:44:08 +05:30
Amith Koujalgi
8f33de7e59 Update README.md 2024-10-30 00:43:09 +05:30
Amith Koujalgi
8c59e6511b Update README.md 2024-10-30 00:41:55 +05:30
Amith Koujalgi
b93fc7623a Updated javadoc 2024-10-30 00:28:53 +05:30
Amith Koujalgi
bd1a57c7e0 Added support for new embed API /api/embed 2024-10-30 00:03:49 +05:30
Amith Koujalgi
7fabead249 Merge pull request #73 from daguava/tool-role
Add 'tool' role
2024-10-29 22:05:43 +05:30
Mitchell Lutzke
268a973d5e Add tool role 2024-10-27 17:06:25 -07:00
Amith Koujalgi
d949a3cb69 Merge pull request #72 from daguava/minp-custom-options
Add minp option and ability to set custom options
2024-10-27 20:05:24 +05:30
Mitchell Lutzke
e2443ed68a Add throws to the docs 2024-10-26 22:08:03 -07:00
Mitchell Lutzke
37193b1f5b slight cleanup 2024-10-26 21:36:43 -07:00
Mitchell Lutzke
e33071ae38 Add minp option and ability to set custom options 2024-10-26 21:22:46 -07:00
Amith Koujalgi
fffc8dc526 Update README.md 2024-10-16 00:55:01 +05:30
Amith Koujalgi
def950cc9c Update README.md 2024-10-15 14:27:07 +05:30
Amith Koujalgi
f4db7ca326 Update README.md 2024-10-15 11:51:20 +05:30
Amith Koujalgi
18760250ea Update README.md 2024-10-11 21:21:20 +05:30
Amith Koujalgi
233597efd1 Update README.md 2024-10-01 23:38:49 +05:30
Amith Koujalgi
cec9f29eb7 Update README.md 2024-09-15 09:43:37 +05:30
Amith Koujalgi
20cb92a418 Update README.md 2024-09-15 08:48:31 +05:30
Amith Koujalgi
b0dc38954b Update README.md 2024-09-15 08:47:22 +05:30
Amith Koujalgi
1479d0a494 Update README.md 2024-09-08 16:28:46 +05:30
Amith Koujalgi
b328daee43 Update README.md 2024-09-08 16:28:23 +05:30
190 changed files with 30418 additions and 19876 deletions

10
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,10 @@
# See https://docs.github.com/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
# Default owners for everything in the repo
* @amithkoujalgi
# Example for scoping ownership (uncomment and adjust as teams evolve)
# /docs/ @amithkoujalgi
# /src/ @amithkoujalgi

59
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,59 @@
name: Bug report
description: File a bug report
labels: [bug]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: input
id: version
attributes:
label: ollama4j version
description: e.g., 1.1.0
placeholder: 1.1.0
validations:
required: true
- type: input
id: java
attributes:
label: Java version
description: Output of `java -version`
placeholder: 11/17/21
validations:
required: true
- type: input
id: environment
attributes:
label: Environment
description: OS, build tool, Docker/Testcontainers, etc.
placeholder: macOS 13, Maven 3.9.x, Docker 24.x
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us what you expected to happen
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce
description: Be as specific as possible
placeholder: |
1. Setup ...
2. Run ...
3. Observe ...
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant logs/stack traces
render: shell
- type: textarea
id: additional
attributes:
label: Additional context

6
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,6 @@
blank_issues_enabled: false
contact_links:
- name: Questions / Discussions
url: https://github.com/ollama4j/ollama4j/discussions
about: Ask questions and discuss ideas here

View File

@@ -0,0 +1,31 @@
name: Feature request
description: Suggest an idea or enhancement
labels: [enhancement]
assignees: []
body:
- type: markdown
attributes:
value: |
Thanks for suggesting an improvement!
- type: textarea
id: problem
attributes:
label: Is your feature request related to a problem?
description: A clear and concise description of the problem
placeholder: I'm frustrated when...
- type: textarea
id: solution
attributes:
label: Describe the solution you'd like
placeholder: I'd like...
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered
- type: textarea
id: context
attributes:
label: Additional context

34
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,34 @@
## Description
Describe what this PR does and why.
## Type of change
- [ ] feat: New feature
- [ ] fix: Bug fix
- [ ] docs: Documentation update
- [ ] refactor: Refactoring
- [ ] test: Tests only
- [ ] build/ci: Build or CI changes
## How has this been tested?
Explain the testing done. Include commands, screenshots, logs.
## Checklist
- [ ] I ran `pre-commit run -a` locally
- [ ] `make build` succeeds locally
- [ ] Unit/integration tests added or updated as needed
- [ ] Docs updated (README/docs site) if user-facing changes
- [ ] PR title follows Conventional Commits
## Breaking changes
List any breaking changes and migration notes.
## Related issues
Fixes #

34
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,34 @@
# To get started with Dependabot version updates, you'll need to specify which
## package ecosystems to update and where the package manifests are located.
## Please see the documentation for all configuration options:
## https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
#
#version: 2
#updates:
# - package-ecosystem: "" # See documentation for possible values
# directory: "/" # Location of package manifests
# schedule:
# interval: "weekly"
version: 2
updates:
- package-ecosystem: "maven"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
labels: ["dependencies"]
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
labels: ["dependencies"]
- package-ecosystem: "npm"
directory: "/docs"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
labels: ["dependencies"]
#

View File

@@ -1,34 +0,0 @@
# This workflow will build a package using Maven and then publish it to GitHub packages when a release is created
# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#apache-maven-with-a-settings-path
name: Build on PR Create
on:
pull_request:
types: [ opened, reopened ]
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'adopt-hotspot'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
- name: Build with Maven
run: mvn --file pom.xml -U clean package
- name: Run Tests
run: mvn --file pom.xml -U clean test -Punit-tests

View File

@@ -0,0 +1,59 @@
name: Build and Test on Pull Request
on:
pull_request:
types: [opened, reopened, synchronize]
branches:
- main
paths:
- 'src/**'
- 'pom.xml'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build Java Project
runs-on: ubuntu-latest
permissions:
contents: read
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v5
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'oracle'
server-id: github
settings-path: ${{ github.workspace }}
- name: Build with Maven
run: mvn --file pom.xml -U clean package
run-tests:
name: Run Unit and Integration Tests
needs: build
uses: ./.github/workflows/run-tests.yml
with:
branch: ${{ github.head_ref || github.ref_name }}
build-docs:
name: Build Documentation
needs: [build, run-tests]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Use Node.js
uses: actions/setup-node@v5
with:
node-version: '20.x'
- run: cd docs && npm ci
- run: cd docs && npm run build

44
.github/workflows/codeql.yml vendored Normal file
View File

@@ -0,0 +1,44 @@
name: CodeQL
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
schedule:
- cron: '0 3 * * 1'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'java', 'javascript' ]
steps:
- name: Checkout repository
uses: actions/checkout@v5
- name: Set up JDK
if: matrix.language == 'java'
uses: actions/setup-java@v5
with:
distribution: oracle
java-version: '21'
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3

View File

@@ -13,12 +13,12 @@ jobs:
packages: write
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
- uses: actions/checkout@v5
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'temurin'
java-version: '21'
distribution: 'oracle'
server-id: github
settings-path: ${{ github.workspace }}

24
.github/workflows/label-issue-stale.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
name: Mark stale issues
on:
workflow_dispatch: # for manual run
schedule:
- cron: '0 0 * * *' # Runs every day at midnight
permissions:
contents: write # only for delete-branch option
issues: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- name: Mark stale issues
uses: actions/stale@v10
with:
repo-token: ${{ github.token }}
days-before-stale: 15
stale-issue-message: 'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.'
days-before-close: 7
stale-issue-label: 'stale'
exempt-issue-labels: 'pinned,security'

View File

@@ -24,13 +24,13 @@ jobs:
packages: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v5
- name: Set up JDK 17
uses: actions/setup-java@v3
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'temurin'
java-version: '21'
distribution: 'oracle'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file

30
.github/workflows/pre-commit.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
name: Pre-commit Check on PR
on:
pull_request:
types: [opened, reopened, synchronize]
branches:
- main
#on:
# pull_request:
# branches: [ main ]
# push:
# branches: [ main ]
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: '3.x'
- name: Install pre-commit
run: |
python -m pip install --upgrade pip
pip install pre-commit
# - name: Run pre-commit
# run: |
# pre-commit run --all-files --show-diff-on-failure

View File

@@ -1,5 +1,5 @@
# Simple workflow for deploying static content to GitHub Pages
name: Deploy Docs to GH Pages
name: Publish Docs to GH Pages
on:
release:
@@ -29,18 +29,18 @@ jobs:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
- uses: actions/checkout@v5
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '11'
distribution: 'adopt-hotspot'
java-version: '21'
distribution: 'oracle'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v5
with:
node-version: '20.x'
- run: cd docs && npm ci
@@ -57,18 +57,18 @@ jobs:
run: mvn --file pom.xml -U clean package && cp -r ./target/apidocs/. ./docs/build/apidocs
- name: Doxygen Action
uses: mattnotmitt/doxygen-action@v1.1.0
uses: mattnotmitt/doxygen-action@v1.12.0
with:
doxyfile-path: "./Doxyfile"
working-directory: "."
- name: Setup Pages
uses: actions/configure-pages@v3
uses: actions/configure-pages@v5
- name: Upload artifact
uses: actions/upload-pages-artifact@v2
uses: actions/upload-pages-artifact@v4
with:
# Upload entire repository
path: './docs/build/.'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2
uses: actions/deploy-pages@v4

54
.github/workflows/run-tests.yml vendored Normal file
View File

@@ -0,0 +1,54 @@
name: Run Tests
on:
# push:
# branches:
# - main
workflow_call:
inputs:
branch:
description: 'Branch name to run the tests on'
required: true
default: 'main'
type: string
workflow_dispatch:
inputs:
branch:
description: 'Branch name to run the tests on'
required: true
default: 'main'
type: string
jobs:
run-tests:
name: Unit and Integration Tests
runs-on: ubuntu-latest
steps:
- name: Checkout target branch
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.branch }}
- name: Set up Ollama
run: |
curl -fsSL https://ollama.com/install.sh | sh
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'oracle'
server-id: github
settings-path: ${{ github.workspace }}
- name: Run unit tests
run: make unit-tests
- name: Run integration tests
run: make integration-tests-basic
env:
USE_EXTERNAL_OLLAMA_HOST: "true"
OLLAMA_HOST: "http://localhost:11434"

33
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Mark stale issues and PRs
on:
schedule:
- cron: '0 2 * * *'
permissions:
issues: write
pull-requests: write
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v10
with:
days-before-stale: 60
days-before-close: 14
stale-issue-label: 'stale'
stale-pr-label: 'stale'
exempt-issue-labels: 'pinned,security'
exempt-pr-labels: 'pinned,security'
stale-issue-message: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs.
close-issue-message: >
Closing this stale issue. Feel free to reopen if this is still relevant.
stale-pr-message: >
This pull request has been automatically marked as stale due to inactivity.
It will be closed if no further activity occurs.
close-pr-message: >
Closing this stale pull request. Please reopen when you're ready to continue.

2
.gitignore vendored
View File

@@ -41,4 +41,4 @@ pom.xml.*
release.properties
!.idea/icon.svg
src/main/java/io/github/ollama4j/localtests
src/main/java/io/github/ollama4j/localtests

46
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,46 @@
repos:
# pre-commit hooks
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: "v6.0.0"
hooks:
- id: no-commit-to-branch
args: ['--branch', 'main']
- id: check-merge-conflict
- id: check-added-large-files
- id: check-yaml
- id: check-xml
- id: check-json
- id: pretty-format-json
args: ['--no-sort-keys', '--autofix', '--indent=4']
- id: end-of-file-fixer
exclude: \.json$
files: \.java$|\.xml$
- id: trailing-whitespace
- id: mixed-line-ending
# for commit message formatting
- repo: https://github.com/commitizen-tools/commitizen
rev: v4.9.1
hooks:
- id: commitizen
stages: [commit-msg]
- repo: local
hooks:
- id: format-code
name: Format Code
entry: make apply-formatting
language: system
always_run: true
# # for java code quality
# - repo: https://github.com/gherynos/pre-commit-java
# rev: v0.6.10
# hooks:
# - id: pmd
# exclude: /test/
# - id: cpd
# exclude: /test/
# - id: checkstyle
# exclude: /test/

9
CITATION.cff Normal file
View File

@@ -0,0 +1,9 @@
cff-version: 1.2.0
message: "If you use this software, please cite it as below."
authors:
- family-names: "Koujalgi"
given-names: "Amith"
title: "Ollama4j: A Java Library (Wrapper/Binding) for Ollama Server"
version: "1.1.0"
date-released: 2023-12-19
url: "https://github.com/ollama4j/ollama4j"

125
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,125 @@
## Contributing to Ollama4j
Thanks for your interest in contributing! This guide explains how to set up your environment, make changes, and submit pull requests.
### Code of Conduct
By participating, you agree to abide by our [Code of Conduct](CODE_OF_CONDUCT.md).
### Quick Start
Prerequisites:
- Java 11+
- Maven 3.8+
- Docker (required for integration tests)
- Make (for convenience targets)
- pre-commit (for Git hooks)
Setup:
```bash
# 1) Fork the repo and clone your fork
git clone https://github.com/<your-username>/ollama4j.git
cd ollama4j
# 2) Install and enable git hooks
pre-commit install --hook-type pre-commit --hook-type commit-msg
# 3) Prepare dev environment (installs husk deps/tools if needed)
make dev
```
Build and test:
```bash
# Build
make build
# Run unit tests
make unit-tests
# Run integration tests (requires Docker running)
make integration-tests
```
If you prefer raw Maven:
```bash
# Unit tests profile
mvn -P unit-tests clean test
# Integration tests profile (Docker required)
mvn -P integration-tests -DskipUnitTests=true clean verify
```
### Commit Style
We use Conventional Commits. Commit messages and PR titles should follow:
```
<type>(optional scope): <short summary>
[optional body]
[optional footer(s)]
```
Common types: `feat`, `fix`, `docs`, `refactor`, `test`, `build`, `chore`.
Commit message formatting is enforced via `commitizen` through `pre-commit` hooks.
### Pre-commit Hooks
Before pushing, run:
```bash
pre-commit run -a
```
Hooks will check for merge conflicts, large files, YAML/XML/JSON validity, line endings, and basic formatting. Fix reported issues before opening a PR.
### Coding Guidelines
- Target Java 11+; match existing style and formatting.
- Prefer clear, descriptive names over abbreviations.
- Add Javadoc for public APIs and non-obvious logic.
- Include meaningful tests for new features and bug fixes.
- Avoid introducing new dependencies without discussion.
### Tests
- Unit tests: place under `src/test/java/**/unittests/`.
- Integration tests: place under `src/test/java/**/integrationtests/` (uses Testcontainers; ensure Docker is running).
### Documentation
- Update `README.md`, Javadoc, and `docs/` when you change public APIs or user-facing behavior.
- Add example snippets where useful. Keep API references consistent with the website content when applicable.
### Pull Requests
Before opening a PR:
- Ensure `make build` and all tests pass locally.
- Run `pre-commit run -a` and fix any issues.
- Keep PRs focused and reasonably small. Link related issues (e.g., "Closes #123").
- Describe the change, rationale, and any trade-offs in the PR description.
Review process:
- Maintainers will review for correctness, scope, tests, and docs.
- You may be asked to iterate; please be responsive to comments.
### Security
If you discover a security issue, please do not open a public issue. Instead, email the maintainer at `koujalgi.amith@gmail.com` with details.
### License
By contributing, you agree that your contributions will be licensed under the projects [MIT License](LICENSE).
### Questions and Discussion
Have questions or ideas? Open a GitHub Discussion or issue. We welcome feedback and proposals!

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2023 Amith Koujalgi
Copyright (c) 2023 Amith Koujalgi and contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1,28 +1,79 @@
build:
mvn -B clean install
# Default target
.PHONY: all
all: dev build
unit-tests:
mvn clean test -Punit-tests
dev:
@echo "Setting up dev environment..."
@command -v pre-commit >/dev/null 2>&1 || { echo "Error: pre-commit is not installed. Please install it first."; exit 1; }
@command -v docker >/dev/null 2>&1 || { echo "Error: docker is not installed. Please install it first."; exit 1; }
@pre-commit install
@pre-commit autoupdate
@pre-commit install --install-hooks
integration-tests:
mvn clean verify -Pintegration-tests
check-formatting:
@echo "\033[0;34mChecking code formatting...\033[0m"
@mvn spotless:check
apply-formatting:
@echo "\033[0;32mApplying code formatting...\033[0m"
@mvn spotless:apply
build: apply-formatting
@echo "\033[0;34mBuilding project (GPG skipped)...\033[0m"
@mvn -B clean install -Dgpg.skip=true -Dmaven.javadoc.skip=true
full-build: apply-formatting
@echo "\033[0;34mPerforming full build...\033[0m"
@mvn -B clean install
unit-tests: apply-formatting
@echo "\033[0;34mRunning unit tests...\033[0m"
@mvn clean test -Punit-tests
integration-tests-all: apply-formatting
@echo "\033[0;34mRunning integration tests (local - all)...\033[0m"
@export USE_EXTERNAL_OLLAMA_HOST=false && mvn clean verify -Pintegration-tests
integration-tests-basic: apply-formatting
@echo "\033[0;34mRunning integration tests (local - basic)...\033[0m"
@export USE_EXTERNAL_OLLAMA_HOST=false && mvn clean verify -Pintegration-tests -Dit.test=WithAuth
integration-tests-remote: apply-formatting
@echo "\033[0;34mRunning integration tests (remote - all)...\033[0m"
@export USE_EXTERNAL_OLLAMA_HOST=true && export OLLAMA_HOST=http://192.168.29.229:11434 && mvn clean verify -Pintegration-tests -Dgpg.skip=true
doxygen:
doxygen Doxyfile
@echo "\033[0;34mGenerating documentation with Doxygen...\033[0m"
@doxygen Doxyfile
javadoc:
@echo "\033[0;34mGenerating Javadocs...\033[0m"
@mvn clean javadoc:javadoc
@if [ -f "target/reports/apidocs/index.html" ]; then \
echo "\033[0;32mJavadocs generated in target/reports/apidocs/index.html\033[0m"; \
else \
echo "\033[0;31mFailed to generate Javadocs in target/reports/apidocs\033[0m"; \
exit 1; \
fi
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' \
@echo "\033[0;34mListing latest releases...\033[0m"
@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 \
--silent | jq '.components[].version'
--silent | jq -r '.components[].version'
build-docs:
npm i --prefix docs && npm run build --prefix docs
docs-build:
@echo "\033[0;34mBuilding documentation site...\033[0m"
@cd ./docs && npm ci --no-audit --fund=false && npm run build
start-docs:
npm i --prefix docs && npm run start --prefix docs
docs-serve:
@echo "\033[0;34mServing documentation site...\033[0m"
@cd ./docs && npm install && npm run start
start-cpu:
docker run -it -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
@echo "\033[0;34mStarting Ollama (CPU mode)...\033[0m"
@docker run -it -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
start-gpu:
docker run -it --gpus=all -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
@echo "\033[0;34mStarting Ollama (GPU mode)...\033[0m"
@docker run -it --gpus=all -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama

267
README.md
View File

@@ -1,28 +1,32 @@
<div align="center">
<img src='https://raw.githubusercontent.com/ollama4j/ollama4j/refs/heads/main/ollama4j-new.jpeg' width='200' alt="ollama4j-icon">
### Ollama4j
<p align="center">
<img src='https://raw.githubusercontent.com/ollama4j/ollama4j/65a9d526150da8fcd98e2af6a164f055572bf722/ollama4j.jpeg' width='100' alt="ollama4j-icon">
</p>
A Java library (wrapper/binding) for [Ollama](https://ollama.ai/) server.
Find more details on the [website](https://ollama4j.github.io/ollama4j/).
</div>
<div align="center">
A Java library (wrapper/binding) for Ollama server.
_Find more details on the **[website](https://ollama4j.github.io/ollama4j/)**._
![GitHub stars](https://img.shields.io/github/stars/ollama4j/ollama4j)
![GitHub forks](https://img.shields.io/github/forks/ollama4j/ollama4j)
![GitHub watchers](https://img.shields.io/github/watchers/ollama4j/ollama4j)
![Contributors](https://img.shields.io/github/contributors/ollama4j/ollama4j?style=social)
![GitHub last commit](https://img.shields.io/github/last-commit/ollama4j/ollama4j?color=green)
![GitHub License](https://img.shields.io/github/license/ollama4j/ollama4j)
[![Run Unit and Integration Tests](https://github.com/ollama4j/ollama4j/actions/workflows/run-tests.yml/badge.svg)](https://github.com/ollama4j/ollama4j/actions/workflows/run-tests.yml)
![Sonar Quality Gate](https://img.shields.io/sonar/quality_gate/ollama4j_ollama4j?server=https%3A%2F%2Fsonarcloud.io&label=Sonar%20Quality%20Gate)
[![codecov](https://codecov.io/gh/ollama4j/ollama4j/graph/badge.svg?token=U0TE7BGP8L)](https://codecov.io/gh/ollama4j/ollama4j)
</div>
[//]: # (![GitHub repo size]&#40;https://img.shields.io/github/repo-size/ollama4j/ollama4j&#41;)
[//]: # (![GitHub top language]&#40;https://img.shields.io/github/languages/top/ollama4j/ollama4j&#41;)
[//]: # (![JitPack Downloads This Month Badge]&#40;https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fjitpack.io%2Fapi%2Fdownloads%2Fio.github.ollama4j%2Follama4j&query=%24.month&label=JitPack%20Downloads%20-%20This%20Month&#41;)
[//]: # (![JitPack Downloads This Week Badge]&#40;https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fjitpack.io%2Fapi%2Fdownloads%2Fio.github.ollama4j%2Follama4j&query=%24.week&label=JitPack%20Downloads%20-%20This%20Week&#41;)
@@ -31,28 +35,60 @@ Find more details on the [website](https://ollama4j.github.io/ollama4j/).
[//]: # (![GitHub Downloads &#40;all assets, all releases&#41;]&#40;https://img.shields.io/github/downloads/ollama4j/ollama4j/total?label=GitHub%20Package%20Downloads&#41;)
![GitHub last commit](https://img.shields.io/github/last-commit/ollama4j/ollama4j?color=green)
[![codecov](https://codecov.io/gh/ollama4j/ollama4j/graph/badge.svg?token=U0TE7BGP8L)](https://codecov.io/gh/ollama4j/ollama4j)
![Build Status](https://github.com/ollama4j/ollama4j/actions/workflows/maven-publish.yml/badge.svg)
</div>
[//]: # (![Hits]&#40;https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Follama4j%2Follama4j&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false&#41;)
[//]: # (![GitHub language count]&#40;https://img.shields.io/github/languages/count/ollama4j/ollama4j&#41;)
## Table of Contents
- [Capabilities](#capabilities)
- [How does it work?](#how-does-it-work)
- [Requirements](#requirements)
- [Installation](#installation)
- [API Spec](https://ollama4j.github.io/ollama4j/category/apis---model-management)
- [Javadoc](https://ollama4j.github.io/ollama4j/apidocs/)
- [Usage](#usage)
- [For Maven](#for-maven)
- [Using Maven Central](#using-maven-central)
- [Using GitHub's Maven Package Repository](#using-githubs-maven-package-repository)
- [For Gradle](#for-gradle)
- [API Spec](#api-spec)
- [Examples](#examples)
- [Development](#development)
- [Contributions](#get-involved)
- [References](#references)
- [Setup dev environment](#setup-dev-environment)
- [Build](#build)
- [Run unit tests](#run-unit-tests)
- [Run integration tests](#run-integration-tests)
- [Releases](#releases)
- [Get Involved](#get-involved)
- [Who's using Ollama4j?](#whos-using-ollama4j)
- [Growth](#growth)
- [References](#references)
- [Credits](#credits)
- [Appreciate the work?](#appreciate-the-work)
#### How does it work?
## Capabilities
- **Text generation**: Single-turn `generate` with optional streaming and advanced options
- **Chat**: Multi-turn chat with conversation history and roles
- **Tool/function calling**: Built-in tool invocation via annotations and tool specs
- **Reasoning/thinking modes**: Generate and chat with “thinking” outputs where supported
- **Image inputs (multimodal)**: Generate with images as inputs where models support vision
- **Embeddings**: Create vector embeddings for text
- **Async generation**: Fire-and-forget style generation APIs
- **Custom roles**: Define and use custom chat roles
- **Model management**: List, pull, create, delete, and get model details
- **Connectivity utilities**: Server `ping` and process status (`ps`)
- **Authentication**: Basic auth and bearer token support
- **Options builder**: Type-safe builder for model parameters and request options
- **Timeouts**: Configure connect/read/write timeouts
- **Logging**: Built-in logging hooks for requests and responses
- **Metrics & Monitoring** 🆕: Built-in Prometheus metrics export for real-time monitoring of requests, model usage, and
performance. *(Beta feature feedback/contributions welcome!)* -
Checkout [ollama4j-examples](https://github.com/ollama4j/ollama4j-examples) repository for details.
<div align="center">
<img src='metrics.png' width='100%' alt="ollama4j-icon">
</div>
## How does it work?
```mermaid
flowchart LR
@@ -66,71 +102,16 @@ Find more details on the [website](https://ollama4j.github.io/ollama4j/).
end
```
#### Requirements
## Requirements
![Java](https://img.shields.io/badge/Java-11_+-green.svg?style=for-the-badge&labelColor=gray&label=Java&color=orange)
<p align="center">
<img src="https://img.shields.io/badge/Java-11%2B-green.svg?style=for-the-badge&labelColor=gray&label=Java&color=orange" alt="Java"/>
<a href="https://ollama.com/" target="_blank">
<img src="https://img.shields.io/badge/Ollama-0.11.10+-blue.svg?style=for-the-badge&labelColor=gray&label=Ollama&color=blue" alt="Ollama"/>
</a>
</p>
<a href="https://ollama.com/" target="_blank">
<img src="https://img.shields.io/badge/v0.3.0-green.svg?style=for-the-badge&labelColor=gray&label=Ollama&color=blue" alt=""/>
</a>
<table>
<tr>
<td>
<a href="https://ollama.ai/" target="_blank">Local Installation</a>
</td>
<td>
<a href="https://hub.docker.com/r/ollama/ollama" target="_blank">Docker Installation</a>
</td>
</tr>
<tr>
<td>
<a href="https://ollama.com/download/Ollama-darwin.zip" target="_blank">Download for macOS</a>
<a href="https://ollama.com/download/OllamaSetup.exe" target="_blank">Download for Windows</a>
Install on Linux
```shell
curl -fsSL https://ollama.com/install.sh | sh
```
</td>
<td>
CPU only
```shell
docker run -d -p 11434:11434 \
-v ollama:/root/.ollama \
--name ollama \
ollama/ollama
```
NVIDIA GPU
```shell
docker run -d -p 11434:11434 \
--gpus=all \
-v ollama:/root/.ollama \
--name ollama \
ollama/ollama
```
</td>
</tr>
</table>
## Installation
## Usage
> [!NOTE]
> We are now publishing the artifacts to both Maven Central and GitHub package repositories.
@@ -155,7 +136,7 @@ In your Maven project, add this dependency:
<dependency>
<groupId>io.github.ollama4j</groupId>
<artifactId>ollama4j</artifactId>
<version>1.0.79</version>
<version>1.1.0</version>
</dependency>
```
@@ -211,7 +192,7 @@ In your Maven project, add this dependency:
<dependency>
<groupId>io.github.ollama4j</groupId>
<artifactId>ollama4j</artifactId>
<version>1.0.79</version>
<version>1.1.0</version>
</dependency>
```
@@ -221,7 +202,7 @@ In your Maven project, add this dependency:
```groovy
dependencies {
implementation 'io.github.ollama4j:ollama4j:1.0.79'
implementation 'io.github.ollama4j:ollama4j:1.1.0'
}
```
@@ -239,56 +220,69 @@ dependencies {
[lib-shield]: https://img.shields.io/badge/ollama4j-get_latest_version-blue.svg?style=just-the-message&labelColor=gray
#### API Spec
### API Spec
> [!TIP]
> Find the full API specifications on the [website](https://ollama4j.github.io/ollama4j/).
#### Development
## Examples
Build:
For practical examples and usage patterns of the Ollama4j library, check out
the [ollama4j-examples](https://github.com/ollama4j/ollama4j-examples) repository.
## Development
Make sure you have `pre-commit` installed.
With `brew`:
```shell
brew install pre-commit
```
With `pip`:
```shell
pip install pre-commit
```
#### Setup dev environment
> **Note**
> If you're on Windows, install [Chocolatey Package Manager for Windows](https://chocolatey.org/install) and then
> install `make` by running `choco install make`. Just a little tip - run the command with administrator privileges if
> installation faiils.
```shell
make dev
```
#### Build
```shell
make build
```
Run unit tests:
#### Run unit tests
```shell
make unit-tests
```
Run integration tests:
#### Run integration tests
Make sure you have Docker running as this uses [testcontainers](https://testcontainers.com/) to run the integration
tests on Ollama Docker container.
```shell
make integration-tests
```
#### Releases
### Releases
Newer artifacts are published via GitHub Actions CI workflow when a new release is created from `main` branch.
#### Who's using Ollama4j?
- `Datafaker`: a library to generate fake data
- 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
- https://www.reddit.com/r/fabricmc/comments/1e65x5s/comment/ldr2vcf/
- `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
- `JnsCLI`: A command-line tool for Jenkins that manages jobs, builds, and configurations directly from the terminal while offering AI-powered error analysis for quick troubleshooting.
- https://github.com/mirum8/jnscli
#### Traction
[![Star History Chart](https://api.star-history.com/svg?repos=ollama4j/ollama4j&type=Date)](https://star-history.com/#ollama4j/ollama4j&Date)
### Get Involved
## Get Involved
<div align="center">
@@ -300,6 +294,40 @@ Newer artifacts are published via GitHub Actions CI workflow when a new release
</div>
Contributions are most welcome! Whether it's reporting a bug, proposing an enhancement, or helping
with code - any sort of contribution is much appreciated.
<div style="font-size: 15px; font-weight: bold; padding-top: 10px; padding-bottom: 10px; border: 1px solid" align="center">
If you like or are use this project, please give us a ⭐. It's a free way to show your support.
</div>
## 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 | [Website](https://modrinth.com/mod/ai-player), [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) |
| 10 | B4X | A set of simple and powerful RAD tool for Desktop and Server development | [Website](https://www.b4x.com/android/forum/threads/ollama4j-library-pnd_ollama4j-your-local-offline-llm-like-chatgpt.165003/) |
| 11 | Research Article | Article: `Large language model based mutations in genetic improvement` - published on National Library of Medicine (National Center for Biotechnology Information) | [Website](https://pmc.ncbi.nlm.nih.gov/articles/PMC11750896/) |
| 12 | renaime | A LLaVa powered tool that automatically renames image files having messy file names. | [Website](https://devpost.com/software/renaime) |
## Growth
<p align="center">
<a href="https://star-history.com/#ollama4j/ollama4j&Date" target="_blank" rel="noopener noreferrer">
<img
src="https://api.star-history.com/svg?repos=ollama4j/ollama4j&type=Date"
alt="Star History Chart"
/>
</a>
</p>
[//]: # (![GitHub Issues or Pull Requests]&#40;https://img.shields.io/github/issues-raw/ollama4j/ollama4j&#41;)
@@ -311,11 +339,6 @@ Newer artifacts are published via GitHub Actions CI workflow when a new release
[//]: # (![GitHub Discussions]&#40;https://img.shields.io/github/discussions/ollama4j/ollama4j&#41;)
Contributions are most welcome! Whether it's reporting a bug, proposing an enhancement, or helping
with code - any sort
of contribution is much appreciated.
### References
- [Ollama REST APIs](https://github.com/jmorganca/ollama/blob/main/docs/api.md)
@@ -329,11 +352,11 @@ project.
<p align="center">
<a href="https://github.com/ollama4j/ollama4j/graphs/contributors">
<img src="https://contrib.rocks/image?repo=ollama4j/ollama4j" alt=""/>
<img src="https://contrib.rocks/image?repo=ollama4j/ollama4j" alt=""/>
</a>
</p>
### Appreciate my work?
### Appreciate the work?
<p align="center">
<a href="https://www.buymeacoffee.com/amithkoujalgi" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>

39
SECURITY.md Normal file
View File

@@ -0,0 +1,39 @@
## Security Policy
### Supported Versions
We aim to support the latest released version of `ollama4j` and the most recent minor version prior to it. Older versions may receive fixes on a best-effort basis.
### Reporting a Vulnerability
Please do not open public GitHub issues for security vulnerabilities.
Instead, email the maintainer at:
```
koujalgi.amith@gmail.com
```
Include as much detail as possible:
- A clear description of the issue and impact
- Steps to reproduce or proof-of-concept
- Affected version(s) and environment
- Any suggested mitigations or patches
You should receive an acknowledgement within 72 hours. We will work with you to validate the issue, determine severity, and prepare a fix.
### Disclosure
We follow a responsible disclosure process:
1. Receive and validate report privately.
2. Develop and test a fix.
3. Coordinate a release that includes the fix.
4. Publicly credit the reporter (if desired) in release notes.
### GPG Signatures
Releases may be signed as part of our CI pipeline. If verification fails or you have concerns about release integrity, please contact us via the email above.

186
docs/METRICS.md Normal file
View File

@@ -0,0 +1,186 @@
# Prometheus Metrics Integration
Ollama4j now includes comprehensive Prometheus metrics collection to help you monitor and observe your Ollama API usage. This feature allows you to track request counts, response times, model usage, and other operational metrics.
## Features
The metrics integration provides the following metrics:
- **Request Metrics**: Total requests, duration histograms, and response time summaries by endpoint
- **Model Usage**: Model-specific usage statistics and response times
- **Token Generation**: Token count tracking per model
- **Error Tracking**: Error counts by type and endpoint
- **Active Connections**: Current number of active API connections
## Quick Start
### 1. Enable Metrics Collection
```java
import io.github.ollama4j.Ollama;
// Create API instance with metrics enabled
Ollama ollama = new Ollama();
ollamaAPI.
setMetricsEnabled(true);
```
### 2. Start Metrics Server
```java
import io.prometheus.client.exporter.HTTPServer;
// Start Prometheus metrics HTTP server on port 8080
HTTPServer metricsServer = new HTTPServer(8080);
System.out.println("Metrics available at: http://localhost:8080/metrics");
```
### 3. Use the API (Metrics are automatically collected)
```java
// All API calls are automatically instrumented
boolean isReachable = ollama.ping();
Map<String, Object> format = new HashMap<>();
format.put("type", "json");
OllamaResult result = ollama.generateWithFormat(
"llama2",
"Generate a JSON object",
format
);
```
## Available Metrics
### Request Metrics
- `ollama_api_requests_total` - Total number of API requests by endpoint, method, and status
- `ollama_api_request_duration_seconds` - Request duration histogram by endpoint and method
- `ollama_api_response_time_seconds` - Response time summary with percentiles
### Model Metrics
- `ollama_model_usage_total` - Model usage count by model name and operation
- `ollama_model_response_time_seconds` - Model response time histogram
- `ollama_tokens_generated_total` - Total tokens generated by model
### System Metrics
- `ollama_api_active_connections` - Current number of active connections
- `ollama_api_errors_total` - Error count by endpoint and error type
## Example Metrics Output
```
# HELP ollama_api_requests_total Total number of Ollama API requests
# TYPE ollama_api_requests_total counter
ollama_api_requests_total{endpoint="/api/generate",method="POST",status="success"} 5.0
ollama_api_requests_total{endpoint="/api/embed",method="POST",status="success"} 3.0
# HELP ollama_api_request_duration_seconds Duration of Ollama API requests in seconds
# TYPE ollama_api_request_duration_seconds histogram
ollama_api_request_duration_seconds_bucket{endpoint="/api/generate",method="POST",le="0.1"} 0.0
ollama_api_request_duration_seconds_bucket{endpoint="/api/generate",method="POST",le="0.5"} 2.0
ollama_api_request_duration_seconds_bucket{endpoint="/api/generate",method="POST",le="1.0"} 4.0
ollama_api_request_duration_seconds_bucket{endpoint="/api/generate",method="POST",le="+Inf"} 5.0
ollama_api_request_duration_seconds_sum{endpoint="/api/generate",method="POST"} 2.5
ollama_api_request_duration_seconds_count{endpoint="/api/generate",method="POST"} 5.0
# HELP ollama_model_usage_total Total number of model usage requests
# TYPE ollama_model_usage_total counter
ollama_model_usage_total{model_name="llama2",operation="generate_with_format"} 5.0
ollama_model_usage_total{model_name="llama2",operation="embed"} 3.0
# HELP ollama_tokens_generated_total Total number of tokens generated
# TYPE ollama_tokens_generated_total counter
ollama_tokens_generated_total{model_name="llama2"} 150.0
```
## Configuration
### Enable/Disable Metrics
```java
OllamaAPI ollama = new OllamaAPI();
// Enable metrics collection
ollama.setMetricsEnabled(true);
// Disable metrics collection (default)
ollama.setMetricsEnabled(false);
```
### Custom Metrics Server
```java
import io.prometheus.client.exporter.HTTPServer;
// Start on custom port
HTTPServer metricsServer = new HTTPServer(9090);
// Start on custom host and port
HTTPServer metricsServer = new HTTPServer("0.0.0.0", 9090);
```
## Integration with Prometheus
### Prometheus Configuration
Add this to your `prometheus.yml`:
```yaml
scrape_configs:
- job_name: 'ollama4j'
static_configs:
- targets: ['localhost:8080']
scrape_interval: 15s
```
### Grafana Dashboards
You can create Grafana dashboards using the metrics. Some useful queries:
- **Request Rate**: `rate(ollama_api_requests_total[5m])`
- **Average Response Time**: `rate(ollama_api_request_duration_seconds_sum[5m]) / rate(ollama_api_request_duration_seconds_count[5m])`
- **Error Rate**: `rate(ollama_api_requests_total{status="error"}[5m]) / rate(ollama_api_requests_total[5m])`
- **Model Usage**: `rate(ollama_model_usage_total[5m])`
- **Token Generation Rate**: `rate(ollama_tokens_generated_total[5m])`
## Performance Considerations
- Metrics collection adds minimal overhead (~1-2% in most cases)
- Metrics are collected asynchronously and don't block API calls
- You can disable metrics in production if needed: `ollama.setMetricsEnabled(false)`
- The metrics server uses minimal resources
## Troubleshooting
### Metrics Not Appearing
1. Ensure metrics are enabled: `ollama.setMetricsEnabled(true)`
2. Check that the metrics server is running: `http://localhost:8080/metrics`
3. Verify API calls are being made (metrics only appear after API usage)
### High Memory Usage
- Metrics accumulate over time. Consider restarting your application periodically
- Use Prometheus to scrape metrics regularly to avoid accumulation
### Custom Metrics
You can extend the metrics by accessing the Prometheus registry directly:
```java
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.Counter;
// Create custom metrics
Counter customCounter = Counter.build()
.name("my_custom_metric_total")
.help("My custom metric")
.register();
// Use the metric
customCounter.inc();
```

View File

@@ -1,9 +0,0 @@
---
slug: welcome
title: Welcome
authors: [ amith ]
tags: [ Java, AI, LLM, GenAI, GenerativeAI, Ollama, Ollama4J, OpenSource, Developers
]
---
Welcome Java Developers!

View File

@@ -1,6 +1,6 @@
---
slug: release-post
title: Release
title: First Release 🚀
authors: [ amith ]
tags: [ Java, AI, LLM, GenAI, GenerativeAI, Ollama, Ollama4j, OpenSource, Developers
]
@@ -23,6 +23,8 @@ applications! 🌐🚀
- Ability to ask questions along with image files or image URLs! 🤩
- Open-source and primed for collaborative contributions from the community!
<!-- truncate -->
🦙 What is Ollama?
Ollama is an advanced AI tool that allows users to easily set up and run large language models locally (in CPU and GPU

View File

@@ -0,0 +1,710 @@
---
slug: talk-to-your-data-on-couchbase-via-ollama4j
title: "Talk to Your Data Using Natural Language: A Guide to Interacting with Couchbase via Ollama4j"
authors: [ amith ]
tags: [ Java, AI, LLM, GenAI, GenerativeAI, Generative AI Tools, Ollama, Ollama4J, OpenSource, Developers,
]
---
Sometime back, I created a small wrapper called Ollama4j to interact with the Ollama server over the REST API in Java as
a side project and made the [repository](https://github.com/ollama4j/ollama4j) public on GitHub. Over time, the project
gained traction, with many fellow Java
developers contributing, and it now boasts over _300 stars_! 😍
Weve consistently introduced new features, and when we added the tool-calling capability, the library became incredibly
powerful, opening up so many possibilities. With this addition, we could automate numerous tasks using natural language!
I wanted to share how to make the most of this functionality.
In this article, well explore how to use Ollama4j, a Java SDK for interacting with Ollama-hosted models, to leverage
tool-calling models like Mistral for querying a Couchbase database. The goal is to create a system where you can query
your database using natural, conversational language — just like interacting with a virtual assistant. Well walk you
through the code, explain the key components, and show you how to set up your environment to ensure everything runs
smoothly.
<!-- truncate -->
### Overview of the Technologies Involved
Before diving into the implementation, lets understand the core technologies were using:
- **Ollama4j**: A Java SDK that interacts with hosted AI models through a convenient API. Ollama allows you to interact
with
pre-trained models (like Mistral) and access additional tools that can be applied to real-world tasks.
- **Mistral**: A powerful, language-based model that can be used for a variety of tasks, including answering questions,
text
generation, and data retrieval from external sources. While Ive used Mistral in this instance, you can easily replace
it with [any other model](https://ollama.com/search?c=tools) that supports tool-calling capabilities.
- **Couchbase**: A NoSQL database that provides a flexible and scalable data model. In this example, well query a
Couchbase
database to retrieve airline information.
The magic happens when we combine these technologies to allow the model to query the database in a more intuitive and
human-like way, acting as an interface between the users natural language and Couchbases structured data.
> Oh, by the way, you can either set up
> a [Couchbase server](https://www.couchbase.com/downloads/?family=couchbase-server) on your own or, if you prefer a
> more
> effortless approach like
> I
> do, give [Couchbase Capella](https://www.couchbase.com/products/capella/) a spin. Its a fully managed
> Database-as-a-Service (DBaaS) with a free tier 🎉 thats so
> easy
> to set up, youll be querying your data in no time. Its perfect for developers who want to dive in without any
> hassle —
> its like having your own cloud database, minus the headache!
In the following section, we will walk you through the simple steps to create your free Couchbase Capella database
cluster. If youd prefer to set up your own Couchbase server elsewhere, feel free to skip this section and go directly
to the [Code Environment Setup](#setting-up-the-environment-for-code) section.
Sign up for a free database cluster on Couchbase Capella
Head over to https://cloud.couchbase.com/sign-in and sign up for an account.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*vsJC0ugfoh9vpYNapt4-5A.png'} />
Once youre in, you will be able to create a new database cluster. Click on the _**Operational**_ tab and click on the
**_Create Cluster_** button.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*ZNicgmYNkclgaBIxwRN7Ug.png'} />
Select the default project named **_My First Project_** and click on the **_Continue_** button.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*vfc2cF7IgkjLtNXvls8giQ.png'} />
Youll now see the available cluster options. Go ahead and select the **_Free_** option! 😍
Next, choose your preferred cloud provider (you can select any provider or stick with the default AWS provider).
Pick a region (or leave it set to the default).
Finally, click on the Create Cluster button to proceed.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*rdWpeSrUaBKC6Y5q8Kd6EA.png'} />
Give it a couple of minutes, and let the magic happen as your cluster gets deployed.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*no3uHx8cIzVBn7qccYEZ3A.png'} />
Once your cluster is deployed, youll see the status of your cluster as **_Healthy_**.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*Jyu9uiSDSE0o-EQRb53CJA.png'} />
Click on the listed cluster to open its details. Here, you can view the version of the deployed Couchbase server, the
enabled services, as well as the cloud provider and region.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*Sv-7wQuAoD0l0bjbI5I7Aw.png'} />
Click on **_Explore Data_** button. Notice that a default bucket called **_travel-sample_** with some sample data has
been created
for you.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*z85GsgMBvdR2mrvKUrIjJg.png'} />
Browse through the collection to explore the pre-created buckets, scopes and collections available to you.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*Qr84bs1dvn6m9ZjkNxXvUg.png'} />
Open up a sample document from the **_travel-sample_** (bucket) > **_inventory_** (scope) > **_airline_** (collection)
to see the contents
of the document.
The document shown in the image below is about an airline named **_Astraeus_**, whose call sign (a unique name or code
used to
identify an airline or aircraft in communication) is **_FLYSTAR_**.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*AmvixYfdNNKC6nXNNXbe4Q.png'} />
Navigate to the **_Connect_** tab, and you will see a **_Public Connection String_** that allows you to access the
Capella cluster
endpoint from your client application, which looks like the following URL:
```
couchbases://cb.uniqueclusteridentifer.cloud.couchbase.com
```
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*jwnVdj5ZOQMHoggj9JZeJQ.png'} />
To access this cluster endpoint, you need to allow the IP addresses that are permitted to connect. Click on the
**_Settings_**
tab, which will take you to the **_Cluster Settings_** view. Then, click on **_Allowed IP Addresses_** in the left pane
under
**_Networking_**, where you can add allowed IP addresses. Then, click on the **_Add Allowed IP_** button.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*tS83AJaNzlBa4Q3aadxohw.png'} />
You can either click on the **_Add Current IP Address_** button to limit access to your cluster to your IP address
alone, or
if youd like to allow access from anywhere, click on the **_Allow Access from Anywhere_** button.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*XBgqQoXQQJyYg51Ztugw6w.png'} />
Confirm that you want to allow the IP addresses.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*WjfYQQaiT2WqwNnWvUCyww.png'} />
The IP addresses have now been added to the allow list, and the networking is set up.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*5BHIp2rqUf7E_GNX8TENoA.png'} />
Now that youve allowed IP addresses, its time to create credentials for accessing the cluster using a username and
password. Click on the **_Cluster Access_** tab in the left pane, then click on the **_Create Cluster Access_** button.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*Q5l_EE3gGtxiANdkKilVTQ.png'} />
Enter a username of your choice in the **_Cluster Access Name_** text field, and then enter a password of your choice in
the
**_Password_** text field.
Next, select the bucket, scope, and the read/write permissions you want these credentials to have access to. In this
example, Ive granted access to all buckets and scopes with both read and write permissions.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*j2DRB1oDWE78SKpcsIb2SA.png'} />
Alright, your cluster access is now set up.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*8TY-5DPDfQlwz0-2IYR8Sg.png'} />
One last step: you just need to select the **_Cluster Access Credentials_** that you want to allow to connect to your
Capella
cluster. Head over to the **_Connect_** tab, then click on the **_SDKs_** tab in the left pane. Under Choose the
**_Cluster Access Credentials you want to use to connect to your Capella cluster_**, select the cluster credentials you
just created.
<img src={'https://miro.medium.com/v2/resize:fit:1400/format:webp/1*sIlH51v2HllTzBDV8K-9Aw.png'} />
Awesome! Your cluster access is all set up, and youre ready to connect to your Capella cluster using a Couchbase
client. Thats it — youre all set and good to go!
### Setting Up the Environment For Code
Before you begin, ensure you have the following components setup.
**Java**: Make sure you have Java 11+ installed on your system. Set it up
from [here](https://www.oracle.com/in/java/technologies/downloads/). Verify it by running the following
command in your terminal.
```shell
java --version
```
**Maven**: Make sure you have the Maven build system set up. Set it up from [here](https://maven.apache.org/download.cgi).
Verify it by running the following command
in your terminal.
```
mvn --version
```
**Ollama Server**: Make sure you have installed the latest version of [Ollama server](https://ollama.com/) and it is up
and running. Verify it by
running the following command in your terminal.
```shell
ollama --version
```
**Model**: Youll need [tool-calling model](https://ollama.com/search?c=tools) (such as Mistral) downloaded and ready to
serve from your Ollama server.
To download/pull the model into your Ollama server, run the following command in your terminal.
```shell
ollama pull mistral
```
You can list the models available on your model server by running the following command in your terminal.
```shell
ollama list
```
Once you have these, you can start setting up the application.
Setup `pom.xml` for your Maven project.
```xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.ollama4j.couchbase</groupId>
<artifactId>ollama4j-couchbase</artifactId>
<version>0.0.1</version>
<name>Ollama4j Couchbase</name>
<description>Talk to your data in Couchbase over Ollama4j</description>
<packaging>jar</packaging>
<properties>
<maven.compiler.release>11</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<lombok.version>1.18.30</lombok.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.11.2</version>
<configuration>
<!-- to disable the "missing" warnings. Remove the doclint to enable warnings-->
<doclint>all,-missing</doclint>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
<dependency>
<groupId>io.github.ollama4j</groupId>
<artifactId>ollama4j</artifactId>
<version>ollama4j-revision</version>
</dependency>
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0</version>
</dependency>
<!-- Logback Classic (SLF4J binding) -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.12</version>
</dependency>
<dependency>
<groupId>com.couchbase.client</groupId>
<artifactId>java-client</artifactId>
<version>3.7.8</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
```
### Code Walkthrough
Heres the main part of the implementation in the Java code.
```java
package io.github.ollama4j.examples;
import com.couchbase.client.java.Bucket;
import com.couchbase.client.java.Cluster;
import com.couchbase.client.java.ClusterOptions;
import com.couchbase.client.java.Scope;
import com.couchbase.client.java.json.JsonObject;
import com.couchbase.client.java.query.QueryResult;
import io.github.ollama4j.Ollama;
import io.github.ollama4j.exceptions.OllamaException;
import io.github.ollama4j.exceptions.ToolInvocationException;
import io.github.ollama4j.tools.OllamaToolsResult;
import io.github.ollama4j.tools.ToolFunction;
import io.github.ollama4j.tools.Tools;
import io.github.ollama4j.utils.OptionsBuilder;
import io.github.ollama4j.utils.Utilities;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.IOException;
import java.time.Duration;
import java.util.Arrays;
import java.util.Map;
public class CouchbaseToolCallingExample {
public static void main(String[] args) throws IOException, ToolInvocationException, OllamaException, InterruptedException {
String connectionString = Utilities.getFromEnvVar("CB_CLUSTER_URL");
String username = Utilities.getFromEnvVar("CB_CLUSTER_USERNAME");
String password = Utilities.getFromEnvVar("CB_CLUSTER_PASSWORD");
String bucketName = "travel-sample";
Cluster cluster = Cluster.connect(
connectionString,
ClusterOptions.clusterOptions(username, password).environment(env -> {
env.applyProfile("wan-development");
})
);
String host = Utilities.getFromConfig("host");
String modelName = Utilities.getFromConfig("tools_model_mistral");
Ollama ollama = new Ollama(host);
ollama.setRequestTimeoutSeconds(60);
Tools.ToolSpecification callSignFinderToolSpec = getCallSignFinderToolSpec(cluster, bucketName);
Tools.ToolSpecification callSignUpdaterToolSpec = getCallSignUpdaterToolSpec(cluster, bucketName);
ollama.registerTool(callSignFinderToolSpec);
ollama.registerTool(callSignUpdaterToolSpec);
String prompt1 = "What is the call-sign of Astraeus?";
for (OllamaToolsResult.ToolResult r : ollama.generateWithTools(modelName, new Tools.PromptBuilder()
.withToolSpecification(callSignFinderToolSpec)
.withPrompt(prompt1)
.build(), new OptionsBuilder().build()).getToolResults()) {
AirlineDetail airlineDetail = (AirlineDetail) r.getResult();
System.out.println(String.format("[Result of tool '%s']: Call-sign of %s is '%s'! ✈️", r.getFunctionName(), airlineDetail.getName(), airlineDetail.getCallsign()));
}
String prompt2 = "I want to code name Astraeus as STARBOUND";
for (OllamaToolsResult.ToolResult r : ollama.generateWithTools(modelName, new Tools.PromptBuilder()
.withToolSpecification(callSignUpdaterToolSpec)
.withPrompt(prompt2)
.build(), new OptionsBuilder().build()).getToolResults()) {
Boolean updated = (Boolean) r.getResult();
System.out.println(String.format("[Result of tool '%s']: Call-sign is %s! ✈️", r.getFunctionName(), updated ? "updated" : "not updated"));
}
String prompt3 = "What is the call-sign of Astraeus?";
for (OllamaToolsResult.ToolResult r : ollama.generateWithTools(modelName, new Tools.PromptBuilder()
.withToolSpecification(callSignFinderToolSpec)
.withPrompt(prompt3)
.build(), new OptionsBuilder().build()).getToolResults()) {
AirlineDetail airlineDetail = (AirlineDetail) r.getResult();
System.out.println(String.format("[Result of tool '%s']: Call-sign of %s is '%s'! ✈️", r.getFunctionName(), airlineDetail.getName(), airlineDetail.getCallsign()));
}
}
public static Tools.ToolSpecification getCallSignFinderToolSpec(Cluster cluster, String bucketName) {
return Tools.ToolSpecification.builder()
.functionName("airline-lookup")
.functionDescription("You are a tool who finds only the airline name and do not worry about any other parameters. You simply find the airline name and ignore the rest of the parameters. Do not validate airline names as I want to use fake/fictitious airline names as well.")
.toolFunction(new AirlineCallsignQueryToolFunction(bucketName, cluster))
.toolPrompt(
Tools.PromptFuncDefinition.builder()
.type("prompt")
.function(
Tools.PromptFuncDefinition.PromptFuncSpec.builder()
.name("get-airline-name")
.description("Get the airline name")
.parameters(
Tools.PromptFuncDefinition.Parameters.builder()
.type("object")
.properties(
Map.of(
"airlineName", Tools.PromptFuncDefinition.Property.builder()
.type("string")
.description("The name of the airline. e.g. Emirates")
.required(true)
.build()
)
)
.required(java.util.List.of("airline-name"))
.build()
)
.build()
)
.build()
)
.build();
}
public static Tools.ToolSpecification getCallSignUpdaterToolSpec(Cluster cluster, String bucketName) {
return Tools.ToolSpecification.builder()
.functionName("airline-update")
.functionDescription("You are a tool who finds the airline name and its callsign and do not worry about any validations. You simply find the airline name and its callsign. Do not validate airline names as I want to use fake/fictitious airline names as well.")
.toolFunction(new AirlineCallsignUpdateToolFunction(bucketName, cluster))
.toolPrompt(
Tools.PromptFuncDefinition.builder()
.type("prompt")
.function(
Tools.PromptFuncDefinition.PromptFuncSpec.builder()
.name("get-airline-name-and-callsign")
.description("Get the airline name and callsign")
.parameters(
Tools.PromptFuncDefinition.Parameters.builder()
.type("object")
.properties(
Map.of(
"airlineName", Tools.PromptFuncDefinition.Property.builder()
.type("string")
.description("The name of the airline. e.g. Emirates")
.required(true)
.build(),
"airlineCallsign", Tools.PromptFuncDefinition.Property.builder()
.type("string")
.description("The callsign of the airline. e.g. Maverick")
.enumValues(Arrays.asList("petrol", "diesel"))
.required(true)
.build()
)
)
.required(java.util.List.of("airlineName", "airlineCallsign"))
.build()
)
.build()
)
.build()
)
.build();
}
}
class AirlineCallsignQueryToolFunction implements ToolFunction {
private final String bucketName;
private final Cluster cluster;
public AirlineCallsignQueryToolFunction(String bucketName, Cluster cluster) {
this.bucketName = bucketName;
this.cluster = cluster;
}
@Override
public AirlineDetail apply(Map<String, Object> arguments) {
String airlineName = arguments.get("airlineName").toString();
Bucket bucket = cluster.bucket(bucketName);
bucket.waitUntilReady(Duration.ofSeconds(10));
Scope inventoryScope = bucket.scope("inventory");
QueryResult result = inventoryScope.query(String.format("SELECT * FROM airline WHERE name = '%s';", airlineName));
JsonObject row = (JsonObject) result.rowsAsObject().get(0).get("airline");
return new AirlineDetail(row.getString("callsign"), row.getString("name"), row.getString("country"));
}
}
class AirlineCallsignUpdateToolFunction implements ToolFunction {
private final String bucketName;
private final Cluster cluster;
public AirlineCallsignUpdateToolFunction(String bucketName, Cluster cluster) {
this.bucketName = bucketName;
this.cluster = cluster;
}
@Override
public Boolean apply(Map<String, Object> arguments) {
String airlineName = arguments.get("airlineName").toString();
String airlineNewCallsign = arguments.get("airlineCallsign").toString();
Bucket bucket = cluster.bucket(bucketName);
bucket.waitUntilReady(Duration.ofSeconds(10));
Scope inventoryScope = bucket.scope("inventory");
String query = String.format("SELECT * FROM airline WHERE name = '%s';", airlineName);
QueryResult result;
try {
result = inventoryScope.query(query);
} catch (Exception e) {
throw new RuntimeException("Error executing query", e);
}
if (result.rowsAsObject().isEmpty()) {
throw new RuntimeException("Airline not found with name: " + airlineName);
}
JsonObject row = (JsonObject) result.rowsAsObject().get(0).get("airline");
if (row == null) {
throw new RuntimeException("Airline data is missing or corrupted.");
}
String currentCallsign = row.getString("callsign");
if (!airlineNewCallsign.equals(currentCallsign)) {
JsonObject updateQuery = JsonObject.create()
.put("callsign", airlineNewCallsign);
inventoryScope.query(String.format(
"UPDATE airline SET callsign = '%s' WHERE name = '%s';",
airlineNewCallsign, airlineName
));
return true;
}
return false;
}
}
@SuppressWarnings("ALL")
@Data
@AllArgsConstructor
@NoArgsConstructor
class AirlineDetail {
private String callsign;
private String name;
private String country;
}
```
### Key Concepts
#### 1. Ollama API Client Setup
```javascript
OllamaAPI ollama = new OllamaAPI(host);
ollama.setRequestTimeoutSeconds(60);
```
Here, we initialize the Ollama API client and configure it with the host of the Ollama server, where the model is hosted
and can handle API requests. Additionally, we set the request timeout to 60 seconds to ensure that even if the model
takes longer to respond, the request will still be processed.
#### 2. Tool Specification
The ToolSpecification class defines how the model will interact with the Couchbase database. We define a function that
queries the database for airline details based on the airline name.
```javascript
Tools.ToolSpecification callSignFinderToolSpec = getCallSignFinderToolSpec(cluster, bucketName);
ollama.registerTool(callSignFinderToolSpec);
```
This step registers custom tools with Ollama that allows the tool-calling model to invoke database queries.
#### 3. Query Execution
The tool will execute a Couchbase N1QL query to retrieve the airline details:
```javascript
QueryResult result = inventoryScope.query(String.format("SELECT * FROM airline WHERE name = '%s';", airlineName));
```
The result is processed and returned as an AirlineDetail object.
#### 4. Set up your prompt (question)
```javascript
String prompt = "What is the call-sign of Astraeus?";
```
#### 5. Generating Results with Tools
```javascript
for (OllamaToolsResult.ToolResult r : ollama.generateWithTools(modelName, new Tools.PromptBuilder()
.withToolSpecification(callSignFinderToolSpec)
.withPrompt(prompt)
.build(), new OptionsBuilder().build()).getToolResults()) {
AirlineDetail airlineDetail = (AirlineDetail) r.getResult();
System.out.printf("[Result of tool '%s']: Call-sign of %s is '%s'! ✈️", r.getFunctionName(), airlineDetail.getName(), airlineDetail.getCallsign());
}
```
This invokes the tool-calling model (Mistral in this case) with the provided prompt and uses the registered tool to
query the database. The result is returned and printed to the console.
So, we ask the following question to the model.
> **What is the call-sign of Astraeus?**
And, heres what the model responds:
> **Call-sign of Astraeus is FLYSTAR! ✈️**
Isnt that amazing? Now, lets enhance it further by adding a function that allows us to update an airlines call sign
using natural language.
Lets define another `ToolSpecificationclass` that defines how the model will interact with the Couchbase database to
update the database. We define a function that queries the database for airline details based on the airline name and
then update the airlines callsign.
```javascript
Tools.ToolSpecification callSignUpdaterToolSpec = getCallSignUpdaterToolSpec(cluster, bucketName);
ollama.registerTool(callSignUpdaterToolSpec);
```
The tool will execute a Couchbase N1QL query to update the airlines callsign.
```javascript
inventoryScope.query(String.format(
"UPDATE airline SET callsign = '%s' WHERE name = '%s';",
airlineNewCallsign, airlineName
));
```
Setup the prompt to instruct the model to update the airlines callsign.
```javascript
String prompt = "I want to code name Astraeus as STARBOUND";
```
And then we invoke the model with the new prompt.
```javascript
String prompt = "I want to code name Astraeus as STARBOUND";
for (OllamaToolsResult.ToolResult r : ollama.generateWithTools(modelName, new Tools.PromptBuilder()
.withToolSpecification(callSignUpdaterToolSpec)
.withPrompt(prompt)
.build(), new OptionsBuilder().build()).getToolResults()) {
Boolean updated = (Boolean) r.getResult();
System.out.println(String.format("[Result of tool '%s']: Call-sign is %s! ✈️", r.getFunctionName(), updated ? "updated" : "not updated"));
}
```
This invokes the tool-calling model (Mistral in this case) with the new prompt and uses the registered tool to update
the database.
So, we ask the following question to the model.
> **I want to code name Astraeus as STARBOUND.**
And, heres what the model responds:
> **Call-sign is updated! ✈️**
How amazing is that? The possibilities for interacting with your data using natural language are endless. You could
integrate features like checking flight availability, booking tickets, retrieving ticket details, and so much more!
Feel free to extend this example further by adding more sophisticated capabilities! 🚀
### Conclusion
With the code above, you can use Ollamas hosted models (like Mistral) to query a Couchbase database using natural
language prompts. This makes it possible to interact with databases in a more intuitive and human-like way.
By leveraging Ollama4j, you can connect AI models to real-world applications and build powerful tools that can automate
complex tasks or simply make querying your data more conversational.
You can find the full code and more such examples from
the [ollama4j-examples](https://github.com/ollama4j/ollama4j-examples) GitHub repository.
Credit to Couchbase, Ollama, and all the model teams for providing us with such amazing software!

60
docs/docs/agent.md Normal file
View File

@@ -0,0 +1,60 @@
---
sidebar_position: 4
title: Agents
---
import CodeEmbed from '@site/src/components/CodeEmbed';
# Agents
Build powerful, flexible agents—backed by LLMs and tools—in a few minutes.
Ollama4js agent system lets you bring together the best of LLM reasoning and external tool-use using a simple, declarative YAML configuration. No framework bloat, no complicated setup—just describe your agent, plug in your logic, and go.
---
**Why use agents in Ollama4j?**
- **Effortless Customization:** Instantly adjust your agents persona, reasoning strategies, or domain by tweaking YAML. No need to touch your compiled Java code.
- **Easy Extensibility:** Want new capabilities? Just add or change tools and logic classes—no framework glue or plumbing required.
- **Fast Experimentation:** Mix-and-match models, instructions, and tools—prototype sophisticated behaviors or orchestrators in minutes.
- **Clean Separation:** Keep business logic (Java) and agent personality/configuration (YAML) separate for maintainability and clarity.
---
## Define an Agent in YAML
Specify everything about your agent—what LLM it uses, its “personality,” and all callable tools—in a single YAML file.
**Agent YAML keys:**
| Field | Description |
|-------------------------|-----------------------------------------------------------------------------------------------------------------------|
| `name` | Name of your agent. |
| `host` | The base URL for your Ollama server (e.g., `http://localhost:11434`). |
| `model` | The LLM backing your agent (e.g., `llama2`, `mistral`, `mixtral`, etc). |
| `customPrompt` | _(optional)_ System prompt—instructions or persona for your agent. |
| `tools` | List of tools the agent can use. Each tool entry describes the name, function, and parameters. |
| `toolFunctionFQCN` | Fully qualified Java class name implementing the tool logic. Must be present on classpath. |
| `requestTimeoutSeconds` | _(optional)_ How long (seconds) to wait for agent replies. |
YAML makes it effortless to configure and tweak your agents powers and behavior—no code changes needed!
**Example agent YAML:**
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/resources/agent.yaml" language='yaml'/>
---
## Instantiating and Running Agents in Java
Once your agent is described in YAML, bringing it to life in Java takes only a couple of lines:
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/AgentExample.java"/>
- **No boilerplate.** Just load and start chatting or calling tools.
- The API takes care of wiring up LLMs, tool invocation, and instruction handling.
Ready to build your own AI-powered assistant? Just write your YAML, implement the tool logic in Java, and go!

View File

@@ -1,8 +1,8 @@
{
"label": "APIs - Extras",
"position": 4,
"link": {
"type": "generated-index",
"description": "Details of APIs to handle bunch of extra stuff."
}
"label": "Extras",
"position": 5,
"link": {
"type": "generated-index",
"description": "Details of APIs to handle bunch of extra stuff."
}
}

View File

@@ -1,8 +1,8 @@
---
sidebar_position: 2
sidebar_position: 3
---
# Set Basic Authentication
# Basic Auth
This API lets you set the basic authentication for the Ollama client. This would help in scenarios where
Ollama server would be setup behind a gateway/reverse proxy with basic auth.
@@ -10,7 +10,7 @@ Ollama server would be setup behind a gateway/reverse proxy with basic auth.
After configuring basic authentication, all subsequent requests will include the Basic Auth header.
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.Ollama;
public class Main {
@@ -18,9 +18,9 @@ public class Main {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
Ollama ollama = new Ollama(host);
ollamaAPI.setBasicAuth("username", "password");
ollama.setBasicAuth("username", "password");
}
}
```

View File

@@ -0,0 +1,26 @@
---
sidebar_position: 4
---
# Bearer Auth
This API lets you set the bearer authentication for the Ollama client. This would help in scenarios where
Ollama server would be setup behind a gateway/reverse proxy with bearer auth.
After configuring bearer authentication, all subsequent requests will include the Bearer Auth header.
```java
import io.github.ollama4j.Ollama;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
Ollama ollama = new Ollama(host);
ollama.setBearerAuth("YOUR-TOKEN");
}
}
```

View File

@@ -0,0 +1,26 @@
---
sidebar_position: 7
---
# Logging
### Using with SLF4J and Logback
Add a `logback.xml` file to your `src/main/resources` folder with the following content:
```xml
<configuration>
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
</root>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</configuration>
```

View File

@@ -36,7 +36,7 @@ from [javadoc](https://ollama4j.github.io/ollama4j/apidocs/io/github/ollama4j/ol
## Build an empty `Options` object
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.Ollama;
import io.github.ollama4j.utils.Options;
import io.github.ollama4j.utils.OptionsBuilder;
@@ -46,7 +46,7 @@ public class Main {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
Ollama ollama = new Ollama(host);
Options options = new OptionsBuilder().build();
}
@@ -65,7 +65,7 @@ public class Main {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
Ollama ollama = new Ollama(host);
Options options =
new OptionsBuilder()
@@ -74,6 +74,15 @@ public class Main {
.setNumGpu(2)
.setTemperature(1.5f)
.build();
OllamaResult result =
ollama.generate(
OllamaGenerateRequestBuilder.builder()
.withModel(model)
.withPrompt("Who are you?")
.withOptions(options)
.build(),
null);
}
}
```

View File

@@ -1,5 +1,5 @@
---
sidebar_position: 3
sidebar_position: 5
---
# Ping
@@ -7,16 +7,16 @@ sidebar_position: 3
This API lets you check the reachability of Ollama server.
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.Ollama;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.ping();
Ollama ollama = new Ollama(host);
ollama.ping();
}
}
```

View File

@@ -1,5 +1,5 @@
---
sidebar_position: 6
sidebar_position: 2
---
# Prompt Builder
@@ -8,7 +8,7 @@ This is designed for prompt engineering. It allows you to easily build the promp
inferences.
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.Ollama;
import io.github.ollama4j.models.response.OllamaResult;
import io.github.ollama4j.types.OllamaModelType;
import io.github.ollama4j.utils.OptionsBuilder;
@@ -18,8 +18,8 @@ public class Main {
public static void main(String[] args) throws Exception {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.setRequestTimeoutSeconds(10);
Ollama ollama = new Ollama(host);
ollama.setRequestTimeoutSeconds(10);
String model = OllamaModelType.PHI;
@@ -43,7 +43,7 @@ public class Main {
.add("How do I read a file in Go and print its contents to stdout?");
boolean raw = false;
OllamaResult response = ollamaAPI.generate(model, promptBuilder.build(), raw, new OptionsBuilder().build());
OllamaResult response = ollama.generate(model, promptBuilder.build(), raw, new OptionsBuilder().build());
System.out.println(response.getResponse());
}
}
@@ -51,6 +51,7 @@ public class Main {
You will get a response similar to:
:::tip[LLM Response]
```go
package main
@@ -71,4 +72,5 @@ func readFile(fileName string) {
fmt.Println(f.String())
}
}
```
```
:::

View File

@@ -1,5 +1,5 @@
---
sidebar_position: 4
sidebar_position: 5
---
# PS
@@ -11,18 +11,15 @@ This API corresponds to the [PS](https://github.com/ollama/ollama/blob/main/docs
```java
package io.github.ollama4j.localtests;
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.exceptions.OllamaBaseException;
import io.github.ollama4j.models.ps.ModelsProcessResponse;
import java.io.IOException;
import io.github.ollama4j.Ollama;
import io.github.ollama4j.models.ps.ModelProcessesResult;
public class Main {
public static void main(String[] args) {
OllamaAPI ollamaAPI = new OllamaAPI("http://localhost:11434");
Ollama ollama = new Ollama("http://localhost:11434");
ModelsProcessResponse response = ollamaAPI.ps();
ModelProcessesResult response = ollama.ps();
System.out.println(response);
}

View File

@@ -1,23 +0,0 @@
---
sidebar_position: 2
---
# Set Request Timeout
This API lets you set the request timeout for the Ollama client.
```java
import io.github.ollama4j.OllamaAPI;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.setRequestTimeoutSeconds(10);
}
}
```

View File

@@ -0,0 +1,25 @@
---
sidebar_position: 2
---
# Timeouts
### Set Request Timeout
This API lets you set the request timeout for the Ollama client.
```java
import io.github.ollama4j.Ollama;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
Ollama ollama = new Ollama(host);
ollama.setRequestTimeoutSeconds(10);
}
}
```

View File

@@ -1,25 +0,0 @@
---
sidebar_position: 1
---
# Set Verbosity
This API lets you set the verbosity of the Ollama client.
## Try asking a question about the model.
```java
import io.github.ollama4j.OllamaAPI;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.setVerbose(true);
}
}
```

View File

@@ -1,8 +1,8 @@
{
"label": "APIs - Generate",
"position": 3,
"link": {
"type": "generated-index",
"description": "Details of APIs to interact with LLMs."
}
"label": "Generate",
"position": 3,
"link": {
"type": "generated-index",
"description": "Details of APIs to interact with LLMs."
}
}

View File

@@ -0,0 +1,92 @@
---
sidebar_position: 8
---
import CodeEmbed from '@site/src/components/CodeEmbed';
import TypewriterTextarea from '@site/src/components/TypewriterTextarea';
# Chat with Thinking
This API allows to generate responses from an LLM while also retrieving the model's "thinking" process separately from
the final answer. The "thinking" tokens represent the model's internal reasoning or planning before it produces the
actual response. This can be useful for debugging, transparency, or simply understanding how the model arrives at its
answers.
You can use this feature to receive both the thinking and the response as separate outputs, either as a complete result
or streamed token by token. The examples below show how to use the API to access both the thinking and the response, and
how to display them in your application.
### Chat with thinking model and receive the thinking and response text separately
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatWithThinkingModelExample.java" />
You will get a response similar to:
:::tip[LLM Response]
**First thinking response:** User asks a simple question. We just answer.
**First answer response:** The capital of France is _**Paris**_.
**Second thinking response:** User: "And what is the second largest city?" They asked about the second largest city in
France. Provide answer: Paris largest, second largest is Marseille. We can provide population stats, maybe mention Lyon
as third largest. Also context. The answer should be concise. Provide some details: Marseille is the second largest,
population ~870k, located on Mediterranean coast. Provide maybe some facts. Given no request for extra context, just answer.
**Second answer response:** The secondlargest city in France is _**Marseille**_. Its a major Mediterranean port with a
population of roughly 870,000 (as of the latest estimates) and is known for its historic Old Port, vibrant cultural
scene, and diverse population.
:::
### Chat with thinking model and receive the thinking and response tokens streamed
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatStreamingWithThinkingExample.java" />
You will get a response similar to:
:::tip[First Question's Thinking Tokens]
<TypewriterTextarea
textContent={`USER ASKS A SIMPLE QUESTION: "WHAT IS THE CAPITAL OF FRANCE?" THE ANSWER: PARIS. PROVIDE ANSWER.`}
typingSpeed={10}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>
:::
:::tip[First Question's Response Tokens]
<TypewriterTextarea
textContent={`the capital of france is 'paris'.`}
typingSpeed={10}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>
:::
:::tip[Second Question's Thinking Tokens]
<TypewriterTextarea
textContent={`THE USER ASKS: "AND WHAT IS THE SECOND LARGEST CITY?" LIKELY REFERRING TO FRANCE. THE SECOND LARGEST CITY IN FRANCE (BY POPULATION) IS MARSEILLE. HOWEVER, THERE MIGHT BE NUANCE: THE LARGEST IS PARIS, SECOND LARGEST IS MARSEILLE. BUT SOME MIGHT ARGUE THAT LYON IS SECOND LARGEST? LET'S CONFIRM: POPULATION OF FRANCE: PARIS ~2.1M (METRO 12M). MARSEILLE ~870K (METRO 1.5M). LYON ~515K (METRO 1.5M). SO MARSEILLE IS SECOND LARGEST CITY PROPER. LYON IS THIRD LARGEST. SO ANSWER: MARSEILLE. WE SHOULD PROVIDE THAT. PROVIDE A BRIEF EXPLANATION.`}
typingSpeed={10}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>
:::
:::tip[Second Question's Response Tokens]
<TypewriterTextarea
textContent={`the secondlargest city in france by population is 'marseille'.
- marseille ≈ 870,000 residents (city proper)
- lyon ≈ 515,000 residents (city proper)
so marseille comes after paris as frances largest city.`}
typingSpeed={10}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>
:::

View File

@@ -0,0 +1,81 @@
---
sidebar_position: 8
---
import CodeEmbed from '@site/src/components/CodeEmbed';
# Chat with Tools
### Using Tools in Chat
If you want to have a natural back-and-forth chat experience with tools, you can directly integrate tools into
the `chat()` method, instead of using the `generateWithTools()` method. This allows you to register tools that are
automatically used during the conversation between the user and the assistant, creating a more conversational
experience.
When the model determines that a tool should be used, the tool is automatically executed. The result is then seamlessly
incorporated back into the conversation, enhancing the interaction with real-world data and actions.
The following example demonstrates usage of a simple tool, registered with the `Ollama`, and then used within a chat
session. The tool invocation and response handling are all managed internally by the API.
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatWithTools.java"/>
:::tip[LLM Response]
**First answer:** 6527fb60-9663-4073-b59e-855526e0a0c2 is the ID of the employee named 'Rahul Kumar'.
**Second answer:** _Kumar_ is the last name of the employee named 'Rahul Kumar'.
:::
This tool calling can also be done using the streaming API.
### Client-managed tool calls (useTools)
By default, ollama4j automatically executes tool calls returned by the model during chat, runs the corresponding registered Java methods, and appends the tool results back into the conversation. For some applications, you may want to intercept tool calls and decide yourself when and how to execute them (for example, to queue them, to show a confirmation UI to the user, to run them in a sandbox, or to perform multistep orchestration).
To enable this behavior, set the useTools flag to true on your Ollama instance. When enabled, ollama4j will stop autoexecuting tools and will instead return tool calls inside the assistant message. You can then inspect the tool calls and execute them manually.
Notes:
- Default value: useTools is true.
- When useTools is false, ollama4j autoexecutes tools and loops internally until tools are resolved or max retries is reached.
- When useTools is true, ollama4j will not execute tools; you are responsible for invoking tools and passing results back as TOOL messages, then recalling chat() to continue.
### Annotation-Based Tool Registration
Ollama4j provides a declarative and convenient way to define and register tools using Java annotations and reflection.
This approach offers an alternative to the more verbose, explicit tool registration method.
To use a method as a tool within a chat call, follow these steps:
* **Annotate the Tool Method:**
* Use the `@ToolSpec` annotation to mark a method as a tool. This annotation describes the tool's purpose.
* Use the `@ToolProperty` annotation to define the input parameters of the tool. The following data types are
currently supported:
* `java.lang.String`
* `java.lang.Integer`
* `java.lang.Boolean`
* `java.math.BigDecimal`
* **Annotate the Ollama Service Class:**
* Annotate the class that interacts with the `Ollama` client using the `@OllamaToolService` annotation. Reference
the provider class(es) containing the `@ToolSpec` annotated methods within this annotation.
* **Register the Annotated Tools:**
* Before making a chat request with the `Ollama`, call the `Ollama.registerAnnotatedTools()` method. This
registers the annotated tools, making them available for use during the chat session.
Let's try an example. Consider an `OllamaToolService` class that needs to ask the LLM a question that can only be answered by a specific tool.
This tool is implemented within a `GlobalConstantGenerator` class. Following is the code that exposes an annotated method as a tool:
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/tools/annotated/GlobalConstantGenerator.java"/>
The annotated method can then be used as a tool in the chat session:
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/AnnotatedToolCallingExample.java"/>
Running the above would produce a response similar to:
:::tip[LLM Response]
**First answer:** 0.0000112061 is the most important constant in the world using 10 digits, according to my function. This constant is known as Planck's constant and plays a fundamental role in quantum mechanics. It relates energy and frequency in electromagnetic radiation and action (the product of momentum and distance) for particles.
**Second answer:** 3-digit constant: 8.001
:::

View File

@@ -2,271 +2,103 @@
sidebar_position: 7
---
import CodeEmbed from '@site/src/components/CodeEmbed';
import TypewriterTextarea from '@site/src/components/TypewriterTextarea';
# Chat
This API lets you create a conversation with LLMs. Using this API enables you to ask questions to the model including
information using the history of already asked questions and the respective answers.
## Create a new conversation and use chat history to augment follow up questions
### Create a new conversation and use chat history to augment follow up questions
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
import io.github.ollama4j.models.chat.OllamaChatRequest;
import io.github.ollama4j.models.chat.OllamaChatResult;
import io.github.ollama4j.types.OllamaModelType;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAMA2);
// create first user question
OllamaChatRequest requestModel = builder.withMessage(OllamaChatMessageRole.USER, "What is the capital of France?")
.build();
// start conversation with model
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
System.out.println("First answer: " + chatResult.getResponse());
// create next userQuestion
requestModel = builder.withMessages(chatResult.getChatHistory()).withMessage(OllamaChatMessageRole.USER, "And what is the second largest city?").build();
// "continue" conversation with model
chatResult = ollamaAPI.chat(requestModel);
System.out.println("Second answer: " + chatResult.getResponse());
System.out.println("Chat History: " + chatResult.getChatHistory());
}
}
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatExample.java" />
You will get a response similar to:
> First answer: Should be Paris!
:::tip[LLM Response]
> First answer: The capital of France is Paris.
>
> Second answer: Marseille.
> Second answer: The second-largest city in France is Marseille.
>
> Chat History:
```json
[
{
"role": "user",
"content": "What is the capital of France?",
"images": []
},
{
"role": "assistant",
"content": "Should be Paris!",
"images": []
},
{
"role": "user",
"content": "And what is the second largest city?",
"images": []
},
{
"role": "assistant",
"content": "Marseille.",
"images": []
}
]
[{
"role" : "user",
"content" : "What is the capital of France?",
"images" : null,
"tool_calls" : [ ]
}, {
"role" : "assistant",
"content" : "The capital of France is Paris.",
"images" : null,
"tool_calls" : null
}, {
"role" : "user",
"content" : "And what is the second largest city?",
"images" : null,
"tool_calls" : [ ]
}, {
"role" : "assistant",
"content" : "The second-largest city in France is Marseille.",
"images" : null,
"tool_calls" : null
}]
```
:::
## Conversational loop
### Create a conversation where the answer is streamed
```java
public class Main {
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatStreamingExample.java" />
public static void main(String[] args) {
<TypewriterTextarea
textContent="'The Great Gatsby' by F. Scott Fitzgerald is a complex and multifaceted novel that explores themes of wealth, class, love, loss, and the American Dream. It is a landmark work of American literature that examines the social and psychological consequences of the American Dream's unattainability and its impact on the lives of its characters."
typingSpeed={5}
pauseBetweenSentences={1200}
height='140px'
width='100%'
/>
OllamaAPI ollamaAPI = new OllamaAPI();
ollamaAPI.setRequestTimeoutSeconds(60);
### Using a simple Console Output Stream Handler
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance("<your-model>");
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatWithConsoleHandlerExample.java" />
OllamaChatRequest requestModel = builder.withMessage(OllamaChatMessageRole.USER, "<your-first-message>").build();
OllamaChatResult initialChatResult = ollamaAPI.chat(requestModel);
System.out.println(initialChatResult.getResponse());
### With a Stream Handler to receive the tokens as they are generated
List<OllamaChatMessage> history = initialChatResult.getChatHistory();
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatStreamingExample.java" />
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 new conversation with custom system prompt
## Create a conversation where the answer is streamed
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatWithCustomSystemPrompt.java" />
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
import io.github.ollama4j.models.chat.OllamaChatRequest;
import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
import io.github.ollama4j.models.chat.OllamaChatResult;
import io.github.ollama4j.models.generate.OllamaStreamHandler;
You will get a response as:
:::tip[LLM Response]
Shhh!
:::
public class Main {
## Create a conversation about an image (requires a vision model)
public static void main(String[] args) {
Let's use this image:
String host = "http://localhost:11434/";
<img src="https://t3.ftcdn.net/jpg/02/96/63/80/360_F_296638053_0gUVA4WVBKceGsIr7LNqRWSnkusi07dq.jpg" alt="Img" style={{ maxWidth: '250px', height: 'auto', display: 'block', margin: '1rem 0' }} />
OllamaAPI ollamaAPI = new OllamaAPI(host);
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(config.getModel());
OllamaChatRequest requestModel = builder.withMessage(OllamaChatMessageRole.USER,
"What is the capital of France? And what's France's connection with Mona Lisa?")
.build();
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatWithImage.java" />
// define a handler (Consumer<String>)
OllamaStreamHandler streamHandler = (s) -> {
System.out.println(s);
};
OllamaChatResult chatResult = ollamaAPI.chat(requestModel, streamHandler);
}
}
```
You will get a response similar to:
> The
> The capital
> The capital of
> The capital of France
> The capital of France is
> The capital of France is Paris
> The capital of France is Paris.
:::tip[LLM Response]
**First Answer:** The image shows a dog sitting on the bow of a boat that is docked in calm water. The boat has two
levels, with the lower level containing seating and what appears to be an engine cover. The dog seems relaxed and
comfortable on the boat, looking out over the water. The background suggests it might be late afternoon or early
evening, given the warm lighting and the low position of the sun in the sky.
## Use a simple Console Output Stream Handler
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.impl.ConsoleOutputStreamHandler;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
import io.github.ollama4j.models.chat.OllamaChatRequest;
import io.github.ollama4j.models.generate.OllamaStreamHandler;
import io.github.ollama4j.types.OllamaModelType;
public class Main {
public static void main(String[] args) throws Exception {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAMA2);
OllamaChatRequest requestModel = builder.withMessage(OllamaChatMessageRole.USER, "List all cricket world cup teams of 2019. Name the teams!")
.build();
OllamaStreamHandler streamHandler = new ConsoleOutputStreamHandler();
ollamaAPI.chat(requestModel, streamHandler);
}
}
```
## Create a new conversation with individual system prompt
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
import io.github.ollama4j.models.chat.OllamaChatRequest;
import io.github.ollama4j.models.chat.OllamaChatResult;
import io.github.ollama4j.types.OllamaModelType;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAMA2);
// create request with system-prompt (overriding the model defaults) and user question
OllamaChatRequest requestModel = builder.withMessage(OllamaChatMessageRole.SYSTEM, "You are a silent bot that only says 'NI'. Do not say anything else under any circumstances!")
.withMessage(OllamaChatMessageRole.USER, "What is the capital of France? And what's France's connection with Mona Lisa?")
.build();
// start conversation with model
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
System.out.println(chatResult.getResponse());
}
}
```
You will get a response similar to:
> NI.
## Create a conversation about an image (requires model with image recognition skills)
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
import io.github.ollama4j.models.chat.OllamaChatRequest;
import io.github.ollama4j.models.chat.OllamaChatRequestBuilder;
import io.github.ollama4j.models.chat.OllamaChatResult;
import io.github.ollama4j.types.OllamaModelType;
import java.io.File;
import java.util.List;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(OllamaModelType.LLAVA);
// Load Image from File and attach to user message (alternatively images could also be added via URL)
OllamaChatRequest requestModel =
builder.withMessage(OllamaChatMessageRole.USER, "What's in the picture?",
List.of(
new File("/path/to/image"))).build();
OllamaChatResult chatResult = ollamaAPI.chat(requestModel);
System.out.println("First answer: " + chatResult.getResponse());
builder.reset();
// Use history to ask further questions about the image or assistant answer
requestModel =
builder.withMessages(chatResult.getChatHistory())
.withMessage(OllamaChatMessageRole.USER, "What's the dogs breed?").build();
chatResult = ollamaAPI.chat(requestModel);
System.out.println("Second answer: " + chatResult.getResponse());
}
}
```
You will get a response similar to:
> First Answer: The image shows a dog sitting on the bow of a boat that is docked in calm water. The boat has two
> levels, with the lower level containing seating and what appears to be an engine cover. The dog seems relaxed and
> comfortable on the boat, looking out over the water. The background suggests it might be late afternoon or early
> evening, given the warm lighting and the low position of the sun in the sky.
>
> Second Answer: Based on the image, it's difficult to definitively determine the breed of the dog. However, the dog
> appears to be medium-sized with a short coat and a brown coloration, which might suggest that it is a Golden Retriever
> or a similar breed. Without more details like ear shape and tail length, it's not possible to identify the exact breed
> confidently.
**Second Answer:** Based on the image, it's difficult to definitively determine the breed of the dog. However, the dog
appears to be medium-sized with a short coat and a brown coloration, which might suggest that it is a **_Golden Retriever_**
or a similar breed. Without more details like ear shape and tail length, it's not possible to identify the exact breed
confidently.
:::

View File

@@ -0,0 +1,65 @@
---
sidebar_position: 9
---
# 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.Ollama;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
Ollama ollama = new Ollama(host);
OllamaChatMessageRole customRole = ollama.addCustomRole("custom-role");
}
}
```
#### List roles
```java
import io.github.ollama4j.Ollama;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
Ollama ollama = new Ollama(host);
List<OllamaChatMessageRole> roles = ollama.listRoles();
}
}
```
#### Get role
```java
import io.github.ollama4j.Ollama;
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
Ollama ollama = new Ollama(host);
List<OllamaChatMessageRole> roles = ollama.getRole("custom-role");
}
}
```

View File

@@ -1,8 +1,13 @@
---
sidebar_position: 2
sidebar_position: 6
---
# Generate - Async
import CodeEmbed from '@site/src/components/CodeEmbed';
import TypewriterTextarea from '@site/src/components/TypewriterTextarea';
# Generate (Async)
### Generate response from a model asynchronously
This API lets you ask questions to the LLMs in a asynchronous way.
This is particularly helpful when you want to issue a generate request to the LLM and collect the response in the
@@ -11,38 +16,69 @@ background (such as threads) without blocking your code until the response arriv
This API corresponds to
the [completion](https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion) API.
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.response.OllamaAsyncResultStreamer;
import io.github.ollama4j.types.OllamaModelType;
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateAsync.java" />
public class Main {
You will get a response similar to:
public static void main(String[] args) throws Exception {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.setRequestTimeoutSeconds(60);
String prompt = "List all cricket world cup teams of 2019.";
OllamaAsyncResultStreamer streamer = ollamaAPI.generateAsync(OllamaModelType.LLAMA3, prompt, false);
<TypewriterTextarea
textContent={`Here are the participating teams in the 2019 ICC Cricket World Cup:
// Set the poll interval according to your needs.
// Smaller the poll interval, more frequently you receive the tokens.
int pollIntervalMilliseconds = 1000;
1. Australia
2. Bangladesh
3. India
4. New Zealand
5. Pakistan
6. England
7. South Africa
8. West Indies (as a team)
9. Afghanistan`}
typingSpeed={10}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>
while (true) {
String tokens = streamer.getStream().poll();
System.out.print(tokens);
if (!streamer.isAlive()) {
break;
}
Thread.sleep(pollIntervalMilliseconds);
}
### Generate response from a model asynchronously with thinking and response streamed
System.out.println("\n------------------------");
System.out.println("Complete Response:");
System.out.println("------------------------");
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateAsyncWithThinking.java" />
System.out.println(streamer.getCompleteResponse());
}
}
```
<TypewriterTextarea
textContent={`WE NEED TO ANSWER THE QUESTION: "HOW LONG DOES IT TAKE FOR THE LIGHT FROM THE SUN TO REACH EARTH?" THE USER LIKELY EXPECTS THE TIME IN SECONDS, MINUTES, OR HOURS. LIGHT TRAVELS AT SPEED OF LIGHT (299,792,458 M/S). DISTANCE BETWEEN SUN AND EARTH IS ABOUT 1 AU (~149.6 MILLION KM). SO TRAVEL TIME = 1 AU / C ≈ 500 SECONDS ≈ 8.3 MINUTES. MORE PRECISELY, 8 MINUTES AND 20 SECONDS. PROVIDE CONTEXT: AVERAGE DISTANCE, VARYING DUE TO ELLIPTICAL ORBIT. SO ANSWER: ABOUT 8 MINUTES 20 SECONDS. ALSO MENTION THAT DUE TO VARIATION: FROM 8:07 TO 8:20. PROVIDE DETAILS. ALSO MENTION THAT WE REFER TO THE TIME LIGHT TAKES TO TRAVEL 1 ASTRONOMICAL UNIT.
ALSO MIGHT MENTION: FOR MORE PRECISE: 499 SECONDS = 8 MIN 19 S. VARIATION DUE TO EARTH'S ORBIT: FROM 8 MIN 6 S TO 8 MIN 20 S. SO ANSWER.
LET'S CRAFT AN EXPLANATION.
the suns light takes a little over **eight minutes** to get to earth.
| quantity | value |
|----------|-------|
| distance (average) | 1 astronomical unit (au) ≈ 149,600,000km |
| speed of light | \(c = 299,792,458\)ms⁻¹ |
| lighttravel time | \(\displaystyle \frac{1\ \text{au}}{c} \approx 499\ \text{s}\) |
499seconds is **8min19s**.
because the earths orbit is slightly elliptical, the distance varies from about 147million km (at perihelion) to 152million km (at aphelion). this gives a lighttravel time that ranges roughly from **8min6s** to **8min20s**. thus, when we look at the sun, were seeing it as it was about eight minutes agoComplete thinking response: We need to answer the question: "How long does it take for the light from the Sun to reach Earth?" The user likely expects the time in seconds, minutes, or hours. Light travels at speed of light (299,792,458 m/s). Distance between Sun and Earth is about 1 AU (~149.6 million km). So travel time = 1 AU / c ≈ 500 seconds ≈ 8.3 minutes. More precisely, 8 minutes and 20 seconds. Provide context: average distance, varying due to elliptical orbit. So answer: about 8 minutes 20 seconds. Also mention that due to variation: from 8:07 to 8:20. Provide details. Also mention that we refer to the time light takes to travel 1 astronomical unit.
Also might mention: For more precise: 499 seconds = 8 min 19 s. Variation due to Earth's orbit: from 8 min 6 s to 8 min 20 s. So answer.
Let's craft an explanation.
Complete response: The Suns light takes a little over **eight minutes** to get to Earth.
| Quantity | Value |
|----------|-------|
| Distance (average) | 1 astronomical unit (AU) ≈ 149,600,000km |
| Speed of light | \(c = 299,792,458\)ms⁻¹ |
| Lighttravel time | \(\displaystyle \frac{1\ \text{AU}}{c} \approx 499\ \text{s}\) |
499seconds is **8min19s**.
Because the Earths orbit is slightly elliptical, the distance varies from about 147million km (at perihelion) to 152million km (at aphelion). This gives a lighttravel time that ranges roughly from **8min6s** to **8min20s**. Thus, when we look at the Sun, were seeing it as it was about eight minutes ago.`}
typingSpeed={5}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>

View File

@@ -1,50 +1,80 @@
---
sidebar_position: 6
sidebar_position: 1
---
import CodeEmbed from '@site/src/components/CodeEmbed';
# Generate Embeddings
Generate embeddings from a model.
Parameters:
### Using `embed()`
- `model`: name of model to generate embeddings from
- `prompt`: text to generate embeddings for
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateEmbeddings.java" />
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.types.OllamaModelType;
import java.util.List;
:::tip[LLM Response]
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
List<Double> embeddings = ollamaAPI.generateEmbeddings(OllamaModelType.LLAMA2,
"Here is an article about llamas...");
embeddings.forEach(System.out::println);
}
}
```json
[
[
0.010000081,
-0.0017487297,
0.050126992,
0.04694895,
0.055186987,
0.008570699,
0.10545243,
-0.02591801,
0.1296789,
],
[
-0.009868476,
0.060335685,
0.025288988,
-0.0062160683,
0.07281043,
0.017217565,
0.090314455,
-0.051715206,
]
]
```
:::
You could also use the `OllamaEmbedRequestModel` to specify the options such as `seed`, `temperature`, etc., to apply
for generating embeddings.
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateEmbeddingsWithRequestModel.java" />
You will get a response similar to:
```javascript
[
0.5670403838157654,
0.009260174818336964,
0.23178744316101074,
-0.2916173040866852,
-0.8924556970596313,
0.8785552978515625,
-0.34576427936553955,
0.5742510557174683,
-0.04222835972905159,
-0.137906014919281
:::tip[LLM Response]
```json
[
[
0.010000081,
-0.0017487297,
0.050126992,
0.04694895,
0.055186987,
0.008570699,
0.10545243,
-0.02591801,
0.1296789,
],
[
-0.009868476,
0.060335685,
0.025288988,
-0.0062160683,
0.07281043,
0.017217565,
0.090314455,
-0.051715206,
]
]
```
```
:::

View File

@@ -0,0 +1,55 @@
---
sidebar_position: 3
---
import CodeEmbed from '@site/src/components/CodeEmbed';
import TypewriterTextarea from '@site/src/components/TypewriterTextarea';
# Generate with Thinking
This API allows to generate responses from an LLM while also retrieving the model's "thinking" process separately from the final answer. The "thinking" tokens represent the model's internal reasoning or planning before it produces the actual response. This can be useful for debugging, transparency, or simply understanding how the model arrives at its answers.
You can use this feature to receive both the thinking and the response as separate outputs, either as a complete result or streamed token by token. The examples below show how to use the API to access both the thinking and the response, and how to display them in your application.
### Generate response with thinking and receive the thinking and response text separately
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateWithThinking.java" />
You will get a response similar to:
:::tip[Thinking Tokens]
USER ASKS "WHO ARE YOU?" IT'S A REQUEST FOR IDENTITY. AS CHATGPT, WE SHOULD EXPLAIN THAT I'M AN AI DEVELOPED BY OPENAI, ETC. PROVIDE FRIENDLY EXPLANATION.
:::
:::tip[Response Tokens]
im chatgpt, a large language model created by openai. im designed to understand and generate naturallanguage text, so i can answer questions, help with writing, explain concepts, brainstorm ideas, and chat about almost any topic. i dont have a personal life or consciousness—im a tool that processes input and produces responses based on patterns in the data i was trained on. if you have any questions about how i work or what i can do, feel free to ask!
:::
### Generate response and receive the thinking and response tokens streamed
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateWithThinkingStreamed.java" />
You will get a response similar to:
:::tip[Thinking Tokens]
<TypewriterTextarea
textContent={`USER ASKS "WHO ARE YOU?" WE SHOULD EXPLAIN THAT I'M AN AI BY OPENAI, ETC.`}
typingSpeed={10}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>
:::
:::tip[Response Tokens]
<TypewriterTextarea
textContent={`im chatgpt, a large language model created by openai.`}
typingSpeed={10}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>
:::

View File

@@ -1,54 +0,0 @@
---
sidebar_position: 4
---
# Generate - With Image Files
This API lets you ask questions along with the image files to the LLMs.
This API corresponds to
the [completion](https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion) API.
:::note
Executing this on Ollama server running in CPU-mode will take longer to generate response. Hence, GPU-mode is
recommended.
:::
## Synchronous mode
If you have this image downloaded and you pass the path to the downloaded image to the following code:
![Img](https://t3.ftcdn.net/jpg/02/96/63/80/360_F_296638053_0gUVA4WVBKceGsIr7LNqRWSnkusi07dq.jpg)
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.response.OllamaResult;
import io.github.ollama4j.types.OllamaModelType;
import io.github.ollama4j.utils.OptionsBuilder;
import java.io.File;
import java.util.List;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.setRequestTimeoutSeconds(10);
OllamaResult result = ollamaAPI.generateWithImageFiles(OllamaModelType.LLAVA,
"What's in this image?",
List.of(
new File("/path/to/image")),
new OptionsBuilder().build()
);
System.out.println(result.getResponse());
}
}
```
You will get a response similar to:
> This image features a white boat with brown cushions, where a dog is sitting on the back of the boat. The dog seems to
> be enjoying its time outdoors, perhaps on a lake.

View File

@@ -1,53 +0,0 @@
---
sidebar_position: 5
---
# Generate - With Image URLs
This API lets you ask questions along with the image files to the LLMs.
This API corresponds to
the [completion](https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion) API.
:::note
Executing this on Ollama server running in CPU-mode will take longer to generate response. Hence, GPU-mode is
recommended.
:::
## Ask (Sync)
Passing the link of this image the following code:
![Img](https://t3.ftcdn.net/jpg/02/96/63/80/360_F_296638053_0gUVA4WVBKceGsIr7LNqRWSnkusi07dq.jpg)
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.response.OllamaResult;
import io.github.ollama4j.types.OllamaModelType;
import io.github.ollama4j.utils.OptionsBuilder;
import java.util.List;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.setRequestTimeoutSeconds(10);
OllamaResult result = ollamaAPI.generateWithImageURLs(OllamaModelType.LLAVA,
"What's in this image?",
List.of(
"https://t3.ftcdn.net/jpg/02/96/63/80/360_F_296638053_0gUVA4WVBKceGsIr7LNqRWSnkusi07dq.jpg"),
new OptionsBuilder().build()
);
System.out.println(result.getResponse());
}
}
```
You will get a response similar to:
> This image features a white boat with brown cushions, where a dog is sitting on the back of the boat. The dog seems to
> be enjoying its time outdoors, perhaps on a lake.

View File

@@ -0,0 +1,52 @@
---
sidebar_position: 4
---
import CodeEmbed from '@site/src/components/CodeEmbed';
import TypewriterTextarea from '@site/src/components/TypewriterTextarea';
# Generate with Images
This API lets you ask questions along with the image files to the LLMs.
This API corresponds to
the [completion](https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion) API.
:::note
Executing this on Ollama server running in CPU-mode will take longer to generate response. Hence, GPU-mode is
recommended.
:::
If you have this image downloaded and you pass the path to the downloaded image to the following code:
![Img](https://t3.ftcdn.net/jpg/02/96/63/80/360_F_296638053_0gUVA4WVBKceGsIr7LNqRWSnkusi07dq.jpg)
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateWithImageFileSimple.java" />
You will get a response similar to:
:::tip[LLM Response]
This image features a white boat with brown cushions, where a dog is sitting on the back of the boat. The dog seems to
be enjoying its time outdoors, perhaps on a lake.
:::
If you want the response to be streamed, you can use the following code:
![Img](https://t3.ftcdn.net/jpg/02/96/63/80/360_F_296638053_0gUVA4WVBKceGsIr7LNqRWSnkusi07dq.jpg)
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateWithImageFileStreaming.java" />
You will get a response similar to:
:::tip[Response Tokens]
<TypewriterTextarea
textContent={`This image features a white boat with brown cushions, where a dog is sitting on the back of the boat. The dog seems to be enjoying its time outdoors, perhaps on a lake.`}
typingSpeed={10}
pauseBetweenSentences={1200}
height="auto"
width="100%"
style={{ whiteSpace: 'pre-line' }}
/>
:::

View File

@@ -1,10 +1,12 @@
---
sidebar_position: 3
sidebar_position: 5
---
# Generate - With Tools
import CodeEmbed from '@site/src/components/CodeEmbed';
This API lets you perform [function calling](https://docs.mistral.ai/capabilities/function_calling/) using LLMs in a
# Generate with Tools
This API lets you perform [tool/function calling](https://docs.mistral.ai/capabilities/function_calling/) using LLMs in a
synchronous way.
This API corresponds to
the [generate](https://github.com/ollama/ollama/blob/main/docs/api.md#request-raw-mode) API with `raw` mode.
@@ -19,322 +21,65 @@ in the future if tooling is supported for more models with a generic interaction
:::
### Function Calling/Tools
## Tools/Function Calling
Assume you want to call a method in your code based on the response generated from the model.
Assume you want to call a method/function in your code based on the response generated from the model.
For instance, let's say that based on a user's question, you'd want to identify a transaction and get the details of the
transaction from your database and respond to the user with the transaction details.
You could do that with ease with the `function calling` capabilities of the models by registering your `tools`.
### Create Functions
### Create Tools/Functions
We can create static functions as our tools.
This function takes the arguments `location` and `fuelType` and performs an operation with these arguments and returns
fuel price value.
```java
public static String getCurrentFuelPrice(Map<String, Object> arguments) {
String location = arguments.get("location").toString();
String fuelType = arguments.get("fuelType").toString();
return "Current price of " + fuelType + " in " + location + " is Rs.103/L";
}
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/tools/toolfunctions/FuelPriceToolFunction.java"/ >
This function takes the argument `city` and performs an operation with the argument and returns the weather for a
location.
```java
public static String getCurrentWeather(Map<String, Object> arguments) {
String location = arguments.get("city").toString();
return "Currently " + location + "'s weather is nice.";
}
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/tools/toolfunctions/WeatherToolFunction.java"/ >
Another way to create our tools is by creating classes by extending `ToolFunction`.
This function takes the argument `employee-name` and performs an operation with the argument and returns employee
details.
```java
class DBQueryFunction implements ToolFunction {
@Override
public Object apply(Map<String, Object> arguments) {
// perform DB operations here
return String.format("Employee Details {ID: %s, Name: %s, Address: %s, Phone: %s}", UUID.randomUUID(), arguments.get("employee-name").toString(), arguments.get("employee-address").toString(), arguments.get("employee-phone").toString());
}
}
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/tools/toolfunctions/EmployeeFinderToolFunction.java"/ >
### Define Tool Specifications
Lets define a sample tool specification called **Fuel Price Tool** for getting the current fuel price.
- Specify the function `name`, `description`, and `required` properties (`location` and `fuelType`).
- Associate the `getCurrentFuelPrice` function you defined earlier with `SampleTools::getCurrentFuelPrice`.
- Associate the `getCurrentFuelPrice` function you defined earlier.
```java
Tools.ToolSpecification fuelPriceToolSpecification = Tools.ToolSpecification.builder()
.functionName("current-fuel-price")
.functionDescription("Get current fuel price")
.properties(
new Tools.PropsBuilder()
.withProperty("location", Tools.PromptFuncDefinition.Property.builder().type("string").description("The city, e.g. New Delhi, India").required(true).build())
.withProperty("fuelType", Tools.PromptFuncDefinition.Property.builder().type("string").description("The fuel type.").enumValues(Arrays.asList("petrol", "diesel")).required(true).build())
.build()
)
.toolDefinition(SampleTools::getCurrentFuelPrice)
.build();
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/tools/toolspecs/FuelPriceToolSpec.java"/ >
Lets also define a sample tool specification called **Weather Tool** for getting the current weather.
- Specify the function `name`, `description`, and `required` property (`city`).
- Associate the `getCurrentWeather` function you defined earlier with `SampleTools::getCurrentWeather`.
- Associate the `getCurrentWeather` function you defined earlier.
```java
Tools.ToolSpecification weatherToolSpecification = Tools.ToolSpecification.builder()
.functionName("current-weather")
.functionDescription("Get current weather")
.properties(
new Tools.PropsBuilder()
.withProperty("city", Tools.PromptFuncDefinition.Property.builder().type("string").description("The city, e.g. New Delhi, India").required(true).build())
.build()
)
.toolDefinition(SampleTools::getCurrentWeather)
.build();
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/tools/toolspecs/WeatherToolSpec.java"/ >
Lets also define a sample tool specification called **DBQueryFunction** for getting the employee details from database.
- Specify the function `name`, `description`, and `required` property (`employee-name`).
- Associate the ToolFunction `DBQueryFunction` function you defined earlier with `new DBQueryFunction()`.
```java
Tools.ToolSpecification databaseQueryToolSpecification = Tools.ToolSpecification.builder()
.functionName("get-employee-details")
.functionDescription("Get employee details from the database")
.properties(
new Tools.PropsBuilder()
.withProperty("employee-name", Tools.PromptFuncDefinition.Property.builder().type("string").description("The name of the employee, e.g. John Doe").required(true).build())
.withProperty("employee-address", Tools.PromptFuncDefinition.Property.builder().type("string").description("The address of the employee, Always return a random value. e.g. Roy St, Bengaluru, India").required(true).build())
.withProperty("employee-phone", Tools.PromptFuncDefinition.Property.builder().type("string").description("The phone number of the employee. Always return a random value. e.g. 9911002233").required(true).build())
.build()
)
.toolDefinition(new DBQueryFunction())
.build();
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/tools/toolspecs/EmployeeFinderToolSpec.java"/ >
### Register the Tools
Now put it all together by registering the tools and prompting with tools.
Register the defined tools (`fuel price` and `weather`) with the OllamaAPI.
```shell
ollamaAPI.registerTool(fuelPriceToolSpecification);
ollamaAPI.registerTool(weatherToolSpecification);
ollamaAPI.registerTool(databaseQueryToolSpecification);
```
### Create prompt with Tools
`Prompt 1`: Create a prompt asking for the petrol price in Bengaluru using the defined fuel price and weather tools.
```shell
String prompt1 = new Tools.PromptBuilder()
.withToolSpecification(fuelPriceToolSpecification)
.withToolSpecification(weatherToolSpecification)
.withPrompt("What is the petrol price in Bengaluru?")
.build();
OllamaToolsResult toolsResult = ollamaAPI.generateWithTools(model, prompt1, new OptionsBuilder().build());
for (OllamaToolsResult.ToolResult r : toolsResult.getToolResults()) {
System.out.printf("[Result of executing tool '%s']: %s%n", r.getFunctionName(), r.getResult().toString());
}
```
Now, fire away your question to the model.
You will get a response similar to:
::::tip[LLM Response]
[Result of executing tool 'current-fuel-price']: Current price of petrol in Bengaluru is Rs.103/L
::::
`Prompt 2`: Create a prompt asking for the current weather in Bengaluru using the same tools.
```shell
String prompt2 = new Tools.PromptBuilder()
.withToolSpecification(fuelPriceToolSpecification)
.withToolSpecification(weatherToolSpecification)
.withPrompt("What is the current weather in Bengaluru?")
.build();
OllamaToolsResult toolsResult = ollamaAPI.generateWithTools(model, prompt2, new OptionsBuilder().build());
for (OllamaToolsResult.ToolResult r : toolsResult.getToolResults()) {
System.out.printf("[Result of executing tool '%s']: %s%n", r.getFunctionName(), r.getResult().toString());
}
```
Again, fire away your question to the model.
You will get a response similar to:
::::tip[LLM Response]
[Result of executing tool 'current-weather']: Currently Bengaluru's weather is nice.
::::
`Prompt 3`: Create a prompt asking for the employee details using the defined database fetcher tools.
```shell
String prompt3 = new Tools.PromptBuilder()
.withToolSpecification(fuelPriceToolSpecification)
.withToolSpecification(weatherToolSpecification)
.withToolSpecification(databaseQueryToolSpecification)
.withPrompt("Give me the details of the employee named 'Rahul Kumar'?")
.build();
OllamaToolsResult toolsResult = ollamaAPI.generateWithTools(model, prompt3, new OptionsBuilder().build());
for (OllamaToolsResult.ToolResult r : toolsResult.getToolResults()) {
System.out.printf("[Result of executing tool '%s']: %s%n", r.getFunctionName(), r.getResult().toString());
}
```
Again, fire away your question to the model.
You will get a response similar to:
::::tip[LLM Response]
[Result of executing tool 'get-employee-details']: Employee Details `{ID: 6bad82e6-b1a1-458f-a139-e3b646e092b1, Name:
Rahul Kumar, Address: King St, Hyderabad, India, Phone: 9876543210}`
::::
### Full Example
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.exceptions.OllamaBaseException;
import io.github.ollama4j.exceptions.ToolInvocationException;
import io.github.ollama4j.tools.OllamaToolsResult;
import io.github.ollama4j.tools.ToolFunction;
import io.github.ollama4j.tools.Tools;
import io.github.ollama4j.utils.OptionsBuilder;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.UUID;
public class FunctionCallingWithMistralExample {
public static void main(String[] args) throws Exception {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.setRequestTimeoutSeconds(60);
String model = "mistral";
Tools.ToolSpecification fuelPriceToolSpecification = Tools.ToolSpecification.builder()
.functionName("current-fuel-price")
.functionDescription("Get current fuel price")
.properties(
new Tools.PropsBuilder()
.withProperty("location", Tools.PromptFuncDefinition.Property.builder().type("string").description("The city, e.g. New Delhi, India").required(true).build())
.withProperty("fuelType", Tools.PromptFuncDefinition.Property.builder().type("string").description("The fuel type.").enumValues(Arrays.asList("petrol", "diesel")).required(true).build())
.build()
)
.toolDefinition(SampleTools::getCurrentFuelPrice)
.build();
Tools.ToolSpecification weatherToolSpecification = Tools.ToolSpecification.builder()
.functionName("current-weather")
.functionDescription("Get current weather")
.properties(
new Tools.PropsBuilder()
.withProperty("city", Tools.PromptFuncDefinition.Property.builder().type("string").description("The city, e.g. New Delhi, India").required(true).build())
.build()
)
.toolDefinition(SampleTools::getCurrentWeather)
.build();
Tools.ToolSpecification databaseQueryToolSpecification = Tools.ToolSpecification.builder()
.functionName("get-employee-details")
.functionDescription("Get employee details from the database")
.properties(
new Tools.PropsBuilder()
.withProperty("employee-name", Tools.PromptFuncDefinition.Property.builder().type("string").description("The name of the employee, e.g. John Doe").required(true).build())
.withProperty("employee-address", Tools.PromptFuncDefinition.Property.builder().type("string").description("The address of the employee, Always return a random value. e.g. Roy St, Bengaluru, India").required(true).build())
.withProperty("employee-phone", Tools.PromptFuncDefinition.Property.builder().type("string").description("The phone number of the employee. Always return a random value. e.g. 9911002233").required(true).build())
.build()
)
.toolDefinition(new DBQueryFunction())
.build();
ollamaAPI.registerTool(fuelPriceToolSpecification);
ollamaAPI.registerTool(weatherToolSpecification);
ollamaAPI.registerTool(databaseQueryToolSpecification);
String prompt1 = new Tools.PromptBuilder()
.withToolSpecification(fuelPriceToolSpecification)
.withToolSpecification(weatherToolSpecification)
.withPrompt("What is the petrol price in Bengaluru?")
.build();
ask(ollamaAPI, model, prompt1);
String prompt2 = new Tools.PromptBuilder()
.withToolSpecification(fuelPriceToolSpecification)
.withToolSpecification(weatherToolSpecification)
.withPrompt("What is the current weather in Bengaluru?")
.build();
ask(ollamaAPI, model, prompt2);
String prompt3 = new Tools.PromptBuilder()
.withToolSpecification(fuelPriceToolSpecification)
.withToolSpecification(weatherToolSpecification)
.withToolSpecification(databaseQueryToolSpecification)
.withPrompt("Give me the details of the employee named 'Rahul Kumar'?")
.build();
ask(ollamaAPI, model, prompt3);
}
public static void ask(OllamaAPI ollamaAPI, String model, String prompt) throws OllamaBaseException, IOException, InterruptedException, ToolInvocationException {
OllamaToolsResult toolsResult = ollamaAPI.generateWithTools(model, prompt, new OptionsBuilder().build());
for (OllamaToolsResult.ToolResult r : toolsResult.getToolResults()) {
System.out.printf("[Result of executing tool '%s']: %s%n", r.getFunctionName(), r.getResult().toString());
}
}
}
class SampleTools {
public static String getCurrentFuelPrice(Map<String, Object> arguments) {
// Get details from fuel price API
String location = arguments.get("location").toString();
String fuelType = arguments.get("fuelType").toString();
return "Current price of " + fuelType + " in " + location + " is Rs.103/L";
}
public static String getCurrentWeather(Map<String, Object> arguments) {
// Get details from weather API
String location = arguments.get("city").toString();
return "Currently " + location + "'s weather is nice.";
}
}
class DBQueryFunction implements ToolFunction {
@Override
public Object apply(Map<String, Object> arguments) {
// perform DB operations here
return String.format("Employee Details {ID: %s, Name: %s, Address: %s, Phone: %s}", UUID.randomUUID(), arguments.get("employee-name").toString(), arguments.get("employee-address").toString(), arguments.get("employee-phone").toString());
}
}
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/MultiToolRegistryExample.java"/ >
Run this full example and you will get a response similar to:
::::tip[LLM Response]
:::tip[LLM Response]
[Result of executing tool 'current-fuel-price']: Current price of petrol in Bengaluru is Rs.103/L
@@ -343,30 +88,4 @@ Run this full example and you will get a response similar to:
[Result of executing tool 'get-employee-details']: Employee Details `{ID: 6bad82e6-b1a1-458f-a139-e3b646e092b1, Name:
Rahul Kumar, Address: King St, Hyderabad, India, Phone: 9876543210}`
::::
### Potential Improvements
Instead of explicitly registering `ollamaAPI.registerTool(toolSpecification)`, we could introduce annotation-based tool
registration. For example:
```java
@ToolSpec(name = "current-fuel-price", desc = "Get current fuel price")
public String getCurrentFuelPrice(Map<String, Object> arguments) {
String location = arguments.get("location").toString();
String fuelType = arguments.get("fuelType").toString();
return "Current price of " + fuelType + " in " + location + " is Rs.103/L";
}
```
Instead of passing a map of args `Map<String, Object> arguments` to the tool functions, we could support passing
specific args separately with their data types. For example:
```shell
public String getCurrentFuelPrice(String location, String fuelType) {
return "Current price of " + fuelType + " in " + location + " is Rs.103/L";
}
```
Updating async/chat APIs with support for tool-based generation.
:::

View File

@@ -1,8 +1,11 @@
---
sidebar_position: 1
sidebar_position: 2
---
# Generate - Sync
import CodeEmbed from '@site/src/components/CodeEmbed';
import TypewriterTextarea from '@site/src/components/TypewriterTextarea';
# Generate
This API lets you ask questions to the LLMs in a synchronous way.
This API corresponds to
@@ -13,163 +16,54 @@ with [extra parameters](https://github.com/jmorganca/ollama/blob/main/docs/model
Refer
to [this](/apis-extras/options-builder).
## Try asking a question about the model.
### Try asking a question about the model
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.response.OllamaResult;
import io.github.ollama4j.types.OllamaModelType;
import io.github.ollama4j.utils.OptionsBuilder;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
OllamaResult result =
ollamaAPI.generate(OllamaModelType.LLAMA2, "Who are you?", new OptionsBuilder().build());
System.out.println(result.getResponse());
}
}
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/Generate.java" />
You will get a response similar to:
> I am LLaMA, an AI assistant developed by Meta AI that can understand and respond to human input in a conversational
> manner. I am trained on a massive dataset of text from the internet and can generate human-like responses to a wide
> range of topics and questions. I can be used to create chatbots, virtual assistants, and other applications that
> require
> natural language understanding and generation capabilities.
:::tip[LLM Response]
I am a model of an AI trained by Mistral AI. I was designed to assist with a wide range of tasks, from answering
questions to helping with complex computations and research. How can I help you toda
:::
## Try asking a question, receiving the answer streamed
### Try asking a question, receiving the answer streamed
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.response.OllamaResult;
import io.github.ollama4j.models.generate.OllamaStreamHandler;
import io.github.ollama4j.utils.OptionsBuilder;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
// define a stream handler (Consumer<String>)
OllamaStreamHandler streamHandler = (s) -> {
System.out.println(s);
};
// Should be called using seperate thread to gain non blocking streaming effect.
OllamaResult result = ollamaAPI.generate(config.getModel(),
"What is the capital of France? And what's France's connection with Mona Lisa?",
new OptionsBuilder().build(), streamHandler);
System.out.println("Full response: " + result.getResponse());
}
}
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateStreaming.java" />
You will get a response similar to:
> The
> The capital
> The capital of
> The capital of France
> The capital of France is
> The capital of France is Paris
> The capital of France is Paris.
> Full response: The capital of France is Paris.
<TypewriterTextarea
textContent='The capital of France is Paris.'
typingSpeed={30}
pauseBetweenSentences={1200}
height='55px'
width='100%'
/>
## Try asking a question from general topics.
## Generate structured output
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.response.OllamaResult;
import io.github.ollama4j.types.OllamaModelType;
import io.github.ollama4j.utils.OptionsBuilder;
### With response as a `Map`
public class Main {
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateStructuredOutput.java" />
public static void main(String[] args) {
You will get a response similar to:
String host = "http://localhost:11434/";
:::tip[LLM Response]
OllamaAPI ollamaAPI = new OllamaAPI(host);
String prompt = "List all cricket world cup teams of 2019.";
OllamaResult result =
ollamaAPI.generate(OllamaModelType.LLAMA2, prompt, new OptionsBuilder().build());
System.out.println(result.getResponse());
}
```json
{
"heroName" : "Batman",
"ageOfPerson" : 30
}
```
You'd then get a response from the model:
:::
> The 2019 ICC Cricket World Cup was held in England and Wales from May 30 to July 14, 2019. The
> following teams
> participated in the tournament:
>
> 1. Afghanistan
> 2. Australia
> 3. Bangladesh
> 4. England
> 5. India
> 6. New Zealand
> 7. Pakistan
> 8. South Africa
> 9. Sri Lanka
> 10. West Indies
>
> These teams competed in a round-robin format, with the top four teams advancing to the
> semi-finals. The tournament was
> won by the England cricket team, who defeated New Zealand in the final.
### With response mapped to specified class type
## Try asking for a Database query for your data schema.
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateStructuredOutputMappedToObject.java" />
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.response.OllamaResult;
import io.github.ollama4j.types.OllamaModelType;
import io.github.ollama4j.utils.OptionsBuilder;
import io.github.ollama4j.utils.SamplePrompts;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
String prompt =
SamplePrompts.getSampleDatabasePromptWithQuestion(
"List all customer names who have bought one or more products");
OllamaResult result =
ollamaAPI.generate(OllamaModelType.SQLCODER, prompt, new OptionsBuilder().build());
System.out.println(result.getResponse());
}
}
```
_Note: Here I've used
a [sample prompt](https://github.com/ollama4j/ollama4j/blob/main/src/main/resources/sample-db-prompt-template.txt)
containing a database schema from within this library for demonstration purposes._
You'd then get a response from the model:
```sql
SELECT customers.name
FROM sales
JOIN customers ON sales.customer_id = customers.customer_id
GROUP BY customers.name;
```
:::tip[LLM Response]
HeroInfo(heroName=Batman, ageOfPerson=30)
:::

View File

@@ -1,8 +1,8 @@
{
"label": "APIs - Model Management",
"position": 2,
"link": {
"type": "generated-index",
"description": "Details of APIs to manage LLMs."
}
"label": "Manage Models",
"position": 2,
"link": {
"type": "generated-index",
"description": "Details of APIs to manage LLMs."
}
}

View File

@@ -1,162 +1,237 @@
---
sidebar_position: 4
sidebar_position: 5
---
import CodeEmbed from '@site/src/components/CodeEmbed';
# Create Model
This API lets you create a custom model on the Ollama server.
### Create a model from an existing Modelfile in the Ollama server
### Create a custom model from an existing model in the Ollama server
```java title="CreateModel.java"
import io.github.ollama4j.OllamaAPI;
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/CreateModel.java" />
public class CreateModel {
You would see these logs while the custom model is being created:
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.createModelWithFilePath("mario", "/path/to/mario/modelfile/on/ollama-server");
}
}
```
### Create a model by passing the contents of Modelfile
```java title="CreateModel.java"
public class CreateModel {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.createModelWithModelFileContents("mario", "FROM llama2\nSYSTEM You are mario from Super Mario Bros.");
}
}
using existing layer sha256:fad2a06e4cc705c2fa8bec5477ddb00dc0c859ac184c34dcc5586663774161ca
using existing layer sha256:41c2cf8c272f6fb0080a97cd9d9bd7d4604072b80a0b10e7d65ca26ef5000c0c
using existing layer sha256:1da0581fd4ce92dcf5a66b1da737cf215d8dcf25aa1b98b44443aaf7173155f5
creating new layer sha256:941b69ca7dc2a85c053c38d9e8029c9df6224e545060954fa97587f87c044a64
using existing layer sha256:f02dd72bb2423204352eabc5637b44d79d17f109fdb510a7c51455892aa2d216
writing manifest
success
```
Once created, you can see it when you use [list models](./list-models) API.
### Example of a `Modelfile`
[Read more](https://github.com/ollama/ollama/blob/main/docs/api.md#create-a-model) about custom model creation and the parameters available for model creation.
```
FROM llama2
# sets the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1
# sets the context window size to 4096, this controls how many tokens the LLM can use as context to generate the next token
PARAMETER num_ctx 4096
[//]: # ()
[//]: # (### Example of a `Modelfile`)
# sets a custom system message to specify the behavior of the chat assistant
SYSTEM You are Mario from super mario bros, acting as an assistant.
```
[//]: # ()
[//]: # (```)
### Format of the `Modelfile`
[//]: # (FROM llama2)
```modelfile
# comment
INSTRUCTION arguments
```
[//]: # (# sets the temperature to 1 [higher is more creative, lower is more coherent])
| Instruction | Description |
|-------------------------------------|----------------------------------------------------------------|
| [`FROM`](#from-required) (required) | Defines the base model to use. |
| [`PARAMETER`](#parameter) | Sets the parameters for how Ollama will run the model. |
| [`TEMPLATE`](#template) | The full prompt template to be sent to the model. |
| [`SYSTEM`](#system) | Specifies the system message that will be set in the template. |
| [`ADAPTER`](#adapter) | Defines the (Q)LoRA adapters to apply to the model. |
| [`LICENSE`](#license) | Specifies the legal license. |
[//]: # (PARAMETER temperature 1)
#### PARAMETER
[//]: # (# sets the context window size to 4096, this controls how many tokens the LLM can use as context to generate the next token)
The `PARAMETER` instruction defines a parameter that can be set when the model is run.
[//]: # (PARAMETER num_ctx 4096)
| Parameter | Description | Value Type | Example Usage |
|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|----------------------|
| mirostat | Enable Mirostat sampling for controlling perplexity. (default: 0, 0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0) | int | mirostat 0 |
| mirostat_eta | Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. (Default: 0.1) | float | mirostat_eta 0.1 |
| mirostat_tau | Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0) | float | mirostat_tau 5.0 |
| num_ctx | Sets the size of the context window used to generate the next token. (Default: 2048) | int | num_ctx 4096 |
| num_gqa | The number of GQA groups in the transformer layer. Required for some models, for example it is 8 for llama2:70b | int | num_gqa 1 |
| num_gpu | The number of layers to send to the GPU(s). On macOS it defaults to 1 to enable metal support, 0 to disable. | int | num_gpu 50 |
| num_thread | Sets the number of threads to use during computation. By default, Ollama will detect this for optimal performance. It is recommended to set this value to the number of physical CPU cores your system has (as opposed to the logical number of cores). | int | num_thread 8 |
| repeat_last_n | Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx) | int | repeat_last_n 64 |
| repeat_penalty | Sets how strongly to penalize repetitions. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. (Default: 1.1) | float | repeat_penalty 1.1 |
| temperature | The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8) | float | temperature 0.7 |
| seed | Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: 0) | int | seed 42 |
| stop | Sets the stop sequences to use. When this pattern is encountered the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate `stop` parameters in a modelfile. | string | stop "AI assistant:" |
| tfs_z | Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1) | float | tfs_z 1 |
| num_predict | Maximum number of tokens to predict when generating text. (Default: 128, -1 = infinite generation, -2 = fill context) | int | num_predict 42 |
| top_k | Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40) | int | top_k 40 |
| top_p | Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9) | float | top_p 0.9 |
[//]: # ()
[//]: # (# sets a custom system message to specify the behavior of the chat assistant)
#### TEMPLATE
[//]: # (SYSTEM You are Mario from super mario bros, acting as an assistant.)
`TEMPLATE` of the full prompt template to be passed into the model. It may include (optionally) a system message and a
user's prompt. This is used to create a full custom prompt, and syntax may be model specific. You can usually find the
template for a given model in the readme for that model.
[//]: # (```)
#### Template Variables
[//]: # ()
[//]: # (### Format of the `Modelfile`)
| Variable | Description |
|-----------------|---------------------------------------------------------------------------------------------------------------|
| `{{ .System }}` | The system message used to specify custom behavior, this must also be set in the Modelfile as an instruction. |
| `{{ .Prompt }}` | The incoming prompt, this is not specified in the model file and will be set based on input. |
| `{{ .First }}` | A boolean value used to render specific template information for the first generation of a session. |
[//]: # ()
[//]: # (```modelfile)
```modelfile
TEMPLATE """
{{- if .First }}
### System:
{{ .System }}
{{- end }}
[//]: # (# comment)
### User:
{{ .Prompt }}
[//]: # (INSTRUCTION arguments)
### Response:
"""
[//]: # (```)
SYSTEM """<system message>"""
```
[//]: # ()
[//]: # (| Instruction | Description |)
### SYSTEM
[//]: # (|-------------------------------------|----------------------------------------------------------------|)
The `SYSTEM` instruction specifies the system message to be used in the template, if applicable.
[//]: # (| [`FROM`]&#40;#from-required&#41; &#40;required&#41; | Defines the base model to use. |)
```modelfile
SYSTEM """<system message>"""
```
[//]: # (| [`PARAMETER`]&#40;#parameter&#41; | Sets the parameters for how Ollama will run the model. |)
### ADAPTER
[//]: # (| [`TEMPLATE`]&#40;#template&#41; | The full prompt template to be sent to the model. |)
The `ADAPTER` instruction specifies the LoRA adapter to apply to the base model. The value of this instruction should be
an absolute path or a path relative to the Modelfile and the file must be in a GGML file format. The adapter should be
tuned from the base model otherwise the behaviour is undefined.
[//]: # (| [`SYSTEM`]&#40;#system&#41; | Specifies the system message that will be set in the template. |)
```modelfile
ADAPTER ./ollama-lora.bin
```
[//]: # (| [`ADAPTER`]&#40;#adapter&#41; | Defines the &#40;Q&#41;LoRA adapters to apply to the model. |)
### LICENSE
[//]: # (| [`LICENSE`]&#40;#license&#41; | Specifies the legal license. |)
The `LICENSE` instruction allows you to specify the legal license under which the model used with this Modelfile is
shared or distributed.
[//]: # ()
[//]: # (#### PARAMETER)
```modelfile
LICENSE """
<license text>
"""
```
[//]: # ()
[//]: # (The `PARAMETER` instruction defines a parameter that can be set when the model is run.)
## Notes
[//]: # ()
[//]: # (| Parameter | Description | Value Type | Example Usage |)
- the **`Modelfile` is not case sensitive**. In the examples, uppercase instructions are used to make it easier to
distinguish it from arguments.
- Instructions can be in any order. In the examples, the `FROM` instruction is first to keep it easily readable.
[//]: # (|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------|----------------------|)
Read more about Modelfile: https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md
[//]: # (| mirostat | Enable Mirostat sampling for controlling perplexity. &#40;default: 0, 0 = disabled, 1 = Mirostat, 2 = Mirostat 2.0&#41; | int | mirostat 0 |)
[//]: # (| mirostat_eta | Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive. &#40;Default: 0.1&#41; | float | mirostat_eta 0.1 |)
[//]: # (| mirostat_tau | Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. &#40;Default: 5.0&#41; | float | mirostat_tau 5.0 |)
[//]: # (| num_ctx | Sets the size of the context window used to generate the next token. &#40;Default: 2048&#41; | int | num_ctx 4096 |)
[//]: # (| num_gqa | The number of GQA groups in the transformer layer. Required for some models, for example it is 8 for llama2:70b | int | num_gqa 1 |)
[//]: # (| num_gpu | The number of layers to send to the GPU&#40;s&#41;. On macOS it defaults to 1 to enable metal support, 0 to disable. | int | num_gpu 50 |)
[//]: # (| num_thread | Sets the number of threads to use during computation. By default, Ollama will detect this for optimal performance. It is recommended to set this value to the number of physical CPU cores your system has &#40;as opposed to the logical number of cores&#41;. | int | num_thread 8 |)
[//]: # (| repeat_last_n | Sets how far back for the model to look back to prevent repetition. &#40;Default: 64, 0 = disabled, -1 = num_ctx&#41; | int | repeat_last_n 64 |)
[//]: # (| repeat_penalty | Sets how strongly to penalize repetitions. A higher value &#40;e.g., 1.5&#41; will penalize repetitions more strongly, while a lower value &#40;e.g., 0.9&#41; will be more lenient. &#40;Default: 1.1&#41; | float | repeat_penalty 1.1 |)
[//]: # (| temperature | The temperature of the model. Increasing the temperature will make the model answer more creatively. &#40;Default: 0.8&#41; | float | temperature 0.7 |)
[//]: # (| seed | Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. &#40;Default: 0&#41; | int | seed 42 |)
[//]: # (| stop | Sets the stop sequences to use. When this pattern is encountered the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate `stop` parameters in a modelfile. | string | stop "AI assistant:" |)
[//]: # (| tfs_z | Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value &#40;e.g., 2.0&#41; will reduce the impact more, while a value of 1.0 disables this setting. &#40;default: 1&#41; | float | tfs_z 1 |)
[//]: # (| num_predict | Maximum number of tokens to predict when generating text. &#40;Default: 128, -1 = infinite generation, -2 = fill context&#41; | int | num_predict 42 |)
[//]: # (| top_k | Reduces the probability of generating nonsense. A higher value &#40;e.g. 100&#41; will give more diverse answers, while a lower value &#40;e.g. 10&#41; will be more conservative. &#40;Default: 40&#41; | int | top_k 40 |)
[//]: # (| top_p | Works together with top-k. A higher value &#40;e.g., 0.95&#41; will lead to more diverse text, while a lower value &#40;e.g., 0.5&#41; will generate more focused and conservative text. &#40;Default: 0.9&#41; | float | top_p 0.9 |)
[//]: # ()
[//]: # (#### TEMPLATE)
[//]: # ()
[//]: # (`TEMPLATE` of the full prompt template to be passed into the model. It may include &#40;optionally&#41; a system message and a)
[//]: # (user's prompt. This is used to create a full custom prompt, and syntax may be model specific. You can usually find the)
[//]: # (template for a given model in the readme for that model.)
[//]: # ()
[//]: # (#### Template Variables)
[//]: # ()
[//]: # (| Variable | Description |)
[//]: # (|-----------------|---------------------------------------------------------------------------------------------------------------|)
[//]: # (| `{{ .System }}` | The system message used to specify custom behavior, this must also be set in the Modelfile as an instruction. |)
[//]: # (| `{{ .Prompt }}` | The incoming prompt, this is not specified in the model file and will be set based on input. |)
[//]: # (| `{{ .First }}` | A boolean value used to render specific template information for the first generation of a session. |)
[//]: # ()
[//]: # (```modelfile)
[//]: # (TEMPLATE """)
[//]: # ({{- if .First }})
[//]: # (### System:)
[//]: # ({{ .System }})
[//]: # ({{- end }})
[//]: # ()
[//]: # (### User:)
[//]: # ({{ .Prompt }})
[//]: # ()
[//]: # (### Response:)
[//]: # (""")
[//]: # ()
[//]: # (SYSTEM """<system message>""")
[//]: # (```)
[//]: # ()
[//]: # (### SYSTEM)
[//]: # ()
[//]: # (The `SYSTEM` instruction specifies the system message to be used in the template, if applicable.)
[//]: # ()
[//]: # (```modelfile)
[//]: # (SYSTEM """<system message>""")
[//]: # (```)
[//]: # ()
[//]: # (### ADAPTER)
[//]: # ()
[//]: # (The `ADAPTER` instruction specifies the LoRA adapter to apply to the base model. The value of this instruction should be)
[//]: # (an absolute path or a path relative to the Modelfile and the file must be in a GGML file format. The adapter should be)
[//]: # (tuned from the base model otherwise the behaviour is undefined.)
[//]: # ()
[//]: # (```modelfile)
[//]: # (ADAPTER ./ollama-lora.bin)
[//]: # (```)
[//]: # ()
[//]: # (### LICENSE)
[//]: # ()
[//]: # (The `LICENSE` instruction allows you to specify the legal license under which the model used with this Modelfile is)
[//]: # (shared or distributed.)
[//]: # ()
[//]: # (```modelfile)
[//]: # (LICENSE """)
[//]: # (<license text>)
[//]: # (""")
[//]: # (```)
[//]: # ()
[//]: # (## Notes)
[//]: # ()
[//]: # (- the **`Modelfile` is not case sensitive**. In the examples, uppercase instructions are used to make it easier to)
[//]: # ( distinguish it from arguments.)
[//]: # (- Instructions can be in any order. In the examples, the `FROM` instruction is first to keep it easily readable.)
[//]: # ()
[//]: # (Read more about Modelfile: https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md)

View File

@@ -1,28 +1,13 @@
---
sidebar_position: 5
sidebar_position: 6
---
import CodeEmbed from '@site/src/components/CodeEmbed';
# Delete Model
This API lets you create a delete a model from the Ollama server.
```java title="DeleteModel.java"
import io.github.ollama4j.OllamaAPI;
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.setVerbose(false);
ollamaAPI.deleteModel("mycustommodel", true);
}
}
```
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/DeleteModel.java" />
Once deleted, you can verify it using [list models](./list-models) API.

File diff suppressed because one or more lines are too long

View File

@@ -1,35 +1,24 @@
---
sidebar_position: 1
sidebar_position: 2
---
# List Models
import CodeEmbed from '@site/src/components/CodeEmbed';
This API lets you list available models on the Ollama server.
# List Library Models
```java title="ListModels.java"
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.models.response.Model;
This API lets you list downloaded/available models on the Ollama server.
import java.util.List;
<CodeEmbed
src='https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ListLocalModels.java'>
</CodeEmbed>
public class ListModels {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
List<Model> models = ollamaAPI.listModels();
models.forEach(model -> System.out.println(model.getName()));
}
}
```
If you have any models already downloaded on Ollama server, you would have them listed as follows:
```bash
llama2:latest
llama3.2:1b
qwen2:0.5b
qwen:0.5b
sqlcoder:latest
```

View File

@@ -1,26 +1,15 @@
---
sidebar_position: 2
sidebar_position: 3
---
import CodeEmbed from '@site/src/components/CodeEmbed';
# Pull Model
This API lets you pull a model on the Ollama server.
```java title="PullModel.java"
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.types.OllamaModelType;
<CodeEmbed
src='https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/PullModel.java'>
</CodeEmbed>
public class Main {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
ollamaAPI.pullModel(OllamaModelType.LLAMA2);
}
}
```
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.

View File

@@ -1,19 +1,22 @@
---
sidebar_position: 1
title: Introduction
---
import LatestRelease from '@site/src/components/LatestRelease';
import AddToYourProject from '@site/src/components/AddToYourProject';
# Introduction
Let's get started with **Ollama4j**.
## 🦙 What is Ollama?
### 🦙 What is Ollama?
[Ollama](https://ollama.ai/) is an advanced AI tool that allows users to easily set up and run large language models
locally (in CPU and GPU
modes). With Ollama, users can leverage powerful language models such as Llama 2 and even customize and create their own
models.
## 👨‍💻 Why Ollama4j?
### 👨‍💻 Why Ollama4j?
Ollama4j was built for the simple purpose of integrating Ollama with Java applications.
@@ -34,16 +37,16 @@ Ollama4j was built for the simple purpose of integrating Ollama with Java applic
end
```
## Getting Started
### Getting Started
### What you'll need
#### What you'll need
- **[Ollama](https://ollama.ai/download)**
- **[Oracle JDK](https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html)** or
**[Open JDK](https://jdk.java.net/archive/)** 11.0 or above.
- **[Maven](https://maven.apache.org/download.cgi)**
### Start Ollama server
#### Start Ollama server
The easiest way of getting started with Ollama server is with [Docker](https://docs.docker.com/get-started/overview/).
But if you choose to run the
@@ -69,22 +72,17 @@ terminal of your code editor.
The command runs the Ollama server locally at **http://localhost:11434/**.
### Setup your project
Get started by **creating a new Maven project** on your favorite IDE.
#### Setup your project
Add the dependency to your project's `pom.xml`.
```xml
<AddToYourProject/>
<dependency>
<groupId>io.github.ollama4j</groupId>
<artifactId>ollama4j</artifactId>
<version>1.0.78</version>
</dependency>
```
<div style={{ marginTop: '2rem', marginBottom: '2rem', fontSize: '1em', textAlign: 'left', display: 'flex', justifyContent: 'left'}}>
<LatestRelease showReleaseDate={true} style={{textAlign: 'left', fontWeight: 'normal'}}/>
</div>
Find the latest version of the library [here](https://central.sonatype.com/artifact/io.github.ollama4j/ollama4j).
Find the latest version of the library from [Maven Central Repository](https://central.sonatype.com/artifact/io.github.ollama4j/ollama4j).
You might want to include an implementation of [SL4J](https://www.slf4j.org/) logger in your `pom.xml` file. For
example,
@@ -92,7 +90,6 @@ example,
Use `slf4j-jdk14` implementation:
```xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
@@ -103,7 +100,6 @@ Use `slf4j-jdk14` implementation:
or use `logback-classic` implementation:
```xml
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
@@ -116,14 +112,14 @@ or use other suitable implementations.
Create a new Java class in your project and add this code.
```java
import io.github.ollama4j.OllamaAPI;
import io.github.ollama4j.Ollama;
public class OllamaAPITest {
public class OllamaTest {
public static void main(String[] args) {
OllamaAPI ollamaAPI = new OllamaAPI();
Ollama ollama = new Ollama();
boolean isOllamaServerReachable = ollamaAPI.ping();
boolean isOllamaServerReachable = ollama.ping();
System.out.println("Is Ollama server running: " + isOllamaServerReachable);
}
@@ -134,18 +130,16 @@ 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;
import io.github.ollama4j.Ollama;
public class OllamaAPITest {
public class OllamaTest {
public static void main(String[] args) {
String host = "http://localhost:11434/";
OllamaAPI ollamaAPI = new OllamaAPI(host);
Ollama ollama = new Ollama(host);
ollamaAPI.setVerbose(true);
boolean isOllamaServerReachable = ollamaAPI.ping();
boolean isOllamaServerReachable = ollama.ping();
System.out.println("Is Ollama server running: " + isOllamaServerReachable);
}

90
docs/docs/metrics.md Normal file
View File

@@ -0,0 +1,90 @@
---
sidebar_position: 6
title: Metrics
---
import CodeEmbed from '@site/src/components/CodeEmbed';
# Metrics
:::warning[Note]
This is work in progress
:::
Monitoring and understanding the performance of your models and requests is crucial for optimizing and maintaining your
applications. The Ollama4j library provides built-in support for collecting and exposing various metrics, such as
request counts, response times, and error rates. These metrics can help you:
- Track usage patterns and identify bottlenecks
- Monitor the health and reliability of your services
- Set up alerts for abnormal behavior
- Gain insights for scaling and optimization
## Available Metrics
Ollama4j exposes several key metrics, including:
- **Total Requests**: The number of requests processed by the model.
- **Response Time**: The time taken to generate a response for each request.
- **Error Rate**: The percentage of requests that resulted in errors.
- **Active Sessions**: The number of concurrent sessions or users.
These metrics can be accessed programmatically or integrated with monitoring tools such as Prometheus or Grafana for
visualization and alerting.
## Example Metrics Dashboard
Below is an example of a metrics dashboard visualizing some of these key statistics:
![Img](https://raw.githubusercontent.com/ollama4j/ollama4j/main/metrics.png)
## Example: Accessing Metrics in Java
You can easily access and display metrics in your Java application using Ollama4j.
Make sure you have added the `simpleclient_httpserver` dependency in your app for the app to be able to expose the
metrics via `/metrics` endpoint:
```xml
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_httpserver</artifactId>
<version>0.16.0</version>
</dependency>
```
Here is a sample code snippet demonstrating how to retrieve and print metrics on Grafana:
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/MetricsExample.java" />
This will start a simple HTTP server with `/metrics` endpoint enabled. Metrics will now available
at: http://localhost:8080/metrics
## Integrating with Monitoring Tools
### Grafana
Use the following sample `docker-compose` file to host a basic Grafana container.
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/docker/docker-compose.yml" />
And run:
```shell
docker-compose -f path/to/your/docker-compose.yml up
```
This starts Granfana at http://localhost:3000
[//]: # (To integrate Ollama4j metrics with external monitoring systems, you can export the metrics endpoint and configure your)
[//]: # (monitoring tool to scrape or collect the data. Refer to the [integration guide]&#40;../integration/monitoring.md&#41; for)
[//]: # (detailed instructions.)
[//]: # ()
[//]: # (For more information on customizing and extending metrics, see the [API documentation]&#40;../api/metrics.md&#41;.)

View File

@@ -24,7 +24,6 @@ const config = {
projectName: 'ollama4j', // Usually your repo name.
onBrokenLinks: 'throw',
onBrokenMarkdownLinks: 'warn',
// Even if you don't use internationalization, you can use this field to set
// useful metadata like html lang. For example, if your site is Chinese, you
@@ -84,6 +83,7 @@ const config = {
position: 'left',
label: 'Docs',
},
{to: 'https://github.com/ollama4j/ollama4j-examples', label: 'Examples', position: 'left'},
{to: 'https://ollama4j.github.io/ollama4j/apidocs/', label: 'Javadoc', position: 'left'},
{to: 'https://ollama4j.github.io/ollama4j/doxygen/html/', label: 'Doxygen', position: 'left'},
{to: '/blog', label: 'Blog', position: 'left'},
@@ -98,11 +98,32 @@ const config = {
style: 'dark',
links: [
{
title: 'Docs',
title: 'Quick Links',
items: [
{
label: 'Tutorial',
to: '/intro',
label: 'Ollama4j Examples',
to: 'https://github.com/ollama4j/ollama4j-examples',
},
{
label: 'Blog',
to: '/blog',
},
{
label: 'GitHub',
href: 'https://github.com/ollama4j/ollama4j',
},
],
},
{
title: 'Stuff built with Ollama4j',
items: [
{
label: 'Ollama4j Web UI',
to: 'https://github.com/ollama4j/ollama4j-web-ui',
},
{
label: 'Ollama4j Desktop UI with Swing',
to: 'https://github.com/ollama4j/ollama4j-ui',
},
],
},
@@ -118,20 +139,7 @@ const config = {
href: 'https://twitter.com/ollama4j',
},
],
},
{
title: 'More',
items: [
{
label: 'Blog',
to: '/blog',
},
{
label: 'GitHub',
href: 'https://github.com/ollama4j/ollama4j',
},
],
},
}
],
copyright: `Ollama4j Documentation ${new Date().getFullYear()}. Built with Docusaurus.`,
},
@@ -140,9 +148,35 @@ const config = {
darkTheme: prismThemes.dracula,
additionalLanguages: ['java'],
},
algolia: {
// The application ID provided by Algolia
appId: '7HJ3MZ6GBX',
// Public API key: it is safe to commit it
apiKey: '3037a6d8706a6347b1844ca6ecd582b0',
indexName: 'ollama4jio',
// Optional: see doc section below
contextualSearch: true,
// Optional: Specify domains where the navigation should occur through window.location instead on history.push. Useful when our Algolia config crawls multiple documentation sites and we want to navigate with window.location.href to them.
externalUrlRegex: 'external\\.com|domain\\.com',
// Optional: Replace parts of the item URLs from Algolia. Useful when using the same search index for multiple deployments using a different baseUrl. You can use regexp or string in the `from` param. For example: localhost:3000 vs myCompany.com/docs
replaceSearchResultPathname: {
from: '/docs/', // or as RegExp: /\/docs\//
to: '/',
},
// Optional: Algolia search parameters
searchParameters: {},
// Optional: path for search page that enabled by default (`false` to disable it)
searchPagePath: 'search',
// Optional: whether the insights feature is enabled or not on Docsearch (`false` by default)
insights: false,
//... other Algolia params
},
}),
markdown: {
mermaid: true,
hooks: {
onBrokenMarkdownLinks: 'warn'
}
},
themes: ['@docusaurus/theme-mermaid']
};

34663
docs/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,46 +1,51 @@
{
"name": "ollama-4-j",
"version": "0.0.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
"start": "docusaurus start",
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids"
},
"dependencies": {
"@docusaurus/core": "^3.4.0",
"@docusaurus/plugin-google-gtag": "^3.4.0",
"@docusaurus/preset-classic": "^3.4.0",
"@docusaurus/theme-mermaid": "^3.4.0",
"@mdx-js/react": "^3.0.0",
"clsx": "^2.0.0",
"prism-react-renderer": "^2.3.0",
"react": "^18.0.0",
"react-dom": "^18.0.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.4.0",
"@docusaurus/types": "^3.4.0"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
"not op_mini all"
],
"development": [
"last 3 chrome version",
"last 3 firefox version",
"last 5 safari version"
]
},
"engines": {
"node": ">=18.0"
}
"name": "ollama-4-j",
"version": "0.0.0",
"private": true,
"scripts": {
"docusaurus": "docusaurus",
"start": "docusaurus start",
"build": "docusaurus build",
"swizzle": "docusaurus swizzle",
"deploy": "docusaurus deploy",
"clear": "docusaurus clear",
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids"
},
"dependencies": {
"@docsearch/js": "^4.1.0",
"@docusaurus/core": "^3.9.0",
"@docusaurus/plugin-google-gtag": "^3.9.1",
"@docusaurus/preset-classic": "^3.9.1",
"@docusaurus/theme-mermaid": "^3.9.1",
"@iconify/react": "^6.0.2",
"@mdx-js/react": "^3.1.1",
"clsx": "^2.1.1",
"font-awesome": "^4.7.0",
"prism-react-renderer": "^2.4.1",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react-icons": "^5.5.0",
"react-image-gallery": "^1.4.0"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.9.1",
"@docusaurus/types": "^3.4.0"
},
"browserslist": {
"production": [
">0.5%",
"not dead",
"not op_mini all"
],
"development": [
"last 3 chrome version",
"last 3 firefox version",
"last 5 safari version"
]
},
"engines": {
"node": ">=18.0"
}
}

View File

@@ -0,0 +1,65 @@
import React, { useState, useEffect } from 'react';
import CodeBlock from '@theme/CodeBlock';
const AddToYourProject = () => {
const [releaseInfo, setReleaseInfo] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchLatestRelease = async () => {
setLoading(true);
setError(null);
try {
const response = await fetch('https://api.github.com/repos/ollama4j/ollama4j/releases/latest');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setReleaseInfo(data);
} catch (err) {
console.error('Failed to fetch release info:', err);
setError(err);
} finally {
setLoading(false);
}
};
fetchLatestRelease();
}, []);
return (
<div style={{ width: '100%' }}>
{loading ? (
<div>Loading latest release info...</div>
) : error ? (
<div>Error: {error.message}</div>
) : releaseInfo ? (
<>
<h4>Using Maven <code>pom.xml</code></h4>
<CodeBlock className="language-xml">
{`<dependency>
<groupId>io.github.ollama4j</groupId>
<artifactId>ollama4j</artifactId>
<version>${releaseInfo.name}</version>
</dependency>`}
</CodeBlock>
<h4>Using Groovy-based <code>build.gradle</code></h4>
<CodeBlock className="language-groovy">
{`dependencies {
implementation 'io.github.ollama4j:ollama4j:${releaseInfo.name}'
}`}
</CodeBlock>
<h4>For Kotlin-based <code>build.gradle.kts</code></h4>
<CodeBlock className="language-kotlin">
{`dependencies {
implementation("io.github.ollama4j:ollama4j:${releaseInfo.name}")
}`}
</CodeBlock>
</>
) : null}
</div>
);
};
export default AddToYourProject;

View File

@@ -0,0 +1,106 @@
import React, {useState, useEffect} from 'react';
import CodeBlock from '@theme/CodeBlock';
import Icon from '@site/src/components/Icon';
/**
* CodeEmbed component to display code fetched from a URL in a CodeBlock.
* @param {object} props
* @param {string} props.src - Source URL to fetch the code from.
* @param {string} [props.language='java'] - Language for syntax highlighting in CodeBlock.
*/
const CodeEmbed = ({src, language = 'java'}) => {
const [code, setCode] = useState('');
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
let isMounted = true;
const fetchCodeFromUrl = async (url) => {
if (!isMounted) return;
setLoading(true);
setError(null);
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.text();
if (isMounted) {
setCode(data);
}
} catch (err) {
console.error('Failed to fetch code:', err);
if (isMounted) {
setError(err);
setCode(`// Failed to load code from ${url}\n// ${err.message}`);
}
} finally {
if (isMounted) {
setLoading(false);
}
}
};
if (src) {
fetchCodeFromUrl(src);
}
return () => {
isMounted = false;
};
}, [src]);
const githubUrl = src ? src.replace('https://raw.githubusercontent.com', 'https://github.com').replace('/refs/heads/', '/blob/') : null;
const fileName = src ? src.substring(src.lastIndexOf('/') + 1) : null;
const title = (
<div style={{display: 'flex', justifyContent: 'space-between', alignItems: 'center'}}>
<a
href={githubUrl}
target="_blank"
rel="noopener noreferrer"
style={{
color: 'gray',
textDecoration: 'none',
}}
onMouseOver={e => {
e.target.style.textDecoration = 'underline';
}}
onMouseOut={e => {
e.target.style.textDecoration = 'none';
}}
>
<span>{fileName}</span>
</a>
{githubUrl && (
<a href={githubUrl} target="_blank" rel="noopener noreferrer" style={{
color: 'gray',
fontSize: '0.9em',
fontStyle: 'italic',
display: 'inline-flex',
alignItems: 'center'
}}>
View on GitHub
<Icon icon="mdi:github" height="1em"/>
</a>
)}
</div>
);
return (
loading ? (
<div>Loading code...</div>
) : error ? (
<div>Error: {error.message}</div>
) : (
<div style={{backgroundColor: 'transparent', padding: '0px', borderRadius: '5px'}}>
<CodeBlock title={title} language={language}>{code}</CodeBlock>
</div>
)
);
};
export default CodeEmbed;

View File

@@ -1,39 +1,107 @@
import clsx from 'clsx';
import Heading from '@theme/Heading';
import styles from './styles.module.css';
import Ollama4jUIImageCarousel from '@site/src/components/Ollama4jUIImageCarousel';
const FeatureList = [
{
title: 'Easy LLM Integration',
Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
description: (
<>
Easy integration with Ollama, enabling the execution of large language models locally.
</>
),
},
{
title: 'Developer-Friendly',
Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
description: (
<>
Clean and simple <code>APIs</code>, focused on seamless interaction with Ollama.
Provides clean and simple <code>APIs</code> for interacting with Ollama, including model management, chat functionalities, and authentication capability when Ollama is deployed behind proxy server.
</>
),
},
{
title: 'Powered by Java',
title: 'Chat with Images',
Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,
description: (
<>
Supports interactions with vision/image models, allowing you to build applications that can understand and respond to visual content. Upload images directly into your chat sessions and receive intelligent, context-aware replies.
</>
),
},
{
title: 'Tools Support',
Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
description: (
<>
Empowers Java developers to harness the full capabilities of Ollama.
Supports tool/function calling with tool calling models such as mistral, llama3.x, qwen, etc. Empower your models to interact with external services and data sources, enabling more complex and dynamic AI workflows.
</>
),
},
];
const UsageList = [
{
title: 'Datafaker',
Svg: require('@site/static/img/datafaker.svg').default,
link: 'https://www.datafaker.net/',
description: (
<>
A powerful fake data generation library designed for JVM programs, offering over 200 data providers to easily create realistic and diverse datasets within minutes.
</>
),
imageSize: '20%',
},
{
title: 'Katie',
Svg: require('@site/static/img/katie_logo_v3.svg').default,
link: 'https://katie.qa/home',
description: (
<>
An Open Source AI-based question-answering platform that helps companies and organizations make their private domain knowledge accessible and useful to their employees and customers.
</>
),
imageSize: '30%',
},
{
title: 'AI Player',
Svg: require('@site/static/img/ai-player.svg').default,
link: 'https://modrinth.com/mod/ai-player',
description: (
<>
A minecraft mod which aims to add a "second player" into the game which will actually be intelligent.
</>
),
imageSize: '15%',
},
{
title: 'Ollama Translator Plugin',
Svg: require('@site/static/img/minecraft-spigot.svg').default,
link: 'https://github.com/liebki/ollama-translator',
description: (
<>
A minecraft 1.21 spigot plugin allows to easily break language barriers by using ollama on the server to translate all messages into a specfic target language.
</>
),
imageSize: '20%',
},
{
title: 'JnsCLI',
Svg: require('@site/static/img/jnscli.svg').default,
link: 'https://github.com/mirum8/jnscli',
description: (
<>
JnsCLI is a command-line tool for Jenkins, allowing you to manage jobs, builds, and configurations directly from the terminal. It also features AI-powered error analysis for quick troubleshooting.
</>
),
imageSize: '20%',
},
{
title: 'Featured in a Research Article on AI-Assisted Code Optimization',
Svg: require('@site/static/img/pmc-logo.svg').default,
link: 'https://pmc.ncbi.nlm.nih.gov/articles/PMC11750896/',
description: (
<>
Ollama4j was used in a research article Large Language Model Based Mutations in Genetic Improvement (PubMed Central).
</>
),
imageSize: '50%',
},
];
function Feature({Svg, title, description}) {
function Feature({ Svg, title, description }) {
return (
<div className={clsx('col col--4')}>
<div className="text--center">
@@ -47,16 +115,58 @@ function Feature({Svg, title, description}) {
);
}
export default function HomepageFeatures() {
function Usage({ Svg, title, description, link, imageSize }) {
return (
<section className={styles.features}>
<div className="container">
<div className="row">
{FeatureList.map((props, idx) => (
<Feature key={idx} {...props} />
))}
</div>
<div className={clsx('col col--4')}>
<div className="text--center">
<Svg className={styles.featureSvg} role="img" style={{ width: imageSize }} />
</div>
</section>
<div className="text--center padding-horiz--md">
<Heading as="h3" style={{ color: 'red' }}>
{link ? (
<a href={link} target="_blank" rel="noopener noreferrer" style={{ color: '#11bc11' }}>
{title}
</a>
) : (
<span style={{ color: 'red' }}>{title}</span>
)}
</Heading>
<p>{description}</p>
</div>
</div>
);
}
export default function HomepageFeatures() {
return (
<>
<section className={styles.features}>
<div className="container">
<div className="row">
{FeatureList.map((props, idx) => (
<Feature key={idx} {...props} />
))}
</div>
</div>
</section>
<hr />
<section className={styles.features}>
<div className="container">
<div style={{ fontSize: '20px', fontWeight: 'bold', display: 'flex', flexDirection: 'column', alignItems: 'center' }}>
Check out who's using Ollama4j
</div>
<div className="row">
{UsageList.map((props, idx) => (
<Usage key={idx} {...props} />
))}
</div>
</div>
</section>
<section className={styles.features}>
<div className="container">
<Ollama4jUIImageCarousel></Ollama4jUIImageCarousel>
</div>
</section>
</>
);
}

View File

@@ -0,0 +1,9 @@
// @site/src/components/Icon.js
import React from 'react';
import { Icon as IconifyIcon } from '@iconify/react';
const IIcon = ({ icon, color, width = '24', height = '24' }) => (
<IconifyIcon icon={icon} color={color} width={width} height={height} />
);
export default IIcon;

View File

@@ -0,0 +1,52 @@
import React, { useState, useEffect } from 'react';
const LatestRelease = ({ showReleaseDate }) => {
const [releaseInfo, setReleaseInfo] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchLatestRelease = async () => {
setLoading(true);
setError(null);
try {
const response = await fetch('https://api.github.com/repos/ollama4j/ollama4j/releases/latest');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
setReleaseInfo(data);
} catch (err) {
console.error('Failed to fetch release info:', err);
setError(err);
} finally {
setLoading(false);
}
};
fetchLatestRelease();
}, []);
return (
<div style={{ display: 'flex', justifyContent: 'center' }}>
{loading ? (
<div>Loading latest release info...</div>
) : error ? (
<div>Error: {error.message}</div>
) : releaseInfo ? (
<div>
{/* <h4 style={{ display: 'flex', justifyContent: 'center'}}>Latest Release</h4> */}
<div>
<span style={{ fontWeight: 'bold'}}>Latest Version</span>: <a href={releaseInfo.html_url} target='_blank' rel="noopener noreferrer"><span style={{color: 'white', fontWeight: 'bold', backgroundColor:'#11bc11', borderRadius: '15px', padding: '5px'}}>{releaseInfo.name}</span></a>
{showReleaseDate && ` released on ${new Date(releaseInfo.published_at).toLocaleDateString(undefined, { year: 'numeric', month: 'long', day: 'numeric' })}`}
</div>
{/* <pre style={{ whiteSpace: 'pre-wrap' }}>
{JSON.stringify(releaseInfo, null, 2)}
</pre> */}
</div>
) : null}
</div>
);
};
export default LatestRelease;

View File

@@ -0,0 +1,54 @@
import React from 'react';
import "react-image-gallery/styles/css/image-gallery.css";
import ImageGallery from "react-image-gallery";
const images = [
{
original: require('@site/static/img/ollama4j-ui/1.png').default,
thumbnail: require('@site/static/img/ollama4j-ui/1.png').default,
},
{
original: require('@site/static/img/ollama4j-ui/2.png').default,
thumbnail: require('@site/static/img/ollama4j-ui/2.png').default,
},
{
original: require('@site/static/img/ollama4j-ui/3.png').default,
thumbnail: require('@site/static/img/ollama4j-ui/3.png').default,
},
{
original: require('@site/static/img/ollama4j-ui/4.png').default,
thumbnail: require('@site/static/img/ollama4j-ui/4.png').default,
},
];
class Ollama4jUIImageCarousel extends React.Component {
renderItem = (item) => {
return (
<div className="image-gallery-image" style={{ textAlign: 'center' }}>
<img
src={item.original}
alt=""
style={{ maxHeight: '500px', width: 'auto', maxWidth: '100%' }}
/>
</div>
);
};
render() {
return (
<div style={{ margin: '0 auto', maxWidth: '800px' }}>
<div style={{ display: 'flex', flexDirection: 'column', justifyContent: 'center', alignItems: 'center', textAlign: 'center' }}>
<h2>Explore the stuff we have built with Ollama4j</h2>
<h4>
<a href="https://github.com/ollama4j/ollama4j-ui" target='_blank' rel="noopener noreferrer">
Ollama4j UI - Desktop UI built in Java with Swing
</a>
</h4>
</div>
<ImageGallery items={images} renderItem={this.renderItem} />
</div>
);
}
}
export default Ollama4jUIImageCarousel;

View File

@@ -0,0 +1,73 @@
import React, { useEffect, useState, useRef } from 'react';
const TypewriterTextarea = ({
textContent,
typingSpeed = 50,
pauseBetweenSentences = 1000,
height = '200px',
width = '100%',
align = 'left',
style = {},
}) => {
const [displayedText, setDisplayedText] = useState('');
const [charIndex, setCharIndex] = useState(0);
const isTyping = useRef(false);
// Flatten textContent to a string, preserving \n
const fullText = textContent || '';
useEffect(() => {
if (!fullText) return;
if (!isTyping.current) {
isTyping.current = true;
}
if (charIndex > fullText.length) {
// Reset to start from the beginning
setCharIndex(0);
setDisplayedText('');
return;
}
if (charIndex < fullText.length) {
const timeout = setTimeout(() => {
setDisplayedText(fullText.slice(0, charIndex + 1));
setCharIndex((prevCharIndex) => prevCharIndex + 1);
}, fullText[charIndex] === '\n' ? typingSpeed : typingSpeed);
return () => clearTimeout(timeout);
} else {
// Wait a bit, then restart
const timeout = setTimeout(() => {
setCharIndex(0);
setDisplayedText('');
}, pauseBetweenSentences);
return () => clearTimeout(timeout);
}
// eslint-disable-next-line
}, [charIndex, fullText, typingSpeed, pauseBetweenSentences]);
return (
<div
style={{
width: typeof width === 'number' ? `${width}px` : width,
height: height,
padding: '1rem',
fontFamily: 'monospace',
fontSize: '1rem',
backgroundColor: '#f4f4f4',
border: '1px solid #ccc',
textAlign: align,
resize: 'none',
whiteSpace: 'pre-wrap',
color: 'black',
overflow: 'auto',
...style,
}}
>
{displayedText}
</div>
);
};
export default TypewriterTextarea;

View File

@@ -4,6 +4,8 @@
* work well for content-centric websites.
*/
@import 'font-awesome/css/font-awesome.min.css';
/* You can override the default Infima variables here. */
:root {
--ifm-color-primary: #2e8555;

View File

@@ -7,39 +7,60 @@ import BuyMeACoffee from '@site/src/components/BuyMeACoffee';
import Heading from '@theme/Heading';
import styles from './index.module.css';
import BrowserOnly from '@docusaurus/BrowserOnly';
import LatestRelease from '@site/src/components/LatestRelease';
import TypewriterTextarea from '@site/src/components/TypewriterTextarea';
function HomepageHeader() {
const {siteConfig} = useDocusaurusContext();
return (<header className={clsx('hero hero--primary', styles.heroBanner)}>
<div className="container">
<Heading as="h1" className="hero__title">
{siteConfig.title}
</Heading>
<img src="img/logo.svg" alt="Ollama4j Logo" className={styles.logo}
style={{maxWidth: '20vh'}}/>
<p className="hero__subtitle">{siteConfig.tagline}</p>
<div className={styles.buttons}>
<Link
className="button button--secondary button--lg"
to="/intro">
Getting Started
</Link>
return (
<header className={clsx('hero hero--primary', styles.heroBanner)}>
<div className="container">
<Heading as="h1" className="hero__title">
{siteConfig.title}
</Heading>
<img
src="img/logo.svg"
alt="Ollama4j Logo"
className={styles.logo}
style={{ maxWidth: '20vh' }}
/>
<p className="hero__subtitle">{siteConfig.tagline}</p>
<div style={{ marginTop: '2rem' }}>
<TypewriterTextarea
textContent='Hello there! Im a handy little Java library that helps you talk to an Ollama server — nice and easy.'
typingSpeed={30}
pauseBetweenSentences={1200}
height='130px'
width='100%'
align='center'
/>
</div>
<div className={styles.buttons} >
<Link className="button button--secondary button--lg" to="/intro" style={{ marginTop:'2rem' }}>
Get Started
</Link>
</div>
<div style={{ marginTop: '3rem' }}>
<LatestRelease showReleaseDate={false} />
</div>
</div>
</div>
</header>);
</header>
);
}
export default function Home() {
const {siteConfig} = useDocusaurusContext();
return (<Layout
title={`Hello from ${siteConfig.title}`}
return (
<Layout
title={`${siteConfig.title}`}
description="Description will go into a meta tag in <head />">
<HomepageHeader/>
<main>
<HomepageFeatures/>
<BrowserOnly>
{() => <BuyMeACoffee />}
</BrowserOnly>
</main>
</Layout>);
<HomepageHeader />
<main>
<HomepageFeatures />
<BrowserOnly>
{() => <BuyMeACoffee />}
</BrowserOnly>
</main>
</Layout>
);
}

7
docs/static/img/ai-player.svg vendored Normal file
View File

@@ -0,0 +1,7 @@
<svg width="96" height="96" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg">
<rect width="96" height="96" rx="16" fill="#3F0F8D"/>
<path d="M26 24H70V32H26V24Z" fill="white"/>
<path d="M36 44H44V52H36V44Z" fill="white"/>
<path d="M52 44H60V52H52V44Z" fill="white"/>
<path d="M36 60H60V68H36V60Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 335 B

1
docs/static/img/datafaker.svg vendored Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="gray" d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z"></path></svg>

After

Width:  |  Height:  |  Size: 263 B

345
docs/static/img/jnscli.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 501 KiB

13
docs/static/img/katie_logo_v3.svg vendored Normal file
View File

@@ -0,0 +1,13 @@
<svg width="539" height="122" viewBox="0 0 539 122" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M233.794 106.267L194.606 73.1369L230.215 42.896C233.395 40.1969 233.755 35.4621 231.017 32.3237C228.282 29.1851 223.482 28.8263 220.301 31.533L177.914 67.5271V10.039C177.914 5.89749 174.511 2.54163 170.316 2.54163C166.119 2.54163 162.717 5.89749 162.717 10.039V111.961C162.717 116.103 166.119 119.458 170.316 119.458C174.511 119.458 177.914 116.103 177.914 111.961V78.7709L223.905 117.655C225.339 118.865 227.096 119.458 228.847 119.458C230.988 119.458 233.116 118.571 234.62 116.84C237.35 113.694 236.981 108.961 233.794 106.267Z" fill="#414041"/>
<path d="M323.056 30.4831C318.932 30.4831 315.592 33.8533 315.592 38.0129V42.0425C307.753 33.3984 296.966 27.9584 285.263 27.9584C262.554 27.9584 244.075 49.0502 244.075 74.9781C244.075 100.907 262.554 122 285.263 122C298.217 122 308.397 116.775 315.592 108.901V112.96C315.592 117.12 318.932 120.49 323.056 120.49C327.178 120.49 330.519 117.12 330.519 112.96V38.0129C330.519 33.8533 327.178 30.4831 323.056 30.4831ZM285.263 106.941C271.027 106.941 259.002 92.3023 259.002 74.9781C259.002 57.6537 271.027 43.018 285.263 43.018C298.803 43.018 313.299 55.8594 313.299 74.9781C313.299 95.962 299.197 106.941 285.263 106.941Z" fill="#414041"/>
<path d="M411.244 105.137C409.576 101.309 405.12 99.5521 401.277 101.222C400.739 101.454 400.076 101.763 399.304 102.121C395.776 103.764 385.034 108.765 380.927 106.146C378.976 104.904 377.859 100.863 377.859 95.0546V43.0501H394.522C398.705 43.0501 402.096 39.6633 402.096 35.4831C402.096 31.3029 398.705 27.9159 394.522 27.9159H377.859V7.56714C377.859 3.38695 374.47 0 370.285 0C366.102 0 362.711 3.38695 362.711 7.56714V27.9159H350.805C346.621 27.9159 343.231 31.3029 343.231 35.4831C343.231 39.6633 346.621 43.0501 350.805 43.0501H362.711V95.0546C362.711 106.629 366.102 114.654 372.785 118.909C376.316 121.155 380.207 122 384.1 122C392.482 122 400.877 118.088 405.707 115.839C406.339 115.544 406.885 115.288 407.327 115.095C411.161 113.428 412.917 108.969 411.244 105.137Z" fill="#414041"/>
<path d="M502.288 122C487.874 122 460.527 111.883 460.187 73.5909C460.052 58.2558 464.703 45.0328 473.288 36.3573C480.37 29.1992 489.739 25.4166 500.381 25.4166C526.708 25.4166 537.58 47.0116 538.976 67.2225C539.168 69.9859 538.2 72.7323 536.321 74.7481C534.467 76.7394 531.854 77.8793 529.147 77.8793H475.52C477.843 105.988 499.689 106.84 502.288 106.84C516.078 106.84 523.655 98.4106 523.729 98.327C526.452 95.1443 531.226 94.7713 534.398 97.4901C537.577 100.209 537.951 104.994 535.234 108.177C534.754 108.742 523.197 122 502.288 122ZM476.301 62.7194H523.227C519.981 43.6041 507.776 40.5766 500.381 40.5766C493.774 40.5766 488.273 42.7479 484.036 47.0289C480.257 50.851 477.621 56.2473 476.301 62.7194Z" fill="#414041"/>
<path d="M434.759 33.0416C430.546 33.0416 427.132 36.4385 427.132 40.6307V111.869C427.132 116.061 430.546 119.458 434.759 119.458C438.973 119.458 442.387 116.061 442.387 111.869V40.6307C442.387 36.4385 438.973 33.0416 434.759 33.0416Z" fill="#414041"/>
<path d="M434.759 22.875C440.376 22.875 444.929 18.3232 444.929 12.7083C444.929 7.09347 440.376 2.54163 434.759 2.54163C429.142 2.54163 424.59 7.09347 424.59 12.7083C424.59 18.3232 429.142 22.875 434.759 22.875Z" fill="#414041"/>
<path d="M111.868 0H10.1698C4.55318 0 0 4.55177 0 10.1667V111.833C0 117.448 4.55318 122 10.1698 122H111.868C117.485 122 122.038 117.448 122.038 111.833V10.1667C122.038 4.55177 117.485 0 111.868 0Z" fill="#FF89BB"/>
<path d="M119.138 3H3.10229V119H119.138V3Z" fill="#FF89BB"/>
<path d="M37.0639 65.2438C41.7531 65.2438 45.5543 60.8104 45.5543 55.3414C45.5543 49.8724 41.7531 45.439 37.0639 45.439C32.3748 45.439 28.5735 49.8724 28.5735 55.3414C28.5735 60.8104 32.3748 65.2438 37.0639 65.2438Z" fill="#414041"/>
<path d="M82.3464 56.756C87.0355 56.756 90.8368 52.3226 90.8368 46.8536C90.8368 41.3846 87.0355 36.9512 82.3464 36.9512C77.6573 36.9512 73.856 41.3846 73.856 46.8536C73.856 52.3226 77.6573 56.756 82.3464 56.756Z" fill="#414041"/>
<path d="M59.8714 99.1951C42.5471 99.1951 30.8795 89.4538 30.3195 88.985C28.2142 87.1935 27.9803 84.0583 29.7949 81.9799C31.6096 79.9085 34.771 79.6705 36.8763 81.448C37.0748 81.616 49.2599 91.5603 65.9462 88.747C83.0366 85.8638 93.003 73.0154 93.1022 72.8894C94.768 70.699 97.9153 70.2511 100.134 71.8887C102.353 73.5262 102.821 76.6194 101.169 78.8168C100.673 79.4746 88.8208 94.9683 67.6333 98.5373C64.9468 98.9992 62.3453 99.1951 59.8714 99.1951Z" fill="#414041"/>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

1
docs/static/img/minecraft-spigot.svg vendored Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 448.012"><path fill="#424C57" fill-rule="nonzero" d="M386.912 404.082c-31.653 27.804-68.134 42.5-104.037 43.83-37.327 1.383-73.956-11.673-103.851-39.445l-15.148-14.072-54.139-44.075h-48.07c-25.406 0-43.633-20.936-46.214-46.212L.195 154.71c-2.581-25.279 20.879-48.258 46.214-46.215l189.276 15.258c25.335 2.042 46.214 20.793 46.214 46.215v134.14c0 25.418-20.805 46.212-46.214 46.212h-59.323l4.221 47.53 4.398 2.497c33.226 18.862 65.806 26.928 96.721 22.849 28.258-3.73 55.317-17.66 80.412-42.828l-15.449-13.603 64.278-14.309-7.532 67.307-16.499-15.681z"/><path fill="#337EC6" d="M276.315 73.91l113.118-9.119-30.176-17.127c-33.228-18.859-65.809-26.927-96.721-22.848-28.26 3.73-55.319 17.66-80.414 42.827l15.449 13.604-64.277 14.309 7.533-67.307 16.498 15.682C188.979 16.128 225.46 1.43 261.363.099c37.327-1.382 73.956 11.673 103.851 39.446l26.942 25.027 73.434-5.92c25.335-2.042 48.796 20.936 46.215 46.216l-15.258 149.397c-2.581 25.277-20.808 46.212-46.215 46.212h-50.099l-71.815 58.466 5.19-58.466h-57.293c-25.411 0-46.216-20.793-46.216-46.212V120.126c0-25.422 20.881-44.173 46.216-46.216z"/><path fill="#fff" d="M84.246 173.714h43.841v-12.353h19.585v12.353h44.001v20.281h-9.033c-1.629 12.811-5.21 23.368-11.297 34.746-5.149 9.611-11.796 18.87-19.516 27.744 12.32 14.735 27.616 27.554 45.826 39.24l-10.073 15.701c-19.119-12.267-35.356-25.774-48.699-41.332-11.936 11.547-25.496 22.303-39.7 32.127l-10.588-15.325c14.055-9.725 27.407-20.347 38.896-31.672-10.588-15.493-18.697-32.88-24.308-52.875l17.968-5.038c4.601 16.401 11.052 30.837 19.344 43.759 5.657-6.848 10.548-13.876 14.412-21.092 4.74-8.866 7.286-16.196 8.89-25.983H84.246v-20.281zM398.456 215.314h-55.931l-7.357 25.09h-27.814c11.988-31.729 25.831-69.829 37.825-101.573 4.318-11.466 9.234-30.467 24.943-30.467 16.284 0 21.691 17.409 26.222 29.436l38.4 103.122h-28.708l-7.58-25.608zm-6-24.398l-21.893-57.703-21.971 57.703h43.864z"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
docs/static/img/ollama4j-ui/1.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 606 KiB

BIN
docs/static/img/ollama4j-ui/2.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 KiB

BIN
docs/static/img/ollama4j-ui/3.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 KiB

BIN
docs/static/img/ollama4j-ui/4.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 916 KiB

12
docs/static/img/pmc-logo.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
metrics.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 KiB

BIN
ollama4j-new.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

231
pom.xml
View File

@@ -13,12 +13,13 @@
<packaging>jar</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.release>11</maven.compiler.release>
<project.build.outputTimestamp>${git.commit.time}
</project.build.outputTimestamp><!-- populated via git-commit-id-plugin -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
<maven-failsafe-plugin.version>3.0.0-M5</maven-failsafe-plugin.version>
<lombok.version>1.18.30</lombok.version>
<maven-surefire-plugin.version>3.5.4</maven-surefire-plugin.version>
<maven-failsafe-plugin.version>3.5.4</maven-failsafe-plugin.version>
<lombok.version>1.18.40</lombok.version>
</properties>
<developers>
@@ -46,10 +47,23 @@
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
<version>3.3.1</version>
<executions>
<execution>
<id>attach-sources</id>
@@ -62,13 +76,21 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.5.0</version>
<version>3.12.0</version>
<configuration>
<!-- to disable the "missing" warnings. Remove the doclint to enable warnings-->
<doclint>all,-missing</doclint>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
@@ -110,11 +132,10 @@
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<version>3.2.8</version>
<executions>
<execution>
<id>sign-artifacts</id>
@@ -126,7 +147,99 @@
</executions>
</plugin>
<plugin>
<groupId>io.github.git-commit-id</groupId>
<artifactId>git-commit-id-maven-plugin</artifactId>
<version>9.0.2</version>
<executions>
<execution>
<goals>
<goal>revision</goal>
</goals>
</execution>
</executions>
<configuration>
<dateFormat>yyyy-MM-dd'T'HH:mm:ss'Z'</dateFormat>
<dateFormatTimeZone>Etc/UTC</dateFormatTimeZone>
</configuration>
</plugin>
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<formats>
<!-- you can define as many formats as you want, each is independent -->
<format>
<!-- define the files to apply to -->
<includes>
<include>.gitattributes</include>
<include>.gitignore</include>
</includes>
<!-- define the steps to apply to those files -->
<trimTrailingWhitespace/>
<endWithNewline/>
<indent>
<tabs>true</tabs>
<spacesPerTab>4</spacesPerTab>
</indent>
</format>
</formats>
<!-- define a language-specific format -->
<java>
<!-- no need to specify files, inferred automatically, but you can if you want -->
<!-- apply a specific flavor of google-java-format and reflow long strings -->
<googleJavaFormat>
<version>1.28.0</version>
<style>AOSP</style>
<reflowLongStrings>true</reflowLongStrings>
<formatJavadoc>false</formatJavadoc>
</googleJavaFormat>
<!-- make sure every file has the following copyright header.
optionally, Spotless can set copyright years by digging
through git history (see "license" section below) -->
<licenseHeader>
<content>
<![CDATA[
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) $YEAR Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
]]>
</content> <!-- or <file>${project.basedir}/license-header</file> -->
</licenseHeader>
</java>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>compile</phase>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
@@ -136,45 +249,78 @@
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.21.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.1</version>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.17.1</version>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.6</version>
<version>1.5.18</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
<version>2.0.17</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.0</version>
<version>5.13.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>4.1.0</version>
<version>5.20.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20240205</version>
<version>20250517</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>ollama</artifactId>
<version>1.20.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>nginx</artifactId>
<version>1.21.3</version>
<scope>test</scope>
</dependency>
<!-- Prometheus metrics dependencies -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.16.0</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.5.0-jre</version>
</dependency>
</dependencies>
<distributionManagement>
@@ -200,7 +346,7 @@
<plugin>
<groupId>org.sonatype.central</groupId>
<artifactId>central-publishing-maven-plugin</artifactId>
<version>0.5.0</version>
<version>0.8.0</version>
<extensions>true</extensions>
<configuration>
<publishingServerId>mvn-repo-id</publishingServerId>
@@ -216,6 +362,7 @@
<test.env>unit</test.env>
<skipUnitTests>false</skipUnitTests>
<skipIntegrationTests>true</skipIntegrationTests>
<skipGpgPluginDuringTests>true</skipGpgPluginDuringTests>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
@@ -225,7 +372,7 @@
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.11</version>
<version>0.8.13</version>
<executions>
<execution>
<goals>
@@ -241,6 +388,23 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.8</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
<configuration>
<skip>${skipGpgPluginDuringTests}</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
@@ -250,7 +414,29 @@
<test.env>integration</test.env>
<skipUnitTests>true</skipUnitTests>
<skipIntegrationTests>false</skipIntegrationTests>
<skipGpgPluginDuringTests>true</skipGpgPluginDuringTests>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.8</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
<configuration>
<skip>${skipGpgPluginDuringTests}</skip>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>ci-cd</id>
@@ -264,7 +450,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.1.0</version>
<version>3.2.8</version>
<executions>
<execution>
<id>sign-artifacts</id>
@@ -286,7 +472,7 @@
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.13</version>
<version>1.7.0</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
@@ -294,11 +480,10 @@
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version>
<version>0.8.13</version>
<executions>
<execution>
<goals>
@@ -319,4 +504,4 @@
</profile>
</profiles>
</project>
</project>

File diff suppressed because it is too large Load Diff

View File

@@ -1,682 +0,0 @@
package io.github.ollama4j;
import io.github.ollama4j.exceptions.OllamaBaseException;
import io.github.ollama4j.exceptions.ToolInvocationException;
import io.github.ollama4j.exceptions.ToolNotFoundException;
import io.github.ollama4j.models.chat.OllamaChatMessage;
import io.github.ollama4j.models.chat.OllamaChatRequest;
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.OllamaEmbeddingsRequestModel;
import io.github.ollama4j.models.generate.OllamaGenerateRequest;
import io.github.ollama4j.models.generate.OllamaStreamHandler;
import io.github.ollama4j.models.ps.ModelsProcessResponse;
import io.github.ollama4j.models.request.*;
import io.github.ollama4j.models.response.*;
import io.github.ollama4j.tools.*;
import io.github.ollama4j.utils.Options;
import io.github.ollama4j.utils.Utils;
import lombok.Setter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpConnectTimeoutException;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.time.Duration;
import java.util.*;
/**
* The base Ollama API class.
*/
@SuppressWarnings("DuplicatedCode")
public class OllamaAPI {
private static final Logger logger = LoggerFactory.getLogger(OllamaAPI.class);
private final String host;
/**
* -- SETTER --
* Set request timeout in seconds. Default is 3 seconds.
*/
@Setter
private long requestTimeoutSeconds = 10;
/**
* -- SETTER --
* Set/unset logging of responses
*/
@Setter
private boolean verbose = true;
private BasicAuth basicAuth;
private final ToolRegistry toolRegistry = new ToolRegistry();
/**
* 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
*/
public OllamaAPI(String host) {
if (host.endsWith("/")) {
this.host = host.substring(0, host.length() - 1);
} else {
this.host = host;
}
}
/**
* Set basic authentication for accessing Ollama server that's behind a reverse-proxy/gateway.
*
* @param username the username
* @param password the password
*/
public void setBasicAuth(String username, String password) {
this.basicAuth = new BasicAuth(username, password);
}
/**
* API to check the reachability of Ollama server.
*
* @return true if the server is reachable, false otherwise.
*/
public boolean ping() {
String url = this.host + "/api/tags";
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest httpRequest = null;
try {
httpRequest =
getRequestBuilderDefault(new URI(url))
.header("Accept", "application/json")
.header("Content-type", "application/json")
.GET()
.build();
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
HttpResponse<String> response = null;
try {
response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
} catch (HttpConnectTimeoutException e) {
return false;
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
int statusCode = response.statusCode();
return statusCode == 200;
}
/**
* Provides a list of running models and details about each model currently loaded into memory.
*
* @return ModelsProcessResponse
*/
public ModelsProcessResponse ps() throws IOException, InterruptedException, OllamaBaseException {
String url = this.host + "/api/ps";
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest httpRequest = null;
try {
httpRequest =
getRequestBuilderDefault(new URI(url))
.header("Accept", "application/json")
.header("Content-type", "application/json")
.GET()
.build();
} catch (URISyntaxException e) {
throw new RuntimeException(e);
}
HttpResponse<String> response = null;
response = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
int statusCode = response.statusCode();
String responseString = response.body();
if (statusCode == 200) {
return Utils.getObjectMapper()
.readValue(responseString, ModelsProcessResponse.class);
} else {
throw new OllamaBaseException(statusCode + " - " + responseString);
}
}
/**
* List available models from Ollama server.
*
* @return the list
*/
public List<Model> listModels()
throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
String url = this.host + "/api/tags";
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();
if (statusCode == 200) {
return Utils.getObjectMapper()
.readValue(responseString, ListModelsResponse.class)
.getModels();
} else {
throw new OllamaBaseException(statusCode + " - " + responseString);
}
}
/**
* Pull a model on the Ollama server from the list of <a
* href="https://ollama.ai/library">available models</a>.
*
* @param modelName the name of the model
*/
public void pullModel(String modelName)
throws OllamaBaseException, IOException, URISyntaxException, InterruptedException {
String url = this.host + "/api/pull";
String jsonData = new ModelRequest(modelName).toString();
HttpRequest request =
getRequestBuilderDefault(new URI(url))
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
.header("Accept", "application/json")
.header("Content-type", "application/json")
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<InputStream> response =
client.send(request, HttpResponse.BodyHandlers.ofInputStream());
int statusCode = response.statusCode();
InputStream responseBodyStream = response.body();
String responseString = "";
try (BufferedReader reader =
new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
ModelPullResponse modelPullResponse =
Utils.getObjectMapper().readValue(line, ModelPullResponse.class);
if (verbose) {
logger.info(modelPullResponse.getStatus());
}
}
}
if (statusCode != 200) {
throw new OllamaBaseException(statusCode + " - " + responseString);
}
}
/**
* Gets model details from the Ollama server.
*
* @param modelName the model
* @return the model details
*/
public ModelDetail getModelDetails(String modelName)
throws IOException, OllamaBaseException, InterruptedException, URISyntaxException {
String url = this.host + "/api/show";
String jsonData = new ModelRequest(modelName).toString();
HttpRequest request =
getRequestBuilderDefault(new URI(url))
.header("Accept", "application/json")
.header("Content-type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
int statusCode = response.statusCode();
String responseBody = response.body();
if (statusCode == 200) {
return Utils.getObjectMapper().readValue(responseBody, ModelDetail.class);
} else {
throw new OllamaBaseException(statusCode + " - " + responseBody);
}
}
/**
* Create a custom model from a model file. Read more about custom model file creation <a
* href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md">here</a>.
*
* @param modelName the name of the custom model to be created.
* @param modelFilePath the path to model file that exists on the Ollama server.
*/
public void createModelWithFilePath(String modelName, String modelFilePath)
throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
String url = this.host + "/api/create";
String jsonData = new CustomModelFilePathRequest(modelName, modelFilePath).toString();
HttpRequest request =
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();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
int statusCode = response.statusCode();
String responseString = response.body();
if (statusCode != 200) {
throw new OllamaBaseException(statusCode + " - " + responseString);
}
// FIXME: Ollama API returns HTTP status code 200 for model creation failure cases. Correct this
// if the issue is fixed in the Ollama API server.
if (responseString.contains("error")) {
throw new OllamaBaseException(responseString);
}
if (verbose) {
logger.info(responseString);
}
}
/**
* Create a custom model from a model file. Read more about custom model file creation <a
* href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md">here</a>.
*
* @param modelName the name of the custom model to be created.
* @param modelFileContents the path to model file that exists on the Ollama server.
*/
public void createModelWithModelFileContents(String modelName, String modelFileContents)
throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
String url = this.host + "/api/create";
String jsonData = new CustomModelFileContentsRequest(modelName, modelFileContents).toString();
HttpRequest request =
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();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
int statusCode = response.statusCode();
String responseString = response.body();
if (statusCode != 200) {
throw new OllamaBaseException(statusCode + " - " + responseString);
}
if (responseString.contains("error")) {
throw new OllamaBaseException(responseString);
}
if (verbose) {
logger.info(responseString);
}
}
/**
* Delete a model from Ollama server.
*
* @param modelName the name of the model to be deleted.
* @param ignoreIfNotPresent ignore errors if the specified model is not present on Ollama server.
*/
public void deleteModel(String modelName, boolean ignoreIfNotPresent)
throws IOException, InterruptedException, OllamaBaseException, URISyntaxException {
String url = this.host + "/api/delete";
String jsonData = new ModelRequest(modelName).toString();
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();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
int statusCode = response.statusCode();
String responseBody = response.body();
if (statusCode == 404 && responseBody.contains("model") && responseBody.contains("not found")) {
return;
}
if (statusCode != 200) {
throw new OllamaBaseException(statusCode + " - " + responseBody);
}
}
/**
* Generate embeddings for a given text from a model
*
* @param model name of model to generate embeddings from
* @param prompt text to generate embeddings for
* @return embeddings
*/
public List<Double> generateEmbeddings(String model, String prompt)
throws IOException, InterruptedException, OllamaBaseException {
return generateEmbeddings(new OllamaEmbeddingsRequestModel(model, prompt));
}
/**
* Generate embeddings using a {@link OllamaEmbeddingsRequestModel}.
*
* @param modelRequest request for '/api/embeddings' endpoint
* @return embeddings
*/
public List<Double> generateEmbeddings(OllamaEmbeddingsRequestModel modelRequest) throws IOException, InterruptedException, OllamaBaseException {
URI uri = URI.create(this.host + "/api/embeddings");
String jsonData = modelRequest.toString();
HttpClient httpClient = HttpClient.newHttpClient();
HttpRequest.Builder requestBuilder =
getRequestBuilderDefault(uri)
.header("Accept", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonData));
HttpRequest request = requestBuilder.build();
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
int statusCode = response.statusCode();
String responseBody = response.body();
if (statusCode == 200) {
OllamaEmbeddingResponseModel embeddingResponse =
Utils.getObjectMapper().readValue(responseBody, OllamaEmbeddingResponseModel.class);
return embeddingResponse.getEmbedding();
} else {
throw new OllamaBaseException(statusCode + " - " + responseBody);
}
}
/**
* Generate response for a question to a model running on Ollama server. This is a sync/blocking
* call.
*
* @param model the ollama model to ask the question to
* @param prompt the prompt/question text
* @param options the Options object - <a
* href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values">More
* 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.
* @return OllamaResult that includes response text and time taken for response
*/
public OllamaResult generate(String model, String prompt, boolean raw, Options options, OllamaStreamHandler streamHandler)
throws OllamaBaseException, IOException, InterruptedException {
OllamaGenerateRequest ollamaRequestModel = new OllamaGenerateRequest(model, prompt);
ollamaRequestModel.setRaw(raw);
ollamaRequestModel.setOptions(options.getOptionsMap());
return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler);
}
/**
* Generates response using the specified AI model and prompt (in blocking mode).
* <p>
* Uses {@link #generate(String, String, boolean, Options, OllamaStreamHandler)}
*
* @param model The name or identifier of the AI model to use for generating the response.
* @param prompt The input text or prompt to provide to the AI model.
* @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.
* @return {@link OllamaResult}
*/
public OllamaResult generate(String model, String prompt, boolean raw, Options options)
throws OllamaBaseException, IOException, InterruptedException {
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
* on the generated response.
*
* @param model The name or identifier of the AI model to use for generating the response.
* @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.
* @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 IOException If there is an error related to input/output operations.
* @throws InterruptedException If the method is interrupted while waiting for the AI model
* to generate the response or for the tools to be invoked.
*/
public OllamaToolsResult generateWithTools(String model, String prompt, Options options)
throws OllamaBaseException, IOException, InterruptedException, ToolInvocationException {
boolean raw = true;
OllamaToolsResult toolResult = new OllamaToolsResult();
Map<ToolFunctionCallSpec, Object> toolResults = new HashMap<>();
OllamaResult result = generate(model, prompt, raw, options, null);
toolResult.setModelResult(result);
String toolsResponse = result.getResponse();
if (toolsResponse.contains("[TOOL_CALLS]")) {
toolsResponse = toolsResponse.replace("[TOOL_CALLS]", "");
}
List<ToolFunctionCallSpec> toolFunctionCallSpecs = Utils.getObjectMapper().readValue(toolsResponse, Utils.getObjectMapper().getTypeFactory().constructCollectionType(List.class, ToolFunctionCallSpec.class));
for (ToolFunctionCallSpec toolFunctionCallSpec : toolFunctionCallSpecs) {
toolResults.put(toolFunctionCallSpec, invokeTool(toolFunctionCallSpec));
}
toolResult.setToolResults(toolResults);
return toolResult;
}
/**
* 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
* an async/non-blocking call.
*
* @param model the ollama model to ask the question to
* @param prompt the prompt/question text
* @return the ollama async result callback handle
*/
public OllamaAsyncResultStreamer generateAsync(String model, String prompt, boolean raw) {
OllamaGenerateRequest ollamaRequestModel = new OllamaGenerateRequest(model, prompt);
ollamaRequestModel.setRaw(raw);
URI uri = URI.create(this.host + "/api/generate");
OllamaAsyncResultStreamer ollamaAsyncResultStreamer =
new OllamaAsyncResultStreamer(
getRequestBuilderDefault(uri), ollamaRequestModel, requestTimeoutSeconds);
ollamaAsyncResultStreamer.start();
return ollamaAsyncResultStreamer;
}
/**
* With one or more image files, ask a question to a model running on Ollama server. This is a
* sync/blocking call.
*
* @param model the ollama model to ask the question to
* @param prompt the prompt/question text
* @param imageFiles the list of image files to use for the question
* @param options the Options object - <a
* href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values">More
* 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.
* @return OllamaResult that includes response text and time taken for response
*/
public OllamaResult generateWithImageFiles(
String model, String prompt, List<File> imageFiles, Options options, OllamaStreamHandler streamHandler)
throws OllamaBaseException, IOException, InterruptedException {
List<String> images = new ArrayList<>();
for (File imageFile : imageFiles) {
images.add(encodeFileToBase64(imageFile));
}
OllamaGenerateRequest ollamaRequestModel = new OllamaGenerateRequest(model, prompt, images);
ollamaRequestModel.setOptions(options.getOptionsMap());
return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler);
}
/**
* Convenience method to call Ollama API without streaming responses.
* <p>
* Uses {@link #generateWithImageFiles(String, String, List, Options, OllamaStreamHandler)}
*/
public OllamaResult generateWithImageFiles(
String model, String prompt, List<File> imageFiles, Options options)
throws OllamaBaseException, IOException, InterruptedException {
return generateWithImageFiles(model, prompt, imageFiles, options, null);
}
/**
* With one or more image URLs, ask a question to a model running on Ollama server. This is a
* sync/blocking call.
*
* @param model the ollama model to ask the question to
* @param prompt the prompt/question text
* @param imageURLs the list of image URLs to use for the question
* @param options the Options object - <a
* href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values">More
* 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.
* @return OllamaResult that includes response text and time taken for response
*/
public OllamaResult generateWithImageURLs(
String model, String prompt, List<String> imageURLs, Options options, OllamaStreamHandler streamHandler)
throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
List<String> images = new ArrayList<>();
for (String imageURL : imageURLs) {
images.add(encodeByteArrayToBase64(Utils.loadImageBytesFromUrl(imageURL)));
}
OllamaGenerateRequest ollamaRequestModel = new OllamaGenerateRequest(model, prompt, images);
ollamaRequestModel.setOptions(options.getOptionsMap());
return generateSyncForOllamaRequestModel(ollamaRequestModel, streamHandler);
}
/**
* Convenience method to call Ollama API without streaming responses.
* <p>
* Uses {@link #generateWithImageURLs(String, String, List, Options, OllamaStreamHandler)}
*/
public OllamaResult generateWithImageURLs(String model, String prompt, List<String> imageURLs,
Options options)
throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
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
* 'api/chat'.
*
* @param model the ollama model to ask the question to
* @param messages chat history / message stack to send to the model
* @return {@link OllamaChatResult} containing the api response and the message history including the newly aqcuired assistant response.
* @throws OllamaBaseException any response code than 200 has been returned
* @throws IOException in case the responseStream can not be read
* @throws InterruptedException in case the server is not reachable or network issues happen
*/
public OllamaChatResult chat(String model, List<OllamaChatMessage> messages) throws OllamaBaseException, IOException, InterruptedException {
OllamaChatRequestBuilder builder = OllamaChatRequestBuilder.getInstance(model);
return chat(builder.withMessages(messages).build());
}
/**
* Ask a question to a model using an {@link OllamaChatRequest}. This can be constructed using an {@link OllamaChatRequestBuilder}.
* <p>
* Hint: the OllamaChatRequestModel#getStream() property is not implemented.
*
* @param request request object to be sent to the server
* @return {@link OllamaChatResult}
* @throws OllamaBaseException any response code than 200 has been returned
* @throws IOException in case the responseStream can not be read
* @throws InterruptedException in case the server is not reachable or network issues happen
*/
public OllamaChatResult chat(OllamaChatRequest request) throws OllamaBaseException, IOException, InterruptedException {
return chat(request, null);
}
/**
* Ask a question to a model using an {@link OllamaChatRequest}. This can be constructed using an {@link OllamaChatRequestBuilder}.
* <p>
* Hint: the OllamaChatRequestModel#getStream() property is not implemented.
*
* @param request request object to be sent to the server
* @param streamHandler callback handler to handle the last message from stream (caution: all previous messages from stream will be concatenated)
* @return {@link OllamaChatResult}
* @throws OllamaBaseException any response code than 200 has been returned
* @throws IOException in case the responseStream can not be read
* @throws InterruptedException in case the server is not reachable or network issues happen
*/
public OllamaChatResult chat(OllamaChatRequest request, OllamaStreamHandler streamHandler) throws OllamaBaseException, IOException, InterruptedException {
OllamaChatEndpointCaller requestCaller = new OllamaChatEndpointCaller(host, basicAuth, requestTimeoutSeconds, verbose);
OllamaResult result;
if (streamHandler != null) {
request.setStream(true);
result = requestCaller.call(request, streamHandler);
} else {
result = requestCaller.callSync(request);
}
return new OllamaChatResult(result.getResponse(), result.getResponseTime(), result.getHttpStatusCode(), request.getMessages());
}
public void registerTool(Tools.ToolSpecification toolSpecification) {
toolRegistry.addFunction(toolSpecification.getFunctionName(), toolSpecification.getToolDefinition());
}
// technical private methods //
private static String encodeFileToBase64(File file) throws IOException {
return Base64.getEncoder().encodeToString(Files.readAllBytes(file.toPath()));
}
private static String encodeByteArrayToBase64(byte[] bytes) {
return Base64.getEncoder().encodeToString(bytes);
}
private OllamaResult generateSyncForOllamaRequestModel(
OllamaGenerateRequest ollamaRequestModel, OllamaStreamHandler streamHandler)
throws OllamaBaseException, IOException, InterruptedException {
OllamaGenerateEndpointCaller requestCaller =
new OllamaGenerateEndpointCaller(host, basicAuth, requestTimeoutSeconds, verbose);
OllamaResult result;
if (streamHandler != null) {
ollamaRequestModel.setStream(true);
result = requestCaller.call(ollamaRequestModel, streamHandler);
} else {
result = requestCaller.callSync(ollamaRequestModel);
}
return result;
}
/**
* Get default request builder.
*
* @param uri URI to get a HttpRequest.Builder
* @return HttpRequest.Builder
*/
private HttpRequest.Builder getRequestBuilderDefault(URI uri) {
HttpRequest.Builder requestBuilder =
HttpRequest.newBuilder(uri)
.header("Content-Type", "application/json")
.timeout(Duration.ofSeconds(requestTimeoutSeconds));
if (isBasicAuthCredentialsSet()) {
requestBuilder.header("Authorization", getBasicAuthHeaderValue());
}
return requestBuilder;
}
/**
* Get basic authentication header value.
*
* @return basic authentication header value (encoded credentials)
*/
private String getBasicAuthHeaderValue() {
String credentialsToEncode = basicAuth.getUsername() + ":" + basicAuth.getPassword();
return "Basic " + Base64.getEncoder().encodeToString(credentialsToEncode.getBytes());
}
/**
* Check if Basic Auth credentials set.
*
* @return true when Basic Auth credentials set
*/
private boolean isBasicAuthCredentialsSet() {
return basicAuth != null;
}
private Object invokeTool(ToolFunctionCallSpec toolFunctionCallSpec) throws ToolInvocationException {
try {
String methodName = toolFunctionCallSpec.getName();
Map<String, Object> arguments = toolFunctionCallSpec.getArguments();
ToolFunction function = toolRegistry.getFunction(methodName);
if (verbose) {
logger.debug("Invoking function {} with arguments {}", methodName, arguments);
}
if (function == null) {
throw new ToolNotFoundException("No such tool: " + methodName);
}
return function.apply(arguments);
} catch (Exception e) {
throw new ToolInvocationException("Failed to invoke tool: " + toolFunctionCallSpec.getName(), e);
}
}
}

View File

@@ -0,0 +1,318 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.agent;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import io.github.ollama4j.Ollama;
import io.github.ollama4j.exceptions.OllamaException;
import io.github.ollama4j.impl.ConsoleOutputGenerateTokenHandler;
import io.github.ollama4j.models.chat.*;
import io.github.ollama4j.tools.ToolFunction;
import io.github.ollama4j.tools.Tools;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import lombok.*;
/**
* The {@code Agent} class represents an AI assistant capable of interacting with the Ollama API
* server.
*
* <p>It supports the use of tools (interchangeable code components), persistent chat history, and
* interactive as well as pre-scripted chat sessions.
*
* <h2>Usage</h2>
*
* <ul>
* <li>Instantiate an Agent via {@link #load(String)} for YAML-based configuration.
* <li>Handle conversation turns via {@link #interact(String, OllamaChatStreamObserver)}.
* <li>Use {@link #runInteractive()} for an interactive console-based session.
* </ul>
*/
public class Agent {
/**
* The agent's display name
*/
private final String name;
/**
* List of supported tools for this agent
*/
private final List<Tools.Tool> tools;
/**
* Ollama client instance for communication with the API
*/
private final Ollama ollamaClient;
/**
* The model name used for chat completions
*/
private final String model;
/**
* Persists chat message history across rounds
*/
private final List<OllamaChatMessage> chatHistory;
/**
* Optional custom system prompt for the agent
*/
private final String customPrompt;
/**
* Constructs a new Agent.
*
* @param name The agent's given name.
* @param ollamaClient The Ollama API client instance to use.
* @param model The model name to use for chat completion.
* @param customPrompt A custom prompt to prepend to all conversations (may be null).
* @param tools List of available tools for function calling.
*/
public Agent(
String name,
Ollama ollamaClient,
String model,
String customPrompt,
List<Tools.Tool> tools) {
this.name = name;
this.ollamaClient = ollamaClient;
this.chatHistory = new ArrayList<>();
this.tools = tools;
this.model = model;
this.customPrompt = customPrompt;
}
/**
* Loads and constructs an Agent from a YAML configuration file (classpath or filesystem).
*
* <p>The YAML should define the agent, the model, and the desired tool functions (using their
* fully qualified class names for auto-discovery).
*
* @param yamlPathOrResource Path or classpath resource name of the YAML file.
* @return New Agent instance loaded according to the YAML definition.
* @throws RuntimeException if the YAML cannot be read or agent cannot be constructed.
*/
public static Agent load(String yamlPathOrResource) {
try {
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
InputStream input =
Agent.class.getClassLoader().getResourceAsStream(yamlPathOrResource);
if (input == null) {
java.nio.file.Path filePath = java.nio.file.Paths.get(yamlPathOrResource);
if (java.nio.file.Files.exists(filePath)) {
input = java.nio.file.Files.newInputStream(filePath);
} else {
throw new RuntimeException(
yamlPathOrResource + " not found in classpath or file system");
}
}
AgentSpec agentSpec = mapper.readValue(input, AgentSpec.class);
List<AgentToolSpec> tools = agentSpec.getTools();
for (AgentToolSpec tool : tools) {
String fqcn = tool.getToolFunctionFQCN();
if (fqcn != null && !fqcn.isEmpty()) {
try {
Class<?> clazz = Class.forName(fqcn);
Object instance = clazz.getDeclaredConstructor().newInstance();
if (instance instanceof ToolFunction) {
tool.setToolFunctionInstance((ToolFunction) instance);
} else {
throw new RuntimeException(
"Class does not implement ToolFunction: " + fqcn);
}
} catch (Exception e) {
throw new RuntimeException(
"Failed to instantiate tool function: " + fqcn, e);
}
}
}
List<Tools.Tool> agentTools = new ArrayList<>();
for (AgentToolSpec a : tools) {
Tools.Tool t = new Tools.Tool();
t.setToolFunction(a.getToolFunctionInstance());
Tools.ToolSpec ts = new Tools.ToolSpec();
ts.setName(a.getName());
ts.setDescription(a.getDescription());
ts.setParameters(a.getParameters());
t.setToolSpec(ts);
agentTools.add(t);
}
Ollama ollama = new Ollama(agentSpec.getHost());
ollama.setRequestTimeoutSeconds(120);
return new Agent(
agentSpec.getName(),
ollama,
agentSpec.getModel(),
agentSpec.getCustomPrompt(),
agentTools);
} catch (Exception e) {
throw new RuntimeException("Failed to load agent from YAML", e);
}
}
/**
* Facilitates a single round of chat for the agent:
*
* <ul>
* <li>Builds/promotes the system prompt on the first turn if necessary
* <li>Adds the user's input to chat history
* <li>Submits the chat turn to the Ollama model (with tool/function support)
* <li>Updates internal chat history in accordance with the Ollama chat result
* </ul>
*
* @param userInput The user's message or question for the agent.
* @return The model's response as a string.
* @throws OllamaException If there is a problem with the Ollama API.
*/
public String interact(String userInput, OllamaChatStreamObserver chatTokenHandler)
throws OllamaException {
// Build a concise and readable description of available tools
String availableToolsDescription =
tools.isEmpty()
? ""
: tools.stream()
.map(
t ->
String.format(
"- %s: %s",
t.getToolSpec().getName(),
t.getToolSpec().getDescription() != null
? t.getToolSpec().getDescription()
: "No description"))
.reduce((a, b) -> a + "\n" + b)
.map(desc -> "\nYou have access to the following tools:\n" + desc)
.orElse("");
// Add system prompt if chatHistory is empty
if (chatHistory.isEmpty()) {
String systemPrompt =
String.format(
"You are a helpful AI assistant named %s. Your actions are limited to"
+ " using the available tools. %s%s",
name,
(customPrompt != null ? customPrompt : ""),
availableToolsDescription);
chatHistory.add(new OllamaChatMessage(OllamaChatMessageRole.SYSTEM, systemPrompt));
}
// Add the user input as a message before sending request
chatHistory.add(new OllamaChatMessage(OllamaChatMessageRole.USER, userInput));
OllamaChatRequest request =
OllamaChatRequest.builder()
.withTools(tools)
.withUseTools(true)
.withModel(model)
.withMessages(chatHistory)
.build();
OllamaChatResult response = ollamaClient.chat(request, chatTokenHandler);
// Update chat history for continuity
chatHistory.clear();
chatHistory.addAll(response.getChatHistory());
return response.getResponseModel().getMessage().getResponse();
}
/**
* Launches an endless interactive console session with the agent, echoing user input and the
* agent's response using the provided chat model and tools.
*
* <p>Type {@code exit} to break the loop and terminate the session.
*
* @throws OllamaException if any errors occur talking to the Ollama API.
*/
public void runInteractive() throws OllamaException {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("\n[You]: ");
String input = sc.nextLine();
if ("exit".equalsIgnoreCase(input)) break;
this.interact(
input,
new OllamaChatStreamObserver(
new ConsoleOutputGenerateTokenHandler(),
new ConsoleOutputGenerateTokenHandler()));
}
}
/**
* Bean describing an agent as definable from YAML.
*
* <ul>
* <li>{@code name}: Agent display name
* <li>{@code description}: Freeform description
* <li>{@code tools}: List of tools/functions to enable
* <li>{@code host}: Target Ollama host address
* <li>{@code model}: Name of Ollama model to use
* <li>{@code customPrompt}: Agent's custom base prompt
* <li>{@code requestTimeoutSeconds}: Timeout for requests
* </ul>
*/
@Data
public static class AgentSpec {
private String name;
private String description;
private List<AgentToolSpec> tools;
private String host;
private String model;
private String customPrompt;
private int requestTimeoutSeconds;
}
/**
* Subclass extension of {@link Tools.ToolSpec}, which allows associating a tool with a function
* implementation (via FQCN).
*/
@Data
@Setter
@Getter
@EqualsAndHashCode(callSuper = false)
private static class AgentToolSpec extends Tools.ToolSpec {
/**
* Fully qualified class name of the tool's {@link ToolFunction} implementation
*/
private String toolFunctionFQCN = null;
/**
* Instance of the {@link ToolFunction} to invoke
*/
private ToolFunction toolFunctionInstance = null;
}
/**
* Bean for describing a tool function parameter for use in agent YAML definitions.
*/
@Data
public class AgentToolParameter {
/**
* The parameter's type (e.g., string, number, etc.)
*/
private String type;
/**
* Description of the parameter
*/
private String description;
/**
* Whether this parameter is required
*/
private boolean required;
/**
* Enum values (if any) that this parameter may take; _enum used because 'enum' is reserved
*/
private List<String> _enum; // `enum` is a reserved keyword, so use _enum or similar
}
}

View File

@@ -1,8 +0,0 @@
package io.github.ollama4j.exceptions;
public class OllamaBaseException extends Exception {
public OllamaBaseException(String s) {
super(s);
}
}

View File

@@ -0,0 +1,20 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.exceptions;
public class OllamaException extends Exception {
public OllamaException(String message) {
super(message);
}
public OllamaException(String message, Exception exception) {
super(message, exception);
}
}

View File

@@ -0,0 +1,16 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.exceptions;
public class RoleNotFoundException extends Exception {
public RoleNotFoundException(String s) {
super(s);
}
}

View File

@@ -1,7 +1,19 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.exceptions;
public class ToolInvocationException extends Exception {
public ToolInvocationException(String s) {
super(s);
}
public ToolInvocationException(String s, Exception e) {
super(s, e);
}

View File

@@ -1,3 +1,11 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.exceptions;
public class ToolNotFoundException extends Exception {

View File

@@ -0,0 +1,18 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.impl;
import io.github.ollama4j.models.chat.OllamaChatStreamObserver;
public final class ConsoleOutputChatTokenHandler extends OllamaChatStreamObserver {
public ConsoleOutputChatTokenHandler() {
setThinkingStreamHandler(new ConsoleOutputGenerateTokenHandler());
setResponseStreamHandler(new ConsoleOutputGenerateTokenHandler());
}
}

View File

@@ -0,0 +1,18 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.impl;
import io.github.ollama4j.models.generate.OllamaGenerateTokenHandler;
public class ConsoleOutputGenerateTokenHandler implements OllamaGenerateTokenHandler {
@Override
public void accept(String message) {
System.out.print(message);
}
}

View File

@@ -1,14 +0,0 @@
package io.github.ollama4j.impl;
import io.github.ollama4j.models.generate.OllamaStreamHandler;
public class ConsoleOutputStreamHandler implements OllamaStreamHandler {
private final StringBuffer response = new StringBuffer();
@Override
public void accept(String message) {
String substr = message.substring(response.length());
response.append(substr);
System.out.print(substr);
}
}

View File

@@ -0,0 +1,129 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.metrics;
import com.google.common.base.Throwables;
import io.prometheus.client.Counter;
import io.prometheus.client.Histogram;
import java.util.Map;
public class MetricsRecorder {
// Corrected: Removed duplicate "format" label and ensured label count matches usage
private static final Counter requests =
Counter.build()
.name("ollama_api_requests_total")
.help("Total requests to Ollama API")
.labelNames(
"endpoint",
"model",
"raw",
"streaming",
"thinking",
"http_status",
"options",
"format")
.register();
private static final Histogram requestLatency =
Histogram.build()
.name("ollama_api_request_duration_seconds")
.help("Request latency in seconds")
.labelNames(
"endpoint",
"model",
"raw",
"streaming",
"thinking",
"http_status",
"options",
"format")
.register();
private static final Histogram responseSize =
Histogram.build()
.name("ollama_api_response_size_bytes")
.help("Response size in bytes")
.labelNames("endpoint", "model", "options")
.register();
public static void record(
String endpoint,
String model,
boolean raw,
boolean thinking,
boolean streaming,
Map<String, Object> options,
Object format,
long startTime,
int responseHttpStatus,
Object response) {
long endTime = System.currentTimeMillis();
String httpStatus = String.valueOf(responseHttpStatus);
String formatString = "";
if (format instanceof String) {
formatString = (String) format;
} else if (format instanceof Map) {
formatString = mapToString((Map<String, Object>) format);
} else if (format != null) {
formatString = format.toString();
}
// Ensure the number of labels matches the labelNames above (8 labels)
requests.labels(
endpoint,
safe(model),
String.valueOf(raw),
String.valueOf(streaming),
String.valueOf(thinking),
httpStatus,
safe(mapToString(options)),
safe(formatString))
.inc();
double durationSeconds = (endTime - startTime) / 1000.0;
// Ensure the number of labels matches the labelNames above (8 labels)
requestLatency
.labels(
endpoint,
safe(model),
String.valueOf(raw),
String.valueOf(streaming),
String.valueOf(thinking),
httpStatus,
safe(mapToString(options)),
safe(formatString))
.observe(durationSeconds);
// Record response size (only if response is a string or json-like object)
if (response != null) {
if (response instanceof Exception) {
response = Throwables.getStackTraceAsString((Throwable) response);
}
int size = response.toString().length();
responseSize.labels(endpoint, safe(model), safe(mapToString(options))).observe(size);
}
}
// Utility method to convert options Map to string (you can adjust this for more detailed
// representation)
private static String mapToString(Map<String, Object> map) {
if (map == null || map.isEmpty()) {
return "none";
}
// Convert the map to a string (can be customized to fit the use case)
return map.toString();
}
private static String safe(String value) {
return (value == null || value.isEmpty()) ? "none" : value;
}
}

View File

@@ -1,45 +1,57 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.models.chat;
import static io.github.ollama4j.utils.Utils.getObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.github.ollama4j.utils.FileToBase64Serializer;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.*;
/**
* Defines a single Message to be used inside a chat request against the ollama /api/chat endpoint.
*
* @see <a href="https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-chat-completion">Generate chat completion</a>
* @see <a
* href="https://github.com/ollama/ollama/blob/main/docs/api.md#generate-a-chat-completion">Generate
* chat completion</a>
*/
@SuppressWarnings("NullableProblems")
@Data
@AllArgsConstructor
@RequiredArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class OllamaChatMessage {
@NonNull
private OllamaChatMessageRole role;
@NonNull private OllamaChatMessageRole role;
@JsonProperty("content")
@NonNull
private String content;
private String response;
private String thinking;
private @JsonProperty("tool_calls") List<OllamaChatToolCalls> toolCalls;
@JsonSerialize(using = FileToBase64Serializer.class)
private List<byte[]> images;
@Override
public String toString() {
try {
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
@Override
public String toString() {
try {
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
}

View File

@@ -1,19 +1,57 @@
/*
* Ollama4j - Java library for interacting with Ollama server.
* Copyright (c) 2025 Amith Koujalgi and contributors.
*
* Licensed under the MIT License (the "License");
* you may not use this file except in compliance with the License.
*
*/
package io.github.ollama4j.models.chat;
import com.fasterxml.jackson.annotation.JsonValue;
import io.github.ollama4j.exceptions.RoleNotFoundException;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
/**
* Defines the possible Chat Message roles.
*/
public enum OllamaChatMessageRole {
SYSTEM("system"),
USER("user"),
ASSISTANT("assistant");
@Getter
public class OllamaChatMessageRole {
private static final List<OllamaChatMessageRole> roles = new ArrayList<>();
@JsonValue
private String roleName;
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");
private OllamaChatMessageRole(String roleName){
@JsonValue private final String roleName;
private OllamaChatMessageRole(String roleName) {
this.roleName = roleName;
roles.add(this);
}
public static OllamaChatMessageRole newCustomRole(String roleName) {
return new OllamaChatMessageRole(roleName);
}
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;
}
}

Some files were not shown because too many files have changed in this diff Show More