Compare commits
772 Commits
docs-build
...
snyk-upgra
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ceb1e6f338 | ||
|
|
64c629775a | ||
|
|
46f2d62fed | ||
|
|
b91943066e | ||
|
|
58d73637bb | ||
|
|
0ffaac65d4 | ||
|
|
4ce9c4c191 | ||
|
|
4681b1986f | ||
|
|
89d42fd469 | ||
|
|
8a903f695e | ||
|
|
3a20af25f1 | ||
|
|
24046b6660 | ||
|
|
453112d09f | ||
|
|
42a0034728 | ||
|
|
d8d660be8d | ||
|
|
c5a2d583c7 | ||
|
|
cd656264cf | ||
|
|
272c8204c7 | ||
|
|
23c7321b63 | ||
|
|
e24a38f89f | ||
|
|
5847cfc94c | ||
|
|
05d5958307 | ||
|
|
ffa81cb7df | ||
|
|
bd231e639d | ||
|
|
73a0a48eab | ||
|
|
fd18a247d7 | ||
|
|
501c35fa44 | ||
|
|
f114181fe2 | ||
|
|
b347faff83 | ||
|
|
16e14ddd1c | ||
|
|
2117d42f60 | ||
|
|
79b8dbaefd | ||
|
|
04f5c28052 | ||
|
|
a4da036389 | ||
|
|
a73cf015d6 | ||
|
|
35bf3de62a | ||
|
|
6fce6ec777 | ||
|
|
61fe8b2b56 | ||
|
|
dd1022a990 | ||
|
|
36f7d14c68 | ||
|
|
e9a4599714 | ||
|
|
e06507a06b | ||
|
|
195b54e07e | ||
|
|
b05242873d | ||
|
|
eccb052de8 | ||
|
|
077dd36b3c | ||
|
|
6405b36854 | ||
|
|
99f413282c | ||
|
|
b3e5af30ab | ||
|
|
b8b2bb5f7a | ||
|
|
806fa726c1 | ||
|
|
1f0ea0ac4d | ||
|
|
0b271383fd | ||
|
|
11e77a9151 | ||
|
|
143f7f47a2 | ||
|
|
3ea9d5021e | ||
|
|
031076b498 | ||
|
|
305bab9819 | ||
|
|
f5ca5bdca3 | ||
|
|
fe82550637 | ||
|
|
53e4b413ec | ||
|
|
07878ddf36 | ||
|
|
cc232c1383 | ||
|
|
52c60d9d18 | ||
|
|
d400998fa2 | ||
|
|
827bedb696 | ||
|
|
54c48cb106 | ||
|
|
944178abce | ||
|
|
9defbb7991 | ||
|
|
c857453654 | ||
|
|
d3495c1def | ||
|
|
a9f6d4671c | ||
|
|
5ef1ea906d | ||
|
|
d6f5b5c313 | ||
|
|
f0c6ce2b8d | ||
|
|
f60491885f | ||
|
|
7a2a307a0a | ||
|
|
f6d52114b8 | ||
|
|
cac94e0faf | ||
|
|
e4c14863fb | ||
|
|
6147c7d697 | ||
|
|
751b11881f | ||
|
|
5da9bc8626 | ||
|
|
90613c0ec1 | ||
|
|
cb0f71ba63 | ||
|
|
d118958ac1 | ||
|
|
8df36a9b98 | ||
|
|
5b71c8eacf | ||
|
|
0aeabcc963 | ||
|
|
7788f954d6 | ||
|
|
fe87c4ccc8 | ||
|
|
4f02b299c3 | ||
|
|
274da54d50 | ||
|
|
ca400cfbba | ||
|
|
e437ba8128 | ||
|
|
5e9f515c66 | ||
|
|
5bfdfa2aa1 | ||
|
|
14666357bd | ||
|
|
b53a391492 | ||
|
|
dab2111f10 | ||
|
|
c15048954c | ||
|
|
ba3d8925f2 | ||
|
|
300f1691e7 | ||
|
|
a1b5756107 | ||
|
|
b1d3ee54a5 | ||
|
|
4df4ea1930 | ||
|
|
2f83a5c98c | ||
|
|
cae8b6e1e4 | ||
|
|
da21bdcf85 | ||
|
|
ac92766c6c | ||
|
|
329381b1ee | ||
|
|
fc1f842f6b | ||
|
|
70519e3309 | ||
|
|
656802b343 | ||
|
|
44c6236243 | ||
|
|
51501cf5e1 | ||
|
|
9dabf678e5 | ||
|
|
e2231a0dbd | ||
|
|
f4ce7e2ec6 | ||
|
|
9fd908bb71 | ||
|
|
c3eedb4785 | ||
|
|
f6f4dfb9f7 | ||
|
|
739f5213a6 | ||
|
|
79ebce842d | ||
|
|
bafd84b0c9 | ||
|
|
cad2654fa2 | ||
|
|
dcde3d7738 | ||
|
|
5c76ab69a5 | ||
|
|
7bd3bed5e4 | ||
|
|
356bd0b81f | ||
|
|
898c34a157 | ||
|
|
d037f45f94 | ||
|
|
1e487fb6ea | ||
|
|
2ad0b03863 | ||
|
|
8e2be82a2b | ||
|
|
1d4d9fa48c | ||
|
|
704ed81ad9 | ||
|
|
8a7554efb8 | ||
|
|
dcc6cdf20f | ||
|
|
390b1e4ba3 | ||
|
|
d48fd02a99 | ||
|
|
05bb69db58 | ||
|
|
fb8a88d8f9 | ||
|
|
4f418794fd | ||
|
|
52d68ad80a | ||
|
|
7da308b563 | ||
|
|
e24ff2c652 | ||
|
|
94aa7669d9 | ||
|
|
44e590caa3 | ||
|
|
37e429cfca | ||
|
|
599874eba2 | ||
|
|
b4c1899561 | ||
|
|
faf847a742 | ||
|
|
77c9a42b2d | ||
|
|
9ea10b8455 | ||
|
|
e8a7675845 | ||
|
|
e29ae93c53 | ||
|
|
3ee93f9534 | ||
|
|
bf8878d40c | ||
|
|
fc077819a9 | ||
|
|
281eb6560d | ||
|
|
74fbafeb3f | ||
|
|
56c3f90559 | ||
|
|
27a2d68e9b | ||
|
|
085fe3a9b0 | ||
|
|
bb1adacc7f | ||
|
|
fdc2e39646 | ||
|
|
773cb4af78 | ||
|
|
9036d9e7c6 | ||
|
|
fddd753a48 | ||
|
|
b42cee36ae | ||
|
|
4694d31e2c | ||
|
|
4abecd1d76 | ||
|
|
5ae999078c | ||
|
|
538db8f484 | ||
|
|
ca79831c1e | ||
|
|
255173c6ac | ||
|
|
8d197f963d | ||
|
|
3c5107f113 | ||
|
|
80ee58ba1e | ||
|
|
d219168451 | ||
|
|
977b85f8ea | ||
|
|
9b31fa5390 | ||
|
|
0e0c83a065 | ||
|
|
3ddfd4fb4e | ||
|
|
a093be5581 | ||
|
|
cfd784b919 | ||
|
|
a3ebe6c992 | ||
|
|
4eefb81a0b | ||
|
|
f914707536 | ||
|
|
931d5dd520 | ||
|
|
b216d1b647 | ||
|
|
4de3d98b79 | ||
|
|
6fa5c323b8 | ||
|
|
c754bd11da | ||
|
|
5f5fa8ecae | ||
|
|
6ae6f4f25b | ||
|
|
6b69284497 | ||
|
|
52d7dbd7ce | ||
|
|
2070753c5e | ||
|
|
c1f7fb78d9 | ||
|
|
b71cf87ec2 | ||
|
|
0965c3046e | ||
|
|
8e50bc8d75 | ||
|
|
be5b77c4ac | ||
|
|
6078db6157 | ||
|
|
97f457575d | ||
|
|
4df59d8862 | ||
|
|
621004e6d8 | ||
|
|
74b2ab13e7 | ||
|
|
8fef5148d9 | ||
|
|
b91f6e6b25 | ||
|
|
0ec20d14b0 | ||
|
|
c705432510 | ||
|
|
de379d73b2 | ||
|
|
ad1bf658a9 | ||
|
|
ab9b95dbed | ||
|
|
7f37233c72 | ||
|
|
77aa3b85d1 | ||
|
|
863c978d12 | ||
|
|
cc950b893e | ||
|
|
f085b633af | ||
|
|
3d0b3eeb7f | ||
|
|
4a69df4476 | ||
|
|
639249d346 | ||
|
|
8d9ee006ee | ||
|
|
14642e9856 | ||
|
|
3efd7712be | ||
|
|
d2417b0082 | ||
|
|
bae903f8ca | ||
|
|
1e17e258b6 | ||
|
|
cc13a580fa | ||
|
|
54d8cf4cd9 | ||
|
|
03da285d1c | ||
|
|
339f788832 | ||
|
|
ccf738127d | ||
|
|
b90c7a027a | ||
|
|
2b0506a393 | ||
|
|
81278be964 | ||
|
|
cef4a00d17 | ||
|
|
9083c3ace3 | ||
|
|
79923451d0 | ||
|
|
02168e6fd9 | ||
|
|
a3debc0983 | ||
|
|
9a0908f504 | ||
|
|
4d03673d8c | ||
|
|
c4ebd5cd31 | ||
|
|
43361ff271 | ||
|
|
f1d9fc154a | ||
|
|
9811d9f7fd | ||
|
|
63e2fc2c49 | ||
|
|
63b3bcb71e | ||
|
|
9d9bc53e0b | ||
|
|
8fd203931d | ||
|
|
9c181486a5 | ||
|
|
2b036c8a62 | ||
|
|
ec0ebc9654 | ||
|
|
c2e4e3fa7f | ||
|
|
d6a57560fe | ||
|
|
a4c47216f5 | ||
|
|
202fbef8b7 | ||
|
|
48d0a494ee | ||
|
|
b2e1330ec0 | ||
|
|
a2d95a052a | ||
|
|
d86217dd0b | ||
|
|
70b4a7961a | ||
|
|
0248f21654 | ||
|
|
252ea50717 | ||
|
|
1155a9be9f | ||
|
|
bc87d0c7ec | ||
|
|
a895e3a0ea | ||
|
|
68acedfd0a | ||
|
|
be08f11027 | ||
|
|
b9b18271a1 | ||
|
|
12aa38cab0 | ||
|
|
b05f1d9b12 | ||
|
|
bc2a931586 | ||
|
|
1bda78e35b | ||
|
|
e7e71f6421 | ||
|
|
57f874921c | ||
|
|
2d7902167b | ||
|
|
407b7eb280 | ||
|
|
e62a7511db | ||
|
|
c904a69b09 | ||
|
|
11bf20c405 | ||
|
|
c3273ea8ca | ||
|
|
f6a29842b5 | ||
|
|
3781ea7a51 | ||
|
|
6f1da25f7e | ||
|
|
e74ef7115c | ||
|
|
c9db51a71e | ||
|
|
681a692ca9 | ||
|
|
9a6065fdb3 | ||
|
|
e245d9633f | ||
|
|
590364dd53 | ||
|
|
bb4e7477bd | ||
|
|
c33c1c8315 | ||
|
|
05eecdccaa | ||
|
|
26bb2f9bab | ||
|
|
bbafc95577 | ||
|
|
bee09aa626 | ||
|
|
8aa6e3b066 | ||
|
|
d40912c638 | ||
|
|
ba0444194f | ||
|
|
ac3f505aa6 | ||
|
|
7e5ca53fda | ||
|
|
2b0238b9e8 | ||
|
|
469a0fe491 | ||
|
|
983a3617f0 | ||
|
|
b638b981c9 | ||
|
|
fe5078891f | ||
|
|
44b4de9ed9 | ||
|
|
854c0b4acf | ||
|
|
18c5d06a6c | ||
|
|
22b403d0b0 | ||
|
|
ee0493eb57 | ||
|
|
f966b4b74e | ||
|
|
1dadbacd2c | ||
|
|
714c16c216 | ||
|
|
cf2c510b23 | ||
|
|
a0bcc47b2e | ||
|
|
57ecbc2572 | ||
|
|
99beb3e6d0 | ||
|
|
7756eed9a0 | ||
|
|
b795117f0a | ||
|
|
0d091d1826 | ||
|
|
9fd77a6743 | ||
|
|
57a962148b | ||
|
|
3c64f2099f | ||
|
|
a9c7f4e5e0 | ||
|
|
e7f58d4e0d | ||
|
|
138497b30f | ||
|
|
3a792090e2 | ||
|
|
7ef859bba5 | ||
|
|
3c30593e1e | ||
|
|
98b794ca2b | ||
|
|
bc90a15a68 | ||
|
|
bb4689e94b | ||
|
|
6739c93edc | ||
|
|
c8c30d703b | ||
|
|
419b0369c9 | ||
|
|
d9a94b95e1 | ||
|
|
db1db948c8 | ||
|
|
41ad780224 | ||
|
|
cb58c6a9b0 | ||
|
|
d1115e0b35 | ||
|
|
740bd3750b | ||
|
|
c9aa6c9e08 | ||
|
|
71bba6ee0d | ||
|
|
27b2201ff9 | ||
|
|
23d23c4ad7 | ||
|
|
e409ff1cf9 | ||
|
|
9a12cebb68 | ||
|
|
24f5bc4fec | ||
|
|
d7c313417b | ||
|
|
b67b4c7eb5 | ||
|
|
ab70201844 | ||
|
|
ac8a40a017 | ||
|
|
1ac65f821b | ||
|
|
d603c4b94b | ||
|
|
a418cbc1dc | ||
|
|
785dd12730 | ||
|
|
dda807d818 | ||
|
|
a06a4025fa | ||
| 761fbc3398 | |||
| a96dc11679 | |||
| b2b3febdaa | |||
|
|
f27bea11d5 | ||
|
|
9503451d5a | ||
|
|
04bae4ca6a | ||
|
|
3e33b8df62 | ||
|
|
a494053263 | ||
|
|
260c57ca84 | ||
|
|
db008de0ca | ||
|
|
1b38466f44 | ||
|
|
26ec00dab8 | ||
|
|
5e6971cc4a | ||
|
|
8b3417ecda | ||
|
|
35f5f34196 | ||
|
|
d8c3edd55f | ||
|
|
7ffbc5d3f2 | ||
|
|
c4b7830614 | ||
|
|
69f6fd81cf | ||
|
|
b6a293add7 | ||
|
|
25694a8bc9 | ||
|
|
12bb10392e | ||
|
|
e9c33ab0b2 | ||
|
|
903a8176cd | ||
|
|
4a91918e84 | ||
|
|
ff3344616c | ||
|
|
726fea5b74 | ||
|
|
a09f1362e9 | ||
|
|
4ef0821932 | ||
|
|
2d3cf228cb | ||
|
|
5b3713c69e | ||
|
|
e9486cbb8e | ||
|
|
057f0babeb | ||
|
|
da146640ca | ||
|
|
82be761b86 | ||
|
|
9c3fc49df1 | ||
|
|
5f19eb17ac | ||
|
|
ecb04d6d82 | ||
|
|
3fc7e9423c | ||
|
|
405a08b330 | ||
|
|
921f745435 | ||
|
|
bedfec6bf9 | ||
|
|
afa09e87a5 | ||
|
|
baf2320ea6 | ||
|
|
948a7444fb | ||
|
|
ec0eb8b469 | ||
|
|
8f33de7e59 | ||
|
|
8c59e6511b | ||
|
|
b93fc7623a | ||
|
|
bd1a57c7e0 | ||
|
|
7fabead249 | ||
|
|
268a973d5e | ||
|
|
d949a3cb69 | ||
|
|
e2443ed68a | ||
|
|
37193b1f5b | ||
|
|
e33071ae38 | ||
|
|
fffc8dc526 | ||
|
|
def950cc9c | ||
|
|
f4db7ca326 | ||
|
|
18760250ea | ||
|
|
233597efd1 | ||
|
|
cec9f29eb7 | ||
|
|
20cb92a418 | ||
|
|
b0dc38954b | ||
|
|
1479d0a494 | ||
|
|
b328daee43 | ||
|
|
b90c8bc622 | ||
|
|
660a1b937a | ||
|
|
fd961d7037 | ||
|
|
b48f9550c3 | ||
|
|
363969a275 | ||
|
|
992625cf86 | ||
|
|
bbebd26d07 | ||
|
|
3aa0fc77cb | ||
|
|
11a98a72a1 | ||
|
|
422601c0fc | ||
|
|
75e6576a13 | ||
|
|
51dd3f3e1e | ||
|
|
30250f79d9 | ||
|
|
d4ee9ed051 | ||
|
|
4412ac683a | ||
|
|
b5b1a26941 | ||
|
|
a84230bbd1 | ||
|
|
00c9b16556 | ||
|
|
9a2194334f | ||
|
|
f9cf11ecdf | ||
|
|
0af80865c3 | ||
|
|
a304c01194 | ||
|
|
887708864e | ||
|
|
2f0c4fdcc9 | ||
|
|
73aabd7ca6 | ||
|
|
17ca2bdee3 | ||
|
|
e43bd3acb4 | ||
|
|
0b041f4340 | ||
|
|
6c6062b757 | ||
|
|
68fd8b7cc8 | ||
|
|
bb6f8aa343 | ||
|
|
12802be0bc | ||
|
|
bd56ccfef7 | ||
|
|
51563f276f | ||
|
|
6e282124bf | ||
|
|
3ab9e4c283 | ||
|
|
2db6a22cc7 | ||
|
|
cc69341620 | ||
|
|
4589a9032c | ||
|
|
da273402b5 | ||
|
|
cfa8aa14d7 | ||
|
|
bc4e8303aa | ||
|
|
f2f740a2a0 | ||
|
|
4cbb783a61 | ||
|
|
5c9e0b7d8a | ||
|
|
2f8577a24d | ||
|
|
02116b7025 | ||
|
|
f3778f8786 | ||
|
|
c6141634db | ||
|
|
d9f98ad901 | ||
|
|
79d97445b8 | ||
|
|
1c40697c96 | ||
|
|
f03026abb3 | ||
|
|
63a6e81ac2 | ||
|
|
76cad0f584 | ||
|
|
bee2908d1e | ||
|
|
8a4c9fd969 | ||
|
|
d470f940b0 | ||
|
|
df402efaba | ||
|
|
677362abbf | ||
|
|
81689be194 | ||
|
|
fd93036d08 | ||
|
|
c9b05a725b | ||
|
|
a4e1b4afe9 | ||
|
|
3d21813abb | ||
|
|
383d0f56ca | ||
|
|
af1b213a76 | ||
|
|
fed89a9643 | ||
|
|
fd32aa33ff | ||
|
|
b8a13e89b1 | ||
|
|
c8f27edd6e | ||
|
|
5a936d8174 | ||
|
|
9b5ddbf4c4 | ||
|
|
7c233d5734 | ||
|
|
e85aeae6e0 | ||
|
|
a05052e095 | ||
|
|
10eb803e26 | ||
|
|
bd2da8fdda | ||
|
|
b0bb082bec | ||
|
|
81f564ef7f | ||
|
|
006b52f3db | ||
|
|
16634e60e4 | ||
|
|
db8b73075b | ||
|
|
dc9f79959a | ||
|
|
88f6d00763 | ||
|
|
fd3a989a49 | ||
|
|
7580c6a549 | ||
|
|
9e6503d84b | ||
|
|
ee21f7fdd8 | ||
|
|
ecc295f484 | ||
|
|
c528fef5fc | ||
|
|
38f1bda105 | ||
|
|
d8a703503a | ||
|
|
dd9ba7c937 | ||
|
|
cf52c9610c | ||
|
|
e8d709e99a | ||
|
|
51fbedad69 | ||
|
|
953605fa73 | ||
|
|
30bfdd9c6d | ||
|
|
91ee6cb4c1 | ||
|
|
8ef6fac28e | ||
|
|
d9e3860123 | ||
|
|
515d1f0399 | ||
|
|
be549430c5 | ||
|
|
4744315d45 | ||
|
|
8eea19a539 | ||
|
|
b5801d84e0 | ||
|
|
165d04b1bb | ||
|
|
16d2160b52 | ||
|
|
e39c47b8e1 | ||
|
|
bb0785140b | ||
|
|
e33ad1a1e3 | ||
|
|
cd60c506cb | ||
|
|
b55925df28 | ||
|
|
3a9b8c309d | ||
|
|
bf07159522 | ||
|
|
f8ca4d041d | ||
|
|
9c6a55f7b0 | ||
|
|
2866d83a2f | ||
|
|
45e5d07581 | ||
|
|
3a264cb6bb | ||
|
|
e1b9d42771 | ||
|
|
1a086c37c0 | ||
|
|
54edba144c | ||
|
|
3ed3187ba9 | ||
|
|
b7cd81a7f5 | ||
|
|
e750c2d7f9 | ||
|
|
62f16131f3 | ||
|
|
2cbaf12d7c | ||
|
|
e2d555d404 | ||
|
|
c296b34174 | ||
|
|
e8f99f28ec | ||
|
|
250b1abc79 | ||
|
|
42b15ad93f | ||
|
|
6f7a714bae | ||
|
|
92618e5084 | ||
|
|
391a9242c3 | ||
|
|
e1b6dc3b54 | ||
|
|
04124cf978 | ||
|
|
e4e717b747 | ||
|
|
10d2a8f5ff | ||
|
|
899fa38805 | ||
|
|
2df878c953 | ||
|
|
78a5eedc8f | ||
|
|
364f961ee2 | ||
|
|
b21aa6add2 | ||
|
|
ec4abd1c2d | ||
|
|
9900ae92fb | ||
|
|
fa20daf6e5 | ||
|
|
44949c0559 | ||
|
|
e88711a017 | ||
|
|
32169ded18 | ||
|
|
4b2d566fd9 | ||
|
|
fb4b7a7ce5 | ||
|
|
18f27775b0 | ||
|
|
cb462ad05a | ||
|
|
1eec22ca1a | ||
|
|
c1f3c51f88 | ||
|
|
7dd556293f | ||
|
|
ee50131ce4 | ||
|
|
2cd47dbfaa | ||
|
|
e5296c1067 | ||
|
|
0f00f05e3d | ||
|
|
976a3b82e5 | ||
|
|
ba26d620c4 | ||
|
|
e45246a767 | ||
|
|
7336668f0c | ||
|
|
11701fb222 | ||
|
|
b1ec12c4e9 | ||
|
|
d0b0a0fc97 | ||
|
|
20774fca6b | ||
|
|
9c46b510d8 | ||
|
|
9d887b60a8 | ||
|
|
63d4de4e24 | ||
|
|
9224d2da06 | ||
|
|
a10692e2f1 | ||
|
|
b0c152a42e | ||
|
|
f44767e023 | ||
|
|
aadef0a57c | ||
|
|
777ee7ffe0 | ||
|
|
dcf1d0bdbc | ||
|
|
13b7111a42 | ||
|
|
09442d37a3 | ||
|
|
1e66bdb07f | ||
|
|
b423090db9 | ||
|
|
a32d94efbf | ||
|
|
31f8302849 | ||
|
|
6487756764 | ||
|
|
abb76ad867 | ||
|
|
cf4e7a96e8 | ||
|
|
0f414f71a3 | ||
|
|
2b700fdad8 | ||
|
|
06c5daa253 | ||
|
|
91aab6cbd1 | ||
|
|
f38a00ebdc | ||
|
|
0f73ea75ab | ||
|
|
8fe869afdb | ||
|
|
2d274c4f5b | ||
|
|
713a3239a4 | ||
|
|
a9e7958d44 | ||
|
|
f38e84053f | ||
|
|
7eb16b7ba0 | ||
|
|
5a3889d8ee | ||
|
|
2c52f4d0bb | ||
|
|
32c4231eb5 | ||
|
|
e9621f054d | ||
|
|
b41b62220c | ||
|
|
c89440cbca | ||
|
|
1aeb555a53 | ||
|
|
9aff3ec5d9 | ||
|
|
b4eaf0cfb5 | ||
|
|
199cb6082d | ||
|
|
37bfe26a6d | ||
|
|
3769386539 | ||
|
|
84a6e57f42 | ||
|
|
14d2474ee9 | ||
|
|
ca613ed80a | ||
|
|
bbcd458849 | ||
|
|
bc885894f8 | ||
|
|
bc83df6971 | ||
|
|
43f43c9f81 | ||
|
|
65f00defcf | ||
|
|
d716b81342 | ||
|
|
272ba445f6 | ||
|
|
d9816d8869 | ||
|
|
874736eb16 | ||
|
|
9c16ccbf81 | ||
|
|
40a3aa31dc | ||
|
|
90669b611b | ||
|
|
f10c7ac725 | ||
|
|
38dca3cd0d | ||
|
|
44bb35b168 | ||
|
|
9832caf503 | ||
|
|
0c4e8e306e | ||
|
|
075416eb9c | ||
|
|
4260fbbc32 | ||
|
|
0bec697a86 | ||
|
|
4ca6eef8fd | ||
|
|
a635dd9be2 | ||
|
|
14982011d9 | ||
|
|
65d852fdc9 | ||
|
|
d483c23c81 | ||
|
|
273b1e47ca | ||
|
|
5c5cdba4cd | ||
|
|
24674ea483 | ||
|
|
5d3a975e4c | ||
|
|
ad670c3c62 | ||
|
|
f9063484f3 | ||
|
|
5e2a07ad41 | ||
|
|
00a3e51a93 | ||
|
|
bc20468f28 | ||
|
|
c7ac50a805 | ||
|
|
f8cd7bc013 | ||
|
|
3469bf314b | ||
|
|
9636807819 | ||
|
|
455251d1d4 | ||
|
|
ec00ffae7f | ||
|
|
d969c7ad46 | ||
|
|
02bf769188 | ||
|
|
1c8a6b4f2a | ||
|
|
60fe5d6ffb | ||
|
|
327ae7437f | ||
|
|
795b9f2b9b | ||
|
|
54da069e68 | ||
|
|
bfc5cebac1 | ||
|
|
d46b1d48d8 | ||
|
|
96320e7761 | ||
|
|
e6472f0a81 | ||
|
|
816bbd9bbf | ||
|
|
da1123271d | ||
|
|
12f099260f | ||
|
|
35728ae208 | ||
|
|
7dba9cc798 | ||
|
|
bb1c920e22 | ||
|
|
770cbd7639 | ||
|
|
b43c9b8d93 | ||
|
|
935964c9b0 | ||
|
|
9aed9a5237 | ||
|
|
6c082c94c4 | ||
|
|
6c93b8304a | ||
|
|
85acf0fe78 | ||
|
|
fe64c6dd10 | ||
|
|
b15066a204 | ||
|
|
e2b29b6a07 | ||
|
|
7470ebe846 | ||
|
|
422efa68aa | ||
|
|
f4d8671922 | ||
|
|
70b136c9fc | ||
|
|
7adb5e93c7 | ||
|
|
a8b7117878 | ||
|
|
3bd99cd1e8 | ||
|
|
1d6af26857 | ||
|
|
14d18d731f | ||
|
|
c8d7cbbc2c | ||
|
|
ef4303fbbb | ||
|
|
2df9a9c69b | ||
|
|
6bb5d9f644 | ||
|
|
94b221248a | ||
|
|
2a887f5015 | ||
|
|
7e3dddf1bb | ||
|
|
fe95a7df2a | ||
|
|
98f6a30c6b | ||
|
|
00288053bf | ||
|
|
6a7feb98bd | ||
|
|
770d511067 | ||
|
|
b57fc1f818 | ||
|
|
01c5a8f07f | ||
|
|
243b8a3747 | ||
|
|
987fce7f07 | ||
|
|
657593be09 | ||
|
|
0afba7e3e3 | ||
|
|
ac00bb9029 | ||
|
|
67cb444d82 | ||
|
|
1914a29163 | ||
|
|
11201bc7c7 | ||
|
|
3a8b5257c0 | ||
|
|
00bb4e92dc | ||
|
|
7481c2ba0e | ||
|
|
9d336e257c | ||
|
|
2027171cb9 | ||
|
|
e06baf0d29 | ||
|
|
5d6a68a5bb | ||
|
|
41a5bb70bf | ||
|
|
c2ec62ba08 | ||
|
|
64361fc9ec | ||
|
|
ec55024734 | ||
|
|
df5c451a12 | ||
|
|
16c39a0a28 | ||
|
|
5e45b2cdd2 | ||
|
|
39210cf0c6 | ||
|
|
2e0e801533 | ||
|
|
0b9785a5d4 | ||
|
|
9070597c17 | ||
|
|
a5f986f145 | ||
|
|
1911afe3ee | ||
|
|
8b2145913c | ||
|
|
e75878d248 | ||
|
|
154d7cca78 | ||
|
|
3c018295b0 | ||
|
|
c8b8a4df11 | ||
|
|
edf74dc110 | ||
|
|
8d67fab958 |
10
.github/CODEOWNERS
vendored
Normal 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
@@ -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
@@ -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
|
||||
|
||||
31
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal 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
@@ -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
@@ -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"]
|
||||
#
|
||||
34
.github/workflows/build-on-pr-create.yml
vendored
@@ -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
|
||||
59
.github/workflows/build-on-pull-request.yml
vendored
Normal 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
@@ -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
|
||||
|
||||
58
.github/workflows/gh-mvn-publish.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
||||
name: Release Artifacts to GitHub Maven Packages
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [ created ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
|
||||
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: maven-settings-xml-action
|
||||
uses: whelk-io/maven-settings-xml-action@v22
|
||||
with:
|
||||
servers: '[{ "id": "${repo.id}", "username": "${repo.user}", "password": "${repo.pass}" }]'
|
||||
|
||||
- name: Find and Replace
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
with:
|
||||
find: "ollama4j-revision"
|
||||
replace: ${{ github.ref_name }}
|
||||
regex: false
|
||||
|
||||
- name: Find and Replace
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
with:
|
||||
find: "mvn-repo-id"
|
||||
replace: github
|
||||
regex: false
|
||||
|
||||
- name: Import GPG key
|
||||
uses: crazy-max/ghaction-import-gpg@v6
|
||||
with:
|
||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||
- name: List keys
|
||||
run: gpg -K
|
||||
|
||||
- name: Build with Maven
|
||||
run: mvn --file pom.xml -U clean package -Punit-tests
|
||||
|
||||
- name: Publish to GitHub Packages Apache Maven
|
||||
run: mvn deploy -Punit-tests -s $GITHUB_WORKSPACE/settings.xml -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} -Drepo.id=github -Drepo.user=${{ secrets.GH_MVN_USER }} -Drepo.pass=${{ secrets.GH_MVN_PASS }} -DaltDeploymentRepository=github::default::https://maven.pkg.github.com/ollama4j/ollama4j
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
24
.github/workflows/label-issue-stale.yml
vendored
Normal 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'
|
||||
115
.github/workflows/maven-publish.yml
vendored
@@ -1,64 +1,95 @@
|
||||
# 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: Test and Publish Package
|
||||
name: Release Artifacts to Maven Central
|
||||
|
||||
on:
|
||||
release:
|
||||
types: [ "created" ]
|
||||
types: [ created ]
|
||||
|
||||
|
||||
#on:
|
||||
# push:
|
||||
# pull_request:
|
||||
# types: [ opened, reopened ]
|
||||
# branches: [ "main" ]
|
||||
# workflow_dispatch:
|
||||
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
|
||||
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
|
||||
- name: Build with Maven
|
||||
run: mvn --file pom.xml -U clean package -Punit-tests
|
||||
- name: Set up Apache Maven Central (Overwrite settings.xml)
|
||||
uses: actions/setup-java@v3
|
||||
with: # running setup-java again overwrites the settings.xml
|
||||
java-version: '11'
|
||||
distribution: 'adopt-hotspot'
|
||||
cache: 'maven'
|
||||
server-id: ossrh
|
||||
server-username: MAVEN_USERNAME
|
||||
server-password: MAVEN_PASSWORD
|
||||
gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||
gpg-passphrase: MAVEN_GPG_PASSPHRASE
|
||||
- name: Set up Maven cache
|
||||
uses: actions/cache@v3
|
||||
|
||||
- name: maven-settings-xml-action
|
||||
uses: whelk-io/maven-settings-xml-action@v22
|
||||
with:
|
||||
path: ~/.m2/repository
|
||||
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-maven-
|
||||
- name: Build
|
||||
run: mvn -B -ntp clean install
|
||||
- name: Publish to GitHub Packages Apache Maven
|
||||
# if: >
|
||||
# github.event_name != 'pull_request' &&
|
||||
# github.ref_name == 'main' &&
|
||||
# contains(github.event.head_commit.message, 'release')
|
||||
run: |
|
||||
git config --global user.email "koujalgi.amith@gmail.com"
|
||||
git config --global user.name "amithkoujalgi"
|
||||
mvn -B -ntp -DskipTests -Pci-cd -Darguments="-DskipTests -Pci-cd" release:clean release:prepare release:perform
|
||||
servers: '[{ "id": "${repo.id}", "username": "${repo.user}", "password": "${repo.pass}" }]'
|
||||
|
||||
- name: Import GPG key
|
||||
uses: crazy-max/ghaction-import-gpg@v6
|
||||
with:
|
||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||
- name: List keys
|
||||
run: gpg -K
|
||||
|
||||
- name: Find and Replace
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
with:
|
||||
find: "ollama4j-revision"
|
||||
replace: ${{ github.ref_name }}
|
||||
regex: false
|
||||
|
||||
- name: Find and Replace
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
with:
|
||||
find: "mvn-repo-id"
|
||||
replace: central
|
||||
regex: false
|
||||
|
||||
- name: Publish to Maven Central
|
||||
run: mvn deploy -Dgpg.passphrase=${{ secrets.GPG_PASSPHRASE }} -Drepo.id=central -Drepo.user=${{ secrets.MVN_USER }} -Drepo.pass=${{ secrets.MVN_PASS }}
|
||||
|
||||
- name: Upload Release Asset - JAR
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
MAVEN_USERNAME: ${{ secrets.OSSRH_USERNAME }}
|
||||
MAVEN_PASSWORD: ${{ secrets.OSSRH_PASSWORD }}
|
||||
MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: target/ollama4j-${{ github.ref_name }}.jar
|
||||
asset_name: ollama4j-${{ github.ref_name }}.jar
|
||||
asset_content_type: application/x-jar
|
||||
|
||||
- name: Upload Release Asset - Javadoc JAR
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: target/ollama4j-${{ github.ref_name }}-javadoc.jar
|
||||
asset_name: ollama4j-${{ github.ref_name }}-javadoc.jar
|
||||
asset_content_type: application/x-jar
|
||||
|
||||
- name: Upload Release Asset - Sources JAR
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ github.event.release.upload_url }}
|
||||
asset_path: target/ollama4j-${{ github.ref_name }}-sources.jar
|
||||
asset_name: ollama4j-${{ github.ref_name }}-sources.jar
|
||||
asset_content_type: application/x-jar
|
||||
30
.github/workflows/pre-commit.yml
vendored
Normal 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
|
||||
|
||||
44
.github/workflows/publish-docs.yml
vendored
@@ -1,10 +1,9 @@
|
||||
# Simple workflow for deploying static content to GitHub Pages
|
||||
name: Deploy Javadoc content to Pages
|
||||
name: Publish Docs to GH Pages
|
||||
|
||||
on:
|
||||
# Runs on pushes targeting the default branch
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
release:
|
||||
types: [ created ]
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
@@ -30,23 +29,46 @@ jobs:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- name: Set up JDK 21
|
||||
uses: actions/setup-java@v5
|
||||
with:
|
||||
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@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
|
||||
- run: cd docs && npm run build
|
||||
|
||||
# - name: Build with npm
|
||||
# run: npm i && npm run build
|
||||
- name: Find and Replace
|
||||
uses: jacobtomlinson/gha-find-replace@v3
|
||||
with:
|
||||
find: "ollama4j-revision"
|
||||
replace: ${{ github.ref_name }}
|
||||
regex: false
|
||||
|
||||
- name: Build with Maven
|
||||
run: mvn --file pom.xml -U clean package && cp -r ./target/apidocs/. ./docs/build/apidocs
|
||||
|
||||
- name: Doxygen Action
|
||||
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
|
||||
|
||||
52
.github/workflows/publish-javadoc.yml
vendored
@@ -1,52 +0,0 @@
|
||||
# Simple workflow for deploying static content to GitHub Pages
|
||||
name: Deploy Javadoc content to Pages
|
||||
|
||||
on:
|
||||
# Runs on pushes targeting the default branch
|
||||
push:
|
||||
branches: [ "none" ]
|
||||
|
||||
# Allows you to run this workflow manually from the Actions tab
|
||||
workflow_dispatch:
|
||||
|
||||
# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
packages: write
|
||||
# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.
|
||||
# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.
|
||||
concurrency:
|
||||
group: "pages"
|
||||
cancel-in-progress: false
|
||||
|
||||
jobs:
|
||||
# Single deploy job since we're just deploying
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
environment:
|
||||
name: github-pages
|
||||
url: ${{ steps.deployment.outputs.page_url }}
|
||||
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: Setup Pages
|
||||
uses: actions/configure-pages@v3
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v2
|
||||
with:
|
||||
# Upload entire repository
|
||||
path: './target/apidocs/.'
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v2
|
||||
54
.github/workflows/run-tests.yml
vendored
Normal 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
@@ -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.
|
||||
|
||||
6
.gitignore
vendored
@@ -37,6 +37,8 @@ build/
|
||||
### Mac OS ###
|
||||
.DS_Store
|
||||
/.idea/
|
||||
/src/main/java/io/github/amithkoujalgi/ollama4j/core/localtests/
|
||||
pom.xml.*
|
||||
release.properties
|
||||
release.properties
|
||||
!.idea/icon.svg
|
||||
|
||||
src/main/java/io/github/ollama4j/localtests
|
||||
|
||||
18
.idea/icon.svg
generated
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" viewBox="0 0 1478 2048" width="1280" height="1280" xmlns="http://www.w3.org/2000/svg">
|
||||
<path transform="translate(0)" d="m0 0h1478v2048h-1478z" fill="#FEFEFE"/>
|
||||
<path transform="translate(411,47)" d="m0 0h24l21 5 17 8 14 10 12 11 10 10 12 16 14 24 11 24 9 24 8 27 6 25 4 21 3 19 3 25 6-2 16-9 29-13 28-10 30-8 26-4 27-2h16l30 2 32 5 19 5 30 10 26 11 20 10 13 8 2-15 6-39 8-36 6-20 9-27 11-24 10-19 12-18 9-11 9-10 12-11 17-11 15-7 19-4h24l18 4 16 7 12 8 10 8 17 17 13 18 12 22 9 20 7 19 9 30 7 33 5 33 3 29 1 15v79l-3 30-4 29-4 20 16 15 17 17 8 7 18 18 9 11 10 12 14 21 9 16 8 16 5 17 7 19 10 34 5 27 3 24 1 14v42l-4 35-6 29-8 27-9 22-12 25-13 22-5 7 2 6 14 29 12 31 8 26 7 29 6 36 2 21 1 19v37l-3 34-4 25-5 24-8 27-8 21-7 16-11 21-15 24 2 5 7 10 8 15 11 29 8 29 6 31 3 22 2 24v57l-4 33-6 27-3 9-3 1h-89l-2-1v-11l2-13 6-21 3-19 1-9v-48l-3-31-4-22-7-27-6-16-8-16-12-21-4-11-3-17v-31l4-13 6-10 11-16 9-15 11-23 10-31 6-26 3-22 1-16v-33l-2-27-4-27-10-39-9-25-8-18-13-25-12-19-4-10-1-5v-13l3-11 4-8 9-10 13-17 8-13 8-14 11-27 7-25 4-21 2-20v-27l-2-22-5-27-6-21-8-22-12-25-8-14-11-16-8-10-11-13-13-13-8-7-17-13-18-11-17-9-15-6-23-7-14-3-17-2h-28l-18 2h-18l-10-3-6-5-16-32-8-14-11-15-8-10-9-10-7-7-14-11-12-9-16-10-19-10-13-6-20-8-17-5-24-5-15-2h-33l-25 4-24 6-22 8-20 9-20 11-19 13-10 8-11 9-13 13-13 17-10 15-10 18-8 18-9 10-6 3h-21l-19-2h-29l-20 3-14 3-27 9-21 10-18 11-16 12-15 13-15 15-11 14-12 17-10 17-8 16-10 25-7 24-5 24-3 25v31l4 30 5 21 9 27 12 25 10 16 7 9 16 15 6 12 3 9v15l-6 16-13 21-14 27-8 20-8 25-7 27-4 23-3 31v35l3 32 5 26 9 30 6 15 10 21 11 17 12 16 8 13 4 13v19l-4 13-12 22-9 15-8 16-7 19-7 26-5 30-2 23v42l3 26 5 22 3 12 1 9v10l-3 1h-81l-11-1-5-21-5-30-2-22v-52l2-25 5-34 5-23 7-25 8-21 11-23 9-12-1-5-14-22-10-19-11-25-10-30-6-24-5-29-3-27-1-17v-35l2-30 4-29 5-26 10-36 9-25 10-23 10-21-1-7-10-14-14-26-7-15-8-20-8-26-6-29-3-25v-66l3-27 7-33 9-29 10-25 8-16 9-17 11-17 11-15 11-13 7-8 56-56-1-6-2-5-4-26-3-32-1-17v-69l3-39 5-35 6-29 8-30 8-23 12-27 12-21 12-16 11-12 7-7 13-10 16-9 11-4z" fill="#010000"/>
|
||||
<path transform="translate(856,1181)" d="m0 0h13l10 4 6 7 4 9 6 29 5 22 8 16 4-13 7-23 5-12 6-9 9-8 7-3 5-1h10l8 4 5 8v11l-6 17-6 15-4 16v22l8 38 1 9v11l-3 16-8 16-9 9-10 8-6 7-4 8-2 7-1 12v51l-2 17-4 13-11 20-5 15-3 17v21l3 17 6 16 11 28 13 38 10 37 7 33 5 33 3 28 1 18v49l-2 24-4 22-6 18-6 10-7 8-10 6-13 4h-17l-7-4-10-9-11-15-11-16-12-17-9-11-9-10-10-9-13-8-14-5-5-1h-26l-16 4-18 8-18 11-16 12-16 13-17 14-20 15-16 9-13 4h-11l-10-3-7-6-4-8-2-9v-39l2-25-6 8-2 1h-8l-13-4-8-7-4-7v-9l6-12 8-10 9-11 9-14 5-12 2-11v-17l-4-20-6-21-2-13v-16l2-12 8-16 9-13 12-16 13-21 8-17 9-27 4-20 4-39 3-39 3-63v-98l-3-35-3-13 5 2 16 11 13 10 11 9 14 12 17 16 33 33 7 8 12 13 9 11 12 14 8 10 10 13 12 16 13 18 18 27 12 19 6 8 6 4 9 1 12-3 10-6 8-11 4-11v-33l-3-17-4-11-5-7-6-3-15-4-16-9-16-8-4-1h-12l-23 5-8-1-7-6-4-10v-10l4-8 9-8 13-6 13-4 10-1-9-11-8-10-10-15-8-16-7-15-9-27-1-5v-13l3-8 8-8 9-4 6-1 8 3 7 9 15 31 8 12 8 9 2 1-6-21-4-20-1-8v-33l3-10 4-5z" fill="#020101"/>
|
||||
<path transform="translate(735,724)" d="m0 0h30l24 2 27 4 20 5 27 9 29 14 18 11 16 12 11 9 15 14 12 14 10 14 9 15 7 14 7 19 5 20 2 14v34l-3 20-6 19-6 15-11 19-9 12-11 13-15 15-11 9-16 11-22 12-26 10-13 4-21 5-19 2h-117l-24-3-27-6-28-10-16-8-14-8-14-10-10-8-10-9-10-10-11-14-10-15-10-21-6-18-4-19-1-9v-31l2-15 5-20 8-21 10-19 8-12 10-13 12-13 13-13 11-9 15-11 15-9 14-8 21-9 16-6 22-6 29-5z" fill="#FEFEFE"/>
|
||||
<path transform="translate(816,1496)" d="m0 0 5 1 13 21 10 18 14 27 15 31 17 40 10 27 12 36 8 28 7 30 5 28 3 28v60l-2 31-3 23-5 17-4 6-5 4-4 1h-14l-6-4-11-14-10-15-12-17-9-11-12-14-8-7-14-10-16-8-12-4-12-2h-20l-16 3-15 5-16 8-18 12-14 11-15 13-14 13-22 18-14 7-4 1h-7l-5-6-3-13v-29l3-32 6-45 11-66 20-100 13-61 2-6 11-7 4-2 7 11 10 10 13 8 18 6 6 1h25l17-4 16-7 13-9 7-6 9-11 8-14 5-15 2-10v-20l-3-11z" fill="#FEFEFE"/>
|
||||
<path transform="translate(735,724)" d="m0 0h30l24 2 27 4 20 5 27 9 29 14 18 11 16 12 11 9 15 14 12 14 10 14 9 15 7 14 7 19 5 20 2 14v34l-3 20-6 19-6 15-11 19-9 12-11 13-15 15-11 9-16 11-22 12-26 10-13 4-21 5-19 2h-117l-24-3-27-6-28-10-16-8-14-8-14-10-10-8-10-9-10-10-11-14-10-15-10-21-6-18-4-19-1-9v-31l2-15 5-20 8-21 10-19 8-12 10-13 12-13 13-13 11-9 15-11 15-9 14-8 21-9 16-6 22-6 29-5zm0 63-20 2-20 4-29 10-17 8-17 10-17 13-15 14-9 11-9 14-9 19-6 20-2 14v11l3 16 6 18 7 14 8 11 11 12 10 9 18 12 16 8 15 6 25 6 15 2 14 1h89l21-3 25-6 26-11 15-9 10-8 10-9 8-8 12-18 6-13 5-16 2-12v-15l-2-14-5-16-5-12-7-13-12-16-12-13-8-7-16-12-14-8-15-8-28-10-21-5-14-2-13-1z" fill="#010101"/>
|
||||
<path transform="translate(1081,140)" d="m0 0h5l5 4 9 11 11 19 11 28 6 21 7 32 4 27 3 42v49l-3 47-1 4-6-1-10-4-22-4-44-6-27-2-9-15-2-5v-40l2-34 5-38 8-38 5-20 11-29 11-23 7-10 11-13z" fill="#FEFEFE"/>
|
||||
<path transform="translate(423,139)" d="m0 0 4 2 10 10 10 14 11 22 9 24 7 25 6 29 5 30 3 31 1 16v45l-6 14-5 6-29 2-31 4-35 6-11 4h-3l-3-28-1-27v-41l2-36 5-35 8-37 6-19 8-21 8-16 8-12 8-9z" fill="#FEFEFE"/>
|
||||
<path transform="translate(745,1472)" d="m0 0h9l16 3 14 7 10 9 6 10 3 9 1 6v15l-4 14-8 16-9 10-9 8-15 8-12 4-10 2h-15l-13-3-16-8-11-10-6-10-5-12-2-11v-8l2-10h2l1-5 4-8 8-10 11-9 17-9 12-5 8-2z" fill="red"/>
|
||||
<path transform="translate(436,735)" d="m0 0h16l15 4 12 7 10 9 7 9 5 11 2 8v21l-4 14-6 12-7 9-14 14-11 7-12 4h-15l-14-3-11-4-11-7-9-10-8-14-2-9v-21l4-14 8-16 6-9 10-10 14-8 9-3z" fill="#010101"/>
|
||||
<path transform="translate(1055,735)" d="m0 0h15l16 4 11 6 10 8 7 9 8 15 5 14 1 6v20l-4 13-7 11-7 8-14 9-16 5-5 1h-16l-13-4-11-7-17-17-8-14-5-14-1-5v-20l4-13 6-10 9-10 11-8 11-5z" fill="#010101"/>
|
||||
<path transform="translate(717,869)" d="m0 0h9l12 4 13 8 5-1 8-6 9-4 12-1 10 3 6 4 6 9 1 2v15l-5 10-8 7-11 8-6 4-1 6 3 17v19l-5 8-9 6-8 2h-10l-11-2-8-6-4-6-1-3v-15l3-19v-7l-16-10-11-11-3-5-1-4v-13l5-10 6-5z" fill="#020101"/>
|
||||
<path transform="translate(717,1479)" d="m0 0 2 1-2 3h2v4 2l6 1 2 1 3 13-1 10-5 10h-2v2h-2v2h-2v2l-5 2-3 2-9 2v-2l-5 1-9-5-5-4v-2h-2l-2-2-6 3 1-7 5-10 8-10 11-9 17-9z" fill="pink"/>
|
||||
<path transform="translate(599,1667)" d="m0 0 4 1v14l-9 48-3 19-2 1-8-20-3-11v-15l5-15 8-14 6-7z" fill="white"/>
|
||||
<path transform="translate(937,1063)" d="m0 0 2 1-11 9-15 10-19 10-26 10-13 4-21 5-19 2h-117l-9-1v-1h82l37-1 18-2 32-7 14-5 16-6 10-4 17-9 11-7z" fill="#553D3C"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.1 KiB |
46
.pre-commit-config.yaml
Normal 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
@@ -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"
|
||||
128
CODE_OF_CONDUCT.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
koujalgi.amith@gmail.com.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
125
CONTRIBUTING.md
Normal 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 project’s [MIT License](LICENSE).
|
||||
|
||||
### Questions and Discussion
|
||||
|
||||
Have questions or ideas? Open a GitHub Discussion or issue. We welcome feedback and proposals!
|
||||
|
||||
|
||||
413
Doxyfile
Normal file
@@ -0,0 +1,413 @@
|
||||
# Doxyfile 1.10.0
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Project related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
DOXYFILE_ENCODING = UTF-8
|
||||
PROJECT_NAME = "Ollama4j"
|
||||
PROJECT_NUMBER =
|
||||
PROJECT_BRIEF = "A Java library (wrapper/binding) for Ollama server."
|
||||
PROJECT_LOGO = ./logo-small.png
|
||||
PROJECT_ICON = ./logo-small.png
|
||||
OUTPUT_DIRECTORY = ./docs/build/doxygen
|
||||
CREATE_SUBDIRS = NO
|
||||
CREATE_SUBDIRS_LEVEL = 8
|
||||
ALLOW_UNICODE_NAMES = NO
|
||||
OUTPUT_LANGUAGE = English
|
||||
BRIEF_MEMBER_DESC = YES
|
||||
REPEAT_BRIEF = YES
|
||||
ABBREVIATE_BRIEF = "The $name class" \
|
||||
"The $name widget" \
|
||||
"The $name file" \
|
||||
is \
|
||||
provides \
|
||||
specifies \
|
||||
contains \
|
||||
represents \
|
||||
a \
|
||||
an \
|
||||
the
|
||||
ALWAYS_DETAILED_SEC = NO
|
||||
INLINE_INHERITED_MEMB = NO
|
||||
FULL_PATH_NAMES = YES
|
||||
STRIP_FROM_PATH =
|
||||
STRIP_FROM_INC_PATH =
|
||||
SHORT_NAMES = NO
|
||||
JAVADOC_AUTOBRIEF = NO
|
||||
JAVADOC_BANNER = NO
|
||||
QT_AUTOBRIEF = NO
|
||||
MULTILINE_CPP_IS_BRIEF = NO
|
||||
PYTHON_DOCSTRING = YES
|
||||
INHERIT_DOCS = YES
|
||||
SEPARATE_MEMBER_PAGES = NO
|
||||
TAB_SIZE = 4
|
||||
ALIASES =
|
||||
OPTIMIZE_OUTPUT_FOR_C = NO
|
||||
OPTIMIZE_OUTPUT_JAVA = YES
|
||||
OPTIMIZE_FOR_FORTRAN = NO
|
||||
OPTIMIZE_OUTPUT_VHDL = NO
|
||||
OPTIMIZE_OUTPUT_SLICE = NO
|
||||
EXTENSION_MAPPING =
|
||||
MARKDOWN_SUPPORT = YES
|
||||
TOC_INCLUDE_HEADINGS = 5
|
||||
MARKDOWN_ID_STYLE = DOXYGEN
|
||||
AUTOLINK_SUPPORT = YES
|
||||
BUILTIN_STL_SUPPORT = NO
|
||||
CPP_CLI_SUPPORT = NO
|
||||
SIP_SUPPORT = NO
|
||||
IDL_PROPERTY_SUPPORT = YES
|
||||
DISTRIBUTE_GROUP_DOC = NO
|
||||
GROUP_NESTED_COMPOUNDS = NO
|
||||
SUBGROUPING = YES
|
||||
INLINE_GROUPED_CLASSES = NO
|
||||
INLINE_SIMPLE_STRUCTS = NO
|
||||
TYPEDEF_HIDES_STRUCT = NO
|
||||
LOOKUP_CACHE_SIZE = 0
|
||||
NUM_PROC_THREADS = 1
|
||||
TIMESTAMP = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# Build related configuration options
|
||||
#---------------------------------------------------------------------------
|
||||
EXTRACT_ALL = YES
|
||||
EXTRACT_PRIVATE = NO
|
||||
EXTRACT_PRIV_VIRTUAL = NO
|
||||
EXTRACT_PACKAGE = NO
|
||||
EXTRACT_STATIC = NO
|
||||
EXTRACT_LOCAL_CLASSES = YES
|
||||
EXTRACT_LOCAL_METHODS = NO
|
||||
EXTRACT_ANON_NSPACES = NO
|
||||
RESOLVE_UNNAMED_PARAMS = YES
|
||||
HIDE_UNDOC_MEMBERS = NO
|
||||
HIDE_UNDOC_CLASSES = NO
|
||||
HIDE_FRIEND_COMPOUNDS = NO
|
||||
HIDE_IN_BODY_DOCS = NO
|
||||
INTERNAL_DOCS = NO
|
||||
CASE_SENSE_NAMES = SYSTEM
|
||||
HIDE_SCOPE_NAMES = NO
|
||||
HIDE_COMPOUND_REFERENCE= NO
|
||||
SHOW_HEADERFILE = YES
|
||||
SHOW_INCLUDE_FILES = YES
|
||||
SHOW_GROUPED_MEMB_INC = NO
|
||||
FORCE_LOCAL_INCLUDES = NO
|
||||
INLINE_INFO = YES
|
||||
SORT_MEMBER_DOCS = YES
|
||||
SORT_BRIEF_DOCS = NO
|
||||
SORT_MEMBERS_CTORS_1ST = NO
|
||||
SORT_GROUP_NAMES = NO
|
||||
SORT_BY_SCOPE_NAME = NO
|
||||
STRICT_PROTO_MATCHING = NO
|
||||
GENERATE_TODOLIST = YES
|
||||
GENERATE_TESTLIST = YES
|
||||
GENERATE_BUGLIST = YES
|
||||
GENERATE_DEPRECATEDLIST= YES
|
||||
ENABLED_SECTIONS =
|
||||
MAX_INITIALIZER_LINES = 30
|
||||
SHOW_USED_FILES = YES
|
||||
SHOW_FILES = YES
|
||||
SHOW_NAMESPACES = YES
|
||||
FILE_VERSION_FILTER =
|
||||
LAYOUT_FILE =
|
||||
CITE_BIB_FILES =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to warning and progress messages
|
||||
#---------------------------------------------------------------------------
|
||||
QUIET = NO
|
||||
WARNINGS = YES
|
||||
WARN_IF_UNDOCUMENTED = YES
|
||||
WARN_IF_DOC_ERROR = YES
|
||||
WARN_IF_INCOMPLETE_DOC = YES
|
||||
WARN_NO_PARAMDOC = NO
|
||||
WARN_IF_UNDOC_ENUM_VAL = NO
|
||||
WARN_AS_ERROR = NO
|
||||
WARN_FORMAT = "$file:$line: $text"
|
||||
WARN_LINE_FORMAT = "at line $line of file $file"
|
||||
WARN_LOGFILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the input files
|
||||
#---------------------------------------------------------------------------
|
||||
INPUT = ./src/main
|
||||
INPUT_ENCODING = UTF-8
|
||||
INPUT_FILE_ENCODING =
|
||||
FILE_PATTERNS = *.c \
|
||||
*.cc \
|
||||
*.cxx \
|
||||
*.cxxm \
|
||||
*.cpp \
|
||||
*.cppm \
|
||||
*.ccm \
|
||||
*.c++ \
|
||||
*.c++m \
|
||||
*.java \
|
||||
*.ii \
|
||||
*.ixx \
|
||||
*.ipp \
|
||||
*.i++ \
|
||||
*.inl \
|
||||
*.idl \
|
||||
*.ddl \
|
||||
*.odl \
|
||||
*.h \
|
||||
*.hh \
|
||||
*.hxx \
|
||||
*.hpp \
|
||||
*.h++ \
|
||||
*.ixx \
|
||||
*.l \
|
||||
*.cs \
|
||||
*.d \
|
||||
*.php \
|
||||
*.php4 \
|
||||
*.php5 \
|
||||
*.phtml \
|
||||
*.inc \
|
||||
*.m \
|
||||
*.markdown \
|
||||
*.md \
|
||||
*.mm \
|
||||
*.dox \
|
||||
*.py \
|
||||
*.pyw \
|
||||
*.f90 \
|
||||
*.f95 \
|
||||
*.f03 \
|
||||
*.f08 \
|
||||
*.f18 \
|
||||
*.f \
|
||||
*.for \
|
||||
*.vhd \
|
||||
*.vhdl \
|
||||
*.ucf \
|
||||
*.qsf \
|
||||
*.ice
|
||||
RECURSIVE = YES
|
||||
EXCLUDE =
|
||||
EXCLUDE_SYMLINKS = NO
|
||||
EXCLUDE_PATTERNS =
|
||||
EXCLUDE_SYMBOLS =
|
||||
EXAMPLE_PATH =
|
||||
EXAMPLE_PATTERNS = *
|
||||
EXAMPLE_RECURSIVE = NO
|
||||
IMAGE_PATH =
|
||||
INPUT_FILTER =
|
||||
FILTER_PATTERNS =
|
||||
FILTER_SOURCE_FILES = NO
|
||||
FILTER_SOURCE_PATTERNS =
|
||||
USE_MDFILE_AS_MAINPAGE =
|
||||
FORTRAN_COMMENT_AFTER = 72
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to source browsing
|
||||
#---------------------------------------------------------------------------
|
||||
SOURCE_BROWSER = YES
|
||||
INLINE_SOURCES = NO
|
||||
STRIP_CODE_COMMENTS = YES
|
||||
REFERENCED_BY_RELATION = NO
|
||||
REFERENCES_RELATION = NO
|
||||
REFERENCES_LINK_SOURCE = YES
|
||||
SOURCE_TOOLTIPS = YES
|
||||
USE_HTAGS = NO
|
||||
VERBATIM_HEADERS = YES
|
||||
CLANG_ASSISTED_PARSING = NO
|
||||
CLANG_ADD_INC_PATHS = YES
|
||||
CLANG_OPTIONS =
|
||||
CLANG_DATABASE_PATH =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the alphabetical class index
|
||||
#---------------------------------------------------------------------------
|
||||
ALPHABETICAL_INDEX = YES
|
||||
IGNORE_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the HTML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_HTML = YES
|
||||
HTML_OUTPUT = html
|
||||
HTML_FILE_EXTENSION = .html
|
||||
HTML_HEADER =
|
||||
HTML_FOOTER =
|
||||
HTML_STYLESHEET =
|
||||
HTML_EXTRA_STYLESHEET =
|
||||
HTML_EXTRA_FILES =
|
||||
HTML_COLORSTYLE = LIGHT
|
||||
HTML_COLORSTYLE_HUE = 220
|
||||
HTML_COLORSTYLE_SAT = 100
|
||||
HTML_COLORSTYLE_GAMMA = 80
|
||||
HTML_DYNAMIC_MENUS = YES
|
||||
HTML_DYNAMIC_SECTIONS = NO
|
||||
HTML_CODE_FOLDING = YES
|
||||
HTML_COPY_CLIPBOARD = YES
|
||||
HTML_PROJECT_COOKIE =
|
||||
HTML_INDEX_NUM_ENTRIES = 100
|
||||
GENERATE_DOCSET = NO
|
||||
DOCSET_FEEDNAME = "Doxygen generated docs"
|
||||
DOCSET_FEEDURL =
|
||||
DOCSET_BUNDLE_ID = org.doxygen.Project
|
||||
DOCSET_PUBLISHER_ID = org.doxygen.Publisher
|
||||
DOCSET_PUBLISHER_NAME = Publisher
|
||||
GENERATE_HTMLHELP = NO
|
||||
CHM_FILE =
|
||||
HHC_LOCATION =
|
||||
GENERATE_CHI = NO
|
||||
CHM_INDEX_ENCODING =
|
||||
BINARY_TOC = NO
|
||||
TOC_EXPAND = NO
|
||||
SITEMAP_URL =
|
||||
GENERATE_QHP = NO
|
||||
QCH_FILE =
|
||||
QHP_NAMESPACE = org.doxygen.Project
|
||||
QHP_VIRTUAL_FOLDER = doc
|
||||
QHP_CUST_FILTER_NAME =
|
||||
QHP_CUST_FILTER_ATTRS =
|
||||
QHP_SECT_FILTER_ATTRS =
|
||||
QHG_LOCATION =
|
||||
GENERATE_ECLIPSEHELP = NO
|
||||
ECLIPSE_DOC_ID = org.doxygen.Project
|
||||
DISABLE_INDEX = NO
|
||||
GENERATE_TREEVIEW = YES
|
||||
FULL_SIDEBAR = NO
|
||||
ENUM_VALUES_PER_LINE = 4
|
||||
TREEVIEW_WIDTH = 250
|
||||
EXT_LINKS_IN_WINDOW = NO
|
||||
OBFUSCATE_EMAILS = YES
|
||||
HTML_FORMULA_FORMAT = png
|
||||
FORMULA_FONTSIZE = 10
|
||||
FORMULA_MACROFILE =
|
||||
USE_MATHJAX = NO
|
||||
MATHJAX_VERSION = MathJax_2
|
||||
MATHJAX_FORMAT = HTML-CSS
|
||||
MATHJAX_RELPATH =
|
||||
MATHJAX_EXTENSIONS =
|
||||
MATHJAX_CODEFILE =
|
||||
SEARCHENGINE = YES
|
||||
SERVER_BASED_SEARCH = NO
|
||||
EXTERNAL_SEARCH = NO
|
||||
SEARCHENGINE_URL =
|
||||
SEARCHDATA_FILE = searchdata.xml
|
||||
EXTERNAL_SEARCH_ID =
|
||||
EXTRA_SEARCH_MAPPINGS =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the LaTeX output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_LATEX = YES
|
||||
LATEX_OUTPUT = latex
|
||||
LATEX_CMD_NAME =
|
||||
MAKEINDEX_CMD_NAME = makeindex
|
||||
LATEX_MAKEINDEX_CMD = makeindex
|
||||
COMPACT_LATEX = NO
|
||||
PAPER_TYPE = a4
|
||||
EXTRA_PACKAGES =
|
||||
LATEX_HEADER =
|
||||
LATEX_FOOTER =
|
||||
LATEX_EXTRA_STYLESHEET =
|
||||
LATEX_EXTRA_FILES =
|
||||
PDF_HYPERLINKS = YES
|
||||
USE_PDFLATEX = YES
|
||||
LATEX_BATCHMODE = NO
|
||||
LATEX_HIDE_INDICES = NO
|
||||
LATEX_BIB_STYLE = plain
|
||||
LATEX_EMOJI_DIRECTORY =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the RTF output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_RTF = NO
|
||||
RTF_OUTPUT = rtf
|
||||
COMPACT_RTF = NO
|
||||
RTF_HYPERLINKS = NO
|
||||
RTF_STYLESHEET_FILE =
|
||||
RTF_EXTENSIONS_FILE =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the man page output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_MAN = NO
|
||||
MAN_OUTPUT = man
|
||||
MAN_EXTENSION = .3
|
||||
MAN_SUBDIR =
|
||||
MAN_LINKS = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the XML output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_XML = NO
|
||||
XML_OUTPUT = xml
|
||||
XML_PROGRAMLISTING = YES
|
||||
XML_NS_MEMB_FILE_SCOPE = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the DOCBOOK output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_DOCBOOK = NO
|
||||
DOCBOOK_OUTPUT = docbook
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options for the AutoGen Definitions output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_AUTOGEN_DEF = NO
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to Sqlite3 output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_SQLITE3 = NO
|
||||
SQLITE3_OUTPUT = sqlite3
|
||||
SQLITE3_RECREATE_DB = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the Perl module output
|
||||
#---------------------------------------------------------------------------
|
||||
GENERATE_PERLMOD = NO
|
||||
PERLMOD_LATEX = NO
|
||||
PERLMOD_PRETTY = YES
|
||||
PERLMOD_MAKEVAR_PREFIX =
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to the preprocessor
|
||||
#---------------------------------------------------------------------------
|
||||
ENABLE_PREPROCESSING = YES
|
||||
MACRO_EXPANSION = NO
|
||||
EXPAND_ONLY_PREDEF = NO
|
||||
SEARCH_INCLUDES = YES
|
||||
INCLUDE_PATH =
|
||||
INCLUDE_FILE_PATTERNS =
|
||||
PREDEFINED =
|
||||
EXPAND_AS_DEFINED =
|
||||
SKIP_FUNCTION_MACROS = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to external references
|
||||
#---------------------------------------------------------------------------
|
||||
TAGFILES =
|
||||
GENERATE_TAGFILE =
|
||||
ALLEXTERNALS = NO
|
||||
EXTERNAL_GROUPS = YES
|
||||
EXTERNAL_PAGES = YES
|
||||
#---------------------------------------------------------------------------
|
||||
# Configuration options related to diagram generator tools
|
||||
#---------------------------------------------------------------------------
|
||||
HIDE_UNDOC_RELATIONS = YES
|
||||
HAVE_DOT = NO
|
||||
DOT_NUM_THREADS = 0
|
||||
DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10"
|
||||
DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10"
|
||||
DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4"
|
||||
DOT_FONTPATH =
|
||||
CLASS_GRAPH = YES
|
||||
COLLABORATION_GRAPH = YES
|
||||
GROUP_GRAPHS = YES
|
||||
UML_LOOK = NO
|
||||
UML_LIMIT_NUM_FIELDS = 10
|
||||
DOT_UML_DETAILS = NO
|
||||
DOT_WRAP_THRESHOLD = 17
|
||||
TEMPLATE_RELATIONS = NO
|
||||
INCLUDE_GRAPH = YES
|
||||
INCLUDED_BY_GRAPH = YES
|
||||
CALL_GRAPH = NO
|
||||
CALLER_GRAPH = NO
|
||||
GRAPHICAL_HIERARCHY = YES
|
||||
DIRECTORY_GRAPH = YES
|
||||
DIR_GRAPH_MAX_DEPTH = 1
|
||||
DOT_IMAGE_FORMAT = png
|
||||
INTERACTIVE_SVG = NO
|
||||
DOT_PATH =
|
||||
DOTFILE_DIRS =
|
||||
DIA_PATH =
|
||||
DIAFILE_DIRS =
|
||||
PLANTUML_JAR_PATH =
|
||||
PLANTUML_CFG_FILE =
|
||||
PLANTUML_INCLUDE_PATH =
|
||||
DOT_GRAPH_MAX_NODES = 50
|
||||
MAX_DOT_GRAPH_DEPTH = 0
|
||||
DOT_MULTI_TARGETS = NO
|
||||
GENERATE_LEGEND = YES
|
||||
DOT_CLEANUP = YES
|
||||
MSCGEN_TOOL =
|
||||
MSCFILE_DIRS =
|
||||
2
LICENSE
@@ -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
|
||||
|
||||
78
Makefile
@@ -1,13 +1,75 @@
|
||||
build:
|
||||
mvn -B clean install
|
||||
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
|
||||
|
||||
ut:
|
||||
mvn clean test -Punit-tests
|
||||
check-formatting:
|
||||
@echo "\033[0;34mChecking code formatting...\033[0m"
|
||||
@mvn spotless:check
|
||||
|
||||
it:
|
||||
mvn clean verify -Pintegration-tests
|
||||
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:
|
||||
@echo "\033[0;34mGenerating documentation with Doxygen...\033[0m"
|
||||
@doxygen Doxyfile
|
||||
|
||||
javadoc:
|
||||
@echo "\033[0;34mGenerating Javadocs into '$(javadocfolder)'...\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'
|
||||
|
||||
docs-build:
|
||||
@echo "\033[0;34mBuilding documentation site...\033[0m"
|
||||
@cd ./docs && npm ci --no-audit --fund=false && npm run build
|
||||
|
||||
docs-serve:
|
||||
@echo "\033[0;34mServing documentation site...\033[0m"
|
||||
@cd ./docs && npm install && npm run start
|
||||
|
||||
start-cpu:
|
||||
@echo "\033[0;34mStarting Ollama (CPU mode)...\033[0m"
|
||||
@docker run -it -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
|
||||
|
||||
start-gpu:
|
||||
@echo "\033[0;34mStarting Ollama (GPU mode)...\033[0m"
|
||||
@docker run -it --gpus=all -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
|
||||
39
SECURITY.md
Normal 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
@@ -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();
|
||||
```
|
||||
@@ -1,12 +0,0 @@
|
||||
---
|
||||
slug: first-blog-post
|
||||
title: First Blog Post
|
||||
authors:
|
||||
name: Gao Wei
|
||||
title: Docusaurus Core Team
|
||||
url: https://github.com/wgao19
|
||||
image_url: https://github.com/wgao19.png
|
||||
tags: [hola, docusaurus]
|
||||
---
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
@@ -1,44 +0,0 @@
|
||||
---
|
||||
slug: long-blog-post
|
||||
title: Long Blog Post
|
||||
authors: endi
|
||||
tags: [hello, docusaurus]
|
||||
---
|
||||
|
||||
This is the summary of a very long blog post,
|
||||
|
||||
Use a `<!--` `truncate` `-->` comment to limit blog post size in the list view.
|
||||
|
||||
<!--truncate-->
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet
|
||||
@@ -1,20 +0,0 @@
|
||||
---
|
||||
slug: mdx-blog-post
|
||||
title: MDX Blog Post
|
||||
authors: [slorber]
|
||||
tags: [docusaurus]
|
||||
---
|
||||
|
||||
Blog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).
|
||||
|
||||
:::tip
|
||||
|
||||
Use the power of React to create interactive blog posts.
|
||||
|
||||
```js
|
||||
<button onClick={() => alert('button clicked!')}>Click me!</button>
|
||||
```
|
||||
|
||||
<button onClick={() => alert('button clicked!')}>Click me!</button>
|
||||
|
||||
:::
|
||||
|
Before Width: | Height: | Size: 94 KiB |
@@ -1,25 +0,0 @@
|
||||
---
|
||||
slug: welcome
|
||||
title: Welcome
|
||||
authors: [slorber, yangshun]
|
||||
tags: [facebook, hello, docusaurus]
|
||||
---
|
||||
|
||||
[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).
|
||||
|
||||
Simply add Markdown files (or folders) to the `blog` directory.
|
||||
|
||||
Regular blog authors can be added to `authors.yml`.
|
||||
|
||||
The blog post date can be extracted from filenames, such as:
|
||||
|
||||
- `2019-05-30-welcome.md`
|
||||
- `2019-05-30-welcome/index.md`
|
||||
|
||||
A blog post folder can be convenient to co-locate blog post images:
|
||||
|
||||

|
||||
|
||||
The blog supports tags as well!
|
||||
|
||||
**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.
|
||||
68
docs/blog/2023-12-22-release-post.md
Normal file
@@ -0,0 +1,68 @@
|
||||
---
|
||||
slug: release-post
|
||||
title: First Release 🚀
|
||||
authors: [ amith ]
|
||||
tags: [ Java, AI, LLM, GenAI, GenerativeAI, Ollama, Ollama4j, OpenSource, Developers
|
||||
]
|
||||
---
|
||||
|
||||
Hey there, my fellow Java Developers! 🚀
|
||||
|
||||
I am glad to announce the release of Ollama4j, a library that unites Ollama (an LLM manager and runner) and your Java
|
||||
applications! 🌐🚀
|
||||
|
||||
👉 GitHub Repository: Ollama4j on GitHub (https://github.com/ollama4j/ollama4j)
|
||||
|
||||
🌟 Key Features:
|
||||
|
||||
- Easy integration with Ollama, enabling the execution of large language models locally.
|
||||
- Clean and simple APIs, focused on seamless interaction with Ollama.
|
||||
- Empowers Java developers to harness the full capabilities of Ollama.
|
||||
- Provides APIs to perform operations such as listing, pulling, deleting models, and creating custom models.
|
||||
- Provides APIs to ask questions (generate completions) to the LLMs in synchronous and asynchronous modes.
|
||||
- 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
|
||||
modes). With Ollama, users can leverage powerful language models such as Llama 2 and even customize and create their own
|
||||
models.
|
||||
|
||||
For more details about Ollama, check these out:
|
||||
|
||||
- https://ollama.ai/
|
||||
- https://www.linkedin.com/company/ollama/
|
||||
|
||||
👨💻 Why Ollama4j?
|
||||
|
||||
As a Java developer passionate about harnessing the latest advancements in AI, I realized the need for a simple and
|
||||
efficient way to integrate Ollama into Java applications. That's why I authored Ollama4j!
|
||||
|
||||
🔧 How to Get Started:
|
||||
|
||||
Visit the GitHub repository: Ollama4j on GitHub.
|
||||
|
||||
Follow the easy setup instructions in the README to integrate Ollama into your Java projects.
|
||||
|
||||
Start unlocking the potential of large language models in your applications!
|
||||
|
||||
🙏 Contributions Welcome:
|
||||
|
||||
I invite the Java developer community to explore, use, and contribute to Ollama4j. Your feedback, suggestions, and
|
||||
contributions will help this library get better.
|
||||
|
||||
I am excited about the possibilities that Ollama4j opens up for Java developers. Whether you're working on natural
|
||||
language processing, chatbots, or any application that can benefit from advanced language models, Ollama4j is here to
|
||||
elevate your projects.
|
||||
|
||||
I look forward to seeing the incredible applications/projects you'll build with Ollama4j! 🌟
|
||||
|
||||
Find the full API spec here: https://ollama4j.github.io/ollama4j/
|
||||
|
||||
Find the Javadoc here: https://ollama4j.github.io/ollama4j/apidocs/
|
||||
|
||||
Ollama4j Docs is powered by [Docusaurus](https://docusaurus.io).
|
||||
|
||||
710
docs/blog/2025-03-08-blog/index.md
Normal 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_! 😍
|
||||
|
||||
We’ve 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, we’ll 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. We’ll 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, let’s understand the core technologies we’re 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 I’ve 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, we’ll 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 user’s natural language and Couchbase’s 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. It’s a fully managed
|
||||
> Database-as-a-Service (DBaaS) with a free tier 🎉 that’s so
|
||||
> easy
|
||||
> to set up, you’ll be querying your data in no time. It’s perfect for developers who want to dive in without any
|
||||
> hassle —
|
||||
> it’s 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 you’d 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 you’re 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'} />
|
||||
|
||||
You’ll 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, you’ll 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 you’d 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 you’ve allowed IP addresses, it’s 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, I’ve 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 you’re ready to connect to your Capella cluster using a Couchbase
|
||||
client. That’s it — you’re 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**: You’ll 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
|
||||
|
||||
Here’s 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, here’s what the model responds:
|
||||
|
||||
> **Call-sign of Astraeus is ‘FLYSTAR’! ✈️**
|
||||
|
||||
Isn’t that amazing? Now, let’s enhance it further by adding a function that allows us to update an airline’s call sign
|
||||
using natural language.
|
||||
|
||||
Let’s 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 airline’s callsign.
|
||||
|
||||
```javascript
|
||||
Tools.ToolSpecification callSignUpdaterToolSpec = getCallSignUpdaterToolSpec(cluster, bucketName);
|
||||
|
||||
ollama.registerTool(callSignUpdaterToolSpec);
|
||||
```
|
||||
|
||||
The tool will execute a Couchbase N1QL query to update the airline’s 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 airline’s 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, here’s 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 Ollama’s 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!
|
||||
@@ -1,17 +1,5 @@
|
||||
endi:
|
||||
name: Endilie Yacop Sucipto
|
||||
title: Maintainer of Docusaurus
|
||||
url: https://github.com/endiliey
|
||||
image_url: https://github.com/endiliey.png
|
||||
|
||||
yangshun:
|
||||
name: Yangshun Tay
|
||||
title: Front End Engineer @ Facebook
|
||||
url: https://github.com/yangshun
|
||||
image_url: https://github.com/yangshun.png
|
||||
|
||||
slorber:
|
||||
name: Sébastien Lorber
|
||||
title: Docusaurus maintainer
|
||||
url: https://sebastienlorber.com
|
||||
image_url: https://github.com/slorber.png
|
||||
amith:
|
||||
name: Amith Koujalgi
|
||||
title: Maintainer of Ollama4j
|
||||
url: https://github.com/amithkoujalgi
|
||||
image_url: https://github.com/amithkoujalgi.png
|
||||
|
||||
0
docs/build.sh
Normal file → Executable file
8
docs/docs/apis-extras/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "APIs - Extras",
|
||||
"position": 4,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Details of APIs to handle bunch of extra stuff."
|
||||
}
|
||||
}
|
||||
26
docs/docs/apis-extras/basic-auth.md
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# 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.
|
||||
|
||||
After configuring basic authentication, all subsequent requests will include the Basic 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.setBasicAuth("username", "password");
|
||||
}
|
||||
}
|
||||
```
|
||||
26
docs/docs/apis-extras/bearer-auth.md
Normal 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");
|
||||
}
|
||||
}
|
||||
```
|
||||
26
docs/docs/apis-extras/logging.md
Normal 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>
|
||||
|
||||
```
|
||||
88
docs/docs/apis-extras/options-builder.md
Normal file
@@ -0,0 +1,88 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Options Builder
|
||||
|
||||
This lets you build options for the `ask()` API.
|
||||
|
||||
Following are the parameters supported by Ollama:
|
||||
|
||||
| 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 |
|
||||
|
||||
Link to [source](https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values).
|
||||
|
||||
Also, see how to set those Ollama parameters using
|
||||
the `OptionsBuilder`
|
||||
from [javadoc](https://ollama4j.github.io/ollama4j/apidocs/io/github/ollama4j/ollama4j/core/utils/OptionsBuilder.html).
|
||||
|
||||
## Build an empty `Options` object
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.Ollama;
|
||||
import io.github.ollama4j.utils.Options;
|
||||
import io.github.ollama4j.utils.OptionsBuilder;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
Ollama ollama = new Ollama(host);
|
||||
|
||||
Options options = new OptionsBuilder().build();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Build the `Options` object with values
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.utils.Options;
|
||||
import io.github.ollama4j.utils.OptionsBuilder;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
Ollama ollama = new Ollama(host);
|
||||
|
||||
Options options =
|
||||
new OptionsBuilder()
|
||||
.setMirostat(10)
|
||||
.setMirostatEta(0.5f)
|
||||
.setNumGpu(2)
|
||||
.setTemperature(1.5f)
|
||||
.build();
|
||||
|
||||
OllamaResult result =
|
||||
ollama.generate(
|
||||
OllamaGenerateRequestBuilder.builder()
|
||||
.withModel(model)
|
||||
.withPrompt("Who are you?")
|
||||
.withOptions(options)
|
||||
.build(),
|
||||
null);
|
||||
}
|
||||
}
|
||||
```
|
||||
22
docs/docs/apis-extras/ping.md
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
# Ping
|
||||
|
||||
This API lets you check the reachability of Ollama server.
|
||||
|
||||
```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.ping();
|
||||
}
|
||||
}
|
||||
```
|
||||
76
docs/docs/apis-extras/prompt-builder.md
Normal file
@@ -0,0 +1,76 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Prompt Builder
|
||||
|
||||
This is designed for prompt engineering. It allows you to easily build the prompt text for zero-shot, one-shot, few-shot
|
||||
inferences.
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.Ollama;
|
||||
import io.github.ollama4j.models.response.OllamaResult;
|
||||
import io.github.ollama4j.types.OllamaModelType;
|
||||
import io.github.ollama4j.utils.OptionsBuilder;
|
||||
import io.github.ollama4j.utils.PromptBuilder;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
String host = "http://localhost:11434/";
|
||||
Ollama ollama = new Ollama(host);
|
||||
ollama.setRequestTimeoutSeconds(10);
|
||||
|
||||
String model = OllamaModelType.PHI;
|
||||
|
||||
PromptBuilder promptBuilder =
|
||||
new PromptBuilder()
|
||||
.addLine("You are an expert coder and understand different programming languages.")
|
||||
.addLine("Given a question, answer ONLY with code.")
|
||||
.addLine("Produce clean, formatted and indented code in markdown format.")
|
||||
.addLine(
|
||||
"DO NOT include ANY extra text apart from code. Follow this instruction very strictly!")
|
||||
.addLine("If there's any additional information you want to add, use comments within code.")
|
||||
.addLine("Answer only in the programming language that has been asked for.")
|
||||
.addSeparator()
|
||||
.addLine("Example: Sum 2 numbers in Python")
|
||||
.addLine("Answer:")
|
||||
.addLine("```python")
|
||||
.addLine("def sum(num1: int, num2: int) -> int:")
|
||||
.addLine(" return num1 + num2")
|
||||
.addLine("```")
|
||||
.addSeparator()
|
||||
.add("How do I read a file in Go and print its contents to stdout?");
|
||||
|
||||
boolean raw = false;
|
||||
OllamaResult response = ollama.generate(model, promptBuilder.build(), raw, new OptionsBuilder().build());
|
||||
System.out.println(response.getResponse());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
You will get a response similar to:
|
||||
|
||||
:::tip[LLM Response]
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
)
|
||||
|
||||
func readFile(fileName string) {
|
||||
file, err := ioutil.ReadFile(fileName)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "Error reading file:", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
f, _ := ioutil.ReadFile("file.txt")
|
||||
if f != nil {
|
||||
fmt.Println(f.String())
|
||||
}
|
||||
}
|
||||
```
|
||||
:::
|
||||
27
docs/docs/apis-extras/ps.md
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
# PS
|
||||
|
||||
This API provides a list of running models and details about each model currently loaded into memory.
|
||||
|
||||
This API corresponds to the [PS](https://github.com/ollama/ollama/blob/main/docs/api.md#list-running-models) API.
|
||||
|
||||
```java
|
||||
package io.github.ollama4j.localtests;
|
||||
|
||||
import io.github.ollama4j.Ollama;
|
||||
import io.github.ollama4j.models.ps.ModelProcessesResult;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
|
||||
Ollama ollama = new Ollama("http://localhost:11434");
|
||||
|
||||
ModelProcessesResult response = ollama.ps();
|
||||
|
||||
System.out.println(response);
|
||||
}
|
||||
}
|
||||
```
|
||||
25
docs/docs/apis-extras/timeouts.md
Normal 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);
|
||||
}
|
||||
}
|
||||
```
|
||||
8
docs/docs/apis-generate/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "APIs - Generate",
|
||||
"position": 3,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Details of APIs to interact with LLMs."
|
||||
}
|
||||
}
|
||||
92
docs/docs/apis-generate/chat-with-thinking.md
Normal 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 second‑largest city in France is _**Marseille**_. It’s 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 second‑largest 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 france’s largest city.`}
|
||||
typingSpeed={10}
|
||||
pauseBetweenSentences={1200}
|
||||
height="auto"
|
||||
width="100%"
|
||||
style={{ whiteSpace: 'pre-line' }}
|
||||
/>
|
||||
:::
|
||||
81
docs/docs/apis-generate/chat-with-tools.md
Normal 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 multi‑step orchestration).
|
||||
|
||||
To enable this behavior, set the useTools flag to true on your Ollama instance. When enabled, ollama4j will stop auto‑executing 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 auto‑executes 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 re‑calling 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/toolcalling/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/toolcalling/annotated/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
|
||||
:::
|
||||
104
docs/docs/apis-generate/chat.md
Normal file
@@ -0,0 +1,104 @@
|
||||
---
|
||||
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
|
||||
|
||||
<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:
|
||||
|
||||
:::tip[LLM Response]
|
||||
|
||||
> First answer: The capital of France is Paris.
|
||||
>
|
||||
> Second answer: The second-largest city in France is Marseille.
|
||||
>
|
||||
> Chat History:
|
||||
|
||||
```json
|
||||
[{
|
||||
"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
|
||||
}]
|
||||
```
|
||||
:::
|
||||
|
||||
### 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/ChatStreamingExample.java" />
|
||||
|
||||
<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%'
|
||||
/>
|
||||
|
||||
### Using a simple Console Output Stream Handler
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ConsoleOutputStreamHandlerExample.java" />
|
||||
|
||||
### With a Stream Handler to receive the tokens as they are generated
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatStreamingExample.java" />
|
||||
|
||||
### Create a new conversation with custom system prompt
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatWithCustomSystemPrompt.java" />
|
||||
|
||||
You will get a response as:
|
||||
|
||||
:::tip[LLM Response]
|
||||
Shhh!
|
||||
:::
|
||||
|
||||
|
||||
## Create a conversation about an image (requires a vision model)
|
||||
|
||||
Let's use this image:
|
||||
|
||||
<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' }} />
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ChatWithImage.java" />
|
||||
|
||||
|
||||
You will get a response similar to:
|
||||
|
||||
:::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.
|
||||
|
||||
**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.
|
||||
:::
|
||||
65
docs/docs/apis-generate/custom-roles.md
Normal 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");
|
||||
}
|
||||
}
|
||||
```
|
||||
84
docs/docs/apis-generate/generate-async.md
Normal file
@@ -0,0 +1,84 @@
|
||||
---
|
||||
sidebar_position: 6
|
||||
---
|
||||
|
||||
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
|
||||
background (such as threads) without blocking your code until the response arrives from the model.
|
||||
|
||||
This API corresponds to
|
||||
the [completion](https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion) API.
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateAsync.java" />
|
||||
|
||||
You will get a response similar to:
|
||||
|
||||
<TypewriterTextarea
|
||||
textContent={`Here are the participating teams in the 2019 ICC Cricket World Cup:
|
||||
|
||||
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' }}
|
||||
/>
|
||||
|
||||
### Generate response from a model asynchronously with thinking and response streamed
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateAsyncWithThinking.java" />
|
||||
|
||||
<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 sun’s light takes a little over **eight minutes** to get to earth.
|
||||
|
||||
| quantity | value |
|
||||
|----------|-------|
|
||||
| distance (average) | 1 astronomical unit (au) ≈ 149,600,000 km |
|
||||
| speed of light | \(c = 299,792,458\) m s⁻¹ |
|
||||
| light‑travel time | \(\displaystyle \frac{1\ \text{au}}{c} \approx 499\ \text{s}\) |
|
||||
|
||||
499 seconds is **8 min 19 s**.
|
||||
|
||||
because the earth’s orbit is slightly elliptical, the distance varies from about 147 million km (at perihelion) to 152 million km (at aphelion). this gives a light‑travel time that ranges roughly from **8 min 6 s** to **8 min 20 s**. thus, when we look at the sun, we’re 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 Sun’s light takes a little over **eight minutes** to get to Earth.
|
||||
|
||||
| Quantity | Value |
|
||||
|----------|-------|
|
||||
| Distance (average) | 1 astronomical unit (AU) ≈ 149,600,000 km |
|
||||
| Speed of light | \(c = 299,792,458\) m s⁻¹ |
|
||||
| Light‑travel time | \(\displaystyle \frac{1\ \text{AU}}{c} \approx 499\ \text{s}\) |
|
||||
|
||||
499 seconds is **8 min 19 s**.
|
||||
|
||||
Because the Earth’s orbit is slightly elliptical, the distance varies from about 147 million km (at perihelion) to 152 million km (at aphelion). This gives a light‑travel time that ranges roughly from **8 min 6 s** to **8 min 20 s**. Thus, when we look at the Sun, we’re seeing it as it was about eight minutes ago.`}
|
||||
typingSpeed={5}
|
||||
pauseBetweenSentences={1200}
|
||||
height="auto"
|
||||
width="100%"
|
||||
style={{ whiteSpace: 'pre-line' }}
|
||||
/>
|
||||
80
docs/docs/apis-generate/generate-embeddings.md
Normal file
@@ -0,0 +1,80 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# Generate Embeddings
|
||||
|
||||
Generate embeddings from a model.
|
||||
|
||||
### Using `embed()`
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateEmbeddings.java" />
|
||||
|
||||
:::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,
|
||||
]
|
||||
]
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
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:
|
||||
|
||||
:::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,
|
||||
]
|
||||
]
|
||||
```
|
||||
|
||||
:::
|
||||
55
docs/docs/apis-generate/generate-thinking.md
Normal 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]
|
||||
I’m ChatGPT, a large language model created by OpenAI. I’m designed to understand and generate natural‑language text, so I can answer questions, help with writing, explain concepts, brainstorm ideas, and chat about almost any topic. I don’t have a personal life or consciousness—I’m 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?" It's a request for identity. As ChatGPT, we should explain that I'm an AI developed by OpenAI, etc. Provide friendly explanation.`}
|
||||
typingSpeed={10}
|
||||
pauseBetweenSentences={1200}
|
||||
height="auto"
|
||||
width="100%"
|
||||
style={{ whiteSpace: 'pre-line' }}
|
||||
/>
|
||||
:::
|
||||
|
||||
:::tip[Response Tokens]
|
||||
<TypewriterTextarea
|
||||
textContent={`I’m ChatGPT, a large language model created by OpenAI. I’m designed to understand and generate natural‑language text, so I can answer questions, help with writing, explain concepts, brainstorm ideas, and chat about almost any topic. I don’t have a personal life or consciousness—I’m 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!`}
|
||||
typingSpeed={10}
|
||||
pauseBetweenSentences={1200}
|
||||
height="auto"
|
||||
width="100%"
|
||||
style={{ whiteSpace: 'pre-line' }}
|
||||
/>
|
||||
:::
|
||||
61
docs/docs/apis-generate/generate-with-images.md
Normal file
@@ -0,0 +1,61 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# 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.
|
||||
|
||||
:::
|
||||
|
||||
## Synchronous mode
|
||||
|
||||
If you have this image downloaded and you pass the path to the downloaded image to the following code:
|
||||
|
||||

|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateWithImageFile.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.
|
||||
:::
|
||||
|
||||
# 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:
|
||||
|
||||

|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateWithImageURL.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.
|
||||
:::
|
||||
91
docs/docs/apis-generate/generate-with-tools.md
Normal file
@@ -0,0 +1,91 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# 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.
|
||||
|
||||
:::note
|
||||
|
||||
This is an only an experimental implementation and has a very basic design.
|
||||
|
||||
Currently, built and tested for [Mistral's latest model](https://ollama.com/library/mistral) only. We could redesign
|
||||
this
|
||||
in the future if tooling is supported for more models with a generic interaction standard from Ollama.
|
||||
|
||||
:::
|
||||
|
||||
## Tools/Function Calling
|
||||
|
||||
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 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.
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/toolcalling/tools/FuelPriceTool.java"/ >
|
||||
|
||||
This function takes the argument `city` and performs an operation with the argument and returns the weather for a
|
||||
location.
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/toolcalling/tools/WeatherTool.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.
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/toolcalling/tools/DBQueryFunction.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.
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/toolcalling/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.
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/toolcalling/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()`.
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/toolcalling/toolspecs/DatabaseQueryToolSpec.java"/ >
|
||||
|
||||
Now put it all together by registering the tools and prompting with tools.
|
||||
|
||||
<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]
|
||||
|
||||
[Result of executing tool 'current-fuel-price']: Current price of petrol in Bengaluru is Rs.103/L
|
||||
|
||||
[Result of executing tool 'current-weather']: Currently Bengaluru's weather is nice.
|
||||
|
||||
[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}`
|
||||
|
||||
:::
|
||||
69
docs/docs/apis-generate/generate.md
Normal file
@@ -0,0 +1,69 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
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
|
||||
the [completion](https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion) API.
|
||||
|
||||
Use the `OptionBuilder` to build the `Options` object
|
||||
with [extra parameters](https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md#valid-parameters-and-values).
|
||||
Refer
|
||||
to [this](/apis-extras/options-builder).
|
||||
|
||||
### Try asking a question about the model
|
||||
|
||||
<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:
|
||||
|
||||
:::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
|
||||
|
||||
<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:
|
||||
|
||||
<TypewriterTextarea
|
||||
textContent='The capital of France is Paris.'
|
||||
typingSpeed={30}
|
||||
pauseBetweenSentences={1200}
|
||||
height='55px'
|
||||
width='100%'
|
||||
/>
|
||||
|
||||
## Generate structured output
|
||||
|
||||
### With response as a `Map`
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateStructuredOutput.java" />
|
||||
|
||||
You will get a response similar to:
|
||||
|
||||
:::tip[LLM Response]
|
||||
|
||||
```json
|
||||
{
|
||||
"heroName" : "Batman",
|
||||
"ageOfPerson" : 30
|
||||
}
|
||||
```
|
||||
|
||||
:::
|
||||
|
||||
### With response mapped to specified class type
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GenerateStructuredOutputMappedToObject.java" />
|
||||
|
||||
:::tip[LLM Response]
|
||||
HeroInfo(heroName=Batman, ageOfPerson=30)
|
||||
:::
|
||||
8
docs/docs/apis-model-management/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "APIs - Manage Models",
|
||||
"position": 2,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Details of APIs to manage LLMs."
|
||||
}
|
||||
}
|
||||
237
docs/docs/apis-model-management/create-model.md
Normal file
@@ -0,0 +1,237 @@
|
||||
---
|
||||
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 custom model from an existing model in the Ollama server
|
||||
|
||||
<CodeEmbed src="https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/CreateModel.java" />
|
||||
|
||||
You would see these logs while the custom model is being created:
|
||||
|
||||
```
|
||||
{"status":"using existing layer sha256:fad2a06e4cc705c2fa8bec5477ddb00dc0c859ac184c34dcc5586663774161ca"}
|
||||
{"status":"using existing layer sha256:41c2cf8c272f6fb0080a97cd9d9bd7d4604072b80a0b10e7d65ca26ef5000c0c"}
|
||||
{"status":"using existing layer sha256:1da0581fd4ce92dcf5a66b1da737cf215d8dcf25aa1b98b44443aaf7173155f5"}
|
||||
{"status":"creating new layer sha256:941b69ca7dc2a85c053c38d9e8029c9df6224e545060954fa97587f87c044a64"}
|
||||
{"status":"using existing layer sha256:f02dd72bb2423204352eabc5637b44d79d17f109fdb510a7c51455892aa2d216"}
|
||||
{"status":"writing manifest"}
|
||||
{"status":"success"}
|
||||
```
|
||||
Once created, you can see it when you use [list models](./list-models) API.
|
||||
|
||||
[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.
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (### Example of a `Modelfile`)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (```)
|
||||
|
||||
[//]: # (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)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (# 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`)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (```modelfile)
|
||||
|
||||
[//]: # (# comment)
|
||||
|
||||
[//]: # (INSTRUCTION arguments)
|
||||
|
||||
[//]: # (```)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (| 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)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (The `PARAMETER` instruction defines a parameter that can be set when the model is run.)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (| 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 |)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (#### TEMPLATE)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (`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)
|
||||
|
||||
[//]: # ()
|
||||
[//]: # (| 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)
|
||||
13
docs/docs/apis-model-management/delete-model.md
Normal file
@@ -0,0 +1,13 @@
|
||||
---
|
||||
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.
|
||||
|
||||
<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.
|
||||
31
docs/docs/apis-model-management/get-model-details.md
Normal file
24
docs/docs/apis-model-management/list-models.md
Normal file
@@ -0,0 +1,24 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# List Library Models
|
||||
|
||||
This API lets you list downloaded/available models on the Ollama server.
|
||||
|
||||
<CodeEmbed
|
||||
src='https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ListLocalModels.java'>
|
||||
</CodeEmbed>
|
||||
|
||||
|
||||
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
|
||||
```
|
||||
15
docs/docs/apis-model-management/pull-model.md
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# Pull Model
|
||||
|
||||
This API lets you pull a model on the Ollama server.
|
||||
|
||||
<CodeEmbed
|
||||
src='https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/PullModel.java'>
|
||||
</CodeEmbed>
|
||||
|
||||
Once downloaded, you can see them when you use [list models](./list-models) API.
|
||||
@@ -1,47 +1,147 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
|
||||
title: Introduction
|
||||
---
|
||||
|
||||
# Tutorial Intro
|
||||
import LatestRelease from '@site/src/components/LatestRelease';
|
||||
import AddToYourProject from '@site/src/components/AddToYourProject';
|
||||
|
||||
Let's discover **Docusaurus in less than 5 minutes**.
|
||||
# Introduction
|
||||
|
||||
## Getting Started
|
||||
### 🦙 What is Ollama?
|
||||
|
||||
Get started by **creating a new site**.
|
||||
[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.
|
||||
|
||||
Or **try Docusaurus immediately** with **[docusaurus.new](https://docusaurus.new)**.
|
||||
### 👨💻 Why Ollama4j?
|
||||
|
||||
### What you'll need
|
||||
Ollama4j was built for the simple purpose of integrating Ollama with Java applications.
|
||||
|
||||
- [Node.js](https://nodejs.org/en/download/) version 18.0 or above:
|
||||
- When installing Node.js, you are recommended to check all checkboxes related to dependencies.
|
||||
|
||||
## Generate a new site
|
||||
|
||||
Generate a new Docusaurus site using the **classic template**.
|
||||
|
||||
The classic template will automatically be added to your project after you run the command:
|
||||
|
||||
```bash
|
||||
npm init docusaurus@latest my-website classic
|
||||
```mermaid
|
||||
flowchart LR
|
||||
o4j[Ollama4j]
|
||||
o[Ollama Server]
|
||||
o4j -->|Communicates with| o;
|
||||
m[Models]
|
||||
p[Your Java Project]
|
||||
subgraph Your Java Environment
|
||||
direction TB
|
||||
p -->|Uses| o4j
|
||||
end
|
||||
subgraph Ollama Setup
|
||||
direction TB
|
||||
o -->|Manages| m
|
||||
end
|
||||
```
|
||||
|
||||
You can type this command into Command Prompt, Powershell, Terminal, or any other integrated terminal of your code editor.
|
||||
### Getting Started
|
||||
|
||||
The command also installs all necessary dependencies you need to run Docusaurus.
|
||||
#### What you'll need
|
||||
|
||||
## Start your site
|
||||
- **[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)**
|
||||
|
||||
Run the development 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
|
||||
Ollama server directly, **[download](https://ollama.ai/download)** the distribution of your choice
|
||||
and follow the installation process.
|
||||
|
||||
#### With Docker
|
||||
|
||||
##### Run in CPU mode:
|
||||
|
||||
```bash
|
||||
cd my-website
|
||||
npm run start
|
||||
docker run -it -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
|
||||
```
|
||||
|
||||
The `cd` command changes the directory you're working with. In order to work with your newly created Docusaurus site, you'll need to navigate the terminal there.
|
||||
##### Run in GPU mode:
|
||||
|
||||
The `npm run start` command builds your website locally and serves it through a development server, ready for you to view at http://localhost:3000/.
|
||||
```bash
|
||||
docker run -it --gpus=all -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
|
||||
```
|
||||
|
||||
Open `docs/intro.md` (this page) and edit some lines: the site **reloads automatically** and displays your changes.
|
||||
You can type this command into Command Prompt, Powershell, Terminal, or any other integrated
|
||||
terminal of your code editor.
|
||||
|
||||
The command runs the Ollama server locally at **http://localhost:11434/**.
|
||||
|
||||
#### Setup your project
|
||||
|
||||
Add the dependency to your project's `pom.xml`.
|
||||
|
||||
<AddToYourProject/>
|
||||
|
||||
<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 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,
|
||||
|
||||
Use `slf4j-jdk14` implementation:
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-jdk14</artifactId>
|
||||
<version>2.0.9</version> <!--Replace with appropriate version-->
|
||||
</dependency>
|
||||
```
|
||||
|
||||
or use `logback-classic` implementation:
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.3.11</version> <!--Replace with appropriate version-->
|
||||
</dependency>
|
||||
```
|
||||
|
||||
or use other suitable implementations.
|
||||
|
||||
Create a new Java class in your project and add this code.
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.Ollama;
|
||||
|
||||
public class OllamaTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Ollama ollama = new Ollama();
|
||||
|
||||
boolean isOllamaServerReachable = ollama.ping();
|
||||
|
||||
System.out.println("Is Ollama server running: " + isOllamaServerReachable);
|
||||
}
|
||||
}
|
||||
```
|
||||
This uses the default Ollama host as `http://localhost:11434`.
|
||||
|
||||
Specify a different Ollama host that you want to connect to.
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.Ollama;
|
||||
|
||||
public class OllamaTest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
Ollama ollama = new Ollama(host);
|
||||
|
||||
boolean isOllamaServerReachable = ollama.ping();
|
||||
|
||||
System.out.println("Is Ollama server running: " + isOllamaServerReachable);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
90
docs/docs/metrics.md
Normal file
@@ -0,0 +1,90 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
|
||||
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:
|
||||
|
||||

|
||||
|
||||
## 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](../integration/monitoring.md) for)
|
||||
|
||||
[//]: # (detailed instructions.)
|
||||
|
||||
[//]: # ()
|
||||
|
||||
[//]: # (For more information on customizing and extending metrics, see the [API documentation](../api/metrics.md).)
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"label": "Tutorial - Basics",
|
||||
"position": 2,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "5 minutes to learn the most important Docusaurus concepts."
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
sidebar_position: 6
|
||||
---
|
||||
|
||||
# Congratulations!
|
||||
|
||||
You have just learned the **basics of Docusaurus** and made some changes to the **initial template**.
|
||||
|
||||
Docusaurus has **much more to offer**!
|
||||
|
||||
Have **5 more minutes**? Take a look at **[versioning](../tutorial-extras/manage-docs-versions.md)** and **[i18n](../tutorial-extras/translate-your-site.md)**.
|
||||
|
||||
Anything **unclear** or **buggy** in this tutorial? [Please report it!](https://github.com/facebook/docusaurus/discussions/4610)
|
||||
|
||||
## What's next?
|
||||
|
||||
- Read the [official documentation](https://docusaurus.io/)
|
||||
- Modify your site configuration with [`docusaurus.config.js`](https://docusaurus.io/docs/api/docusaurus-config)
|
||||
- Add navbar and footer items with [`themeConfig`](https://docusaurus.io/docs/api/themes/configuration)
|
||||
- Add a custom [Design and Layout](https://docusaurus.io/docs/styling-layout)
|
||||
- Add a [search bar](https://docusaurus.io/docs/search)
|
||||
- Find inspirations in the [Docusaurus showcase](https://docusaurus.io/showcase)
|
||||
- Get involved in the [Docusaurus Community](https://docusaurus.io/community/support)
|
||||
@@ -1,34 +0,0 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Create a Blog Post
|
||||
|
||||
Docusaurus creates a **page for each blog post**, but also a **blog index page**, a **tag system**, an **RSS** feed...
|
||||
|
||||
## Create your first Post
|
||||
|
||||
Create a file at `blog/2021-02-28-greetings.md`:
|
||||
|
||||
```md title="blog/2021-02-28-greetings.md"
|
||||
---
|
||||
slug: greetings
|
||||
title: Greetings!
|
||||
authors:
|
||||
- name: Joel Marcey
|
||||
title: Co-creator of Docusaurus 1
|
||||
url: https://github.com/JoelMarcey
|
||||
image_url: https://github.com/JoelMarcey.png
|
||||
- name: Sébastien Lorber
|
||||
title: Docusaurus maintainer
|
||||
url: https://sebastienlorber.com
|
||||
image_url: https://github.com/slorber.png
|
||||
tags: [greetings]
|
||||
---
|
||||
|
||||
Congratulations, you have made your first post!
|
||||
|
||||
Feel free to play around and edit this post as much you like.
|
||||
```
|
||||
|
||||
A new blog post is now available at [http://localhost:3000/blog/greetings](http://localhost:3000/blog/greetings).
|
||||
@@ -1,57 +0,0 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Create a Document
|
||||
|
||||
Documents are **groups of pages** connected through:
|
||||
|
||||
- a **sidebar**
|
||||
- **previous/next navigation**
|
||||
- **versioning**
|
||||
|
||||
## Create your first Doc
|
||||
|
||||
Create a Markdown file at `docs/hello.md`:
|
||||
|
||||
```md title="docs/hello.md"
|
||||
# Hello
|
||||
|
||||
This is my **first Docusaurus document**!
|
||||
```
|
||||
|
||||
A new document is now available at [http://localhost:3000/docs/hello](http://localhost:3000/docs/hello).
|
||||
|
||||
## Configure the Sidebar
|
||||
|
||||
Docusaurus automatically **creates a sidebar** from the `docs` folder.
|
||||
|
||||
Add metadata to customize the sidebar label and position:
|
||||
|
||||
```md title="docs/hello.md" {1-4}
|
||||
---
|
||||
sidebar_label: 'Hi!'
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Hello
|
||||
|
||||
This is my **first Docusaurus document**!
|
||||
```
|
||||
|
||||
It is also possible to create your sidebar explicitly in `sidebars.js`:
|
||||
|
||||
```js title="sidebars.js"
|
||||
export default {
|
||||
tutorialSidebar: [
|
||||
'intro',
|
||||
// highlight-next-line
|
||||
'hello',
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Tutorial',
|
||||
items: ['tutorial-basics/create-a-document'],
|
||||
},
|
||||
],
|
||||
};
|
||||
```
|
||||
@@ -1,43 +0,0 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Create a Page
|
||||
|
||||
Add **Markdown or React** files to `src/pages` to create a **standalone page**:
|
||||
|
||||
- `src/pages/index.js` → `localhost:3000/`
|
||||
- `src/pages/foo.md` → `localhost:3000/foo`
|
||||
- `src/pages/foo/bar.js` → `localhost:3000/foo/bar`
|
||||
|
||||
## Create your first React Page
|
||||
|
||||
Create a file at `src/pages/my-react-page.js`:
|
||||
|
||||
```jsx title="src/pages/my-react-page.js"
|
||||
import React from 'react';
|
||||
import Layout from '@theme/Layout';
|
||||
|
||||
export default function MyReactPage() {
|
||||
return (
|
||||
<Layout>
|
||||
<h1>My React page</h1>
|
||||
<p>This is a React page</p>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
A new page is now available at [http://localhost:3000/my-react-page](http://localhost:3000/my-react-page).
|
||||
|
||||
## Create your first Markdown Page
|
||||
|
||||
Create a file at `src/pages/my-markdown-page.md`:
|
||||
|
||||
```mdx title="src/pages/my-markdown-page.md"
|
||||
# My Markdown page
|
||||
|
||||
This is a Markdown page
|
||||
```
|
||||
|
||||
A new page is now available at [http://localhost:3000/my-markdown-page](http://localhost:3000/my-markdown-page).
|
||||
@@ -1,31 +0,0 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
# Deploy your site
|
||||
|
||||
Docusaurus is a **static-site-generator** (also called **[Jamstack](https://jamstack.org/)**).
|
||||
|
||||
It builds your site as simple **static HTML, JavaScript and CSS files**.
|
||||
|
||||
## Build your site
|
||||
|
||||
Build your site **for production**:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
The static files are generated in the `build` folder.
|
||||
|
||||
## Deploy your site
|
||||
|
||||
Test your production build locally:
|
||||
|
||||
```bash
|
||||
npm run serve
|
||||
```
|
||||
|
||||
The `build` folder is now served at [http://localhost:3000/](http://localhost:3000/).
|
||||
|
||||
You can now deploy the `build` folder **almost anywhere** easily, **for free** or very small cost (read the **[Deployment Guide](https://docusaurus.io/docs/deployment)**).
|
||||
@@ -1,150 +0,0 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Markdown Features
|
||||
|
||||
Docusaurus supports **[Markdown](https://daringfireball.net/projects/markdown/syntax)** and a few **additional features**.
|
||||
|
||||
## Front Matter
|
||||
|
||||
Markdown documents have metadata at the top called [Front Matter](https://jekyllrb.com/docs/front-matter/):
|
||||
|
||||
```text title="my-doc.md"
|
||||
// highlight-start
|
||||
---
|
||||
id: my-doc-id
|
||||
title: My document title
|
||||
description: My document description
|
||||
slug: /my-custom-url
|
||||
---
|
||||
// highlight-end
|
||||
|
||||
## Markdown heading
|
||||
|
||||
Markdown text with [links](./hello.md)
|
||||
```
|
||||
|
||||
## Links
|
||||
|
||||
Regular Markdown links are supported, using url paths or relative file paths.
|
||||
|
||||
```md
|
||||
Let's see how to [Create a page](/create-a-page).
|
||||
```
|
||||
|
||||
```md
|
||||
Let's see how to [Create a page](./create-a-page.md).
|
||||
```
|
||||
|
||||
**Result:** Let's see how to [Create a page](./create-a-page.md).
|
||||
|
||||
## Images
|
||||
|
||||
Regular Markdown images are supported.
|
||||
|
||||
You can use absolute paths to reference images in the static directory (`static/img/docusaurus.png`):
|
||||
|
||||
```md
|
||||

|
||||
```
|
||||
|
||||

|
||||
|
||||
You can reference images relative to the current file as well. This is particularly useful to colocate images close to the Markdown files using them:
|
||||
|
||||
```md
|
||||

|
||||
```
|
||||
|
||||
## Code Blocks
|
||||
|
||||
Markdown code blocks are supported with Syntax highlighting.
|
||||
|
||||
```jsx title="src/components/HelloDocusaurus.js"
|
||||
function HelloDocusaurus() {
|
||||
return (
|
||||
<h1>Hello, Docusaurus!</h1>
|
||||
)
|
||||
}
|
||||
```
|
||||
|
||||
```jsx title="src/components/HelloDocusaurus.js"
|
||||
function HelloDocusaurus() {
|
||||
return <h1>Hello, Docusaurus!</h1>;
|
||||
}
|
||||
```
|
||||
|
||||
## Admonitions
|
||||
|
||||
Docusaurus has a special syntax to create admonitions and callouts:
|
||||
|
||||
:::tip My tip
|
||||
|
||||
Use this awesome feature option
|
||||
|
||||
:::
|
||||
|
||||
:::danger Take care
|
||||
|
||||
This action is dangerous
|
||||
|
||||
:::
|
||||
|
||||
:::tip My tip
|
||||
|
||||
Use this awesome feature option
|
||||
|
||||
:::
|
||||
|
||||
:::danger Take care
|
||||
|
||||
This action is dangerous
|
||||
|
||||
:::
|
||||
|
||||
## MDX and React Components
|
||||
|
||||
[MDX](https://mdxjs.com/) can make your documentation more **interactive** and allows using any **React components inside Markdown**:
|
||||
|
||||
```jsx
|
||||
export const Highlight = ({children, color}) => (
|
||||
<span
|
||||
style={{
|
||||
backgroundColor: color,
|
||||
borderRadius: '20px',
|
||||
color: '#fff',
|
||||
padding: '10px',
|
||||
cursor: 'pointer',
|
||||
}}
|
||||
onClick={() => {
|
||||
alert(`You clicked the color ${color} with label ${children}`)
|
||||
}}>
|
||||
{children}
|
||||
</span>
|
||||
);
|
||||
|
||||
This is <Highlight color="#25c2a0">Docusaurus green</Highlight> !
|
||||
|
||||
This is <Highlight color="#1877F2">Facebook blue</Highlight> !
|
||||
```
|
||||
|
||||
export const Highlight = ({children, color}) => (
|
||||
<span
|
||||
style={{
|
||||
backgroundColor: color,
|
||||
borderRadius: '20px',
|
||||
color: '#fff',
|
||||
padding: '10px',
|
||||
cursor: 'pointer',
|
||||
}}
|
||||
onClick={() => {
|
||||
alert(`You clicked the color ${color} with label ${children}`);
|
||||
}}>
|
||||
{children}
|
||||
</span>
|
||||
);
|
||||
|
||||
This is <Highlight color="#25c2a0">Docusaurus green</Highlight> !
|
||||
|
||||
This is <Highlight color="#1877F2">Facebook blue</Highlight> !
|
||||
@@ -1,7 +0,0 @@
|
||||
{
|
||||
"label": "Tutorial - Extras",
|
||||
"position": 3,
|
||||
"link": {
|
||||
"type": "generated-index"
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 27 KiB |
@@ -1,55 +0,0 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Manage Docs Versions
|
||||
|
||||
Docusaurus can manage multiple versions of your docs.
|
||||
|
||||
## Create a docs version
|
||||
|
||||
Release a version 1.0 of your project:
|
||||
|
||||
```bash
|
||||
npm run docusaurus docs:version 1.0
|
||||
```
|
||||
|
||||
The `docs` folder is copied into `versioned_docs/version-1.0` and `versions.json` is created.
|
||||
|
||||
Your docs now have 2 versions:
|
||||
|
||||
- `1.0` at `http://localhost:3000/docs/` for the version 1.0 docs
|
||||
- `current` at `http://localhost:3000/docs/next/` for the **upcoming, unreleased docs**
|
||||
|
||||
## Add a Version Dropdown
|
||||
|
||||
To navigate seamlessly across versions, add a version dropdown.
|
||||
|
||||
Modify the `docusaurus.config.js` file:
|
||||
|
||||
```js title="docusaurus.config.js"
|
||||
export default {
|
||||
themeConfig: {
|
||||
navbar: {
|
||||
items: [
|
||||
// highlight-start
|
||||
{
|
||||
type: 'docsVersionDropdown',
|
||||
},
|
||||
// highlight-end
|
||||
],
|
||||
},
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
The docs version dropdown appears in your navbar:
|
||||
|
||||

|
||||
|
||||
## Update an existing version
|
||||
|
||||
It is possible to edit versioned docs in their respective folder:
|
||||
|
||||
- `versioned_docs/version-1.0/hello.md` updates `http://localhost:3000/docs/hello`
|
||||
- `docs/hello.md` updates `http://localhost:3000/docs/next/hello`
|
||||
@@ -1,88 +0,0 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Translate your site
|
||||
|
||||
Let's translate `docs/intro.md` to French.
|
||||
|
||||
## Configure i18n
|
||||
|
||||
Modify `docusaurus.config.js` to add support for the `fr` locale:
|
||||
|
||||
```js title="docusaurus.config.js"
|
||||
export default {
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: ['en', 'fr'],
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
## Translate a doc
|
||||
|
||||
Copy the `docs/intro.md` file to the `i18n/fr` folder:
|
||||
|
||||
```bash
|
||||
mkdir -p i18n/fr/docusaurus-plugin-content-docs/current/
|
||||
|
||||
cp docs/intro.md i18n/fr/docusaurus-plugin-content-docs/current/intro.md
|
||||
```
|
||||
|
||||
Translate `i18n/fr/docusaurus-plugin-content-docs/current/intro.md` in French.
|
||||
|
||||
## Start your localized site
|
||||
|
||||
Start your site on the French locale:
|
||||
|
||||
```bash
|
||||
npm run start -- --locale fr
|
||||
```
|
||||
|
||||
Your localized site is accessible at [http://localhost:3000/fr/](http://localhost:3000/fr/) and the `Getting Started` page is translated.
|
||||
|
||||
:::caution
|
||||
|
||||
In development, you can only use one locale at a time.
|
||||
|
||||
:::
|
||||
|
||||
## Add a Locale Dropdown
|
||||
|
||||
To navigate seamlessly across languages, add a locale dropdown.
|
||||
|
||||
Modify the `docusaurus.config.js` file:
|
||||
|
||||
```js title="docusaurus.config.js"
|
||||
export default {
|
||||
themeConfig: {
|
||||
navbar: {
|
||||
items: [
|
||||
// highlight-start
|
||||
{
|
||||
type: 'localeDropdown',
|
||||
},
|
||||
// highlight-end
|
||||
],
|
||||
},
|
||||
},
|
||||
};
|
||||
```
|
||||
|
||||
The locale dropdown now appears in your navbar:
|
||||
|
||||

|
||||
|
||||
## Build your localized site
|
||||
|
||||
Build your site for a specific locale:
|
||||
|
||||
```bash
|
||||
npm run build -- --locale fr
|
||||
```
|
||||
|
||||
Or build your site to include all the locales at once:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
@@ -8,131 +8,177 @@ import {themes as prismThemes} from 'prism-react-renderer';
|
||||
|
||||
/** @type {import('@docusaurus/types').Config} */
|
||||
const config = {
|
||||
title: 'Ollama4J',
|
||||
tagline: 'Java library for interacting with Ollama API.',
|
||||
favicon: 'img/favicon.ico',
|
||||
title: 'Ollama4j',
|
||||
tagline: 'Java library for interacting with Ollama.',
|
||||
favicon: 'img/favicon.ico',
|
||||
|
||||
// Set the production url of your site here
|
||||
url: 'https://your-docusaurus-site.example.com',
|
||||
// Set the /<baseUrl>/ pathname under which your site is served
|
||||
// For GitHub pages deployment, it is often '/<projectName>/'
|
||||
baseUrl: '/ollama4j/',
|
||||
// Set the production url of your site here
|
||||
url: 'https://your-docusaurus-site.example.com',
|
||||
// Set the /<baseUrl>/ pathname under which your site is served
|
||||
// For GitHub pages deployment, it is often '/<projectName>/'
|
||||
baseUrl: '/ollama4j/',
|
||||
|
||||
// GitHub pages deployment config.
|
||||
// If you aren't using GitHub pages, you don't need these.
|
||||
organizationName: 'amithkoujalgi', // Usually your GitHub org/user name.
|
||||
projectName: 'ollama4j', // Usually your repo name.
|
||||
// GitHub pages deployment config.
|
||||
// If you aren't using GitHub pages, you don't need these.
|
||||
organizationName: 'ollama4j', // Usually your GitHub org/user name.
|
||||
projectName: 'ollama4j', // Usually your repo name.
|
||||
|
||||
onBrokenLinks: 'throw',
|
||||
onBrokenMarkdownLinks: 'warn',
|
||||
onBrokenLinks: 'throw',
|
||||
|
||||
// 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
|
||||
// may want to replace "en" with "zh-Hans".
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: ['en'],
|
||||
},
|
||||
// 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
|
||||
// may want to replace "en" with "zh-Hans".
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: ['en'],
|
||||
},
|
||||
|
||||
presets: [
|
||||
[
|
||||
'classic',
|
||||
/** @type {import('@docusaurus/preset-classic').Options} */
|
||||
({
|
||||
docs: {
|
||||
sidebarPath: './sidebars.js',
|
||||
// Please change this to your repo.
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl:
|
||||
'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
|
||||
},
|
||||
blog: {
|
||||
showReadingTime: true,
|
||||
// Please change this to your repo.
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl:
|
||||
'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',
|
||||
},
|
||||
theme: {
|
||||
customCss: './src/css/custom.css',
|
||||
},
|
||||
}),
|
||||
presets: [
|
||||
[
|
||||
'classic',
|
||||
/** @type {import('@docusaurus/preset-classic').Options} */
|
||||
({
|
||||
docs: {
|
||||
path: 'docs',
|
||||
routeBasePath: '', // change this to any URL route you'd want. For example: `home` - if you want /home/intro.
|
||||
sidebarPath: './sidebars.js',
|
||||
// Please change this to your repo.
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl:
|
||||
'https://github.com/ollama4j/ollama4j/blob/main/docs',
|
||||
},
|
||||
blog: {
|
||||
showReadingTime: true,
|
||||
// Please change this to your repo.
|
||||
// Remove this to remove the "edit this page" links.
|
||||
editUrl:
|
||||
'https://github.com/ollama4j/ollama4j/blob/main/docs',
|
||||
},
|
||||
theme: {
|
||||
customCss: './src/css/custom.css',
|
||||
},
|
||||
gtag: {
|
||||
trackingID: 'G-G7FLH6FNDC',
|
||||
anonymizeIP: false,
|
||||
},
|
||||
}),
|
||||
],
|
||||
],
|
||||
],
|
||||
|
||||
themeConfig:
|
||||
themeConfig:
|
||||
/** @type {import('@docusaurus/preset-classic').ThemeConfig} */
|
||||
({
|
||||
// Replace with your project's social card
|
||||
image: 'img/docusaurus-social-card.jpg',
|
||||
navbar: {
|
||||
title: 'Ollama4J',
|
||||
logo: {
|
||||
alt: 'Ollama4J Logo',
|
||||
src: 'img/logo.svg',
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'docSidebar',
|
||||
sidebarId: 'tutorialSidebar',
|
||||
position: 'left',
|
||||
label: 'Tutorial',
|
||||
},
|
||||
{to: '/blog', label: 'Blog', position: 'left'},
|
||||
{to: 'https://github.com/amithkoujalgi/ollama4j', label: 'Javadoc', position: 'left'},
|
||||
{
|
||||
href: 'https://github.com/amithkoujalgi/ollama4j',
|
||||
label: 'GitHub',
|
||||
position: 'right',
|
||||
},
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
style: 'dark',
|
||||
links: [
|
||||
{
|
||||
title: 'Docs',
|
||||
items: [
|
||||
{
|
||||
label: 'Tutorial',
|
||||
to: '/docs/intro',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Community',
|
||||
items: [
|
||||
{
|
||||
label: 'Stack Overflow',
|
||||
href: 'https://stackoverflow.com/questions/tagged/ollama4j',
|
||||
},
|
||||
{
|
||||
label: 'Twitter',
|
||||
href: 'https://twitter.com/ollama4j',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'More',
|
||||
items: [
|
||||
{
|
||||
label: 'Blog',
|
||||
to: '/blog',
|
||||
},
|
||||
{
|
||||
label: 'GitHub',
|
||||
href: 'https://github.com/amithkoujalgi/ollama4j',
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
copyright: `Ollama4J Documentation ${new Date().getFullYear()}. Built with Docusaurus.`,
|
||||
},
|
||||
prism: {
|
||||
theme: prismThemes.github,
|
||||
darkTheme: prismThemes.dracula,
|
||||
},
|
||||
}),
|
||||
({
|
||||
// Replace with your project's social card
|
||||
image: 'img/docusaurus-social-card.jpg',
|
||||
navbar: {
|
||||
title: 'Ollama4j',
|
||||
logo: {
|
||||
alt: 'Ollama4j Logo',
|
||||
src: 'img/logo.svg',
|
||||
},
|
||||
items: [
|
||||
{
|
||||
type: 'docSidebar',
|
||||
sidebarId: 'tutorialSidebar',
|
||||
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'},
|
||||
{
|
||||
href: 'https://github.com/ollama4j/ollama4j',
|
||||
label: 'GitHub',
|
||||
position: 'right',
|
||||
},
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
style: 'dark',
|
||||
links: [
|
||||
{
|
||||
title: 'Quick Links',
|
||||
items: [
|
||||
{
|
||||
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',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: 'Community',
|
||||
items: [
|
||||
{
|
||||
label: 'Stack Overflow',
|
||||
href: 'https://stackoverflow.com/questions/tagged/ollama4j',
|
||||
},
|
||||
{
|
||||
label: 'Twitter',
|
||||
href: 'https://twitter.com/ollama4j',
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
copyright: `Ollama4j Documentation ${new Date().getFullYear()}. Built with Docusaurus.`,
|
||||
},
|
||||
prism: {
|
||||
theme: prismThemes.github,
|
||||
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']
|
||||
};
|
||||
|
||||
export default config;
|
||||
|
||||
33528
docs/package-lock.json
generated
@@ -1,44 +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.0.1",
|
||||
"@docusaurus/preset-classic": "3.0.1",
|
||||
"@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.0.1",
|
||||
"@docusaurus/types": "3.0.1"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
||||
0
docs/run.sh
Normal file → Executable file
65
docs/src/components/AddToYourProject/index.js
Normal 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;
|
||||
41
docs/src/components/BuyMeACoffee/index.js
Normal file
@@ -0,0 +1,41 @@
|
||||
import React from "react";
|
||||
|
||||
class BuyMeACoffee extends React.Component {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
let script = document.createElement("script");
|
||||
script.src = 'https://cdnjs.buymeacoffee.com/1.0.0/widget.prod.min.js';
|
||||
script.dataset.name = 'BMC-Widget';
|
||||
script.dataset.cfasync = 'false';
|
||||
script.dataset.id = 'amithkoujalgi';
|
||||
script.dataset.description = 'Support me on Buy me a coffee!';
|
||||
script.dataset.message = 'If you like my work and want to say thanks, or encourage me to do more, you can buy me a coffee! 😊';
|
||||
script.dataset.color = '#2e8555';
|
||||
script.dataset.position = 'Right';
|
||||
script.dataset.x_margin = '18';
|
||||
script.dataset.y_margin = '18';
|
||||
script.async = true
|
||||
|
||||
script.onload = function () {
|
||||
let evt = document.createEvent('Event');
|
||||
evt.initEvent('DOMContentLoaded', false, false);
|
||||
window.dispatchEvent(evt);
|
||||
}
|
||||
this.script = script
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
document.head.appendChild(this.script)
|
||||
}
|
||||
|
||||
// componentWillUnmount() {
|
||||
// document.head.removeChild(this.script);
|
||||
// document.body.removeChild(document.getElementById("bmc-wbtn"))
|
||||
// }
|
||||
|
||||
render() {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export default BuyMeACoffee;
|
||||
170
docs/src/components/CodeEmbed/index.js
Normal file
@@ -0,0 +1,170 @@
|
||||
// import React, { useState, useEffect } from 'react';
|
||||
// import CodeBlock from '@theme/CodeBlock';
|
||||
// import Icon from '@site/src/components/Icon';
|
||||
|
||||
|
||||
// const CodeEmbed = ({ src }) => {
|
||||
// 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;
|
||||
|
||||
// return (
|
||||
// loading ? (
|
||||
// <div>Loading code...</div>
|
||||
// ) : error ? (
|
||||
// <div>Error: {error.message}</div>
|
||||
// ) : (
|
||||
// <div style={{ backgroundColor: 'transparent', padding: '0px', borderRadius: '5px' }}>
|
||||
// <div style={{ textAlign: 'right' }}>
|
||||
// {githubUrl && (
|
||||
// <a href={githubUrl} target="_blank" rel="noopener noreferrer" style={{ paddingRight: '15px', color: 'gray', fontSize: '0.8em', fontStyle: 'italic', display: 'inline-flex', alignItems: 'center' }}>
|
||||
// View on GitHub
|
||||
// <Icon icon="mdi:github" height="48" />
|
||||
// </a>
|
||||
// )}
|
||||
// </div>
|
||||
// <CodeBlock title={fileName} className="language-java">{code}</CodeBlock>
|
||||
// </div>
|
||||
// )
|
||||
// );
|
||||
// };
|
||||
|
||||
// export default CodeEmbed;
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import CodeBlock from '@theme/CodeBlock';
|
||||
import Icon from '@site/src/components/Icon';
|
||||
|
||||
|
||||
const CodeEmbed = ({ src }) => {
|
||||
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} className="language-java">{code}</CodeBlock>
|
||||
</div>
|
||||
)
|
||||
);
|
||||
};
|
||||
|
||||
export default CodeEmbed;
|
||||
@@ -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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
9
docs/src/components/Icon/index.js
Normal 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;
|
||||
52
docs/src/components/LatestRelease/index.js
Normal 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;
|
||||
54
docs/src/components/Ollama4jUIImageCarousel/index.js
Normal 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;
|
||||
73
docs/src/components/TypewriterTextarea/index.js
Normal 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;
|
||||
@@ -4,27 +4,47 @@
|
||||
* 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;
|
||||
--ifm-color-primary-dark: #29784c;
|
||||
--ifm-color-primary-darker: #277148;
|
||||
--ifm-color-primary-darkest: #205d3b;
|
||||
--ifm-color-primary-light: #33925d;
|
||||
--ifm-color-primary-lighter: #359962;
|
||||
--ifm-color-primary-lightest: #3cad6e;
|
||||
--ifm-code-font-size: 95%;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
||||
--ifm-color-primary: #2e8555;
|
||||
--ifm-color-primary-dark: #29784c;
|
||||
--ifm-color-primary-darker: #277148;
|
||||
--ifm-color-primary-darkest: #205d3b;
|
||||
--ifm-color-primary-light: #33925d;
|
||||
--ifm-color-primary-lighter: #359962;
|
||||
--ifm-color-primary-lightest: #3cad6e;
|
||||
--ifm-code-font-size: 95%;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
/* For readability concerns, you should choose a lighter palette in dark mode. */
|
||||
[data-theme='dark'] {
|
||||
--ifm-color-primary: #25c2a0;
|
||||
--ifm-color-primary-dark: #21af90;
|
||||
--ifm-color-primary-darker: #1fa588;
|
||||
--ifm-color-primary-darkest: #1a8870;
|
||||
--ifm-color-primary-light: #29d5b0;
|
||||
--ifm-color-primary-lighter: #32d8b4;
|
||||
--ifm-color-primary-lightest: #4fddbf;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||
--ifm-color-primary: #25c2a0;
|
||||
--ifm-color-primary-dark: #21af90;
|
||||
--ifm-color-primary-darker: #1fa588;
|
||||
--ifm-color-primary-darkest: #1a8870;
|
||||
--ifm-color-primary-light: #29d5b0;
|
||||
--ifm-color-primary-lighter: #32d8b4;
|
||||
--ifm-color-primary-lightest: #4fddbf;
|
||||
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
article > header > h1 {
|
||||
font-size: 2rem !important;
|
||||
}
|
||||
|
||||
div > h1,
|
||||
header > h1,
|
||||
h2 > a {
|
||||
font-size: 2rem !important;
|
||||
}
|
||||
|
||||
#bmc-wbtn{
|
||||
bottom: 15px;
|
||||
}
|
||||
|
||||
#bmc-wbtn + div{
|
||||
bottom:15px;
|
||||
}
|
||||
@@ -3,9 +3,12 @@ import Link from '@docusaurus/Link';
|
||||
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
||||
import Layout from '@theme/Layout';
|
||||
import HomepageFeatures from '@site/src/components/HomepageFeatures';
|
||||
|
||||
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();
|
||||
@@ -15,14 +18,31 @@ function HomepageHeader() {
|
||||
<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="/docs/intro">
|
||||
Getting Started
|
||||
<div style={{ marginTop: '2rem' }}>
|
||||
<TypewriterTextarea
|
||||
textContent='Hello there! I’m 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>
|
||||
</header>
|
||||
);
|
||||
@@ -32,12 +52,15 @@ export default function Home() {
|
||||
const {siteConfig} = useDocusaurusContext();
|
||||
return (
|
||||
<Layout
|
||||
title={`Hello from ${siteConfig.title}`}
|
||||
title={`${siteConfig.title}`}
|
||||
description="Description will go into a meta tag in <head />">
|
||||
<HomepageHeader />
|
||||
<main>
|
||||
<HomepageFeatures />
|
||||
<BrowserOnly>
|
||||
{() => <BuyMeACoffee />}
|
||||
</BrowserOnly>
|
||||
</main>
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
}
|
||||
7
docs/static/img/ai-player.svg
vendored
Normal 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
@@ -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
|
After Width: | Height: | Size: 501 KiB |
13
docs/static/img/katie_logo_v3.svg
vendored
Normal 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
@@ -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
|
After Width: | Height: | Size: 606 KiB |
BIN
docs/static/img/ollama4j-ui/2.png
vendored
Normal file
|
After Width: | Height: | Size: 562 KiB |
BIN
docs/static/img/ollama4j-ui/3.png
vendored
Normal file
|
After Width: | Height: | Size: 724 KiB |