Compare commits
548 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
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 | ||
![]() |
f128e708a0 | ||
![]() |
8d67fab958 | ||
![]() |
ba355d7f62 | ||
![]() |
0d0e322af8 | ||
![]() |
9eb2ba57fd | ||
![]() |
44e4d6f8b0 | ||
![]() |
b5a647ea30 | ||
![]() |
14c6efb761 | ||
![]() |
2ea8faeea8 | ||
![]() |
9f79dfa936 | ||
![]() |
1fb2258a77 |
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
|
46
.github/workflows/build-on-pull-request.yml
vendored
Normal file
@ -0,0 +1,46 @@
|
||||
name: Run Tests
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
# types: [opened, reopened, synchronize, edited]
|
||||
branches: [ "main" ]
|
||||
paths:
|
||||
- 'src/**' # Run if changes occur in the 'src' folder
|
||||
- 'pom.xml' # Run if changes occur in the 'pom.xml' file
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
run-tests:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
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 unit tests
|
||||
run: mvn --file pom.xml -U clean test -Punit-tests
|
||||
|
||||
- name: Run integration tests
|
||||
run: mvn --file pom.xml -U clean verify -Pintegration-tests
|
||||
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20.x'
|
||||
- run: cd docs && npm ci
|
||||
- run: cd docs && npm run build
|
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@v3
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
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@v8
|
||||
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'
|
119
.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
|
||||
|
||||
#on:
|
||||
# release:
|
||||
# types: [ "created" ]
|
||||
name: Release Artifacts to Maven Central
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
workflow_dispatch:
|
||||
release:
|
||||
types: [ created ]
|
||||
|
||||
|
||||
#on:
|
||||
# pull_request:
|
||||
# types: [ opened, reopened ]
|
||||
# branches: [ "main" ]
|
||||
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up JDK 11
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'adopt-hotspot'
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
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
|
@ -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:
|
||||
@ -38,15 +37,38 @@ jobs:
|
||||
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
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20.x'
|
||||
- run: cd docs && npm ci
|
||||
- run: cd docs && 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
|
||||
run: mvn --file pom.xml -U clean package && cp -r ./target/apidocs/. ./docs/build/apidocs
|
||||
|
||||
- name: Doxygen Action
|
||||
uses: mattnotmitt/doxygen-action@v1.1.0
|
||||
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@v3
|
||||
with:
|
||||
# Upload entire repository
|
||||
path: './target/apidocs/.'
|
||||
path: './docs/build/.'
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v2
|
||||
uses: actions/deploy-pages@v4
|
35
.github/workflows/run-tests.yml
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
name: Run Unit and Integration Tests
|
||||
|
||||
on:
|
||||
# push:
|
||||
# branches:
|
||||
# - main
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: 'Branch name to run the tests on'
|
||||
required: true
|
||||
default: 'main'
|
||||
|
||||
jobs:
|
||||
run-tests:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.inputs.branch }}
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
server-id: github
|
||||
settings-path: ${{ github.workspace }}
|
||||
|
||||
- name: Run unit tests
|
||||
run: mvn clean test -Punit-tests
|
||||
|
||||
- name: Run integration tests
|
||||
run: mvn clean verify -Pintegration-tests
|
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 |
38
.pre-commit-config.yaml
Normal file
@ -0,0 +1,38 @@
|
||||
repos:
|
||||
|
||||
# pre-commit hooks
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: "v5.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.4.1
|
||||
hooks:
|
||||
- id: commitizen
|
||||
stages: [commit-msg]
|
||||
|
||||
# # 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/
|
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.
|
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 =
|
39
Makefile
@ -1,13 +1,42 @@
|
||||
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
|
||||
|
||||
build:
|
||||
mvn -B clean install -Dgpg.skip=true
|
||||
|
||||
full-build:
|
||||
mvn -B clean install
|
||||
|
||||
ut:
|
||||
unit-tests:
|
||||
mvn clean test -Punit-tests
|
||||
|
||||
it:
|
||||
mvn clean verify -Pintegration-tests
|
||||
integration-tests:
|
||||
export USE_EXTERNAL_OLLAMA_HOST=false && mvn clean verify -Pintegration-tests
|
||||
|
||||
integration-tests-remote:
|
||||
export USE_EXTERNAL_OLLAMA_HOST=true && export OLLAMA_HOST=http://192.168.29.223:11434 && mvn clean verify -Pintegration-tests -Dgpg.skip=true
|
||||
|
||||
doxygen:
|
||||
doxygen Doxyfile
|
||||
|
||||
list-releases:
|
||||
curl 'https://central.sonatype.com/api/internal/browse/component/versions?sortField=normalizedVersion&sortDirection=asc&page=0&size=12&filter=namespace%3Aio.github.amithkoujalgi%2Cname%3Aollama4j' \
|
||||
curl 'https://central.sonatype.com/api/internal/browse/component/versions?sortField=normalizedVersion&sortDirection=desc&page=0&size=20&filter=namespace%3Aio.github.ollama4j%2Cname%3Aollama4j' \
|
||||
--compressed \
|
||||
--silent | jq '.components[].version'
|
||||
--silent | jq -r '.components[].version'
|
||||
|
||||
docs-build:
|
||||
npm i --prefix docs && npm run build --prefix docs
|
||||
|
||||
docs-serve:
|
||||
npm i --prefix docs && npm run start --prefix docs
|
||||
|
||||
start-cpu:
|
||||
docker run -it -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
|
||||
|
||||
start-gpu:
|
||||
docker run -it --gpus=all -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
|
20
docs/.gitignore
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
# Dependencies
|
||||
/node_modules
|
||||
|
||||
# Production
|
||||
/build
|
||||
|
||||
# Generated files
|
||||
.docusaurus
|
||||
.cache-loader
|
||||
|
||||
# Misc
|
||||
.DS_Store
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
41
docs/README.md
Normal file
@ -0,0 +1,41 @@
|
||||
# Website
|
||||
|
||||
This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
|
||||
|
||||
### Installation
|
||||
|
||||
```
|
||||
$ yarn
|
||||
```
|
||||
|
||||
### Local Development
|
||||
|
||||
```
|
||||
$ yarn start
|
||||
```
|
||||
|
||||
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
|
||||
|
||||
### Build
|
||||
|
||||
```
|
||||
$ yarn build
|
||||
```
|
||||
|
||||
This command generates static content into the `build` directory and can be served using any static contents hosting service.
|
||||
|
||||
### Deployment
|
||||
|
||||
Using SSH:
|
||||
|
||||
```
|
||||
$ USE_SSH=true yarn deploy
|
||||
```
|
||||
|
||||
Not using SSH:
|
||||
|
||||
```
|
||||
$ GIT_USER=<Your GitHub username> yarn deploy
|
||||
```
|
||||
|
||||
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
|
3
docs/babel.config.js
Normal file
@ -0,0 +1,3 @@
|
||||
module.exports = {
|
||||
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
|
||||
};
|
66
docs/blog/2023-12-22-release-post.md
Normal file
@ -0,0 +1,66 @@
|
||||
---
|
||||
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!
|
||||
|
||||
🦙 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).
|
||||
|
709
docs/blog/2025-03-08-blog/index.md
Normal file
@ -0,0 +1,709 @@
|
||||
---
|
||||
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.
|
||||
|
||||
### 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.OllamaAPI;
|
||||
import io.github.ollama4j.exceptions.OllamaBaseException;
|
||||
import io.github.ollama4j.exceptions.ToolInvocationException;
|
||||
import io.github.ollama4j.tools.OllamaToolsResult;
|
||||
import io.github.ollama4j.tools.ToolFunction;
|
||||
import io.github.ollama4j.tools.Tools;
|
||||
import io.github.ollama4j.utils.OptionsBuilder;
|
||||
import 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, OllamaBaseException, 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");
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
ollamaAPI.setVerbose(false);
|
||||
ollamaAPI.setRequestTimeoutSeconds(60);
|
||||
|
||||
Tools.ToolSpecification callSignFinderToolSpec = getCallSignFinderToolSpec(cluster, bucketName);
|
||||
Tools.ToolSpecification callSignUpdaterToolSpec = getCallSignUpdaterToolSpec(cluster, bucketName);
|
||||
|
||||
ollamaAPI.registerTool(callSignFinderToolSpec);
|
||||
ollamaAPI.registerTool(callSignUpdaterToolSpec);
|
||||
|
||||
String prompt1 = "What is the call-sign of Astraeus?";
|
||||
for (OllamaToolsResult.ToolResult r : ollamaAPI.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 : ollamaAPI.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 : ollamaAPI.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 ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
ollamaAPI.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);
|
||||
|
||||
ollamaAPI.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 : ollamaAPI.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);
|
||||
|
||||
ollamaAPI.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 : ollamaAPI.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!
|
5
docs/blog/authors.yml
Normal file
@ -0,0 +1,5 @@
|
||||
amith:
|
||||
name: Amith Koujalgi
|
||||
title: Maintainer of Ollama4j
|
||||
url: https://github.com/amithkoujalgi
|
||||
image_url: https://github.com/amithkoujalgi.png
|
3
docs/build.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
npm i
|
||||
npm run build
|
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: 2
|
||||
---
|
||||
|
||||
# Set Basic Authentication
|
||||
|
||||
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.OllamaAPI;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
ollamaAPI.setBasicAuth("username", "password");
|
||||
}
|
||||
}
|
||||
```
|
26
docs/docs/apis-extras/bearer-auth.md
Normal file
@ -0,0 +1,26 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Set Bearer Authentication
|
||||
|
||||
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.OllamaAPI;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
ollamaAPI.setBearerAuth("YOUR-TOKEN");
|
||||
}
|
||||
}
|
||||
```
|
79
docs/docs/apis-extras/options-builder.md
Normal file
@ -0,0 +1,79 @@
|
||||
---
|
||||
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.OllamaAPI;
|
||||
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/";
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(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/";
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
Options options =
|
||||
new OptionsBuilder()
|
||||
.setMirostat(10)
|
||||
.setMirostatEta(0.5f)
|
||||
.setNumGpu(2)
|
||||
.setTemperature(1.5f)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
```
|
22
docs/docs/apis-extras/ping.md
Normal file
@ -0,0 +1,22 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Ping
|
||||
|
||||
This API lets you check the reachability of Ollama server.
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.OllamaAPI;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
ollamaAPI.ping();
|
||||
}
|
||||
}
|
||||
```
|
30
docs/docs/apis-extras/ps.md
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# 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.OllamaAPI;
|
||||
import io.github.ollama4j.exceptions.OllamaBaseException;
|
||||
import io.github.ollama4j.models.ps.ModelsProcessResponse;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI("http://localhost:11434");
|
||||
|
||||
ModelsProcessResponse response = ollamaAPI.ps();
|
||||
|
||||
System.out.println(response);
|
||||
}
|
||||
}
|
||||
```
|
23
docs/docs/apis-extras/request-timeout.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Set Request Timeout
|
||||
|
||||
This API lets you set the request timeout for the Ollama client.
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.OllamaAPI;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
ollamaAPI.setRequestTimeoutSeconds(10);
|
||||
}
|
||||
}
|
||||
```
|
25
docs/docs/apis-extras/verbosity.md
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Set Verbosity
|
||||
|
||||
This API lets you set the verbosity of the Ollama client.
|
||||
|
||||
## Try asking a question about the model.
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.OllamaAPI;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
ollamaAPI.setVerbose(true);
|
||||
}
|
||||
}
|
||||
```
|
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."
|
||||
}
|
||||
}
|
69
docs/docs/apis-generate/chat-with-tools.md
Normal file
@ -0,0 +1,69 @@
|
||||
---
|
||||
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 `OllamaAPI`, 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.
|
||||
|
||||
### 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 `OllamaAPI` 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 `OllamaAPI`, call the `OllamaAPI.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
|
||||
::::
|
117
docs/docs/apis-generate/chat.md
Normal file
@ -0,0 +1,117 @@
|
||||
---
|
||||
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/ChatStreamingWithTokenConcatenationExample.java" />
|
||||
|
||||
<!-- ::::tip[LLM Response]
|
||||
>
|
||||
> The
|
||||
>
|
||||
> The capital
|
||||
>
|
||||
> The capital of
|
||||
>
|
||||
> The capital of France
|
||||
>
|
||||
> The capital of France is
|
||||
>
|
||||
> The capital of France is Paris
|
||||
>
|
||||
> The capital of France is Paris.
|
||||
>
|
||||
:::: -->
|
||||
|
||||
<TypewriterTextarea
|
||||
textContent='The capital of France is Paris.'
|
||||
typingSpeed={30}
|
||||
pauseBetweenSentences={1200}
|
||||
height='55px'
|
||||
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)
|
||||
|
||||
<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.OllamaAPI;
|
||||
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String host = "http://localhost:11434/";
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
OllamaChatMessageRole customRole = ollamaAPI.addCustomRole("custom-role");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### List roles
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.OllamaAPI;
|
||||
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String host = "http://localhost:11434/";
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
List<OllamaChatMessageRole> roles = ollamaAPI.listRoles();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Get role
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.OllamaAPI;
|
||||
import io.github.ollama4j.models.chat.OllamaChatMessageRole;
|
||||
|
||||
public class Main {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String host = "http://localhost:11434/";
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
List<OllamaChatMessageRole> roles = ollamaAPI.getRole("custom-role");
|
||||
}
|
||||
}
|
||||
```
|
30
docs/docs/apis-generate/generate-async.md
Normal file
@ -0,0 +1,30 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# Generate (Async)
|
||||
|
||||
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" />
|
||||
|
||||
::::tip[LLM Response]
|
||||
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
|
||||
::::
|
56
docs/docs/apis-generate/generate-embeddings.md
Normal file
33
docs/docs/apis-generate/generate-with-image-files.md
Normal file
@ -0,0 +1,33 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# Generate with Image Files
|
||||
|
||||
This API lets you ask questions along with the image files to the LLMs.
|
||||
This API corresponds to
|
||||
the [completion](https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion) API.
|
||||
|
||||
:::note
|
||||
|
||||
Executing this on Ollama server running in CPU-mode will take longer to generate response. Hence, GPU-mode is
|
||||
recommended.
|
||||
|
||||
:::
|
||||
|
||||
## Synchronous mode
|
||||
|
||||
If you have this image downloaded and you pass the path to the downloaded image to the following code:
|
||||
|
||||

|
||||
|
||||
<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.
|
||||
::::
|
33
docs/docs/apis-generate/generate-with-image-urls.md
Normal file
@ -0,0 +1,33 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# 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: 6
|
||||
---
|
||||
|
||||
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}`
|
||||
|
||||
::::
|
83
docs/docs/apis-generate/generate.md
Normal file
@ -0,0 +1,83 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
import TypewriterTextarea from '@site/src/components/TypewriterTextarea';
|
||||
|
||||
# Generate (Sync)
|
||||
|
||||
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 large language model created by Alibaba Cloud. My purpose is to assist users in generating text, answering
|
||||
> questions, and completing tasks. I aim to be user-friendly and easy to understand for everyone who interacts with me.
|
||||
::::
|
||||
|
||||
### 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/GenerateStreamingWithTokenConcatenation.java" />
|
||||
|
||||
You will get a response similar to:
|
||||
|
||||
<!-- ::::tip[LLM Response]
|
||||
> The
|
||||
>
|
||||
> The capital
|
||||
>
|
||||
> The capital of
|
||||
>
|
||||
> The capital of France
|
||||
>
|
||||
> The capital of France is
|
||||
>
|
||||
> The capital of France is Paris
|
||||
>
|
||||
> The capital of France is Paris.
|
||||
:::: -->
|
||||
|
||||
<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/StructuredOutput.java" />
|
||||
|
||||
You will get a response similar to:
|
||||
|
||||
::::tip[LLM Response]
|
||||
```json
|
||||
{
|
||||
"available": true,
|
||||
"age": 22
|
||||
}
|
||||
```
|
||||
::::
|
||||
|
||||
### 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/StructuredOutputMappedToObject.java" />
|
||||
|
||||
::::tip[LLM Response]
|
||||
Person(age=28, available=false)
|
||||
::::
|
74
docs/docs/apis-generate/prompt-builder.md
Normal file
@ -0,0 +1,74 @@
|
||||
---
|
||||
sidebar_position: 10
|
||||
---
|
||||
|
||||
# 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.OllamaAPI;
|
||||
import io.github.ollama4j.models.response.OllamaResult;
|
||||
import io.github.ollama4j.types.OllamaModelType;
|
||||
import io.github.ollama4j.utils.OptionsBuilder;
|
||||
import io.github.ollama4j.utils.PromptBuilder;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) throws Exception {
|
||||
|
||||
String host = "http://localhost:11434/";
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
ollamaAPI.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 = ollamaAPI.generate(model, promptBuilder.build(), raw, new OptionsBuilder().build());
|
||||
System.out.println(response.getResponse());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
You will get a response similar to:
|
||||
|
||||
```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())
|
||||
}
|
||||
}
|
||||
```
|
8
docs/docs/apis-model-management/_category_.json
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "APIs - Model Management",
|
||||
"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
70
docs/docs/apis-model-management/list-library-models.md
Normal file
@ -0,0 +1,70 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
import CodeEmbed from '@site/src/components/CodeEmbed';
|
||||
|
||||
# Models from Ollama Library
|
||||
|
||||
These API retrieves a list of models directly from the Ollama library.
|
||||
|
||||
### List Models from Ollama Library
|
||||
|
||||
This API fetches available models from the Ollama library page, including details such as the model's name, pull count,
|
||||
popular tags, tag count, and the last update time.
|
||||
|
||||
<CodeEmbed
|
||||
src='https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/ListLibraryModels.java'>
|
||||
</CodeEmbed>
|
||||
|
||||
The following is the sample output:
|
||||
|
||||
```
|
||||
[
|
||||
LibraryModel(name=llama3.2-vision, description=Llama 3.2 Vision is a collection of instruction-tuned image reasoning generative models in 11B and 90B sizes., pullCount=21.1K, totalTags=9, popularTags=[vision, 11b, 90b], lastUpdated=yesterday),
|
||||
LibraryModel(name=llama3.2, description=Meta's Llama 3.2 goes small with 1B and 3B models., pullCount=2.4M, totalTags=63, popularTags=[tools, 1b, 3b], lastUpdated=6 weeks ago)
|
||||
]
|
||||
```
|
||||
|
||||
### Get Tags of a Library Model
|
||||
|
||||
This API Fetches the tags associated with a specific model from Ollama library.
|
||||
|
||||
<CodeEmbed
|
||||
src='https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/GetLibraryModelTags.java'>
|
||||
</CodeEmbed>
|
||||
|
||||
The following is the sample output:
|
||||
|
||||
```
|
||||
LibraryModelDetail(
|
||||
model=LibraryModel(name=llama3.2-vision, description=Llama 3.2 Vision is a collection of instruction-tuned image reasoning generative models in 11B and 90B sizes., pullCount=21.1K, totalTags=9, popularTags=[vision, 11b, 90b], lastUpdated=yesterday),
|
||||
tags=[
|
||||
LibraryModelTag(name=llama3.2-vision, tag=latest, size=7.9GB, lastUpdated=yesterday),
|
||||
LibraryModelTag(name=llama3.2-vision, tag=11b, size=7.9GB, lastUpdated=yesterday),
|
||||
LibraryModelTag(name=llama3.2-vision, tag=90b, size=55GB, lastUpdated=yesterday)
|
||||
]
|
||||
)
|
||||
```
|
||||
|
||||
### Find a model from Ollama library
|
||||
|
||||
This API finds a specific model using model `name` and `tag` from Ollama library.
|
||||
|
||||
<CodeEmbed
|
||||
src='https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/FindLibraryModel.java'>
|
||||
</CodeEmbed>
|
||||
|
||||
The following is the sample output:
|
||||
|
||||
```
|
||||
LibraryModelTag(name=qwen2.5, tag=7b, size=4.7GB, lastUpdated=7 weeks ago)
|
||||
```
|
||||
|
||||
### Pull model using `LibraryModelTag`
|
||||
|
||||
You can use `LibraryModelTag` to pull models into Ollama server.
|
||||
|
||||
<CodeEmbed
|
||||
src='https://raw.githubusercontent.com/ollama4j/ollama4j-examples/refs/heads/main/src/main/java/io/github/ollama4j/examples/PullLibraryModelTags.java'>
|
||||
</CodeEmbed>
|
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 Local 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
|
||||
```
|
23
docs/docs/apis-model-management/pull-model.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
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.
|
||||
|
||||
:::info
|
||||
|
||||
You can even pull models using Ollama model library APIs. This looks up the models directly on the Ollama model library page. Refer
|
||||
to [this](./list-library-models#pull-model-using-librarymodeltag).
|
||||
|
||||
:::
|
||||
|
149
docs/docs/intro.md
Normal file
@ -0,0 +1,149 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
|
||||
title: Introduction
|
||||
---
|
||||
|
||||
import LatestRelease from '@site/src/components/LatestRelease';
|
||||
import AddToYourProject from '@site/src/components/AddToYourProject';
|
||||
|
||||
# Introduction
|
||||
|
||||
### 🦙 What is Ollama?
|
||||
|
||||
[Ollama](https://ollama.ai/) is an advanced AI tool that allows users to easily set up and run large language models
|
||||
locally (in CPU and GPU
|
||||
modes). With Ollama, users can leverage powerful language models such as Llama 2 and even customize and create their own
|
||||
models.
|
||||
|
||||
### 👨💻 Why Ollama4j?
|
||||
|
||||
Ollama4j was built for the simple purpose of integrating Ollama with Java applications.
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
### Getting Started
|
||||
|
||||
#### What you'll need
|
||||
|
||||
- **[Ollama](https://ollama.ai/download)**
|
||||
- **[Oracle JDK](https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html)** or
|
||||
**[Open JDK](https://jdk.java.net/archive/)** 11.0 or above.
|
||||
- **[Maven](https://maven.apache.org/download.cgi)**
|
||||
|
||||
#### Start Ollama server
|
||||
|
||||
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
|
||||
docker run -it -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
|
||||
```
|
||||
|
||||
##### Run in GPU mode:
|
||||
|
||||
```bash
|
||||
docker run -it --gpus=all -v ~/ollama:/root/.ollama -p 11434:11434 ollama/ollama
|
||||
```
|
||||
|
||||
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.OllamaAPI;
|
||||
|
||||
public class OllamaAPITest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
OllamaAPI ollamaAPI = new OllamaAPI();
|
||||
|
||||
boolean isOllamaServerReachable = ollamaAPI.ping();
|
||||
|
||||
System.out.println("Is Ollama server running: " + isOllamaServerReachable);
|
||||
}
|
||||
}
|
||||
```
|
||||
This uses the default Ollama host as `http://localhost:11434`.
|
||||
|
||||
Specify a different Ollama host that you want to connect to.
|
||||
|
||||
```java
|
||||
import io.github.ollama4j.OllamaAPI;
|
||||
|
||||
public class OllamaAPITest {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String host = "http://localhost:11434/";
|
||||
|
||||
OllamaAPI ollamaAPI = new OllamaAPI(host);
|
||||
|
||||
ollamaAPI.setVerbose(true);
|
||||
|
||||
boolean isOllamaServerReachable = ollamaAPI.ping();
|
||||
|
||||
System.out.println("Is Ollama server running: " + isOllamaServerReachable);
|
||||
}
|
||||
}
|
||||
```
|
182
docs/docusaurus.config.js
Normal file
@ -0,0 +1,182 @@
|
||||
// @ts-check
|
||||
// `@type` JSDoc annotations allow editor autocompletion and type checking
|
||||
// (when paired with `@ts-check`).
|
||||
// There are various equivalent ways to declare your Docusaurus config.
|
||||
// See: https://docusaurus.io/docs/api/docusaurus-config
|
||||
|
||||
import {themes as prismThemes} from 'prism-react-renderer';
|
||||
|
||||
/** @type {import('@docusaurus/types').Config} */
|
||||
const config = {
|
||||
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/',
|
||||
|
||||
// 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',
|
||||
|
||||
// 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: {
|
||||
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:
|
||||
/** @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: '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,
|
||||
},
|
||||
themes: ['@docusaurus/theme-mermaid']
|
||||
};
|
||||
|
||||
export default config;
|
16260
docs/package-lock.json
generated
Normal file
51
docs/package.json
Normal file
@ -0,0 +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": {
|
||||
"@docsearch/js": "^3.9.0",
|
||||
"@docusaurus/core": "^3.4.0",
|
||||
"@docusaurus/plugin-google-gtag": "^3.4.0",
|
||||
"@docusaurus/preset-classic": "^3.4.0",
|
||||
"@docusaurus/theme-mermaid": "^3.4.0",
|
||||
"@iconify/react": "^5.2.1",
|
||||
"@mdx-js/react": "^3.0.0",
|
||||
"clsx": "^2.0.0",
|
||||
"font-awesome": "^4.7.0",
|
||||
"prism-react-renderer": "^2.3.0",
|
||||
"react": "^18.0.0",
|
||||
"react-dom": "^18.0.0",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-image-gallery": "^1.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/module-type-aliases": "^3.4.0",
|
||||
"@docusaurus/types": "^3.4.0"
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.5%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 3 chrome version",
|
||||
"last 3 firefox version",
|
||||
"last 5 safari version"
|
||||
]
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0"
|
||||
}
|
||||
}
|
@ -1,54 +0,0 @@
|
||||
Understanding publishing:
|
||||
https://dzone.com/articles/how-to-publish-artifacts-to-maven-central
|
||||
|
||||
Reference Repo:
|
||||
https://github.com/dsibilio/badge-maker/tree/main
|
||||
|
||||
## GPG Signing setup
|
||||
|
||||
### GPG Setup
|
||||
|
||||
https://central.sonatype.org/publish/requirements/gpg/#listing-keys
|
||||
|
||||
#### Steps
|
||||
|
||||
- Create key: `gpg --gen-key` and then list keys to verify: `gpg --list-keys`
|
||||
- Distributing Your Public Key:
|
||||
|
||||
```
|
||||
gpg --keyserver pool.sks-keyservers.net --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
|
||||
gpg --keyserver pgp.key-server.io --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
|
||||
gpg --keyserver keyserver.ubuntu.com --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
|
||||
gpg --keyserver pgp.mit.edu --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
|
||||
gpg --keyserver keys.gnupg.net --send-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98
|
||||
```
|
||||
|
||||
- Now other people can import your public key from the key server to their local
|
||||
machines: `gpg --keyserver keyserver.ubuntu.com --recv-keys CA925CD6C9E8D064FF05B4728190C4130ABA0F98`
|
||||
|
||||
Export for later use:
|
||||
|
||||
```shell
|
||||
gpg --armor --export-secret-keys 88AA0C903A513340A0F3094326257A6F6F5F24A9 > ~/ollama4j/mvn-publish/private.gpg
|
||||
```
|
||||
|
||||
## Maven publish
|
||||
|
||||
https://central.sonatype.org/publish/publish-maven/
|
||||
|
||||
## List release versions
|
||||
|
||||
```shell
|
||||
curl 'https://central.sonatype.com/api/internal/browse/component/versions?sortField=normalizedVersion&sortDirection=desc&page=0&size=12&filter=namespace%3Aio.github.amithkoujalgi%2Cname%3Aollama4j' \
|
||||
--compressed \
|
||||
--silent | jq '.components[].version'
|
||||
```
|
||||
|
||||
Deployment steps to test. [IGNORE THIS FOR PUBLISHING CONTEXT. THIS IS ONLY TO TEST STUFF OUT LOCALLY]
|
||||
|
||||
```shell
|
||||
# release:
|
||||
mvn -B clean install deploy -Punit-tests -Dgpg.passphrase="${GPG_PASSPHRASE}" -e
|
||||
#or
|
||||
mvn -B clean install -Punit-tests release:clean release:prepare release:perform -Dgpg.passphrase="${GPG_PASSPHRASE}" -e
|
||||
```
|
5
docs/run.sh
Executable file
@ -0,0 +1,5 @@
|
||||
#!/usr/bin/env bash
|
||||
npm i
|
||||
|
||||
# dev mode
|
||||
npm run start
|
33
docs/sidebars.js
Normal file
@ -0,0 +1,33 @@
|
||||
/**
|
||||
* Creating a sidebar enables you to:
|
||||
- create an ordered group of docs
|
||||
- render a sidebar for each doc of that group
|
||||
- provide next/previous navigation
|
||||
|
||||
The sidebars can be generated from the filesystem, or explicitly defined here.
|
||||
|
||||
Create as many sidebars as you want.
|
||||
*/
|
||||
|
||||
// @ts-check
|
||||
|
||||
/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */
|
||||
const sidebars = {
|
||||
// By default, Docusaurus generates a sidebar from the docs folder structure
|
||||
tutorialSidebar: [{type: 'autogenerated', dirName: '.'}],
|
||||
|
||||
// But you can create a sidebar manually
|
||||
/*
|
||||
tutorialSidebar: [
|
||||
'intro',
|
||||
'hello',
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Tutorial',
|
||||
items: ['tutorial-basics/create-a-document'],
|
||||
},
|
||||
],
|
||||
*/
|
||||
};
|
||||
|
||||
export default sidebars;
|
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;
|
172
docs/src/components/HomepageFeatures/index.js
Normal file
@ -0,0 +1,172 @@
|
||||
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: 'Developer-Friendly',
|
||||
Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,
|
||||
description: (
|
||||
<>
|
||||
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: '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: (
|
||||
<>
|
||||
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 }) {
|
||||
return (
|
||||
<div className={clsx('col col--4')}>
|
||||
<div className="text--center">
|
||||
<Svg className={styles.featureSvg} role="img" />
|
||||
</div>
|
||||
<div className="text--center padding-horiz--md">
|
||||
<Heading as="h3">{title}</Heading>
|
||||
<p>{description}</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function Usage({ Svg, title, description, link, imageSize }) {
|
||||
return (
|
||||
<div className={clsx('col col--4')}>
|
||||
<div className="text--center">
|
||||
<Svg className={styles.featureSvg} role="img" style={{ width: imageSize }} />
|
||||
</div>
|
||||
<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>
|
||||
</>
|
||||
);
|
||||
}
|
11
docs/src/components/HomepageFeatures/styles.module.css
Normal file
@ -0,0 +1,11 @@
|
||||
.features {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 2rem 0;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.featureSvg {
|
||||
height: 200px;
|
||||
width: 200px;
|
||||
}
|
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;
|
66
docs/src/components/TypewriterTextarea/index.js
Normal file
@ -0,0 +1,66 @@
|
||||
import React, { useEffect, useState, useRef } from 'react';
|
||||
|
||||
const TypewriterTextarea = ({ textContent, typingSpeed = 50, pauseBetweenSentences = 1000, height = '200px', width = '100%' }) => {
|
||||
const [text, setText] = useState('');
|
||||
const [sentenceIndex, setSentenceIndex] = useState(0);
|
||||
const [charIndex, setCharIndex] = useState(0);
|
||||
const sentences = textContent ? textContent.split('\n') : [];
|
||||
const isTyping = useRef(false);
|
||||
|
||||
useEffect(() => {
|
||||
if (!textContent) return;
|
||||
|
||||
if (!isTyping.current) {
|
||||
isTyping.current = true;
|
||||
}
|
||||
|
||||
if (sentenceIndex >= sentences.length) {
|
||||
// Reset to start from the beginning
|
||||
setSentenceIndex(0);
|
||||
setCharIndex(0);
|
||||
setText('');
|
||||
return;
|
||||
}
|
||||
|
||||
const currentSentence = sentences[sentenceIndex];
|
||||
|
||||
if (charIndex < currentSentence.length) {
|
||||
const timeout = setTimeout(() => {
|
||||
setText((prevText) => prevText + currentSentence[charIndex]);
|
||||
setCharIndex((prevCharIndex) => prevCharIndex + 1);
|
||||
}, typingSpeed);
|
||||
|
||||
return () => clearTimeout(timeout);
|
||||
} else {
|
||||
// Wait a bit, then go to the next sentence
|
||||
const timeout = setTimeout(() => {
|
||||
setSentenceIndex((prev) => prev + 1);
|
||||
setCharIndex(0);
|
||||
}, pauseBetweenSentences);
|
||||
|
||||
return () => clearTimeout(timeout);
|
||||
}
|
||||
}, [charIndex, sentenceIndex, sentences, typingSpeed, pauseBetweenSentences, textContent]);
|
||||
|
||||
return (
|
||||
<textarea
|
||||
value={text}
|
||||
readOnly
|
||||
rows={10}
|
||||
cols={5}
|
||||
style={{
|
||||
width: typeof width === 'number' ? `${width}px` : width,
|
||||
height: height,
|
||||
padding: '1rem',
|
||||
fontFamily: 'monospace',
|
||||
fontSize: '1rem',
|
||||
backgroundColor: '#f4f4f4',
|
||||
border: '1px solid #ccc',
|
||||
resize: 'none',
|
||||
whiteSpace: 'pre-wrap',
|
||||
}}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default TypewriterTextarea;
|
50
docs/src/css/custom.css
Normal file
@ -0,0 +1,50 @@
|
||||
/**
|
||||
* Any CSS included here will be global. The classic template
|
||||
* bundles Infima by default. Infima is a CSS framework designed to
|
||||
* 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);
|
||||
}
|
||||
|
||||
/* 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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
65
docs/src/pages/index.js
Normal file
@ -0,0 +1,65 @@
|
||||
import clsx from 'clsx';
|
||||
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();
|
||||
return (
|
||||
<header className={clsx('hero hero--primary', styles.heroBanner)}>
|
||||
<div className="container">
|
||||
<Heading as="h1" className="hero__title">
|
||||
{siteConfig.title}
|
||||
</Heading>
|
||||
<img
|
||||
src="img/logo.svg"
|
||||
alt="Ollama4j Logo"
|
||||
className={styles.logo}
|
||||
style={{ maxWidth: '20vh' }}
|
||||
/>
|
||||
<p className="hero__subtitle">{siteConfig.tagline}</p>
|
||||
<div style={{ marginTop: '2rem' }}>
|
||||
<TypewriterTextarea
|
||||
textContent='Hello there! 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%'
|
||||
/>
|
||||
</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>
|
||||
);
|
||||
}
|
||||
|
||||
export default function Home() {
|
||||
const {siteConfig} = useDocusaurusContext();
|
||||
return (
|
||||
<Layout
|
||||
title={`${siteConfig.title}`}
|
||||
description="Description will go into a meta tag in <head />">
|
||||
<HomepageHeader />
|
||||
<main>
|
||||
<HomepageFeatures />
|
||||
<BrowserOnly>
|
||||
{() => <BuyMeACoffee />}
|
||||
</BrowserOnly>
|
||||
</main>
|
||||
</Layout>
|
||||
);
|
||||
}
|
23
docs/src/pages/index.module.css
Normal file
@ -0,0 +1,23 @@
|
||||
/**
|
||||
* CSS files with the .module.css suffix will be treated as CSS modules
|
||||
* and scoped locally.
|
||||
*/
|
||||
|
||||
.heroBanner {
|
||||
padding: 4rem 0;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 996px) {
|
||||
.heroBanner {
|
||||
padding: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
.buttons {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
7
docs/src/pages/markdown-page.md
Normal file
@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Markdown page example
|
||||
---
|
||||
|
||||
# Markdown page example
|
||||
|
||||
You don't need React to write simple standalone pages.
|
0
docs/static/.nojekyll
vendored
Normal file
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 |
BIN
docs/static/img/docusaurus-social-card.jpg
vendored
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
docs/static/img/docusaurus.png
vendored
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
docs/static/img/favicon.ico
vendored
Normal file
After Width: | Height: | Size: 15 KiB |
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 |
997
docs/static/img/logo.svg
vendored
Normal file
@ -0,0 +1,997 @@
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="100%" viewBox="0 0 452 626" enable-background="new 0 0 452 626" xml:space="preserve">
|
||||
<path fill="#FEFEFE" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M453.000000,172.000000
|
||||
C453.000000,324.000000 453.000000,475.500000 453.000000,627.000000
|
||||
C302.333344,627.000000 151.666672,627.000000 1.000000,627.000000
|
||||
C1.000000,418.333344 1.000000,209.666672 1.000000,1.000000
|
||||
C151.666672,1.000000 302.333344,1.000000 453.000000,1.000000
|
||||
C453.000000,57.833332 453.000000,114.666664 453.000000,172.000000
|
||||
M84.028053,393.322449
|
||||
C83.384384,392.190155 82.740715,391.057831 81.674141,389.388641
|
||||
C80.802788,387.589966 79.931435,385.791290 78.979706,383.217987
|
||||
C78.830223,382.193207 78.680740,381.168457 79.211594,379.870819
|
||||
C78.441444,377.938232 77.671303,376.005676 76.812462,374.215210
|
||||
C76.812462,374.215210 76.647430,374.186401 76.973671,373.285034
|
||||
C76.590546,365.645538 75.618927,357.981232 75.940254,350.371460
|
||||
C76.741119,331.405548 82.253365,313.830963 92.617485,297.769623
|
||||
C97.025253,290.938904 96.475342,283.876709 91.198715,279.005066
|
||||
C78.423065,267.209961 74.109749,251.716476 73.139450,235.444382
|
||||
C71.973801,215.896286 78.028862,197.982742 90.090782,182.428818
|
||||
C101.315453,167.954514 115.670410,158.157211 134.178162,155.874054
|
||||
C140.515533,155.092270 147.056351,155.788574 153.494400,156.050644
|
||||
C158.244003,156.243958 162.395172,155.137680 164.161224,150.445236
|
||||
C176.456848,117.775826 220.521179,96.778435 254.951309,110.592094
|
||||
C273.242065,117.930511 287.870972,129.076309 296.642670,147.071106
|
||||
C300.826782,155.654663 302.852386,156.998413 312.043640,155.662018
|
||||
C329.400574,153.138351 344.629944,158.319366 358.222992,168.651062
|
||||
C374.417389,180.959961 384.232941,197.541626 387.604309,217.457413
|
||||
C391.342957,239.542877 387.681763,260.251465 372.873718,277.966705
|
||||
C366.868317,285.151154 365.754486,290.128052 370.589783,297.820068
|
||||
C380.456207,313.515564 386.038513,330.472168 387.060211,348.944763
|
||||
C388.203552,369.616760 384.423615,388.963318 371.701721,405.929657
|
||||
C370.582031,407.422852 370.128693,409.415680 369.156036,412.067352
|
||||
C369.234100,417.265717 369.312134,422.464111 369.125854,428.423218
|
||||
C369.307739,429.397766 369.221893,430.540802 369.712799,431.320862
|
||||
C374.792511,439.392426 379.126221,447.784576 380.224609,457.409882
|
||||
C381.159149,465.599304 382.514496,473.851654 382.264130,482.032715
|
||||
C382.034668,489.531799 379.894287,496.970642 378.621002,504.440308
|
||||
C377.993927,508.119110 379.174957,510.172180 383.319550,510.096436
|
||||
C390.650452,509.962463 397.988953,510.171967 405.315948,509.955780
|
||||
C406.834259,509.911011 408.971466,509.024048 409.670166,507.842957
|
||||
C410.891266,505.778839 411.484070,503.228821 411.878296,500.807190
|
||||
C416.261047,473.884644 413.699829,447.906311 401.345032,423.216827
|
||||
C400.580872,421.689758 400.674408,419.193756 401.362976,417.570099
|
||||
C404.909973,409.205811 409.605743,401.243958 412.367218,392.649017
|
||||
C417.975433,375.193695 419.173767,357.238953 416.897278,338.910950
|
||||
C414.929382,323.067810 410.664154,308.053436 403.543945,293.858185
|
||||
C402.309479,291.397034 402.337830,289.947479 403.717407,287.668213
|
||||
C409.853485,277.530884 414.585663,266.829285 417.023132,255.099640
|
||||
C419.414673,243.590927 419.981537,232.134415 418.800720,220.438522
|
||||
C417.038361,202.982010 412.465454,186.307236 402.514008,171.942856
|
||||
C395.960114,162.482651 386.950592,154.743759 379.320160,145.990402
|
||||
C377.973846,144.445969 377.363831,141.657150 377.507690,139.516495
|
||||
C378.297546,127.766296 380.238586,116.036354 380.200470,104.304604
|
||||
C380.166199,93.761627 378.195129,83.211807 376.884613,72.689156
|
||||
C374.864380,56.468525 369.322693,41.604122 359.447601,28.447065
|
||||
C347.885315,13.042048 328.695618,9.548378 313.728760,20.546566
|
||||
C302.718689,28.637171 296.367950,40.255608 292.319153,52.873642
|
||||
C288.495239,64.790840 285.972961,77.125694 282.786560,89.636307
|
||||
C281.728912,89.149498 280.086487,88.476044 278.519012,87.658875
|
||||
C267.387054,81.855431 255.631439,77.483955 243.179901,76.411026
|
||||
C228.426987,75.139786 213.532364,75.173859 199.477219,81.187950
|
||||
C195.445267,82.913185 191.609116,85.096024 187.039963,87.409706
|
||||
C185.517532,88.139969 183.995117,88.870232 181.640503,89.273247
|
||||
C181.076416,89.449928 180.512344,89.626617 179.750717,89.104050
|
||||
C179.286575,88.562805 178.822433,88.021568 178.403229,86.779953
|
||||
C178.280228,85.854477 178.157227,84.928993 178.395538,83.604683
|
||||
C177.896805,83.088760 177.398056,82.572838 176.685577,81.409119
|
||||
C176.630936,80.730492 176.576294,80.051865 176.960648,78.797684
|
||||
C176.709839,78.204300 176.459030,77.610916 176.007385,76.414719
|
||||
C175.954910,75.995293 175.902451,75.575867 176.264999,74.490211
|
||||
C175.849304,73.660492 175.433609,72.830765 174.768875,71.298279
|
||||
C174.466293,69.580925 174.163727,67.863571 174.227936,65.526169
|
||||
C173.850906,65.019577 173.473877,64.512985 172.854462,63.470425
|
||||
C172.785080,63.085686 172.715714,62.700943 173.010712,61.661789
|
||||
C172.314041,60.005325 171.617386,58.348862 170.556885,56.037312
|
||||
C170.337494,55.061695 170.118103,54.086079 170.186188,52.404636
|
||||
C169.183838,49.916843 168.181473,47.429050 167.112350,44.178394
|
||||
C163.580078,34.403221 157.690826,26.242882 149.180649,20.384657
|
||||
C141.991806,15.436010 134.072617,11.946379 124.898354,14.326028
|
||||
C110.770477,17.990557 102.129440,27.828142 95.971077,40.326843
|
||||
C90.741524,50.940479 87.607124,62.120296 85.745552,73.876877
|
||||
C82.927361,91.674881 80.890259,109.365974 83.908562,127.320709
|
||||
C84.783783,132.527115 87.079094,138.393234 85.540413,142.860626
|
||||
C83.920807,147.562973 78.674400,151.149567 74.692162,154.881668
|
||||
C57.430939,171.058670 47.458839,190.959152 44.085915,214.243805
|
||||
C40.320992,240.234619 43.917156,264.894196 58.092773,287.427032
|
||||
C59.942730,290.367645 59.926754,292.492737 58.494541,295.553497
|
||||
C46.295830,321.623016 41.936687,348.865662 46.780624,377.406982
|
||||
C49.218697,391.772522 54.294636,405.131378 61.580219,417.735687
|
||||
C62.395935,419.146942 62.137901,421.651398 61.518700,423.332397
|
||||
C59.528576,428.735168 56.721302,433.857391 54.976612,439.326263
|
||||
C49.929848,455.145660 48.280193,471.459442 49.268887,487.994568
|
||||
C49.472752,491.403992 50.940212,494.737854 52.000786,498.037598
|
||||
C52.000786,498.037598 52.141964,497.912567 51.786953,498.590393
|
||||
C52.425430,500.407654 53.063911,502.224915 53.701969,504.834595
|
||||
C53.903355,505.870911 54.104740,506.907196 53.721775,508.035797
|
||||
C53.851608,508.542664 53.981441,509.049500 54.111290,509.556396
|
||||
C54.425308,509.285828 54.739330,509.015259 55.882069,508.977844
|
||||
C63.945946,509.104126 72.009705,509.277893 80.073845,509.297089
|
||||
C81.092964,509.299530 82.114014,508.490265 83.835052,507.995300
|
||||
C83.619720,506.305725 83.404381,504.616119 82.922226,502.331299
|
||||
C82.889275,501.900543 82.856323,501.469818 83.443771,500.751770
|
||||
C82.643730,499.158417 81.843697,497.565094 80.906509,496.075348
|
||||
C80.906509,496.075348 80.745781,496.136322 81.050255,495.397430
|
||||
C81.003296,494.600006 80.956337,493.802582 81.371849,492.650238
|
||||
C81.077583,491.692230 80.783318,490.734253 80.320518,489.195831
|
||||
C80.291107,488.794952 80.261703,488.394104 80.764938,487.362152
|
||||
C80.576195,481.576630 80.387451,475.791077 80.183067,469.395386
|
||||
C80.256805,468.995850 80.330544,468.596313 81.007416,467.926117
|
||||
C80.996033,466.283783 80.984657,464.641418 80.988174,462.201477
|
||||
C80.886604,461.427216 80.785034,460.652924 80.878166,459.454620
|
||||
C80.878166,459.454620 81.088028,459.037811 81.792862,458.971375
|
||||
C82.090530,456.960693 82.388206,454.950012 82.661469,452.204620
|
||||
C82.859047,451.501251 83.056625,450.797913 83.944946,450.005859
|
||||
C84.995773,446.779480 86.046600,443.553101 87.184296,439.777924
|
||||
C87.391747,439.478699 87.599197,439.179474 88.500618,438.983063
|
||||
C89.243309,437.307098 89.986000,435.631134 90.871284,433.308929
|
||||
C91.099716,432.935242 91.328140,432.561584 92.156654,432.273102
|
||||
C92.402473,431.507263 92.648293,430.741455 93.007027,429.327637
|
||||
C93.231262,428.956329 93.455498,428.585022 94.367706,428.216797
|
||||
C95.515411,424.498169 97.368416,420.812531 97.544228,417.048492
|
||||
C97.648399,414.818268 95.105270,412.464417 93.426132,410.056519
|
||||
C93.426132,410.056519 93.105278,409.931610 93.296898,409.263428
|
||||
C92.675713,408.682281 92.054527,408.101135 91.289909,406.986969
|
||||
C91.041679,406.495941 90.793449,406.004913 90.807411,404.793732
|
||||
C89.187851,402.545105 87.568283,400.296448 85.548523,397.551147
|
||||
C85.006523,396.387878 84.464523,395.224640 84.028053,393.322449
|
||||
M238.704788,430.769623
|
||||
C225.614304,415.102051 211.716629,400.304688 193.951843,388.365540
|
||||
C194.397675,392.088226 194.996338,394.719116 194.981903,397.346619
|
||||
C194.880341,415.820526 194.728973,434.294952 194.444962,452.766907
|
||||
C194.115402,474.202911 190.144241,494.365631 175.516769,511.381409
|
||||
C172.988541,514.322327 172.781799,519.793396 172.680847,524.123291
|
||||
C172.594635,527.821350 174.081863,531.590942 175.080978,535.272461
|
||||
C177.421707,543.897827 176.378571,551.729858 170.212524,558.583130
|
||||
C168.437653,560.555786 166.729553,562.654541 165.373871,564.924194
|
||||
C162.840958,569.164673 164.322479,573.284607 169.046417,574.770142
|
||||
C171.258484,575.465759 173.765152,575.224609 175.950989,575.393616
|
||||
C175.950989,580.094604 175.795319,585.251099 175.985687,590.394775
|
||||
C176.310593,599.173157 181.884720,602.863953 189.833038,599.048218
|
||||
C194.566330,596.775818 198.751190,593.311340 203.054657,590.205444
|
||||
C208.854935,586.019409 214.232239,581.167786 220.322083,577.478271
|
||||
C234.627289,568.811646 246.313293,571.031738 256.815735,584.070618
|
||||
C260.987000,589.249207 264.495270,594.957397 268.574249,600.215942
|
||||
C272.782379,605.640869 277.620483,606.983093 283.359100,603.309326
|
||||
C286.582703,601.245544 289.721069,597.563171 290.808685,593.976562
|
||||
C292.712677,587.697815 293.627930,580.953857 293.868591,574.365051
|
||||
C294.863953,547.117310 288.966675,521.135132 278.468567,496.108521
|
||||
C274.422760,486.463593 275.001465,477.135834 279.253845,467.597565
|
||||
C281.355743,462.882965 282.522644,457.622284 283.297943,452.485748
|
||||
C283.936432,448.255554 283.334015,443.843964 283.354462,439.513092
|
||||
C283.379517,434.208038 285.202240,429.833008 289.716736,426.652985
|
||||
C295.510742,422.571716 297.029449,416.534576 296.497925,409.903992
|
||||
C296.233734,406.608063 295.403839,403.340729 294.640045,400.105255
|
||||
C293.097107,393.569122 293.417755,387.245361 296.245911,381.081055
|
||||
C297.144135,379.123383 297.960480,377.096710 298.522583,375.022552
|
||||
C299.846466,370.137695 297.229156,367.162811 292.208710,367.749664
|
||||
C287.076477,368.349579 284.355347,371.765656 282.760803,376.259735
|
||||
C281.377350,380.158875 280.210754,384.135010 278.948334,388.077118
|
||||
C278.493713,388.077820 278.039124,388.078522 277.584503,388.079254
|
||||
C276.526917,384.292572 275.421356,380.518463 274.425690,376.715576
|
||||
C273.501343,373.185089 273.035675,369.493347 271.742432,366.111877
|
||||
C270.365845,362.512512 266.838562,360.993866 263.557739,362.364105
|
||||
C261.530121,363.210938 259.387695,366.264893 259.189301,368.496277
|
||||
C258.768158,373.233368 259.487274,378.089325 259.928894,382.879028
|
||||
C260.192261,385.735413 260.815979,388.558624 261.277679,391.396729
|
||||
C260.828674,391.558228 260.379639,391.719727 259.930634,391.881195
|
||||
C257.462006,387.085114 255.028595,382.270416 252.511154,377.500061
|
||||
C251.067886,374.765198 249.422287,372.070312 245.619095,373.292999
|
||||
C241.971878,374.465485 239.393066,376.840057 239.672379,380.920197
|
||||
C239.862701,383.700409 240.338394,386.659271 241.524673,389.136902
|
||||
C245.430740,397.294739 249.718521,405.269745 253.747864,413.097748
|
||||
C250.644165,414.562683 246.317841,415.800598 243.145325,418.430420
|
||||
C241.479568,419.811279 240.915283,423.897827 241.602615,426.251862
|
||||
C242.053848,427.797363 246.071442,429.779144 247.730911,429.236908
|
||||
C254.664597,426.971069 260.430786,428.599213 266.054321,432.611725
|
||||
C267.495361,433.640015 269.588715,433.739441 271.066010,434.735046
|
||||
C273.126404,436.123566 276.170074,437.708557 276.539459,439.640381
|
||||
C277.648865,445.442352 278.310760,451.497650 277.907013,457.368866
|
||||
C277.575287,462.192261 273.777802,465.197876 268.928558,466.225769
|
||||
C264.201569,467.227722 262.276031,463.903351 260.005219,460.611725
|
||||
C253.199844,450.746674 246.123001,441.068878 238.704788,430.769623
|
||||
M154.621170,247.411545
|
||||
C156.249237,239.272903 153.315323,232.959564 146.511917,228.594666
|
||||
C135.823425,221.737289 122.780060,227.430878 118.151245,240.764862
|
||||
C115.191765,249.290085 117.906853,257.811768 124.995628,262.246887
|
||||
C132.876831,267.177795 141.256744,266.470551 147.597290,259.504211
|
||||
C150.507172,256.307129 152.173431,251.978165 154.621170,247.411545
|
||||
M342.601624,235.803604
|
||||
C336.956207,226.722107 326.795410,223.281433 318.256866,227.559906
|
||||
C309.340973,232.027466 306.012299,241.199265 309.653748,251.264969
|
||||
C312.956024,260.393127 322.273987,266.535522 330.407257,264.945709
|
||||
C344.775848,262.137024 350.027557,250.146881 342.601624,235.803604
|
||||
M234.497452,342.851105
|
||||
C253.566727,343.657532 271.469879,340.207092 287.171722,328.559448
|
||||
C310.519226,311.240326 316.081909,280.706909 300.605438,256.338226
|
||||
C288.073700,236.606140 269.423523,226.137390 247.238831,222.487762
|
||||
C222.618088,218.437363 199.244995,222.800171 178.870041,238.376236
|
||||
C163.531158,250.102356 153.864807,265.409180 153.691620,284.912689
|
||||
C153.411209,316.492493 179.166718,337.251831 207.131546,341.601624
|
||||
C215.776138,342.946228 224.701584,342.485168 234.497452,342.851105
|
||||
z"/>
|
||||
<path fill="#040404" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M81.088028,459.037811
|
||||
C81.088028,459.037811 80.878166,459.454620 80.426918,459.758057
|
||||
C79.577690,463.537842 79.179718,467.014221 78.755219,470.918884
|
||||
C78.786705,476.904144 78.844734,482.461151 78.638916,488.255005
|
||||
C79.165306,491.040039 79.955544,493.588196 80.745789,496.136322
|
||||
C80.745781,496.136322 80.906509,496.075348 80.820312,496.340576
|
||||
C80.764984,497.074768 80.795845,497.543762 80.614609,498.175201
|
||||
C80.846085,498.944885 81.289658,499.552124 81.864838,500.383362
|
||||
C82.272087,500.751251 82.547729,500.895142 82.823372,501.039062
|
||||
C82.856323,501.469818 82.889275,501.900543 82.864288,503.024963
|
||||
C82.915634,505.164795 83.024902,506.610931 83.134178,508.057068
|
||||
C82.114014,508.490265 81.092964,509.299530 80.073845,509.297089
|
||||
C72.009705,509.277893 63.945946,509.104126 55.541321,508.602112
|
||||
C54.902428,508.132111 54.604279,508.037811 54.306129,507.943512
|
||||
C54.104740,506.907196 53.903355,505.870911 54.018414,504.290222
|
||||
C53.603893,501.801422 52.872929,499.856995 52.141964,497.912567
|
||||
C52.141964,497.912567 52.000786,498.037598 52.083740,497.622467
|
||||
C52.093033,486.219025 51.317581,475.179047 52.121506,464.255310
|
||||
C53.150429,450.274414 56.220573,436.570068 63.658657,424.366791
|
||||
C65.526611,421.302124 65.433167,419.138184 63.544727,416.253418
|
||||
C54.717529,402.768921 49.744976,387.735748 48.103249,371.881927
|
||||
C45.307518,344.884155 48.776821,318.757507 61.291477,294.222534
|
||||
C62.084080,292.668640 61.991234,289.819855 61.066147,288.364105
|
||||
C52.251549,274.493134 46.808193,259.574677 45.248268,243.132401
|
||||
C42.852757,217.882736 47.534954,194.193985 61.992100,173.306381
|
||||
C68.736389,163.562241 77.874924,155.485794 85.780846,146.523407
|
||||
C86.925201,145.226135 88.094681,143.039856 87.813805,141.533173
|
||||
C83.612144,118.994171 83.886810,96.443306 87.584114,73.926888
|
||||
C89.888298,59.894482 94.077393,46.452618 101.668411,34.208534
|
||||
C116.050591,11.010487 142.423965,10.012201 158.193069,32.259693
|
||||
C161.068115,36.315899 163.428421,40.736950 166.008514,45.367081
|
||||
C167.293350,48.199883 168.596024,50.655174 169.898697,53.110466
|
||||
C170.118103,54.086079 170.337494,55.061695 170.516022,56.656281
|
||||
C171.198898,58.955570 171.922623,60.635887 172.646332,62.316200
|
||||
C172.715714,62.700943 172.785080,63.085686 172.705475,63.822990
|
||||
C172.991394,64.832443 173.426270,65.489326 173.861160,66.146217
|
||||
C174.163727,67.863571 174.466293,69.580925 174.618439,71.788315
|
||||
C174.928665,73.237709 175.389328,74.197075 175.849991,75.156441
|
||||
C175.902451,75.575867 175.954910,75.995293 175.846039,76.773323
|
||||
C175.963669,77.879028 176.242661,78.626129 176.521637,79.373238
|
||||
C176.576294,80.051865 176.630936,80.730492 176.591492,82.007233
|
||||
C176.576050,83.044731 176.654709,83.484108 176.576355,84.245636
|
||||
C176.527023,85.869171 176.424057,87.236214 176.803345,88.452919
|
||||
C177.161438,89.601616 178.111786,91.518448 178.651947,91.468811
|
||||
C179.971619,91.347542 181.204727,90.284454 182.472687,89.600502
|
||||
C183.995117,88.870232 185.517532,88.139969 187.682526,87.421600
|
||||
C199.862427,82.564972 211.695221,78.741302 224.268723,77.799339
|
||||
C244.137772,76.310799 262.499237,81.442329 279.876282,90.738556
|
||||
C284.705017,93.321793 285.663574,92.699104 286.591431,87.283226
|
||||
C288.048218,78.779991 289.343262,70.212616 291.482635,61.871384
|
||||
C294.604065,49.701283 299.713043,38.361351 307.894592,28.601389
|
||||
C321.889679,11.906353 344.252258,12.365029 357.757874,29.431511
|
||||
C365.912079,39.735626 370.523163,51.638264 373.411957,64.135040
|
||||
C379.017395,88.383919 380.067780,112.966293 375.620728,137.494095
|
||||
C374.579224,143.238708 376.206207,146.487579 380.126709,149.736679
|
||||
C400.188812,166.362946 411.718201,187.683655 415.828918,213.379791
|
||||
C420.016449,239.556335 415.923798,263.955994 402.109955,286.707825
|
||||
C401.013214,288.514221 400.408813,291.716217 401.261047,293.432892
|
||||
C407.217255,305.430206 411.527740,317.885925 413.647644,331.131470
|
||||
C417.956573,358.055206 416.688477,384.467468 403.418610,408.774658
|
||||
C398.867920,417.110443 398.507538,422.926819 402.683075,431.558014
|
||||
C412.522888,451.897675 412.483154,474.064392 410.774536,496.141907
|
||||
C410.521210,499.415100 409.471771,502.678253 408.392456,505.808807
|
||||
C407.997925,506.953125 406.467255,508.473480 405.418396,508.502502
|
||||
C397.329834,508.726166 389.232300,508.625641 380.583740,508.625641
|
||||
C380.751251,505.841766 380.335083,503.517059 381.094543,501.677795
|
||||
C385.174316,491.798065 385.213715,481.471588 384.451660,471.169434
|
||||
C383.285370,455.402435 379.373352,440.444733 369.390198,427.662476
|
||||
C369.312134,422.464111 369.234100,417.265717 369.591858,411.585693
|
||||
C378.529846,401.643585 383.981934,390.485779 386.750061,378.250336
|
||||
C391.087433,359.078522 390.324127,339.872467 383.795532,321.287689
|
||||
C380.908813,313.070160 376.545563,305.342773 372.531128,297.558655
|
||||
C369.061798,290.831512 369.099243,284.694824 373.451782,279.933136
|
||||
C385.207153,267.072601 390.345306,251.555588 390.990601,234.540543
|
||||
C391.698395,215.876160 386.211761,198.788010 375.462585,183.588516
|
||||
C366.633759,171.104446 354.927002,162.243713 340.503571,156.683228
|
||||
C329.846130,152.574600 319.002258,152.920975 308.040192,153.393570
|
||||
C303.576660,153.585983 300.326080,152.697845 299.000610,147.683426
|
||||
C298.257538,144.872162 296.497681,142.276016 294.936188,139.743042
|
||||
C279.399597,114.540398 242.774384,96.847366 211.309784,107.230194
|
||||
C190.407791,114.127548 173.315369,125.894386 163.943314,146.311646
|
||||
C161.179047,152.333710 157.892578,153.781937 152.206726,153.371094
|
||||
C142.886841,152.697678 133.562439,152.564117 124.542236,155.585190
|
||||
C94.260124,165.727325 76.557159,191.353058 72.041077,220.073395
|
||||
C70.376244,230.660965 70.916847,241.205658 73.803696,251.693512
|
||||
C76.625580,261.945374 80.586334,271.384705 88.392426,278.884735
|
||||
C93.718521,284.001953 94.731979,290.720947 90.756561,296.967590
|
||||
C77.313744,318.090393 72.271309,341.206696 74.216591,365.965424
|
||||
C74.435547,368.752228 75.809227,371.448273 76.647430,374.186401
|
||||
C76.647430,374.186401 76.812462,374.215210 76.697754,374.486023
|
||||
C76.660233,375.504852 76.737404,376.252869 76.596680,377.204956
|
||||
C76.873169,378.311310 77.367561,379.213654 78.023911,380.252869
|
||||
C78.185860,380.389740 78.531258,380.143677 78.531258,380.143677
|
||||
C78.680740,381.168457 78.830223,382.193207 78.722519,383.768188
|
||||
C79.531815,386.969818 80.598312,389.621246 81.737183,392.632812
|
||||
C83.174011,395.357147 84.538460,397.721344 85.972809,400.431213
|
||||
C87.543549,402.355896 89.044395,403.934875 90.545227,405.513885
|
||||
C90.793449,406.004913 91.041679,406.495941 91.224251,407.604248
|
||||
C91.807487,408.791534 92.456383,409.361572 93.105286,409.931610
|
||||
C93.105278,409.931610 93.426132,410.056519 93.553352,410.530670
|
||||
C96.694374,416.741272 95.423264,422.477478 93.679718,428.213684
|
||||
C93.455498,428.585022 93.231262,428.956329 92.626465,429.662476
|
||||
C92.016121,430.727539 91.786346,431.457703 91.556564,432.187897
|
||||
C91.328140,432.561584 91.099716,432.935242 90.458389,433.668884
|
||||
C89.299217,435.645966 88.552940,437.263123 87.806664,438.880249
|
||||
C87.599197,439.179474 87.391747,439.478699 86.830666,440.128723
|
||||
C85.880585,441.595398 85.284126,442.711304 84.389313,443.909637
|
||||
C83.728355,445.328064 83.365753,446.664062 82.957626,448.363831
|
||||
C83.026131,449.183258 83.140167,449.638916 83.254196,450.094543
|
||||
C83.056625,450.797913 82.859047,451.501251 82.415634,452.566895
|
||||
C81.983971,453.217468 81.798141,453.505768 81.344223,453.843994
|
||||
C81.031883,454.595093 80.987633,455.296234 80.905113,456.385132
|
||||
C80.940575,457.527832 81.014305,458.282837 81.088028,459.037811
|
||||
M346.639221,70.840302
|
||||
C344.635559,65.215714 343.129150,59.339684 340.456360,54.053432
|
||||
C338.622345,50.426132 335.167023,47.618595 332.436462,44.444618
|
||||
C329.659210,47.612175 326.095215,50.377460 324.235626,54.014240
|
||||
C314.115509,73.805855 312.400696,95.373947 312.214203,117.085426
|
||||
C312.183044,120.713676 313.497894,125.205994 318.707092,125.839920
|
||||
C328.550537,127.037773 338.395508,128.223099 348.769745,129.477722
|
||||
C349.020416,128.056488 349.429626,126.150459 349.685059,124.224052
|
||||
C352.032440,106.522598 350.351135,89.039009 346.639221,70.840302
|
||||
M113.492012,89.731453
|
||||
C111.794785,103.116592 111.746040,116.437302 114.398529,129.551453
|
||||
C123.742180,128.277740 132.434082,126.908836 141.171570,125.959351
|
||||
C148.311752,125.183441 151.529449,122.364624 150.970123,115.314209
|
||||
C149.971970,102.732277 149.011307,90.101509 146.990555,77.660789
|
||||
C145.313797,67.337700 141.982315,57.297325 135.651627,48.651859
|
||||
C131.469238,42.940208 129.319321,43.092106 125.336067,49.049961
|
||||
C124.967010,49.601967 124.647690,50.188084 124.319611,50.766495
|
||||
C117.620155,62.578022 114.967781,75.529541 113.492012,89.731453
|
||||
z"/>
|
||||
<path fill="#090808" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M238.928452,431.043823
|
||||
C246.123001,441.068878 253.199844,450.746674 260.005219,460.611725
|
||||
C262.276031,463.903351 264.201569,467.227722 268.928558,466.225769
|
||||
C273.777802,465.197876 277.575287,462.192261 277.907013,457.368866
|
||||
C278.310760,451.497650 277.648865,445.442352 276.539459,439.640381
|
||||
C276.170074,437.708557 273.126404,436.123566 271.066010,434.735046
|
||||
C269.588715,433.739441 267.495361,433.640015 266.054321,432.611725
|
||||
C260.430786,428.599213 254.664597,426.971069 247.730911,429.236908
|
||||
C246.071442,429.779144 242.053848,427.797363 241.602615,426.251862
|
||||
C240.915283,423.897827 241.479568,419.811279 243.145325,418.430420
|
||||
C246.317841,415.800598 250.644165,414.562683 253.747864,413.097748
|
||||
C249.718521,405.269745 245.430740,397.294739 241.524673,389.136902
|
||||
C240.338394,386.659271 239.862701,383.700409 239.672379,380.920197
|
||||
C239.393066,376.840057 241.971878,374.465485 245.619095,373.292999
|
||||
C249.422287,372.070312 251.067886,374.765198 252.511154,377.500061
|
||||
C255.028595,382.270416 257.462006,387.085114 259.930634,391.881195
|
||||
C260.379639,391.719727 260.828674,391.558228 261.277679,391.396729
|
||||
C260.815979,388.558624 260.192261,385.735413 259.928894,382.879028
|
||||
C259.487274,378.089325 258.768158,373.233368 259.189301,368.496277
|
||||
C259.387695,366.264893 261.530121,363.210938 263.557739,362.364105
|
||||
C266.838562,360.993866 270.365845,362.512512 271.742432,366.111877
|
||||
C273.035675,369.493347 273.501343,373.185089 274.425690,376.715576
|
||||
C275.421356,380.518463 276.526917,384.292572 277.584503,388.079254
|
||||
C278.039124,388.078522 278.493713,388.077820 278.948334,388.077118
|
||||
C280.210754,384.135010 281.377350,380.158875 282.760803,376.259735
|
||||
C284.355347,371.765656 287.076477,368.349579 292.208710,367.749664
|
||||
C297.229156,367.162811 299.846466,370.137695 298.522583,375.022552
|
||||
C297.960480,377.096710 297.144135,379.123383 296.245911,381.081055
|
||||
C293.417755,387.245361 293.097107,393.569122 294.640045,400.105255
|
||||
C295.403839,403.340729 296.233734,406.608063 296.497925,409.903992
|
||||
C297.029449,416.534576 295.510742,422.571716 289.716736,426.652985
|
||||
C285.202240,429.833008 283.379517,434.208038 283.354462,439.513092
|
||||
C283.334015,443.843964 283.936432,448.255554 283.297943,452.485748
|
||||
C282.522644,457.622284 281.355743,462.882965 279.253845,467.597565
|
||||
C275.001465,477.135834 274.422760,486.463593 278.468567,496.108521
|
||||
C288.966675,521.135132 294.863953,547.117310 293.868591,574.365051
|
||||
C293.627930,580.953857 292.712677,587.697815 290.808685,593.976562
|
||||
C289.721069,597.563171 286.582703,601.245544 283.359100,603.309326
|
||||
C277.620483,606.983093 272.782379,605.640869 268.574249,600.215942
|
||||
C264.495270,594.957397 260.987000,589.249207 256.815735,584.070618
|
||||
C246.313293,571.031738 234.627289,568.811646 220.322083,577.478271
|
||||
C214.232239,581.167786 208.854935,586.019409 203.054657,590.205444
|
||||
C198.751190,593.311340 194.566330,596.775818 189.833038,599.048218
|
||||
C181.884720,602.863953 176.310593,599.173157 175.985687,590.394775
|
||||
C175.795319,585.251099 175.950989,580.094604 175.950989,575.393616
|
||||
C173.765152,575.224609 171.258484,575.465759 169.046417,574.770142
|
||||
C164.322479,573.284607 162.840958,569.164673 165.373871,564.924194
|
||||
C166.729553,562.654541 168.437653,560.555786 170.212524,558.583130
|
||||
C176.378571,551.729858 177.421707,543.897827 175.080978,535.272461
|
||||
C174.081863,531.590942 172.594635,527.821350 172.680847,524.123291
|
||||
C172.781799,519.793396 172.988541,514.322327 175.516769,511.381409
|
||||
C190.144241,494.365631 194.115402,474.202911 194.444962,452.766907
|
||||
C194.728973,434.294952 194.880341,415.820526 194.981903,397.346619
|
||||
C194.996338,394.719116 194.397675,392.088226 193.951843,388.365540
|
||||
C211.716629,400.304688 225.614304,415.102051 238.928452,431.043823
|
||||
M228.385803,451.264862
|
||||
C227.576050,451.480164 226.766312,451.695465 225.209366,451.841797
|
||||
C222.756439,452.743103 220.303528,453.644409 217.170731,454.740448
|
||||
C214.683762,456.731873 212.196808,458.723328 209.074677,461.086914
|
||||
C206.395721,465.039581 204.903061,469.203491 206.694351,474.645966
|
||||
C207.032074,475.455811 207.369797,476.265686 207.787186,477.773773
|
||||
C209.189240,479.510315 210.591293,481.246826 212.329575,483.592102
|
||||
C215.219910,484.719025 218.110245,485.845917 221.635101,487.394684
|
||||
C233.391190,488.519379 243.870499,481.443024 246.378113,470.686554
|
||||
C248.007095,463.699005 245.677322,457.613983 239.541641,453.452820
|
||||
C237.706635,452.909149 235.871628,452.365509 233.414749,451.425751
|
||||
C231.940811,451.435333 230.466873,451.444916 228.385803,451.264862
|
||||
M284.566986,538.144775
|
||||
C278.475800,509.657806 267.102570,483.400177 251.528656,458.795929
|
||||
C253.722275,472.870728 249.048874,483.612915 236.402206,489.670532
|
||||
C223.666412,495.770905 212.155731,493.309204 202.572876,480.632416
|
||||
C200.825073,483.607727 198.779495,485.716156 198.288864,488.139435
|
||||
C193.799515,510.313446 189.164429,532.473022 185.458435,554.784119
|
||||
C183.615967,565.876221 183.302872,577.265198 182.940918,588.540527
|
||||
C182.783112,593.456177 185.634399,594.863464 189.859650,592.215210
|
||||
C194.192657,589.499329 197.933914,585.853333 202.021713,582.728943
|
||||
C207.955765,578.193481 213.564606,573.035156 220.032074,569.436279
|
||||
C233.242828,562.085083 246.359818,564.229187 256.986389,574.989197
|
||||
C261.165375,579.220703 264.537445,584.255859 268.212250,588.975464
|
||||
C269.948364,591.205139 271.362610,593.702515 273.221008,595.816284
|
||||
C276.735901,599.814148 282.047241,598.916016 283.939178,593.945984
|
||||
C284.933655,591.333618 285.557251,588.500061 285.850372,585.713928
|
||||
C287.493530,570.096130 287.983032,554.486694 284.566986,538.144775
|
||||
M177.712799,523.615601
|
||||
C178.496674,527.143372 179.280563,530.671082 180.064453,534.198853
|
||||
C180.681747,534.152527 181.299042,534.106262 181.916336,534.059998
|
||||
C183.261337,526.415588 184.606323,518.771179 185.951324,511.126770
|
||||
C185.390701,510.972260 184.830093,510.817749 184.269485,510.663269
|
||||
C180.384155,513.683533 178.762192,518.027527 177.712799,523.615601
|
||||
z"/>
|
||||
<path fill="#9C9C9C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M369.258026,428.042847
|
||||
C379.373352,440.444733 383.285370,455.402435 384.451660,471.169434
|
||||
C385.213715,481.471588 385.174316,491.798065 381.094543,501.677795
|
||||
C380.335083,503.517059 380.751251,505.841766 380.583740,508.625641
|
||||
C389.232300,508.625641 397.329834,508.726166 405.418396,508.502502
|
||||
C406.467255,508.473480 407.997925,506.953125 408.392456,505.808807
|
||||
C409.471771,502.678253 410.521210,499.415100 410.774536,496.141907
|
||||
C412.483154,474.064392 412.522888,451.897675 402.683075,431.558014
|
||||
C398.507538,422.926819 398.867920,417.110443 403.418610,408.774658
|
||||
C416.688477,384.467468 417.956573,358.055206 413.647644,331.131470
|
||||
C411.527740,317.885925 407.217255,305.430206 401.261047,293.432892
|
||||
C400.408813,291.716217 401.013214,288.514221 402.109955,286.707825
|
||||
C415.923798,263.955994 420.016449,239.556335 415.828918,213.379791
|
||||
C411.718201,187.683655 400.188812,166.362946 380.126709,149.736679
|
||||
C376.206207,146.487579 374.579224,143.238708 375.620728,137.494095
|
||||
C380.067780,112.966293 379.017395,88.383919 373.411957,64.135040
|
||||
C370.523163,51.638264 365.912079,39.735626 357.757874,29.431511
|
||||
C344.252258,12.365029 321.889679,11.906353 307.894592,28.601389
|
||||
C299.713043,38.361351 294.604065,49.701283 291.482635,61.871384
|
||||
C289.343262,70.212616 288.048218,78.779991 286.591431,87.283226
|
||||
C285.663574,92.699104 284.705017,93.321793 279.876282,90.738556
|
||||
C262.499237,81.442329 244.137772,76.310799 224.268723,77.799339
|
||||
C211.695221,78.741302 199.862427,82.564972 188.004135,87.251266
|
||||
C191.609116,85.096024 195.445267,82.913185 199.477219,81.187950
|
||||
C213.532364,75.173859 228.426987,75.139786 243.179901,76.411026
|
||||
C255.631439,77.483955 267.387054,81.855431 278.519012,87.658875
|
||||
C280.086487,88.476044 281.728912,89.149498 282.786560,89.636307
|
||||
C285.972961,77.125694 288.495239,64.790840 292.319153,52.873642
|
||||
C296.367950,40.255608 302.718689,28.637171 313.728760,20.546566
|
||||
C328.695618,9.548378 347.885315,13.042048 359.447601,28.447065
|
||||
C369.322693,41.604122 374.864380,56.468525 376.884613,72.689156
|
||||
C378.195129,83.211807 380.166199,93.761627 380.200470,104.304604
|
||||
C380.238586,116.036354 378.297546,127.766296 377.507690,139.516495
|
||||
C377.363831,141.657150 377.973846,144.445969 379.320160,145.990402
|
||||
C386.950592,154.743759 395.960114,162.482651 402.514008,171.942856
|
||||
C412.465454,186.307236 417.038361,202.982010 418.800720,220.438522
|
||||
C419.981537,232.134415 419.414673,243.590927 417.023132,255.099640
|
||||
C414.585663,266.829285 409.853485,277.530884 403.717407,287.668213
|
||||
C402.337830,289.947479 402.309479,291.397034 403.543945,293.858185
|
||||
C410.664154,308.053436 414.929382,323.067810 416.897278,338.910950
|
||||
C419.173767,357.238953 417.975433,375.193695 412.367218,392.649017
|
||||
C409.605743,401.243958 404.909973,409.205811 401.362976,417.570099
|
||||
C400.674408,419.193756 400.580872,421.689758 401.345032,423.216827
|
||||
C413.699829,447.906311 416.261047,473.884644 411.878296,500.807190
|
||||
C411.484070,503.228821 410.891266,505.778839 409.670166,507.842957
|
||||
C408.971466,509.024048 406.834259,509.911011 405.315948,509.955780
|
||||
C397.988953,510.171967 390.650452,509.962463 383.319550,510.096436
|
||||
C379.174957,510.172180 377.993927,508.119110 378.621002,504.440308
|
||||
C379.894287,496.970642 382.034668,489.531799 382.264130,482.032715
|
||||
C382.514496,473.851654 381.159149,465.599304 380.224609,457.409882
|
||||
C379.126221,447.784576 374.792511,439.392426 369.712799,431.320862
|
||||
C369.221893,430.540802 369.307739,429.397766 369.258026,428.042847
|
||||
z"/>
|
||||
<path fill="#626262" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M76.810547,373.735718
|
||||
C75.809227,371.448273 74.435547,368.752228 74.216591,365.965424
|
||||
C72.271309,341.206696 77.313744,318.090393 90.756561,296.967590
|
||||
C94.731979,290.720947 93.718521,284.001953 88.392426,278.884735
|
||||
C80.586334,271.384705 76.625580,261.945374 73.803696,251.693512
|
||||
C70.916847,241.205658 70.376244,230.660965 72.041077,220.073395
|
||||
C76.557159,191.353058 94.260124,165.727325 124.542236,155.585190
|
||||
C133.562439,152.564117 142.886841,152.697678 152.206726,153.371094
|
||||
C157.892578,153.781937 161.179047,152.333710 163.943314,146.311646
|
||||
C173.315369,125.894386 190.407791,114.127548 211.309784,107.230194
|
||||
C242.774384,96.847366 279.399597,114.540398 294.936188,139.743042
|
||||
C296.497681,142.276016 298.257538,144.872162 299.000610,147.683426
|
||||
C300.326080,152.697845 303.576660,153.585983 308.040192,153.393570
|
||||
C319.002258,152.920975 329.846130,152.574600 340.503571,156.683228
|
||||
C354.927002,162.243713 366.633759,171.104446 375.462585,183.588516
|
||||
C386.211761,198.788010 391.698395,215.876160 390.990601,234.540543
|
||||
C390.345306,251.555588 385.207153,267.072601 373.451782,279.933136
|
||||
C369.099243,284.694824 369.061798,290.831512 372.531128,297.558655
|
||||
C376.545563,305.342773 380.908813,313.070160 383.795532,321.287689
|
||||
C390.324127,339.872467 391.087433,359.078522 386.750061,378.250336
|
||||
C383.981934,390.485779 378.529846,401.643585 369.696777,411.140228
|
||||
C370.128693,409.415680 370.582031,407.422852 371.701721,405.929657
|
||||
C384.423615,388.963318 388.203552,369.616760 387.060211,348.944763
|
||||
C386.038513,330.472168 380.456207,313.515564 370.589783,297.820068
|
||||
C365.754486,290.128052 366.868317,285.151154 372.873718,277.966705
|
||||
C387.681763,260.251465 391.342957,239.542877 387.604309,217.457413
|
||||
C384.232941,197.541626 374.417389,180.959961 358.222992,168.651062
|
||||
C344.629944,158.319366 329.400574,153.138351 312.043640,155.662018
|
||||
C302.852386,156.998413 300.826782,155.654663 296.642670,147.071106
|
||||
C287.870972,129.076309 273.242065,117.930511 254.951309,110.592094
|
||||
C220.521179,96.778435 176.456848,117.775826 164.161224,150.445236
|
||||
C162.395172,155.137680 158.244003,156.243958 153.494400,156.050644
|
||||
C147.056351,155.788574 140.515533,155.092270 134.178162,155.874054
|
||||
C115.670410,158.157211 101.315453,167.954514 90.090782,182.428818
|
||||
C78.028862,197.982742 71.973801,215.896286 73.139450,235.444382
|
||||
C74.109749,251.716476 78.423065,267.209961 91.198715,279.005066
|
||||
C96.475342,283.876709 97.025253,290.938904 92.617485,297.769623
|
||||
C82.253365,313.830963 76.741119,331.405548 75.940254,350.371460
|
||||
C75.618927,357.981232 76.590546,365.645538 76.810547,373.735718
|
||||
z"/>
|
||||
<path fill="#ACACAC" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M166.026367,44.989571
|
||||
C163.428421,40.736950 161.068115,36.315899 158.193069,32.259693
|
||||
C142.423965,10.012201 116.050591,11.010487 101.668411,34.208534
|
||||
C94.077393,46.452618 89.888298,59.894482 87.584114,73.926888
|
||||
C83.886810,96.443306 83.612144,118.994171 87.813805,141.533173
|
||||
C88.094681,143.039856 86.925201,145.226135 85.780846,146.523407
|
||||
C77.874924,155.485794 68.736389,163.562241 61.992100,173.306381
|
||||
C47.534954,194.193985 42.852757,217.882736 45.248268,243.132401
|
||||
C46.808193,259.574677 52.251549,274.493134 61.066147,288.364105
|
||||
C61.991234,289.819855 62.084080,292.668640 61.291477,294.222534
|
||||
C48.776821,318.757507 45.307518,344.884155 48.103249,371.881927
|
||||
C49.744976,387.735748 54.717529,402.768921 63.544727,416.253418
|
||||
C65.433167,419.138184 65.526611,421.302124 63.658657,424.366791
|
||||
C56.220573,436.570068 53.150429,450.274414 52.121506,464.255310
|
||||
C51.317581,475.179047 52.093033,486.219025 51.995979,497.656921
|
||||
C50.940212,494.737854 49.472752,491.403992 49.268887,487.994568
|
||||
C48.280193,471.459442 49.929848,455.145660 54.976612,439.326263
|
||||
C56.721302,433.857391 59.528576,428.735168 61.518700,423.332397
|
||||
C62.137901,421.651398 62.395935,419.146942 61.580219,417.735687
|
||||
C54.294636,405.131378 49.218697,391.772522 46.780624,377.406982
|
||||
C41.936687,348.865662 46.295830,321.623016 58.494541,295.553497
|
||||
C59.926754,292.492737 59.942730,290.367645 58.092773,287.427032
|
||||
C43.917156,264.894196 40.320992,240.234619 44.085915,214.243805
|
||||
C47.458839,190.959152 57.430939,171.058670 74.692162,154.881668
|
||||
C78.674400,151.149567 83.920807,147.562973 85.540413,142.860626
|
||||
C87.079094,138.393234 84.783783,132.527115 83.908562,127.320709
|
||||
C80.890259,109.365974 82.927361,91.674881 85.745552,73.876877
|
||||
C87.607124,62.120296 90.741524,50.940479 95.971077,40.326843
|
||||
C102.129440,27.828142 110.770477,17.990557 124.898354,14.326028
|
||||
C134.072617,11.946379 141.991806,15.436010 149.180649,20.384657
|
||||
C157.690826,26.242882 163.580078,34.403221 166.857208,44.575039
|
||||
C166.410172,44.977642 166.218277,44.983604 166.026367,44.989571
|
||||
z"/>
|
||||
<path fill="#0D0D0D" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M154.512405,247.787018
|
||||
C152.173431,251.978165 150.507172,256.307129 147.597290,259.504211
|
||||
C141.256744,266.470551 132.876831,267.177795 124.995628,262.246887
|
||||
C117.906853,257.811768 115.191765,249.290085 118.151245,240.764862
|
||||
C122.780060,227.430878 135.823425,221.737289 146.511917,228.594666
|
||||
C153.315323,232.959564 156.249237,239.272903 154.512405,247.787018
|
||||
z"/>
|
||||
<path fill="#0D0D0D" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M342.733887,236.152222
|
||||
C350.027557,250.146881 344.775848,262.137024 330.407257,264.945709
|
||||
C322.273987,266.535522 312.956024,260.393127 309.653748,251.264969
|
||||
C306.012299,241.199265 309.340973,232.027466 318.256866,227.559906
|
||||
C326.795410,223.281433 336.956207,226.722107 342.733887,236.152222
|
||||
z"/>
|
||||
<path fill="#939393" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M233.997955,342.850952
|
||||
C224.701584,342.485168 215.776138,342.946228 207.131546,341.601624
|
||||
C179.166718,337.251831 153.411209,316.492493 153.691620,284.912689
|
||||
C153.864807,265.409180 163.531158,250.102356 178.870041,238.376236
|
||||
C199.244995,222.800171 222.618088,218.437363 247.238831,222.487762
|
||||
C269.423523,226.137390 288.073700,236.606140 300.605438,256.338226
|
||||
C316.081909,280.706909 310.519226,311.240326 287.171722,328.559448
|
||||
C271.469879,340.207092 253.566727,343.657532 233.997955,342.850952
|
||||
M217.649796,340.900574
|
||||
C224.975922,340.903290 232.309677,340.693848 239.626434,340.957001
|
||||
C251.496933,341.383942 262.651642,338.810181 273.593201,334.334290
|
||||
C307.750580,320.361511 318.189636,278.916809 294.385864,250.807678
|
||||
C281.701477,235.829117 265.409271,227.414459 246.041260,224.447693
|
||||
C217.175339,220.026001 191.864212,226.942841 171.237839,248.000687
|
||||
C153.900864,265.700348 149.830078,293.490631 164.846436,314.248718
|
||||
C177.571472,331.839386 195.669067,339.293976 217.649796,340.900574
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M78.902763,488.018127
|
||||
C78.844734,482.461151 78.786705,476.904144 78.993301,470.829102
|
||||
C79.571526,470.209229 79.885117,470.107391 80.198715,470.005554
|
||||
C80.387451,475.791077 80.576195,481.576630 80.166168,487.682251
|
||||
C79.345848,488.007599 79.124306,488.012848 78.902763,488.018127
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M94.023712,428.215240
|
||||
C95.423264,422.477478 96.694374,416.741272 93.716537,410.585480
|
||||
C95.105270,412.464417 97.648399,414.818268 97.544228,417.048492
|
||||
C97.368416,420.812531 95.515411,424.498169 94.023712,428.215240
|
||||
z"/>
|
||||
<path fill="#9C9C9C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M182.056595,89.436874
|
||||
C181.204727,90.284454 179.971619,91.347542 178.651947,91.468811
|
||||
C178.111786,91.518448 177.161438,89.601616 176.803345,88.452919
|
||||
C176.424057,87.236214 176.527023,85.869171 176.901520,84.266769
|
||||
C177.600555,83.978340 177.817383,83.990929 178.034225,84.003517
|
||||
C178.157227,84.928993 178.280228,85.854477 178.301117,87.440895
|
||||
C178.782089,88.668991 179.365173,89.236145 179.948257,89.803299
|
||||
C180.512344,89.626617 181.076416,89.449928 182.056595,89.436874
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M83.599571,450.050201
|
||||
C83.140167,449.638916 83.026131,449.183258 83.255493,448.196777
|
||||
C83.961807,446.386353 84.324730,445.106750 84.687653,443.827179
|
||||
C85.284126,442.711304 85.880585,441.595398 86.787231,440.403107
|
||||
C86.046600,443.553101 84.995773,446.779480 83.599571,450.050201
|
||||
z"/>
|
||||
<path fill="#505050" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M80.190887,469.700470
|
||||
C79.885117,470.107391 79.571526,470.209229 79.019836,470.400818
|
||||
C79.179718,467.014221 79.577690,463.537842 80.329567,459.970062
|
||||
C80.785034,460.652924 80.886604,461.427216 80.740387,462.898987
|
||||
C80.463165,465.129944 80.433723,466.663361 80.404282,468.196777
|
||||
C80.330544,468.596313 80.256805,468.995850 80.190887,469.700470
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M90.676323,405.153809
|
||||
C89.044395,403.934875 87.543549,402.355896 86.039352,400.094543
|
||||
C86.006905,398.957367 85.977814,398.502594 85.948715,398.047821
|
||||
C87.568283,400.296448 89.187851,402.545105 90.676323,405.153809
|
||||
z"/>
|
||||
<path fill="#626262" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M81.664810,392.272705
|
||||
C80.598312,389.621246 79.531815,386.969818 78.762703,384.155487
|
||||
C79.931435,385.791290 80.802788,387.589966 81.833023,389.974182
|
||||
C82.073318,390.979858 82.154747,391.399994 82.093407,391.933350
|
||||
C81.950645,392.046600 81.664810,392.272705 81.664810,392.272705
|
||||
z"/>
|
||||
<path fill="#505050" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M78.638916,488.255005
|
||||
C79.124306,488.012848 79.345848,488.007599 79.899841,487.997772
|
||||
C80.261703,488.394104 80.291107,488.794952 80.237816,489.803101
|
||||
C80.406540,491.275299 80.657959,492.140228 80.909378,493.005157
|
||||
C80.956337,493.802582 81.003296,494.600006 80.898026,495.766876
|
||||
C79.955544,493.588196 79.165306,491.040039 78.638916,488.255005
|
||||
z"/>
|
||||
<path fill="#9C9C9C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M166.008514,45.367081
|
||||
C166.218277,44.983604 166.410172,44.977642 166.890594,44.956467
|
||||
C168.181473,47.429050 169.183838,49.916843 170.042450,52.757553
|
||||
C168.596024,50.655174 167.293350,48.199883 166.008514,45.367081
|
||||
z"/>
|
||||
<path fill="#626262" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M85.748627,397.799500
|
||||
C85.977814,398.502594 86.006905,398.957367 85.969452,399.748840
|
||||
C84.538460,397.721344 83.174011,395.357147 81.737183,392.632812
|
||||
C81.664810,392.272705 81.950645,392.046600 82.271973,392.159119
|
||||
C83.036377,392.868225 83.479454,393.464813 83.922531,394.061371
|
||||
C84.464523,395.224640 85.006523,396.387878 85.748627,397.799500
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M81.440445,459.004578
|
||||
C81.014305,458.282837 80.940575,457.527832 81.176331,456.203644
|
||||
C81.527969,455.020966 81.570137,454.407532 81.612305,453.794067
|
||||
C81.798141,453.505768 81.983971,453.217468 82.427841,452.934265
|
||||
C82.388206,454.950012 82.090530,456.960693 81.440445,459.004578
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M76.814575,377.000916
|
||||
C76.737404,376.252869 76.660233,375.504852 76.742111,374.414948
|
||||
C77.671303,376.005676 78.441444,377.938232 78.871429,380.007263
|
||||
C78.531258,380.143677 78.185860,380.389740 78.109619,379.901398
|
||||
C77.627113,378.609009 77.220848,377.804962 76.814575,377.000916
|
||||
z"/>
|
||||
<path fill="#505050" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M51.964458,498.251465
|
||||
C52.872929,499.856995 53.603893,501.801422 54.018623,503.894012
|
||||
C53.063911,502.224915 52.425430,500.407654 51.964458,498.251465
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M88.153641,438.931641
|
||||
C88.552940,437.263123 89.299217,435.645966 90.387085,433.992004
|
||||
C89.986000,435.631134 89.243309,437.307098 88.153641,438.931641
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M83.484619,508.026184
|
||||
C83.024902,506.610931 82.915634,505.164795 82.997704,503.322601
|
||||
C83.404381,504.616119 83.619720,506.305725 83.484619,508.026184
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M80.826706,498.012756
|
||||
C80.795845,497.543762 80.764984,497.074768 80.888893,496.288757
|
||||
C81.843697,497.565094 82.643730,499.158417 83.133575,500.895416
|
||||
C82.547729,500.895142 82.272087,500.751251 81.943939,500.067261
|
||||
C81.536530,499.022369 81.181618,498.517578 80.826706,498.012756
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M80.705849,468.061462
|
||||
C80.433723,466.663361 80.463165,465.129944 80.732941,463.297791
|
||||
C80.984657,464.641418 80.996033,466.283783 80.705849,468.061462
|
||||
z"/>
|
||||
<path fill="#9C9C9C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M172.828522,61.988998
|
||||
C171.922623,60.635887 171.198898,58.955570 170.697952,56.983826
|
||||
C171.617386,58.348862 172.314041,60.005325 172.828522,61.988998
|
||||
z"/>
|
||||
<path fill="#9C9C9C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M176.057495,74.823326
|
||||
C175.389328,74.197075 174.928665,73.237709 174.742981,72.139694
|
||||
C175.433609,72.830765 175.849304,73.660492 176.057495,74.823326
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M83.975296,393.691895
|
||||
C83.479454,393.464813 83.036377,392.868225 82.414734,392.045898
|
||||
C82.154747,391.399994 82.073318,390.979858 82.044464,390.242615
|
||||
C82.740715,391.057831 83.384384,392.190155 83.975296,393.691895
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M81.140617,492.827698
|
||||
C80.657959,492.140228 80.406540,491.275299 80.322083,490.093323
|
||||
C80.783318,490.734253 81.077583,491.692230 81.140617,492.827698
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M91.856613,432.230499
|
||||
C91.786346,431.457703 92.016121,430.727539 92.570007,429.986481
|
||||
C92.648293,430.741455 92.402473,431.507263 91.856613,432.230499
|
||||
z"/>
|
||||
<path fill="#ACACAC" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M179.849487,89.453674
|
||||
C179.365173,89.236145 178.782089,88.668991 178.278656,87.791084
|
||||
C178.822433,88.021568 179.286575,88.562805 179.849487,89.453674
|
||||
z"/>
|
||||
<path fill="#B6B6B6" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M54.013954,507.989655
|
||||
C54.604279,508.037811 54.902428,508.132111 55.126961,508.485535
|
||||
C54.739330,509.015259 54.425308,509.285828 54.111282,509.556396
|
||||
C53.981441,509.049500 53.851608,508.542664 54.013954,507.989655
|
||||
z"/>
|
||||
<path fill="#9C9C9C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M176.741150,79.085464
|
||||
C176.242661,78.626129 175.963669,77.879028 175.946442,77.074722
|
||||
C176.459030,77.610916 176.709839,78.204300 176.741150,79.085464
|
||||
z"/>
|
||||
<path fill="#ACACAC" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M178.214874,83.804100
|
||||
C177.817383,83.990929 177.600555,83.978340 177.058533,83.944611
|
||||
C176.654709,83.484108 176.576050,83.044731 176.698349,82.331131
|
||||
C177.398056,82.572838 177.896805,83.088760 178.214874,83.804100
|
||||
z"/>
|
||||
<path fill="#9C9C9C" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M174.044556,65.836197
|
||||
C173.426270,65.489326 172.991394,64.832443 172.826675,64.090973
|
||||
C173.473877,64.512985 173.850906,65.019577 174.044556,65.836197
|
||||
z"/>
|
||||
<path fill="#505050" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M93.201096,409.597534
|
||||
C92.456383,409.361572 91.807487,408.791534 91.295967,407.870728
|
||||
C92.054527,408.101135 92.675713,408.682281 93.201096,409.597534
|
||||
z"/>
|
||||
<path fill="#F4F4F4" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M346.713715,71.250641
|
||||
C350.351135,89.039009 352.032440,106.522598 349.685059,124.224052
|
||||
C349.429626,126.150459 349.020416,128.056488 348.769745,129.477722
|
||||
C338.395508,128.223099 328.550537,127.037773 318.707092,125.839920
|
||||
C313.497894,125.205994 312.183044,120.713676 312.214203,117.085426
|
||||
C312.400696,95.373947 314.115509,73.805855 324.235626,54.014240
|
||||
C326.095215,50.377460 329.659210,47.612175 332.436462,44.444618
|
||||
C335.167023,47.618595 338.622345,50.426132 340.456360,54.053432
|
||||
C343.129150,59.339684 344.635559,65.215714 346.713715,71.250641
|
||||
z"/>
|
||||
<path fill="#F5F5F5" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M113.545265,89.286819
|
||||
C114.967781,75.529541 117.620155,62.578022 124.319611,50.766495
|
||||
C124.647690,50.188084 124.967010,49.601967 125.336067,49.049961
|
||||
C129.319321,43.092106 131.469238,42.940208 135.651627,48.651859
|
||||
C141.982315,57.297325 145.313797,67.337700 146.990555,77.660789
|
||||
C149.011307,90.101509 149.971970,102.732277 150.970123,115.314209
|
||||
C151.529449,122.364624 148.311752,125.183441 141.171570,125.959351
|
||||
C132.434082,126.908836 123.742180,128.277740 114.398529,129.551453
|
||||
C111.746040,116.437302 111.794785,103.116592 113.545265,89.286819
|
||||
z"/>
|
||||
<path fill="#505050" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M84.389297,443.909637
|
||||
C84.324730,445.106750 83.961807,446.386353 83.301018,447.832977
|
||||
C83.365753,446.664062 83.728355,445.328064 84.389297,443.909637
|
||||
z"/>
|
||||
<path fill="#626262" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M76.596680,377.204956
|
||||
C77.220848,377.804962 77.627113,378.609009 77.947670,379.764526
|
||||
C77.367561,379.213654 76.873169,378.311310 76.596680,377.204956
|
||||
z"/>
|
||||
<path fill="#505050" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M80.614609,498.175201
|
||||
C81.181618,498.517578 81.536530,499.022369 81.812332,499.843292
|
||||
C81.289658,499.552124 80.846085,498.944885 80.614609,498.175201
|
||||
z"/>
|
||||
<path fill="#505050" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M81.344223,453.843994
|
||||
C81.570137,454.407532 81.527969,455.020966 81.214584,455.815918
|
||||
C80.987633,455.296234 81.031883,454.595093 81.344223,453.843994
|
||||
z"/>
|
||||
<path fill="#FDFDFD" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M284.667389,538.559143
|
||||
C287.983032,554.486694 287.493530,570.096130 285.850372,585.713928
|
||||
C285.557251,588.500061 284.933655,591.333618 283.939178,593.945984
|
||||
C282.047241,598.916016 276.735901,599.814148 273.221008,595.816284
|
||||
C271.362610,593.702515 269.948364,591.205139 268.212250,588.975464
|
||||
C264.537445,584.255859 261.165375,579.220703 256.986389,574.989197
|
||||
C246.359818,564.229187 233.242828,562.085083 220.032074,569.436279
|
||||
C213.564606,573.035156 207.955765,578.193481 202.021713,582.728943
|
||||
C197.933914,585.853333 194.192657,589.499329 189.859650,592.215210
|
||||
C185.634399,594.863464 182.783112,593.456177 182.940918,588.540527
|
||||
C183.302872,577.265198 183.615967,565.876221 185.458435,554.784119
|
||||
C189.164429,532.473022 193.799515,510.313446 198.288864,488.139435
|
||||
C198.779495,485.716156 200.825073,483.607727 202.572876,480.632416
|
||||
C212.155731,493.309204 223.666412,495.770905 236.402206,489.670532
|
||||
C249.048874,483.612915 253.722275,472.870728 251.528656,458.795929
|
||||
C267.102570,483.400177 278.475800,509.657806 284.667389,538.559143
|
||||
z"/>
|
||||
<path fill="#F16A65" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M217.850616,454.545746
|
||||
C220.303528,453.644409 222.756439,452.743103 225.625885,452.242401
|
||||
C230.153702,457.789215 231.345139,463.211853 227.357086,468.967224
|
||||
C223.059250,475.169708 217.140869,476.274628 210.240158,474.236084
|
||||
C209.155441,473.915619 207.937622,474.045776 206.781342,473.967560
|
||||
C204.903061,469.203491 206.395721,465.039581 209.469391,461.291656
|
||||
C210.149719,462.418610 210.271347,463.437653 210.748856,464.246582
|
||||
C213.005554,468.069458 216.324860,469.191132 219.188370,467.207428
|
||||
C222.364349,465.007294 222.758316,461.198639 220.171570,457.683838
|
||||
C219.400406,456.635986 218.624405,455.591675 217.850616,454.545746
|
||||
z"/>
|
||||
<path fill="#E21F26" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M239.990173,454.002136
|
||||
C245.677322,457.613983 248.007095,463.699005 246.378113,470.686554
|
||||
C243.870499,481.443024 233.391190,488.519379 221.516464,486.914001
|
||||
C223.222702,485.306030 225.020966,484.132812 226.877121,483.059692
|
||||
C233.948486,478.971313 239.137390,473.498993 239.816376,464.923248
|
||||
C240.103165,461.300995 239.945709,457.643585 239.990173,454.002136
|
||||
z"/>
|
||||
<path fill="#EB2A30" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M239.765900,453.727478
|
||||
C239.945709,457.643585 240.103165,461.300995 239.816376,464.923248
|
||||
C239.137390,473.498993 233.948486,478.971313 226.877121,483.059692
|
||||
C225.020966,484.132812 223.222702,485.306030 221.199219,486.703064
|
||||
C218.110245,485.845917 215.219910,484.719025 212.330795,482.976013
|
||||
C213.176376,481.952057 214.043335,481.150146 214.861618,481.197113
|
||||
C223.512863,481.693146 231.724442,477.024109 233.686325,468.804993
|
||||
C234.971054,463.422729 233.998291,457.501617 234.036621,451.821838
|
||||
C235.871628,452.365509 237.706635,452.909149 239.765900,453.727478
|
||||
z"/>
|
||||
<path fill="#E9383B" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M233.725693,451.623779
|
||||
C233.998291,457.501617 234.971054,463.422729 233.686325,468.804993
|
||||
C231.724442,477.024109 223.512863,481.693146 214.861618,481.197113
|
||||
C214.043335,481.150146 213.176376,481.952057 212.162689,482.671631
|
||||
C210.591293,481.246826 209.189240,479.510315 208.159653,477.437561
|
||||
C219.158279,480.797668 228.066940,476.250122 231.498383,467.134491
|
||||
C233.722183,461.226990 231.914169,456.343781 228.992935,451.454498
|
||||
C230.466873,451.444916 231.940811,451.435333 233.725693,451.623779
|
||||
z"/>
|
||||
<path fill="#EA4848" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M228.689362,451.359680
|
||||
C231.914169,456.343781 233.722183,461.226990 231.498383,467.134491
|
||||
C228.066940,476.250122 219.158279,480.797668 208.119812,477.088440
|
||||
C207.369797,476.265686 207.032074,475.455811 206.737854,474.306763
|
||||
C207.937622,474.045776 209.155441,473.915619 210.240158,474.236084
|
||||
C217.140869,476.274628 223.059250,475.169708 227.357086,468.967224
|
||||
C231.345139,463.211853 230.153702,457.789215 225.999481,452.276886
|
||||
C226.766312,451.695465 227.576050,451.480164 228.689362,451.359680
|
||||
z"/>
|
||||
<path fill="#E7E7E7" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M177.753693,523.184937
|
||||
C178.762192,518.027527 180.384155,513.683533 184.269485,510.663269
|
||||
C184.830093,510.817749 185.390701,510.972260 185.951324,511.126770
|
||||
C184.606323,518.771179 183.261337,526.415588 181.916336,534.059998
|
||||
C181.299042,534.106262 180.681747,534.152527 180.064453,534.198853
|
||||
C179.280563,530.671082 178.496674,527.143372 177.753693,523.184937
|
||||
z"/>
|
||||
<path fill="#F9B5A4" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M217.510681,454.643097
|
||||
C218.624405,455.591675 219.400406,456.635986 220.171570,457.683838
|
||||
C222.758316,461.198639 222.364349,465.007294 219.188370,467.207428
|
||||
C216.324860,469.191132 213.005554,468.069458 210.748856,464.246582
|
||||
C210.271347,463.437653 210.149719,462.418610 209.786987,461.105591
|
||||
C212.196808,458.723328 214.683762,456.731873 217.510681,454.643097
|
||||
z"/>
|
||||
<path fill="#090909" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M217.173126,340.895081
|
||||
C195.669067,339.293976 177.571472,331.839386 164.846436,314.248718
|
||||
C149.830078,293.490631 153.900864,265.700348 171.237839,248.000687
|
||||
C191.864212,226.942841 217.175339,220.026001 246.041260,224.447693
|
||||
C265.409271,227.414459 281.701477,235.829117 294.385864,250.807678
|
||||
C318.189636,278.916809 307.750580,320.361511 273.593201,334.334290
|
||||
C262.651642,338.810181 251.496933,341.383942 239.626434,340.957001
|
||||
C232.309677,340.693848 224.975922,340.903290 217.173126,340.895081
|
||||
M248.863983,243.486237
|
||||
C246.738068,243.088089 244.624680,242.598099 242.484299,242.305939
|
||||
C220.435745,239.296371 200.650711,244.157486 184.905121,260.469727
|
||||
C167.044998,278.972595 171.675644,304.356171 194.527725,316.211639
|
||||
C204.709946,321.494049 215.542725,322.906158 226.895706,322.683563
|
||||
C239.516617,322.436096 252.097687,323.301788 264.241119,318.319489
|
||||
C291.865479,306.985626 297.394165,278.226868 275.686523,257.827209
|
||||
C268.235504,250.825119 259.322937,246.585129 248.863983,243.486237
|
||||
z"/>
|
||||
<path fill="#F7F7F7" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M249.265869,243.579742
|
||||
C259.322937,246.585129 268.235504,250.825119 275.686523,257.827209
|
||||
C297.394165,278.226868 291.865479,306.985626 264.241119,318.319489
|
||||
C252.097687,323.301788 239.516617,322.436096 226.895706,322.683563
|
||||
C215.542725,322.906158 204.709946,321.494049 194.527725,316.211639
|
||||
C171.675644,304.356171 167.044998,278.972595 184.905121,260.469727
|
||||
C200.650711,244.157486 220.435745,239.296371 242.484299,242.305939
|
||||
C244.624680,242.598099 246.738068,243.088089 249.265869,243.579742
|
||||
M215.929169,269.461121
|
||||
C212.866943,274.500000 213.005280,278.213623 217.885361,281.533173
|
||||
C222.707077,284.812988 224.323486,288.051453 222.631241,293.867249
|
||||
C221.097626,299.137817 224.643890,302.876923 230.113647,303.217468
|
||||
C237.223434,303.660065 240.553314,300.322723 239.261734,293.231262
|
||||
C238.356491,288.260956 238.673706,284.395416 243.843781,282.114655
|
||||
C244.840103,281.675140 246.108597,280.619324 246.248154,279.696136
|
||||
C246.714813,276.609406 247.945084,272.656799 246.567413,270.550079
|
||||
C245.205322,268.467194 241.091278,267.946442 238.064728,267.306610
|
||||
C236.857285,267.051361 235.371307,268.605194 233.936417,268.813110
|
||||
C232.033310,269.088806 229.788010,269.449341 228.163483,268.719299
|
||||
C224.105011,266.895447 220.314651,265.927124 215.929169,269.461121
|
||||
z"/>
|
||||
<path fill="#121212" opacity="1.000000" stroke="none"
|
||||
d="
|
||||
M216.173950,269.151733
|
||||
C220.314651,265.927124 224.105011,266.895447 228.163483,268.719299
|
||||
C229.788010,269.449341 232.033310,269.088806 233.936417,268.813110
|
||||
C235.371307,268.605194 236.857285,267.051361 238.064728,267.306610
|
||||
C241.091278,267.946442 245.205322,268.467194 246.567413,270.550079
|
||||
C247.945084,272.656799 246.714813,276.609406 246.248154,279.696136
|
||||
C246.108597,280.619324 244.840103,281.675140 243.843781,282.114655
|
||||
C238.673706,284.395416 238.356491,288.260956 239.261734,293.231262
|
||||
C240.553314,300.322723 237.223434,303.660065 230.113647,303.217468
|
||||
C224.643890,302.876923 221.097626,299.137817 222.631241,293.867249
|
||||
C224.323486,288.051453 222.707077,284.812988 217.885361,281.533173
|
||||
C213.005280,278.213623 212.866943,274.500000 216.173950,269.151733
|
||||
z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 55 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 |
BIN
docs/static/img/ollama4j-ui/4.png
vendored
Normal file
After Width: | Height: | Size: 916 KiB |
12
docs/static/img/pmc-logo.svg
vendored
Normal file
After Width: | Height: | Size: 5.8 KiB |
171
docs/static/img/undraw_docusaurus_mountain.svg
vendored
Normal file
@ -0,0 +1,171 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1088" height="687.962" viewBox="0 0 1088 687.962">
|
||||
<title>Easy to Use</title>
|
||||
<g id="Group_12" data-name="Group 12" transform="translate(-57 -56)">
|
||||
<g id="Group_11" data-name="Group 11" transform="translate(57 56)">
|
||||
<path id="Path_83" data-name="Path 83" d="M1017.81,560.461c-5.27,45.15-16.22,81.4-31.25,110.31-20,38.52-54.21,54.04-84.77,70.28a193.275,193.275,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.282,657.282,0,0,0-104.09-13.16q-14.97-.675-29.97-.67c-15.42.02-293.07,5.29-360.67-131.57-16.69-33.76-28.13-75-32.24-125.27-11.63-142.12,52.29-235.46,134.74-296.47,155.97-115.41,369.76-110.57,523.43,7.88C941.15,276.621,1036.99,396.031,1017.81,560.461Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
|
||||
<path id="Path_84" data-name="Path 84" d="M986.56,670.771c-20,38.52-47.21,64.04-77.77,80.28a193.272,193.272,0,0,1-27.46,11.94c-55.61,19.3-117.85,14.18-166.74,3.99a657.3,657.3,0,0,0-104.09-13.16q-14.97-.675-29.97-.67-23.13.03-46.25,1.72c-100.17,7.36-253.82-6.43-321.42-143.29L382,283.981,444.95,445.6l20.09,51.59,55.37-75.98L549,381.981l130.2,149.27,36.8-81.27L970.78,657.9l14.21,11.59Z" transform="translate(-56 -106.019)" fill="#f2f2f2"/>
|
||||
<path id="Path_85" data-name="Path 85" d="M302,282.962l26-57,36,83-31-60Z" opacity="0.1"/>
|
||||
<path id="Path_86" data-name="Path 86" d="M610.5,753.821q-14.97-.675-29.97-.67L465.04,497.191Z" transform="translate(-56 -106.019)" opacity="0.1"/>
|
||||
<path id="Path_87" data-name="Path 87" d="M464.411,315.191,493,292.962l130,150-132-128Z" opacity="0.1"/>
|
||||
<path id="Path_88" data-name="Path 88" d="M908.79,751.051a193.265,193.265,0,0,1-27.46,11.94L679.2,531.251Z" transform="translate(-56 -106.019)" opacity="0.1"/>
|
||||
<circle id="Ellipse_11" data-name="Ellipse 11" cx="3" cy="3" r="3" transform="translate(479 98.962)" fill="#f2f2f2"/>
|
||||
<circle id="Ellipse_12" data-name="Ellipse 12" cx="3" cy="3" r="3" transform="translate(396 201.962)" fill="#f2f2f2"/>
|
||||
<circle id="Ellipse_13" data-name="Ellipse 13" cx="2" cy="2" r="2" transform="translate(600 220.962)" fill="#f2f2f2"/>
|
||||
<circle id="Ellipse_14" data-name="Ellipse 14" cx="2" cy="2" r="2" transform="translate(180 265.962)" fill="#f2f2f2"/>
|
||||
<circle id="Ellipse_15" data-name="Ellipse 15" cx="2" cy="2" r="2" transform="translate(612 96.962)" fill="#f2f2f2"/>
|
||||
<circle id="Ellipse_16" data-name="Ellipse 16" cx="2" cy="2" r="2" transform="translate(736 192.962)" fill="#f2f2f2"/>
|
||||
<circle id="Ellipse_17" data-name="Ellipse 17" cx="2" cy="2" r="2" transform="translate(858 344.962)" fill="#f2f2f2"/>
|
||||
<path id="Path_89" data-name="Path 89" d="M306,121.222h-2.76v-2.76h-1.48v2.76H299V122.7h2.76v2.759h1.48V122.7H306Z" fill="#f2f2f2"/>
|
||||
<path id="Path_90" data-name="Path 90" d="M848,424.222h-2.76v-2.76h-1.48v2.76H841V425.7h2.76v2.759h1.48V425.7H848Z" fill="#f2f2f2"/>
|
||||
<path id="Path_91" data-name="Path 91" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
|
||||
<path id="Path_92" data-name="Path 92" d="M1144,719.981c0,16.569-243.557,74-544,74s-544-57.431-544-74,243.557,14,544,14S1144,703.413,1144,719.981Z" transform="translate(-56 -106.019)" opacity="0.1"/>
|
||||
<ellipse id="Ellipse_18" data-name="Ellipse 18" cx="544" cy="30" rx="544" ry="30" transform="translate(0 583.962)" fill="#3f3d56"/>
|
||||
<path id="Path_93" data-name="Path 93" d="M624,677.981c0,33.137-14.775,24-33,24s-33,9.137-33-24,33-96,33-96S624,644.844,624,677.981Z" transform="translate(-56 -106.019)" fill="#ff6584"/>
|
||||
<path id="Path_94" data-name="Path 94" d="M606,690.66c0,15.062-6.716,10.909-15,10.909s-15,4.153-15-10.909,15-43.636,15-43.636S606,675.6,606,690.66Z" transform="translate(-56 -106.019)" opacity="0.1"/>
|
||||
<rect id="Rectangle_97" data-name="Rectangle 97" width="92" height="18" rx="9" transform="translate(489 604.962)" fill="#2f2e41"/>
|
||||
<rect id="Rectangle_98" data-name="Rectangle 98" width="92" height="18" rx="9" transform="translate(489 586.962)" fill="#2f2e41"/>
|
||||
<path id="Path_95" data-name="Path 95" d="M193,596.547c0,55.343,34.719,100.126,77.626,100.126" transform="translate(-56 -106.019)" fill="#3f3d56"/>
|
||||
<path id="Path_96" data-name="Path 96" d="M270.626,696.673c0-55.965,38.745-101.251,86.626-101.251" transform="translate(-56 -106.019)" fill="#6c63ff"/>
|
||||
<path id="Path_97" data-name="Path 97" d="M221.125,601.564c0,52.57,22.14,95.109,49.5,95.109" transform="translate(-56 -106.019)" fill="#6c63ff"/>
|
||||
<path id="Path_98" data-name="Path 98" d="M270.626,696.673c0-71.511,44.783-129.377,100.126-129.377" transform="translate(-56 -106.019)" fill="#3f3d56"/>
|
||||
<path id="Path_99" data-name="Path 99" d="M254.3,697.379s11.009-.339,14.326-2.7,16.934-5.183,17.757-1.395,16.544,18.844,4.115,18.945-28.879-1.936-32.19-3.953S254.3,697.379,254.3,697.379Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
|
||||
<path id="Path_100" data-name="Path 100" d="M290.716,710.909c-12.429.1-28.879-1.936-32.19-3.953-2.522-1.536-3.527-7.048-3.863-9.591l-.368.014s.7,8.879,4.009,10.9,19.761,4.053,32.19,3.953c3.588-.029,4.827-1.305,4.759-3.2C294.755,710.174,293.386,710.887,290.716,710.909Z" transform="translate(-56 -106.019)" opacity="0.2"/>
|
||||
<path id="Path_101" data-name="Path 101" d="M777.429,633.081c0,38.029,23.857,68.8,53.341,68.8" transform="translate(-56 -106.019)" fill="#3f3d56"/>
|
||||
<path id="Path_102" data-name="Path 102" d="M830.769,701.882c0-38.456,26.623-69.575,59.525-69.575" transform="translate(-56 -106.019)" fill="#6c63ff"/>
|
||||
<path id="Path_103" data-name="Path 103" d="M796.755,636.528c0,36.124,15.213,65.354,34.014,65.354" transform="translate(-56 -106.019)" fill="#6c63ff"/>
|
||||
<path id="Path_104" data-name="Path 104" d="M830.769,701.882c0-49.139,30.773-88.9,68.8-88.9" transform="translate(-56 -106.019)" fill="#3f3d56"/>
|
||||
<path id="Path_105" data-name="Path 105" d="M819.548,702.367s7.565-.233,9.844-1.856,11.636-3.562,12.2-.958,11.368,12.949,2.828,13.018-19.844-1.33-22.119-2.716S819.548,702.367,819.548,702.367Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
|
||||
<path id="Path_106" data-name="Path 106" d="M844.574,711.664c-8.54.069-19.844-1.33-22.119-2.716-1.733-1.056-2.423-4.843-2.654-6.59l-.253.01s.479,6.1,2.755,7.487,13.579,2.785,22.119,2.716c2.465-.02,3.317-.9,3.27-2.2C847.349,711.159,846.409,711.649,844.574,711.664Z" transform="translate(-56 -106.019)" opacity="0.2"/>
|
||||
<path id="Path_107" data-name="Path 107" d="M949.813,724.718s11.36-1.729,14.5-4.591,16.89-7.488,18.217-3.667,19.494,17.447,6.633,19.107-30.153,1.609-33.835-.065S949.813,724.718,949.813,724.718Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
|
||||
<path id="Path_108" data-name="Path 108" d="M989.228,734.173c-12.86,1.659-30.153,1.609-33.835-.065-2.8-1.275-4.535-6.858-5.2-9.45l-.379.061s1.833,9.109,5.516,10.783,20.975,1.725,33.835.065c3.712-.479,4.836-1.956,4.529-3.906C993.319,732.907,991.991,733.817,989.228,734.173Z" transform="translate(-56 -106.019)" opacity="0.2"/>
|
||||
<path id="Path_109" data-name="Path 109" d="M670.26,723.9s9.587-1.459,12.237-3.875,14.255-6.32,15.374-3.095,16.452,14.725,5.6,16.125-25.448,1.358-28.555-.055S670.26,723.9,670.26,723.9Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
|
||||
<path id="Path_110" data-name="Path 110" d="M703.524,731.875c-10.853,1.4-25.448,1.358-28.555-.055-2.367-1.076-3.827-5.788-4.39-7.976l-.32.051s1.547,7.687,4.655,9.1,17.7,1.456,28.555.055c3.133-.4,4.081-1.651,3.822-3.3C706.977,730.807,705.856,731.575,703.524,731.875Z" transform="translate(-56 -106.019)" opacity="0.2"/>
|
||||
<path id="Path_111" data-name="Path 111" d="M178.389,719.109s7.463-1.136,9.527-3.016,11.1-4.92,11.969-2.409,12.808,11.463,4.358,12.553-19.811,1.057-22.23-.043S178.389,719.109,178.389,719.109Z" transform="translate(-56 -106.019)" fill="#a8a8a8"/>
|
||||
<path id="Path_112" data-name="Path 112" d="M204.285,725.321c-8.449,1.09-19.811,1.057-22.23-.043-1.842-.838-2.979-4.506-3.417-6.209l-.249.04s1.2,5.984,3.624,7.085,13.781,1.133,22.23.043c2.439-.315,3.177-1.285,2.976-2.566C206.973,724.489,206.1,725.087,204.285,725.321Z" transform="translate(-56 -106.019)" opacity="0.2"/>
|
||||
<path id="Path_113" data-name="Path 113" d="M439.7,707.337c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873,42.118-36.793,93.694-36.793S439.7,677.117,439.7,707.337Z" transform="translate(-56 -106.019)" opacity="0.1"/>
|
||||
<path id="Path_114" data-name="Path 114" d="M439.7,699.9c0,30.22-42.124,20.873-93.7,20.873s-93.074,9.347-93.074-20.873S295.04,663.1,346.616,663.1,439.7,669.676,439.7,699.9Z" transform="translate(-56 -106.019)" fill="#3f3d56"/>
|
||||
</g>
|
||||
<g id="docusaurus_keytar" transform="translate(312.271 493.733)">
|
||||
<path id="Path_40" data-name="Path 40" d="M99,52h91.791V89.153H99Z" transform="translate(5.904 -14.001)" fill="#fff" fill-rule="evenodd"/>
|
||||
<path id="Path_41" data-name="Path 41" d="M24.855,163.927A21.828,21.828,0,0,1,5.947,153a21.829,21.829,0,0,0,18.908,32.782H46.71V163.927Z" transform="translate(-3 -4.634)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_42" data-name="Path 42" d="M121.861,61.1l76.514-4.782V45.39A21.854,21.854,0,0,0,176.52,23.535H78.173L75.441,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L64.513,18.8a3.154,3.154,0,0,0-5.464,0l-2.732,4.732L53.586,18.8a3.154,3.154,0,0,0-5.464,0L45.39,23.535c-.024,0-.046,0-.071,0l-4.526-4.525a3.153,3.153,0,0,0-5.276,1.414l-1.5,5.577-5.674-1.521a3.154,3.154,0,0,0-3.863,3.864L26,34.023l-5.575,1.494a3.155,3.155,0,0,0-1.416,5.278l4.526,4.526c0,.023,0,.046,0,.07L18.8,48.122a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,59.05a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,69.977a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,80.9a3.154,3.154,0,0,0,0,5.464L23.535,89.1,18.8,91.832a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,102.76a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,113.687a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,124.615a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,135.542a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,146.469a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,157.4a3.154,3.154,0,0,0,0,5.464l4.732,2.732L18.8,168.324a3.154,3.154,0,0,0,0,5.464l4.732,2.732A21.854,21.854,0,0,0,45.39,198.375H176.52a21.854,21.854,0,0,0,21.855-21.855V89.1l-76.514-4.782a11.632,11.632,0,0,1,0-23.219" transform="translate(-1.681 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_43" data-name="Path 43" d="M143,186.71h32.782V143H143Z" transform="translate(9.984 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_44" data-name="Path 44" d="M196.71,159.855a5.438,5.438,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(10.912 -6.025)" fill="#44d860" fill-rule="evenodd"/>
|
||||
<path id="Path_45" data-name="Path 45" d="M153,124.855h32.782V103H153Z" transform="translate(10.912 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_46" data-name="Path 46" d="M194.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.814,2.814,0,0,0,.349.035" transform="translate(12.767 -9.377)" fill="#44d860" fill-rule="evenodd"/>
|
||||
<path id="Path_47" data-name="Path 47" d="M65.087,56.891a2.732,2.732,0,0,1-2.732-2.732,8.2,8.2,0,0,0-16.391,0,2.732,2.732,0,0,1-5.464,0,13.659,13.659,0,0,1,27.319,0,2.732,2.732,0,0,1-2.732,2.732" transform="translate(0.478 -15.068)" fill-rule="evenodd"/>
|
||||
<path id="Path_48" data-name="Path 48" d="M103,191.347h65.565a21.854,21.854,0,0,0,21.855-21.855V93H124.855A21.854,21.854,0,0,0,103,114.855Z" transform="translate(6.275 -10.199)" fill="#ffff50" fill-rule="evenodd"/>
|
||||
<path id="Path_49" data-name="Path 49" d="M173.216,129.787H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0-54.434H118.535a1.093,1.093,0,1,1,0-2.185h54.681a1.093,1.093,0,0,1,0,2.185m0,21.652H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186m0,21.855H118.535a1.093,1.093,0,1,1,0-2.186h54.681a1.093,1.093,0,0,1,0,2.186M189.585,61.611c-.013,0-.024-.007-.037-.005-3.377.115-4.974,3.492-6.384,6.472-1.471,3.114-2.608,5.139-4.473,5.078-2.064-.074-3.244-2.406-4.494-4.874-1.436-2.835-3.075-6.049-6.516-5.929-3.329.114-4.932,3.053-6.346,5.646-1.5,2.762-2.529,4.442-4.5,4.364-2.106-.076-3.225-1.972-4.52-4.167-1.444-2.443-3.112-5.191-6.487-5.1-3.272.113-4.879,2.606-6.3,4.808-1.5,2.328-2.552,3.746-4.551,3.662-2.156-.076-3.27-1.65-4.558-3.472-1.447-2.047-3.077-4.363-6.442-4.251-3.2.109-4.807,2.153-6.224,3.954-1.346,1.709-2.4,3.062-4.621,2.977a1.093,1.093,0,0,0-.079,2.186c3.3.11,4.967-1.967,6.417-3.81,1.286-1.635,2.4-3.045,4.582-3.12,2.1-.09,3.091,1.218,4.584,3.327,1.417,2,3.026,4.277,6.263,4.394,3.391.114,5.022-2.42,6.467-4.663,1.292-2,2.406-3.734,4.535-3.807,1.959-.073,3.026,1.475,4.529,4.022,1.417,2.4,3.023,5.121,6.324,5.241,3.415.118,5.064-2.863,6.5-5.5,1.245-2.282,2.419-4.437,4.5-4.509,1.959-.046,2.981,1.743,4.492,4.732,1.412,2.79,3.013,5.95,6.365,6.071l.185,0c3.348,0,4.937-3.36,6.343-6.331,1.245-2.634,2.423-5.114,4.444-5.216Z" transform="translate(7.109 -13.11)" fill-rule="evenodd"/>
|
||||
<path id="Path_50" data-name="Path 50" d="M83,186.71h43.71V143H83Z" transform="translate(4.42 -5.561)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 109.327, 91.085)">
|
||||
<rect id="Rectangle_3" data-name="Rectangle 3" width="92.361" height="36.462" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
|
||||
<g id="Group_2" data-name="Group 2" transform="translate(1.531 23.03)">
|
||||
<rect id="Rectangle_4" data-name="Rectangle 4" width="5.336" height="5.336" rx="1" transform="translate(16.797 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_5" data-name="Rectangle 5" width="5.336" height="5.336" rx="1" transform="translate(23.12 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_6" data-name="Rectangle 6" width="5.336" height="5.336" rx="1" transform="translate(29.444 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_7" data-name="Rectangle 7" width="5.336" height="5.336" rx="1" transform="translate(35.768 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_8" data-name="Rectangle 8" width="5.336" height="5.336" rx="1" transform="translate(42.091 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_9" data-name="Rectangle 9" width="5.336" height="5.336" rx="1" transform="translate(48.415 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_10" data-name="Rectangle 10" width="5.336" height="5.336" rx="1" transform="translate(54.739 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_11" data-name="Rectangle 11" width="5.336" height="5.336" rx="1" transform="translate(61.063 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_12" data-name="Rectangle 12" width="5.336" height="5.336" rx="1" transform="translate(67.386 0)" fill="#4a4a4a"/>
|
||||
<path id="Path_51" data-name="Path 51" d="M1.093,0H14.518a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0ZM75,0H88.426a1.093,1.093,0,0,1,1.093,1.093V4.243a1.093,1.093,0,0,1-1.093,1.093H75a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,75,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g id="Group_3" data-name="Group 3" transform="translate(1.531 10.261)">
|
||||
<path id="Path_52" data-name="Path 52" d="M1.093,0H6.218A1.093,1.093,0,0,1,7.31,1.093V4.242A1.093,1.093,0,0,1,6.218,5.335H1.093A1.093,1.093,0,0,1,0,4.242V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
<rect id="Rectangle_13" data-name="Rectangle 13" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_14" data-name="Rectangle 14" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_15" data-name="Rectangle 15" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_16" data-name="Rectangle 16" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_17" data-name="Rectangle 17" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_18" data-name="Rectangle 18" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_19" data-name="Rectangle 19" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_20" data-name="Rectangle 20" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_21" data-name="Rectangle 21" width="5.336" height="5.336" rx="1" transform="translate(58.888 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_22" data-name="Rectangle 22" width="5.336" height="5.336" rx="1" transform="translate(65.212 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_23" data-name="Rectangle 23" width="5.336" height="5.336" rx="1" transform="translate(71.536 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_24" data-name="Rectangle 24" width="5.336" height="5.336" rx="1" transform="translate(77.859 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_25" data-name="Rectangle 25" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
|
||||
</g>
|
||||
<g id="Group_4" data-name="Group 4" transform="translate(91.05 9.546) rotate(180)">
|
||||
<path id="Path_53" data-name="Path 53" d="M1.093,0H6.219A1.093,1.093,0,0,1,7.312,1.093v3.15A1.093,1.093,0,0,1,6.219,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.093A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
<rect id="Rectangle_26" data-name="Rectangle 26" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_27" data-name="Rectangle 27" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_28" data-name="Rectangle 28" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_29" data-name="Rectangle 29" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_30" data-name="Rectangle 30" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_31" data-name="Rectangle 31" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_32" data-name="Rectangle 32" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_33" data-name="Rectangle 33" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_34" data-name="Rectangle 34" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_35" data-name="Rectangle 35" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_36" data-name="Rectangle 36" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_37" data-name="Rectangle 37" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_38" data-name="Rectangle 38" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_39" data-name="Rectangle 39" width="5.336" height="5.336" rx="1" transform="translate(8.299 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_40" data-name="Rectangle 40" width="5.336" height="5.336" rx="1" transform="translate(14.623 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_41" data-name="Rectangle 41" width="5.336" height="5.336" rx="1" transform="translate(20.947 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_42" data-name="Rectangle 42" width="5.336" height="5.336" rx="1" transform="translate(27.271 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_43" data-name="Rectangle 43" width="5.336" height="5.336" rx="1" transform="translate(33.594 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_44" data-name="Rectangle 44" width="5.336" height="5.336" rx="1" transform="translate(39.918 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_45" data-name="Rectangle 45" width="5.336" height="5.336" rx="1" transform="translate(46.242 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_46" data-name="Rectangle 46" width="5.336" height="5.336" rx="1" transform="translate(52.565 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_47" data-name="Rectangle 47" width="5.336" height="5.336" rx="1" transform="translate(58.889 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_48" data-name="Rectangle 48" width="5.336" height="5.336" rx="1" transform="translate(65.213 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_49" data-name="Rectangle 49" width="5.336" height="5.336" rx="1" transform="translate(71.537 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_50" data-name="Rectangle 50" width="5.336" height="5.336" rx="1" transform="translate(77.86 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_51" data-name="Rectangle 51" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
|
||||
</g>
|
||||
<g id="Group_6" data-name="Group 6" transform="translate(1.531 16.584)">
|
||||
<path id="Path_54" data-name="Path 54" d="M1.093,0h7.3A1.093,1.093,0,0,1,9.485,1.093v3.15A1.093,1.093,0,0,1,8.392,5.336h-7.3A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
<g id="Group_5" data-name="Group 5" transform="translate(10.671 0)">
|
||||
<rect id="Rectangle_52" data-name="Rectangle 52" width="5.336" height="5.336" rx="1" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_53" data-name="Rectangle 53" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_54" data-name="Rectangle 54" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_55" data-name="Rectangle 55" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_56" data-name="Rectangle 56" width="5.336" height="5.336" rx="1" transform="translate(25.295 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_57" data-name="Rectangle 57" width="5.336" height="5.336" rx="1" transform="translate(31.619 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_58" data-name="Rectangle 58" width="5.336" height="5.336" rx="1" transform="translate(37.942 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_59" data-name="Rectangle 59" width="5.336" height="5.336" rx="1" transform="translate(44.265 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_60" data-name="Rectangle 60" width="5.336" height="5.336" rx="1" transform="translate(50.589 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_61" data-name="Rectangle 61" width="5.336" height="5.336" rx="1" transform="translate(56.912 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_62" data-name="Rectangle 62" width="5.336" height="5.336" rx="1" transform="translate(63.236 0)" fill="#4a4a4a"/>
|
||||
</g>
|
||||
<path id="Path_55" data-name="Path 55" d="M1.094,0H8A1.093,1.093,0,0,1,9.091,1.093v3.15A1.093,1.093,0,0,1,8,5.336H1.093A1.093,1.093,0,0,1,0,4.243V1.094A1.093,1.093,0,0,1,1.093,0Z" transform="translate(80.428 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g id="Group_7" data-name="Group 7" transform="translate(1.531 29.627)">
|
||||
<rect id="Rectangle_63" data-name="Rectangle 63" width="5.336" height="5.336" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_64" data-name="Rectangle 64" width="5.336" height="5.336" rx="1" transform="translate(6.324 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_65" data-name="Rectangle 65" width="5.336" height="5.336" rx="1" transform="translate(12.647 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_66" data-name="Rectangle 66" width="5.336" height="5.336" rx="1" transform="translate(18.971 0)" fill="#4a4a4a"/>
|
||||
<path id="Path_56" data-name="Path 56" d="M1.093,0H31.515a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H1.093A1.093,1.093,0,0,1,0,4.244V1.093A1.093,1.093,0,0,1,1.093,0ZM34.687,0h3.942a1.093,1.093,0,0,1,1.093,1.093V4.244a1.093,1.093,0,0,1-1.093,1.093H34.687a1.093,1.093,0,0,1-1.093-1.093V1.093A1.093,1.093,0,0,1,34.687,0Z" transform="translate(25.294 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
<rect id="Rectangle_67" data-name="Rectangle 67" width="5.336" height="5.336" rx="1" transform="translate(66.003 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_68" data-name="Rectangle 68" width="5.336" height="5.336" rx="1" transform="translate(72.327 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_69" data-name="Rectangle 69" width="5.336" height="5.336" rx="1" transform="translate(84.183 0)" fill="#4a4a4a"/>
|
||||
<path id="Path_57" data-name="Path 57" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(83.59 2.273) rotate(180)" fill="#4a4a4a"/>
|
||||
<path id="Path_58" data-name="Path 58" d="M5.336,0V1.18A1.093,1.093,0,0,1,4.243,2.273H1.093A1.093,1.093,0,0,1,0,1.18V0Z" transform="translate(78.255 3.063)" fill="#4a4a4a"/>
|
||||
</g>
|
||||
<rect id="Rectangle_70" data-name="Rectangle 70" width="88.927" height="2.371" rx="1.085" transform="translate(1.925 1.17)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_71" data-name="Rectangle 71" width="4.986" height="1.581" rx="0.723" transform="translate(4.1 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_72" data-name="Rectangle 72" width="4.986" height="1.581" rx="0.723" transform="translate(10.923 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_73" data-name="Rectangle 73" width="4.986" height="1.581" rx="0.723" transform="translate(16.173 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_74" data-name="Rectangle 74" width="4.986" height="1.581" rx="0.723" transform="translate(21.421 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_75" data-name="Rectangle 75" width="4.986" height="1.581" rx="0.723" transform="translate(26.671 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_76" data-name="Rectangle 76" width="4.986" height="1.581" rx="0.723" transform="translate(33.232 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_77" data-name="Rectangle 77" width="4.986" height="1.581" rx="0.723" transform="translate(38.48 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_78" data-name="Rectangle 78" width="4.986" height="1.581" rx="0.723" transform="translate(43.73 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_79" data-name="Rectangle 79" width="4.986" height="1.581" rx="0.723" transform="translate(48.978 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_80" data-name="Rectangle 80" width="4.986" height="1.581" rx="0.723" transform="translate(55.54 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_81" data-name="Rectangle 81" width="4.986" height="1.581" rx="0.723" transform="translate(60.788 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_82" data-name="Rectangle 82" width="4.986" height="1.581" rx="0.723" transform="translate(66.038 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_83" data-name="Rectangle 83" width="4.986" height="1.581" rx="0.723" transform="translate(72.599 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_84" data-name="Rectangle 84" width="4.986" height="1.581" rx="0.723" transform="translate(77.847 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_85" data-name="Rectangle 85" width="4.986" height="1.581" rx="0.723" transform="translate(83.097 1.566)" fill="#d8d8d8" opacity="0.136"/>
|
||||
</g>
|
||||
<path id="Path_59" data-name="Path 59" d="M146.71,159.855a5.439,5.439,0,0,0-.7.07c-.042-.164-.081-.329-.127-.493a5.457,5.457,0,1,0-5.4-9.372q-.181-.185-.366-.367a5.454,5.454,0,1,0-9.384-5.4c-.162-.046-.325-.084-.486-.126a5.467,5.467,0,1,0-10.788,0c-.162.042-.325.08-.486.126a5.457,5.457,0,1,0-9.384,5.4,21.843,21.843,0,1,0,36.421,21.02,5.452,5.452,0,1,0,.7-10.858" transform="translate(6.275 -6.025)" fill="#44d860" fill-rule="evenodd"/>
|
||||
<path id="Path_60" data-name="Path 60" d="M83,124.855h43.71V103H83Z" transform="translate(4.42 -9.271)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_61" data-name="Path 61" d="M134.855,116.765a2.732,2.732,0,1,0,0-5.464,2.811,2.811,0,0,0-.349.035c-.022-.082-.04-.164-.063-.246a2.733,2.733,0,0,0-1.052-5.253,2.7,2.7,0,0,0-1.648.566q-.09-.093-.184-.184a2.7,2.7,0,0,0,.553-1.633,2.732,2.732,0,0,0-5.245-1.07,10.928,10.928,0,1,0,0,21.031,2.732,2.732,0,0,0,5.245-1.07,2.7,2.7,0,0,0-.553-1.633q.093-.09.184-.184a2.7,2.7,0,0,0,1.648.566,2.732,2.732,0,0,0,1.052-5.253c.023-.081.042-.164.063-.246a2.811,2.811,0,0,0,.349.035" transform="translate(7.202 -9.377)" fill="#44d860" fill-rule="evenodd"/>
|
||||
<path id="Path_62" data-name="Path 62" d="M143.232,42.33a2.967,2.967,0,0,1-.535-.055,2.754,2.754,0,0,1-.514-.153,2.838,2.838,0,0,1-.471-.251,4.139,4.139,0,0,1-.415-.339,3.2,3.2,0,0,1-.338-.415A2.7,2.7,0,0,1,140.5,39.6a2.968,2.968,0,0,1,.055-.535,3.152,3.152,0,0,1,.152-.514,2.874,2.874,0,0,1,.252-.47,2.633,2.633,0,0,1,.753-.754,2.837,2.837,0,0,1,.471-.251,2.753,2.753,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,4.019,4.019,0,0,1,.339.415,2.786,2.786,0,0,1,.251.47,2.864,2.864,0,0,1,.208,1.049,2.77,2.77,0,0,1-.8,1.934,4.139,4.139,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459m21.855-1.366a2.789,2.789,0,0,1-1.935-.8,4.162,4.162,0,0,1-.338-.415,2.7,2.7,0,0,1-.459-1.519,2.789,2.789,0,0,1,.8-1.934,4.139,4.139,0,0,1,.415-.339,2.838,2.838,0,0,1,.471-.251,2.752,2.752,0,0,1,.514-.153,2.527,2.527,0,0,1,1.071,0,2.654,2.654,0,0,1,.983.4,4.139,4.139,0,0,1,.415.339,2.79,2.79,0,0,1,.8,1.934,3.069,3.069,0,0,1-.055.535,2.779,2.779,0,0,1-.153.514,3.885,3.885,0,0,1-.251.47,4.02,4.02,0,0,1-.339.415,4.138,4.138,0,0,1-.415.339,2.722,2.722,0,0,1-1.519.459" transform="translate(9.753 -15.532)" fill-rule="evenodd"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 31 KiB |
170
docs/static/img/undraw_docusaurus_react.svg
vendored
Normal file
@ -0,0 +1,170 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1041.277" height="554.141" viewBox="0 0 1041.277 554.141">
|
||||
<title>Powered by React</title>
|
||||
<g id="Group_24" data-name="Group 24" transform="translate(-440 -263)">
|
||||
<g id="Group_23" data-name="Group 23" transform="translate(439.989 262.965)">
|
||||
<path id="Path_299" data-name="Path 299" d="M1040.82,611.12q-1.74,3.75-3.47,7.4-2.7,5.67-5.33,11.12c-.78,1.61-1.56,3.19-2.32,4.77-8.6,17.57-16.63,33.11-23.45,45.89A73.21,73.21,0,0,1,942.44,719l-151.65,1.65h-1.6l-13,.14-11.12.12-34.1.37h-1.38l-17.36.19h-.53l-107,1.16-95.51,1-11.11.12-69,.75H429l-44.75.48h-.48l-141.5,1.53-42.33.46a87.991,87.991,0,0,1-10.79-.54h0c-1.22-.14-2.44-.3-3.65-.49a87.38,87.38,0,0,1-51.29-27.54C116,678.37,102.75,655,93.85,629.64q-1.93-5.49-3.6-11.12C59.44,514.37,97,380,164.6,290.08q4.25-5.64,8.64-11l.07-.08c20.79-25.52,44.1-46.84,68.93-62,44-26.91,92.75-34.49,140.7-11.9,40.57,19.12,78.45,28.11,115.17,30.55,3.71.24,7.42.42,11.11.53,84.23,2.65,163.17-27.7,255.87-47.29,3.69-.78,7.39-1.55,11.12-2.28,66.13-13.16,139.49-20.1,226.73-5.51a189.089,189.089,0,0,1,26.76,6.4q5.77,1.86,11.12,4c41.64,16.94,64.35,48.24,74,87.46q1.37,5.46,2.37,11.11C1134.3,384.41,1084.19,518.23,1040.82,611.12Z" transform="translate(-79.34 -172.91)" fill="#f2f2f2"/>
|
||||
<path id="Path_300" data-name="Path 300" d="M576.36,618.52a95.21,95.21,0,0,1-1.87,11.12h93.7V618.52Zm-78.25,62.81,11.11-.09V653.77c-3.81-.17-7.52-.34-11.11-.52ZM265.19,618.52v11.12h198.5V618.52ZM1114.87,279h-74V191.51q-5.35-2.17-11.12-4V279H776.21V186.58c-3.73.73-7.43,1.5-11.12,2.28V279H509.22V236.15c-3.69-.11-7.4-.29-11.11-.53V279H242.24V217c-24.83,15.16-48.14,36.48-68.93,62h-.07v.08q-4.4,5.4-8.64,11h8.64V618.52h-83q1.66,5.63,3.6,11.12h79.39v93.62a87,87,0,0,0,12.2,2.79c1.21.19,2.43.35,3.65.49h0a87.991,87.991,0,0,0,10.79.54l42.33-.46v-97H498.11v94.21l11.11-.12V629.64H765.09V721l11.12-.12V629.64H1029.7v4.77c.76-1.58,1.54-3.16,2.32-4.77q2.63-5.45,5.33-11.12,1.73-3.64,3.47-7.4v-321h76.42Q1116.23,284.43,1114.87,279ZM242.24,618.52V290.08H498.11V618.52Zm267,0V290.08H765.09V618.52Zm520.48,0H776.21V290.08H1029.7Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
|
||||
<path id="Path_301" data-name="Path 301" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" fill="#65617d"/>
|
||||
<path id="Path_302" data-name="Path 302" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l46.65-28,93.6-.78,2-.01.66-.01,2-.03,44.94-.37,2.01-.01.64-.01,2-.01L315,509.3l.38-.01,35.55-.3h.29l277.4-2.34,6.79-.05h.68l5.18-.05,37.65-.31,2-.03,1.85-.02h.96l11.71-.09,2.32-.03,3.11-.02,9.75-.09,15.47-.13,2-.02,3.48-.02h.65l74.71-.64Z" opacity="0.2"/>
|
||||
<path id="Path_303" data-name="Path 303" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
|
||||
<path id="Path_304" data-name="Path 304" d="M375.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
|
||||
<path id="Path_305" data-name="Path 305" d="M377.44,656.57v24.49a6.13,6.13,0,0,1-3.5,5.54,6,6,0,0,1-2.5.6l-34.9.74a6,6,0,0,1-2.7-.57,6.12,6.12,0,0,1-3.57-5.57V656.57Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
|
||||
<rect id="Rectangle_137" data-name="Rectangle 137" width="47.17" height="31.5" transform="translate(680.92 483.65)" fill="#3f3d56"/>
|
||||
<rect id="Rectangle_138" data-name="Rectangle 138" width="47.17" height="31.5" transform="translate(680.92 483.65)" opacity="0.1"/>
|
||||
<rect id="Rectangle_139" data-name="Rectangle 139" width="47.17" height="31.5" transform="translate(678.92 483.65)" fill="#3f3d56"/>
|
||||
<path id="Path_306" data-name="Path 306" d="M298.09,483.65v4.97l-47.17,1.26v-6.23Z" opacity="0.1"/>
|
||||
<path id="Path_307" data-name="Path 307" d="M460.69,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6a4,4,0,0,1,3.95,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
|
||||
<path id="Path_308" data-name="Path 308" d="M265.19,481.32v181.2h-.05a4,4,0,0,1-3.95-3.95V485.27a4,4,0,0,1,3.95-3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
|
||||
<path id="Path_309" data-name="Path 309" d="M194.59,319.15h177.5V467.4l-177.5,4Z" fill="#39374d"/>
|
||||
<path id="Path_310" data-name="Path 310" d="M726.09,483.65v6.41l-47.17-1.26v-5.15Z" opacity="0.1"/>
|
||||
<path id="Path_311" data-name="Path 311" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0L672,657.42a4,4,0,0,1-3.85-3.95V485.27a4,4,0,0,1,3.95-3.95H863.7a4,4,0,0,1,3.99,3.95Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
|
||||
<path id="Path_312" data-name="Path 312" d="M867.69,485.27v173.3a4,4,0,0,1-4,3.95h0V481.32h0a4,4,0,0,1,4,3.95Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
|
||||
<path id="Path_313" data-name="Path 313" d="M775.59,319.15H598.09V467.4l177.5,4Z" fill="#39374d"/>
|
||||
<path id="Path_314" data-name="Path 314" d="M663.19,485.27v168.2a4,4,0,0,1-3.85,3.95l-191.65,5.1h0a4,4,0,0,1-4-3.95V485.27a4,4,0,0,1,3.95-3.95h191.6A4,4,0,0,1,663.19,485.27Z" transform="translate(-79.34 -172.91)" fill="#65617d"/>
|
||||
<path id="Path_315" data-name="Path 315" d="M397.09,319.15h177.5V467.4l-177.5,4Z" fill="#4267b2"/>
|
||||
<path id="Path_316" data-name="Path 316" d="M863.09,533.65v13l-151.92,1.4-1.62.03-57.74.53-1.38.02-17.55.15h-.52l-106.98.99L349.77,551.4h-.15l-44.65.42-.48.01-198.4,1.82v-15l202.51-1.33h.48l40.99-.28h.19l283.08-1.87h.29l.17-.01h.47l4.79-.03h1.46l74.49-.5,4.4-.02.98-.01Z" opacity="0.1"/>
|
||||
<circle id="Ellipse_111" data-name="Ellipse 111" cx="51.33" cy="51.33" r="51.33" transform="translate(435.93 246.82)" fill="#fbbebe"/>
|
||||
<path id="Path_317" data-name="Path 317" d="M617.94,550.07s-99.5,12-90,0c3.44-4.34,4.39-17.2,4.2-31.85-.06-4.45-.22-9.06-.45-13.65-1.1-22-3.75-43.5-3.75-43.5s87-41,77-8.5c-4,13.13-2.69,31.57.35,48.88.89,5.05,1.92,10,3,14.7a344.66,344.66,0,0,0,9.65,33.92Z" transform="translate(-79.34 -172.91)" fill="#fbbebe"/>
|
||||
<path id="Path_318" data-name="Path 318" d="M585.47,546c11.51-2.13,23.7-6,34.53-1.54,2.85,1.17,5.47,2.88,8.39,3.86s6.12,1.22,9.16,1.91c10.68,2.42,19.34,10.55,24.9,20s8.44,20.14,11.26,30.72l6.9,25.83c6,22.45,12,45.09,13.39,68.3a2437.506,2437.506,0,0,1-250.84,1.43c5.44-10.34,11-21.31,10.54-33s-7.19-23.22-4.76-34.74c1.55-7.34,6.57-13.39,9.64-20.22,8.75-19.52,1.94-45.79,17.32-60.65,6.92-6.68,17-9.21,26.63-8.89,12.28.41,24.85,4.24,37,6.11C555.09,547.48,569.79,548.88,585.47,546Z" transform="translate(-79.34 -172.91)" fill="#ff6584"/>
|
||||
<path id="Path_319" data-name="Path 319" d="M716.37,657.17l-.1,1.43v.1l-.17,2.3-1.33,18.51-1.61,22.3-.46,6.28-1,13.44v.17l-107,1-175.59,1.9v.84h-.14v-1.12l.45-14.36.86-28.06.74-23.79.07-2.37a10.53,10.53,0,0,1,11.42-10.17c4.72.4,10.85.89,18.18,1.41l3,.22c42.33,2.94,120.56,6.74,199.5,2,1.66-.09,3.33-.19,5-.31,12.24-.77,24.47-1.76,36.58-3a10.53,10.53,0,0,1,11.6,11.23Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
|
||||
<path id="Path_320" data-name="Path 320" d="M429.08,725.44v-.84l175.62-1.91,107-1h.3v-.17l1-13.44.43-6,1.64-22.61,1.29-17.9v-.44a10.617,10.617,0,0,0-.11-2.47.3.3,0,0,0,0-.1,10.391,10.391,0,0,0-2-4.64,10.54,10.54,0,0,0-9.42-4c-12.11,1.24-24.34,2.23-36.58,3-1.67.12-3.34.22-5,.31-78.94,4.69-157.17.89-199.5-2l-3-.22c-7.33-.52-13.46-1-18.18-1.41a10.54,10.54,0,0,0-11.24,8.53,11,11,0,0,0-.18,1.64l-.68,22.16L429.54,710l-.44,14.36v1.12Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
|
||||
<path id="Path_321" data-name="Path 321" d="M716.67,664.18l-1.23,15.33-1.83,22.85-.46,5.72-1,12.81-.06.64v.17h0l-.15,1.48.11-1.48h-.29l-107,1-175.65,1.9v-.28l.49-14.36,1-28.06.64-18.65A6.36,6.36,0,0,1,434.3,658a6.25,6.25,0,0,1,3.78-.9c2.1.17,4.68.37,7.69.59,4.89.36,10.92.78,17.94,1.22,13,.82,29.31,1.7,48,2.42,52,2,122.2,2.67,188.88-3.17,3-.26,6.1-.55,9.13-.84a6.26,6.26,0,0,1,3.48.66,5.159,5.159,0,0,1,.86.54,6.14,6.14,0,0,1,2,2.46,3.564,3.564,0,0,1,.25.61A6.279,6.279,0,0,1,716.67,664.18Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
|
||||
<path id="Path_322" data-name="Path 322" d="M377.44,677.87v3.19a6.13,6.13,0,0,1-3.5,5.54l-40.1.77a6.12,6.12,0,0,1-3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
|
||||
<path id="Path_323" data-name="Path 323" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
|
||||
<path id="Path_324" data-name="Path 324" d="M298.59,515.57l-52.25,1V507.9l52.25-1Z" opacity="0.1"/>
|
||||
<path id="Path_325" data-name="Path 325" d="M300.59,515.57l-52.25,1V507.9l52.25-1Z" fill="#3f3d56"/>
|
||||
<path id="Path_326" data-name="Path 326" d="M758.56,679.87v3.19a6.13,6.13,0,0,0,3.5,5.54l40.1.77a6.12,6.12,0,0,0,3.57-5.57v-3Z" transform="translate(-79.34 -172.91)" opacity="0.1"/>
|
||||
<path id="Path_327" data-name="Path 327" d="M678.72,517.57l52.25,1V509.9l-52.25-1Z" opacity="0.1"/>
|
||||
<path id="Path_328" data-name="Path 328" d="M676.72,517.57l52.25,1V509.9l-52.25-1Z" fill="#3f3d56"/>
|
||||
<path id="Path_329" data-name="Path 329" d="M534.13,486.79c.08,7-3.16,13.6-5.91,20.07a163.491,163.491,0,0,0-12.66,74.71c.73,11,2.58,22,.73,32.9s-8.43,21.77-19,24.9c17.53,10.45,41.26,9.35,57.76-2.66,8.79-6.4,15.34-15.33,21.75-24.11a97.86,97.86,0,0,1-13.31,44.75A103.43,103.43,0,0,0,637,616.53c4.31-5.81,8.06-12.19,9.72-19.23,3.09-13-1.22-26.51-4.51-39.5a266.055,266.055,0,0,1-6.17-33c-.43-3.56-.78-7.22.1-10.7,1-4.07,3.67-7.51,5.64-11.22,5.6-10.54,5.73-23.3,2.86-34.88s-8.49-22.26-14.06-32.81c-4.46-8.46-9.3-17.31-17.46-22.28-5.1-3.1-11-4.39-16.88-5.64l-25.37-5.43c-5.55-1.19-11.26-2.38-16.87-1.51-9.47,1.48-16.14,8.32-22,15.34-4.59,5.46-15.81,15.71-16.6,22.86-.72,6.59,5.1,17.63,6.09,24.58,1.3,9,2.22,6,7.3,11.52C532,478.05,534.07,482,534.13,486.79Z" transform="translate(-79.34 -172.91)" fill="#3f3d56"/>
|
||||
</g>
|
||||
<g id="docusaurus_keytar" transform="translate(670.271 615.768)">
|
||||
<path id="Path_40" data-name="Path 40" d="M99,52h43.635V69.662H99Z" transform="translate(-49.132 -33.936)" fill="#fff" fill-rule="evenodd"/>
|
||||
<path id="Path_41" data-name="Path 41" d="M13.389,158.195A10.377,10.377,0,0,1,4.4,153a10.377,10.377,0,0,0,8.988,15.584H23.779V158.195Z" transform="translate(-3 -82.47)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_42" data-name="Path 42" d="M66.967,38.083l36.373-2.273V30.615A10.389,10.389,0,0,0,92.95,20.226H46.2l-1.3-2.249a1.5,1.5,0,0,0-2.6,0L41,20.226l-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-1.3-2.249a1.5,1.5,0,0,0-2.6,0l-1.3,2.249-.034,0-2.152-2.151a1.5,1.5,0,0,0-2.508.672L25.21,21.4l-2.7-.723a1.5,1.5,0,0,0-1.836,1.837l.722,2.7-2.65.71a1.5,1.5,0,0,0-.673,2.509l2.152,2.152c0,.011,0,.022,0,.033l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6L20.226,41l-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3-2.249,1.3a1.5,1.5,0,0,0,0,2.6l2.249,1.3A10.389,10.389,0,0,0,30.615,103.34H92.95A10.389,10.389,0,0,0,103.34,92.95V51.393L66.967,49.12a5.53,5.53,0,0,1,0-11.038" transform="translate(-9.836 -17.226)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_43" data-name="Path 43" d="M143,163.779h15.584V143H143Z" transform="translate(-70.275 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_44" data-name="Path 44" d="M173.779,148.389a2.582,2.582,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-75.08 -75.262)" fill="#44d860" fill-rule="evenodd"/>
|
||||
<path id="Path_45" data-name="Path 45" d="M153,113.389h15.584V103H153Z" transform="translate(-75.08 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_46" data-name="Path 46" d="M183.389,108.944a1.3,1.3,0,1,0,0-2.6,1.336,1.336,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.337,1.337,0,0,0,.166.017" transform="translate(-84.691 -57.894)" fill="#44d860" fill-rule="evenodd"/>
|
||||
<path id="Path_47" data-name="Path 47" d="M52.188,48.292a1.3,1.3,0,0,1-1.3-1.3,3.9,3.9,0,0,0-7.792,0,1.3,1.3,0,1,1-2.6,0,6.493,6.493,0,0,1,12.987,0,1.3,1.3,0,0,1-1.3,1.3" transform="translate(-21.02 -28.41)" fill-rule="evenodd"/>
|
||||
<path id="Path_48" data-name="Path 48" d="M103,139.752h31.168a10.389,10.389,0,0,0,10.389-10.389V93H113.389A10.389,10.389,0,0,0,103,103.389Z" transform="translate(-51.054 -53.638)" fill="#ffff50" fill-rule="evenodd"/>
|
||||
<path id="Path_49" data-name="Path 49" d="M141.1,94.017H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0-25.877H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.293H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m0,10.389H115.106a.519.519,0,1,1,0-1.039H141.1a.519.519,0,0,1,0,1.039m7.782-47.993c-.006,0-.011,0-.018,0-1.605.055-2.365,1.66-3.035,3.077-.7,1.48-1.24,2.443-2.126,2.414-.981-.035-1.542-1.144-2.137-2.317-.683-1.347-1.462-2.876-3.1-2.819-1.582.054-2.344,1.451-3.017,2.684-.715,1.313-1.2,2.112-2.141,2.075-1-.036-1.533-.938-2.149-1.981-.686-1.162-1.479-2.467-3.084-2.423-1.555.053-2.319,1.239-2.994,2.286-.713,1.106-1.213,1.781-2.164,1.741-1.025-.036-1.554-.784-2.167-1.65-.688-.973-1.463-2.074-3.062-2.021a3.815,3.815,0,0,0-2.959,1.879c-.64.812-1.14,1.456-2.2,1.415a.52.52,0,0,0-.037,1.039,3.588,3.588,0,0,0,3.05-1.811c.611-.777,1.139-1.448,2.178-1.483,1-.043,1.47.579,2.179,1.582.674.953,1.438,2.033,2.977,2.089,1.612.054,2.387-1.151,3.074-2.217.614-.953,1.144-1.775,2.156-1.81.931-.035,1.438.7,2.153,1.912.674,1.141,1.437,2.434,3.006,2.491,1.623.056,2.407-1.361,3.09-2.616.592-1.085,1.15-2.109,2.14-2.143.931-.022,1.417.829,2.135,2.249.671,1.326,1.432,2.828,3.026,2.886l.088,0c1.592,0,2.347-1.6,3.015-3.01.592-1.252,1.152-2.431,2.113-2.479Z" transform="translate(-55.378 -38.552)" fill-rule="evenodd"/>
|
||||
<path id="Path_50" data-name="Path 50" d="M83,163.779h20.779V143H83Z" transform="translate(-41.443 -77.665)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<g id="Group_8" data-name="Group 8" transform="matrix(0.966, -0.259, 0.259, 0.966, 51.971, 43.3)">
|
||||
<rect id="Rectangle_3" data-name="Rectangle 3" width="43.906" height="17.333" rx="2" transform="translate(0 0)" fill="#d8d8d8"/>
|
||||
<g id="Group_2" data-name="Group 2" transform="translate(0.728 10.948)">
|
||||
<rect id="Rectangle_4" data-name="Rectangle 4" width="2.537" height="2.537" rx="1" transform="translate(7.985 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_5" data-name="Rectangle 5" width="2.537" height="2.537" rx="1" transform="translate(10.991 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_6" data-name="Rectangle 6" width="2.537" height="2.537" rx="1" transform="translate(13.997 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_7" data-name="Rectangle 7" width="2.537" height="2.537" rx="1" transform="translate(17.003 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_8" data-name="Rectangle 8" width="2.537" height="2.537" rx="1" transform="translate(20.009 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_9" data-name="Rectangle 9" width="2.537" height="2.537" rx="1" transform="translate(23.015 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_10" data-name="Rectangle 10" width="2.537" height="2.537" rx="1" transform="translate(26.021 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_11" data-name="Rectangle 11" width="2.537" height="2.537" rx="1" transform="translate(29.028 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_12" data-name="Rectangle 12" width="2.537" height="2.537" rx="1" transform="translate(32.034 0)" fill="#4a4a4a"/>
|
||||
<path id="Path_51" data-name="Path 51" d="M.519,0H6.9A.519.519,0,0,1,7.421.52v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0ZM35.653,0h6.383a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H35.652a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,35.652,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g id="Group_3" data-name="Group 3" transform="translate(0.728 4.878)">
|
||||
<path id="Path_52" data-name="Path 52" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
<rect id="Rectangle_13" data-name="Rectangle 13" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_14" data-name="Rectangle 14" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_15" data-name="Rectangle 15" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_16" data-name="Rectangle 16" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_17" data-name="Rectangle 17" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_18" data-name="Rectangle 18" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_19" data-name="Rectangle 19" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_20" data-name="Rectangle 20" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_21" data-name="Rectangle 21" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_22" data-name="Rectangle 22" width="2.537" height="2.537" rx="1" transform="translate(31 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_23" data-name="Rectangle 23" width="2.537" height="2.537" rx="1" transform="translate(34.006 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_24" data-name="Rectangle 24" width="2.537" height="2.537" rx="1" transform="translate(37.012 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_25" data-name="Rectangle 25" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
|
||||
</g>
|
||||
<g id="Group_4" data-name="Group 4" transform="translate(43.283 4.538) rotate(180)">
|
||||
<path id="Path_53" data-name="Path 53" d="M.519,0H2.956a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.519A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
<rect id="Rectangle_26" data-name="Rectangle 26" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_27" data-name="Rectangle 27" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_28" data-name="Rectangle 28" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_29" data-name="Rectangle 29" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_30" data-name="Rectangle 30" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_31" data-name="Rectangle 31" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_32" data-name="Rectangle 32" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_33" data-name="Rectangle 33" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_34" data-name="Rectangle 34" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_35" data-name="Rectangle 35" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_36" data-name="Rectangle 36" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_37" data-name="Rectangle 37" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_38" data-name="Rectangle 38" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_39" data-name="Rectangle 39" width="2.537" height="2.537" rx="1" transform="translate(3.945 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_40" data-name="Rectangle 40" width="2.537" height="2.537" rx="1" transform="translate(6.951 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_41" data-name="Rectangle 41" width="2.537" height="2.537" rx="1" transform="translate(9.958 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_42" data-name="Rectangle 42" width="2.537" height="2.537" rx="1" transform="translate(12.964 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_43" data-name="Rectangle 43" width="2.537" height="2.537" rx="1" transform="translate(15.97 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_44" data-name="Rectangle 44" width="2.537" height="2.537" rx="1" transform="translate(18.976 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_45" data-name="Rectangle 45" width="2.537" height="2.537" rx="1" transform="translate(21.982 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_46" data-name="Rectangle 46" width="2.537" height="2.537" rx="1" transform="translate(24.988 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_47" data-name="Rectangle 47" width="2.537" height="2.537" rx="1" transform="translate(27.994 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_48" data-name="Rectangle 48" width="2.537" height="2.537" rx="1" transform="translate(31.001 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_49" data-name="Rectangle 49" width="2.537" height="2.537" rx="1" transform="translate(34.007 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_50" data-name="Rectangle 50" width="2.537" height="2.537" rx="1" transform="translate(37.013 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_51" data-name="Rectangle 51" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
|
||||
</g>
|
||||
<g id="Group_6" data-name="Group 6" transform="translate(0.728 7.883)">
|
||||
<path id="Path_54" data-name="Path 54" d="M.519,0h3.47a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(0 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
<g id="Group_5" data-name="Group 5" transform="translate(5.073 0)">
|
||||
<rect id="Rectangle_52" data-name="Rectangle 52" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_53" data-name="Rectangle 53" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_54" data-name="Rectangle 54" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_55" data-name="Rectangle 55" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_56" data-name="Rectangle 56" width="2.537" height="2.537" rx="1" transform="translate(12.025 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_57" data-name="Rectangle 57" width="2.537" height="2.537" rx="1" transform="translate(15.031 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_58" data-name="Rectangle 58" width="2.537" height="2.537" rx="1" transform="translate(18.037 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_59" data-name="Rectangle 59" width="2.537" height="2.537" rx="1" transform="translate(21.042 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_60" data-name="Rectangle 60" width="2.537" height="2.537" rx="1" transform="translate(24.049 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_61" data-name="Rectangle 61" width="2.537" height="2.537" rx="1" transform="translate(27.055 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_62" data-name="Rectangle 62" width="2.537" height="2.537" rx="1" transform="translate(30.061 0)" fill="#4a4a4a"/>
|
||||
</g>
|
||||
<path id="Path_55" data-name="Path 55" d="M.52,0H3.8a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.017V.52A.519.519,0,0,1,.519,0Z" transform="translate(38.234 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g id="Group_7" data-name="Group 7" transform="translate(0.728 14.084)">
|
||||
<rect id="Rectangle_63" data-name="Rectangle 63" width="2.537" height="2.537" rx="1" transform="translate(0 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_64" data-name="Rectangle 64" width="2.537" height="2.537" rx="1" transform="translate(3.006 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_65" data-name="Rectangle 65" width="2.537" height="2.537" rx="1" transform="translate(6.012 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_66" data-name="Rectangle 66" width="2.537" height="2.537" rx="1" transform="translate(9.018 0)" fill="#4a4a4a"/>
|
||||
<path id="Path_56" data-name="Path 56" d="M.519,0H14.981A.519.519,0,0,1,15.5.519v1.5a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,2.018V.519A.519.519,0,0,1,.519,0Zm15.97,0h1.874a.519.519,0,0,1,.519.519v1.5a.519.519,0,0,1-.519.519H16.489a.519.519,0,0,1-.519-.519V.519A.519.519,0,0,1,16.489,0Z" transform="translate(12.024 0)" fill="#4a4a4a" fill-rule="evenodd"/>
|
||||
<rect id="Rectangle_67" data-name="Rectangle 67" width="2.537" height="2.537" rx="1" transform="translate(31.376 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_68" data-name="Rectangle 68" width="2.537" height="2.537" rx="1" transform="translate(34.382 0)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_69" data-name="Rectangle 69" width="2.537" height="2.537" rx="1" transform="translate(40.018 0)" fill="#4a4a4a"/>
|
||||
<path id="Path_57" data-name="Path 57" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(39.736 1.08) rotate(180)" fill="#4a4a4a"/>
|
||||
<path id="Path_58" data-name="Path 58" d="M2.537,0V.561a.519.519,0,0,1-.519.519H.519A.519.519,0,0,1,0,.561V0Z" transform="translate(37.2 1.456)" fill="#4a4a4a"/>
|
||||
</g>
|
||||
<rect id="Rectangle_70" data-name="Rectangle 70" width="42.273" height="1.127" rx="0.564" transform="translate(0.915 0.556)" fill="#4a4a4a"/>
|
||||
<rect id="Rectangle_71" data-name="Rectangle 71" width="2.37" height="0.752" rx="0.376" transform="translate(1.949 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_72" data-name="Rectangle 72" width="2.37" height="0.752" rx="0.376" transform="translate(5.193 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_73" data-name="Rectangle 73" width="2.37" height="0.752" rx="0.376" transform="translate(7.688 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_74" data-name="Rectangle 74" width="2.37" height="0.752" rx="0.376" transform="translate(10.183 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_75" data-name="Rectangle 75" width="2.37" height="0.752" rx="0.376" transform="translate(12.679 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_76" data-name="Rectangle 76" width="2.37" height="0.752" rx="0.376" transform="translate(15.797 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_77" data-name="Rectangle 77" width="2.37" height="0.752" rx="0.376" transform="translate(18.292 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_78" data-name="Rectangle 78" width="2.37" height="0.752" rx="0.376" transform="translate(20.788 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_79" data-name="Rectangle 79" width="2.37" height="0.752" rx="0.376" transform="translate(23.283 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_80" data-name="Rectangle 80" width="2.37" height="0.752" rx="0.376" transform="translate(26.402 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_81" data-name="Rectangle 81" width="2.37" height="0.752" rx="0.376" transform="translate(28.897 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_82" data-name="Rectangle 82" width="2.37" height="0.752" rx="0.376" transform="translate(31.393 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_83" data-name="Rectangle 83" width="2.37" height="0.752" rx="0.376" transform="translate(34.512 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_84" data-name="Rectangle 84" width="2.37" height="0.752" rx="0.376" transform="translate(37.007 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
<rect id="Rectangle_85" data-name="Rectangle 85" width="2.37" height="0.752" rx="0.376" transform="translate(39.502 0.744)" fill="#d8d8d8" opacity="0.136"/>
|
||||
</g>
|
||||
<path id="Path_59" data-name="Path 59" d="M123.779,148.389a2.583,2.583,0,0,0-.332.033c-.02-.078-.038-.156-.06-.234a2.594,2.594,0,1,0-2.567-4.455q-.086-.088-.174-.175a2.593,2.593,0,1,0-4.461-2.569c-.077-.022-.154-.04-.231-.06a2.6,2.6,0,1,0-5.128,0c-.077.02-.154.038-.231.06a2.594,2.594,0,1,0-4.461,2.569,10.384,10.384,0,1,0,17.314,9.992,2.592,2.592,0,1,0,.332-5.161" transform="translate(-51.054 -75.262)" fill="#44d860" fill-rule="evenodd"/>
|
||||
<path id="Path_60" data-name="Path 60" d="M83,113.389h20.779V103H83Z" transform="translate(-41.443 -58.444)" fill="#3ecc5f" fill-rule="evenodd"/>
|
||||
<path id="Path_61" data-name="Path 61" d="M123.389,108.944a1.3,1.3,0,1,0,0-2.6,1.338,1.338,0,0,0-.166.017c-.01-.039-.019-.078-.03-.117a1.3,1.3,0,0,0-.5-2.5,1.285,1.285,0,0,0-.783.269q-.043-.044-.087-.087a1.285,1.285,0,0,0,.263-.776,1.3,1.3,0,0,0-2.493-.509,5.195,5.195,0,1,0,0,10,1.3,1.3,0,0,0,2.493-.509,1.285,1.285,0,0,0-.263-.776q.044-.043.087-.087a1.285,1.285,0,0,0,.783.269,1.3,1.3,0,0,0,.5-2.5c.011-.038.02-.078.03-.117a1.335,1.335,0,0,0,.166.017" transform="translate(-55.859 -57.894)" fill="#44d860" fill-rule="evenodd"/>
|
||||
<path id="Path_62" data-name="Path 62" d="M141.8,38.745a1.41,1.41,0,0,1-.255-.026,1.309,1.309,0,0,1-.244-.073,1.349,1.349,0,0,1-.224-.119,1.967,1.967,0,0,1-.2-.161,1.52,1.52,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.41,1.41,0,0,1,.026-.255,1.5,1.5,0,0,1,.072-.244,1.364,1.364,0,0,1,.12-.223,1.252,1.252,0,0,1,.358-.358,1.349,1.349,0,0,1,.224-.119,1.309,1.309,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.968,1.968,0,0,1,.2.161,1.908,1.908,0,0,1,.161.2,1.322,1.322,0,0,1,.12.223,1.361,1.361,0,0,1,.1.5,1.317,1.317,0,0,1-.379.919,1.968,1.968,0,0,1-.2.161,1.346,1.346,0,0,1-.223.119,1.332,1.332,0,0,1-.5.1m10.389-.649a1.326,1.326,0,0,1-.92-.379,1.979,1.979,0,0,1-.161-.2,1.282,1.282,0,0,1-.218-.722,1.326,1.326,0,0,1,.379-.919,1.967,1.967,0,0,1,.2-.161,1.351,1.351,0,0,1,.224-.119,1.308,1.308,0,0,1,.244-.073,1.2,1.2,0,0,1,.509,0,1.262,1.262,0,0,1,.468.192,1.967,1.967,0,0,1,.2.161,1.326,1.326,0,0,1,.379.919,1.461,1.461,0,0,1-.026.255,1.323,1.323,0,0,1-.073.244,1.847,1.847,0,0,1-.119.223,1.911,1.911,0,0,1-.161.2,1.967,1.967,0,0,1-.2.161,1.294,1.294,0,0,1-.722.218" transform="translate(-69.074 -26.006)" fill-rule="evenodd"/>
|
||||
</g>
|
||||
<g id="React-icon" transform="translate(906.3 541.56)">
|
||||
<path id="Path_330" data-name="Path 330" d="M263.668,117.179c0-5.827-7.3-11.35-18.487-14.775,2.582-11.4,1.434-20.477-3.622-23.382a7.861,7.861,0,0,0-4.016-1v4a4.152,4.152,0,0,1,2.044.466c2.439,1.4,3.5,6.724,2.672,13.574-.2,1.685-.52,3.461-.914,5.272a86.9,86.9,0,0,0-11.386-1.954,87.469,87.469,0,0,0-7.459-8.965c5.845-5.433,11.332-8.41,15.062-8.41V78h0c-4.931,0-11.386,3.514-17.913,9.611-6.527-6.061-12.982-9.539-17.913-9.539v4c3.712,0,9.216,2.959,15.062,8.356a84.687,84.687,0,0,0-7.405,8.947,83.732,83.732,0,0,0-11.4,1.972c-.412-1.793-.717-3.532-.932-5.2-.843-6.85.2-12.175,2.618-13.592a3.991,3.991,0,0,1,2.062-.466v-4h0a8,8,0,0,0-4.052,1c-5.039,2.9-6.168,11.96-3.568,23.328-11.153,3.443-18.415,8.947-18.415,14.757,0,5.828,7.3,11.35,18.487,14.775-2.582,11.4-1.434,20.477,3.622,23.382a7.882,7.882,0,0,0,4.034,1c4.931,0,11.386-3.514,17.913-9.611,6.527,6.061,12.982,9.539,17.913,9.539a8,8,0,0,0,4.052-1c5.039-2.9,6.168-11.96,3.568-23.328C256.406,128.511,263.668,122.988,263.668,117.179Zm-23.346-11.96c-.663,2.313-1.488,4.7-2.421,7.083-.735-1.434-1.506-2.869-2.349-4.3-.825-1.434-1.7-2.833-2.582-4.2C235.517,104.179,237.974,104.645,240.323,105.219Zm-8.212,19.1c-1.4,2.421-2.833,4.716-4.321,6.85-2.672.233-5.379.359-8.1.359-2.708,0-5.415-.126-8.069-.341q-2.232-3.2-4.339-6.814-2.044-3.523-3.73-7.136c1.112-2.4,2.367-4.805,3.712-7.154,1.4-2.421,2.833-4.716,4.321-6.85,2.672-.233,5.379-.359,8.1-.359,2.708,0,5.415.126,8.069.341q2.232,3.2,4.339,6.814,2.044,3.523,3.73,7.136C234.692,119.564,233.455,121.966,232.11,124.315Zm5.792-2.331c.968,2.4,1.793,4.805,2.474,7.136-2.349.574-4.823,1.058-7.387,1.434.879-1.381,1.757-2.8,2.582-4.25C236.4,124.871,237.167,123.419,237.9,121.984ZM219.72,141.116a73.921,73.921,0,0,1-4.985-5.738c1.614.072,3.263.126,4.931.126,1.685,0,3.353-.036,4.985-.126A69.993,69.993,0,0,1,219.72,141.116ZM206.38,130.555c-2.546-.377-5-.843-7.352-1.417.663-2.313,1.488-4.7,2.421-7.083.735,1.434,1.506,2.869,2.349,4.3S205.5,129.192,206.38,130.555ZM219.63,93.241a73.924,73.924,0,0,1,4.985,5.738c-1.614-.072-3.263-.126-4.931-.126-1.686,0-3.353.036-4.985.126A69.993,69.993,0,0,1,219.63,93.241ZM206.362,103.8c-.879,1.381-1.757,2.8-2.582,4.25-.825,1.434-1.6,2.869-2.331,4.3-.968-2.4-1.793-4.805-2.474-7.136C201.323,104.663,203.8,104.179,206.362,103.8Zm-16.227,22.449c-6.348-2.708-10.454-6.258-10.454-9.073s4.106-6.383,10.454-9.073c1.542-.663,3.228-1.255,4.967-1.811a86.122,86.122,0,0,0,4.034,10.92,84.9,84.9,0,0,0-3.981,10.866C193.38,127.525,191.694,126.915,190.134,126.252Zm9.647,25.623c-2.439-1.4-3.5-6.724-2.672-13.574.2-1.686.52-3.461.914-5.272a86.9,86.9,0,0,0,11.386,1.954,87.465,87.465,0,0,0,7.459,8.965c-5.845,5.433-11.332,8.41-15.062,8.41A4.279,4.279,0,0,1,199.781,151.875Zm42.532-13.663c.843,6.85-.2,12.175-2.618,13.592a3.99,3.99,0,0,1-2.062.466c-3.712,0-9.216-2.959-15.062-8.356a84.689,84.689,0,0,0,7.405-8.947,83.731,83.731,0,0,0,11.4-1.972A50.194,50.194,0,0,1,242.313,138.212Zm6.9-11.96c-1.542.663-3.228,1.255-4.967,1.811a86.12,86.12,0,0,0-4.034-10.92,84.9,84.9,0,0,0,3.981-10.866c1.775.556,3.461,1.165,5.039,1.829,6.348,2.708,10.454,6.258,10.454,9.073C259.67,119.994,255.564,123.562,249.216,126.252Z" fill="#61dafb"/>
|
||||
<path id="Path_331" data-name="Path 331" d="M320.8,78.4Z" transform="translate(-119.082 -0.328)" fill="#61dafb"/>
|
||||
<circle id="Ellipse_112" data-name="Ellipse 112" cx="8.194" cy="8.194" r="8.194" transform="translate(211.472 108.984)" fill="#61dafb"/>
|
||||
<path id="Path_332" data-name="Path 332" d="M520.5,78.1Z" transform="translate(-282.975 -0.082)" fill="#61dafb"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 35 KiB |
40
docs/static/img/undraw_docusaurus_tree.svg
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1129" height="663" viewBox="0 0 1129 663">
|
||||
<title>Focus on What Matters</title>
|
||||
<circle cx="321" cy="321" r="321" fill="#f2f2f2" />
|
||||
<ellipse cx="559" cy="635.49998" rx="514" ry="27.50002" fill="#3f3d56" />
|
||||
<ellipse cx="558" cy="627" rx="460" ry="22" opacity="0.2" />
|
||||
<rect x="131" y="152.5" width="840" height="50" fill="#3f3d56" />
|
||||
<path d="M166.5,727.3299A21.67009,21.67009,0,0,0,188.1701,749H984.8299A21.67009,21.67009,0,0,0,1006.5,727.3299V296h-840Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
|
||||
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
|
||||
<path d="M984.8299,236H188.1701A21.67009,21.67009,0,0,0,166.5,257.6701V296h840V257.6701A21.67009,21.67009,0,0,0,984.8299,236Z" transform="translate(-35.5 -118.5)" opacity="0.2" />
|
||||
<circle cx="181" cy="147.5" r="13" fill="#3f3d56" />
|
||||
<circle cx="217" cy="147.5" r="13" fill="#3f3d56" />
|
||||
<circle cx="253" cy="147.5" r="13" fill="#3f3d56" />
|
||||
<rect x="168" y="213.5" width="337" height="386" rx="5.33505" fill="#606060" />
|
||||
<rect x="603" y="272.5" width="284" height="22" rx="5.47638" fill="#2e8555" />
|
||||
<rect x="537" y="352.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
|
||||
<rect x="537" y="396.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
|
||||
<rect x="537" y="440.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
|
||||
<rect x="537" y="484.5" width="416" height="15" rx="5.47638" fill="#2e8555" />
|
||||
<rect x="865" y="552.5" width="88" height="26" rx="7.02756" fill="#3ecc5f" />
|
||||
<path d="M1088.60287,624.61594a30.11371,30.11371,0,0,0,3.98291-15.266c0-13.79652-8.54358-24.98081-19.08256-24.98081s-19.08256,11.18429-19.08256,24.98081a30.11411,30.11411,0,0,0,3.98291,15.266,31.248,31.248,0,0,0,0,30.53213,31.248,31.248,0,0,0,0,30.53208,31.248,31.248,0,0,0,0,30.53208,30.11408,30.11408,0,0,0-3.98291,15.266c0,13.79652,8.54353,24.98081,19.08256,24.98081s19.08256-11.18429,19.08256-24.98081a30.11368,30.11368,0,0,0-3.98291-15.266,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53208,31.248,31.248,0,0,0,0-30.53213Z" transform="translate(-35.5 -118.5)" fill="#3f3d56" />
|
||||
<ellipse cx="1038.00321" cy="460.31783" rx="19.08256" ry="24.9808" fill="#3f3d56" />
|
||||
<ellipse cx="1038.00321" cy="429.78574" rx="19.08256" ry="24.9808" fill="#3f3d56" />
|
||||
<path d="M1144.93871,339.34489a91.61081,91.61081,0,0,0,7.10658-10.46092l-50.141-8.23491,54.22885.4033a91.566,91.566,0,0,0,1.74556-72.42605l-72.75449,37.74139,67.09658-49.32086a91.41255,91.41255,0,1,0-150.971,102.29805,91.45842,91.45842,0,0,0-10.42451,16.66946l65.0866,33.81447-69.40046-23.292a91.46011,91.46011,0,0,0,14.73837,85.83669,91.40575,91.40575,0,1,0,143.68892,0,91.41808,91.41808,0,0,0,0-113.02862Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
|
||||
<path d="M981.6885,395.8592a91.01343,91.01343,0,0,0,19.56129,56.51431,91.40575,91.40575,0,1,0,143.68892,0C1157.18982,436.82067,981.6885,385.60008,981.6885,395.8592Z" transform="translate(-35.5 -118.5)" opacity="0.1" />
|
||||
<path d="M365.62,461.43628H477.094v45.12043H365.62Z" transform="translate(-35.5 -118.5)" fill="#fff" fill-rule="evenodd" />
|
||||
<path d="M264.76252,608.74122a26.50931,26.50931,0,0,1-22.96231-13.27072,26.50976,26.50976,0,0,0,22.96231,39.81215H291.304V608.74122Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
|
||||
<path d="M384.17242,468.57061l92.92155-5.80726V449.49263a26.54091,26.54091,0,0,0-26.54143-26.54143H331.1161l-3.31768-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622-3.31767-5.74622a3.83043,3.83043,0,0,0-6.63536,0l-3.31768,5.74622L301.257,417.205a3.83043,3.83043,0,0,0-6.63536,0L291.304,422.9512c-.02919,0-.05573.004-.08625.004l-5.49674-5.49541a3.8293,3.8293,0,0,0-6.4071,1.71723l-1.81676,6.77338L270.607,424.1031a3.82993,3.82993,0,0,0-4.6912,4.69253l1.84463,6.89148-6.77072,1.81411a3.8315,3.8315,0,0,0-1.71988,6.40975l5.49673,5.49673c0,.02787-.004.05574-.004.08493l-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74621,3.31768L259.0163,466.081a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31767a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768L259.0163,558.976a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768-5.74622,3.31768a3.83042,3.83042,0,0,0,0,6.63535l5.74622,3.31768-5.74622,3.31768a3.83043,3.83043,0,0,0,0,6.63536l5.74622,3.31768A26.54091,26.54091,0,0,0,291.304,635.28265H450.55254A26.5409,26.5409,0,0,0,477.094,608.74122V502.5755l-92.92155-5.80727a14.12639,14.12639,0,0,1,0-28.19762" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
|
||||
<path d="M424.01111,635.28265h39.81214V582.19979H424.01111Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
|
||||
<path d="M490.36468,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15393-.59852A6.62668,6.62668,0,1,0,482.80568,590.21q-.2203-.22491-.44457-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39414-.10218-.59056-.15262a6.63957,6.63957,0,1,0-13.10086,0c-.1964.05042-.39414.09687-.59056.15262a6.62767,6.62767,0,1,0-11.39688,6.56369,26.52754,26.52754,0,1,0,44.23127,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
|
||||
<path d="M437.28182,555.65836H477.094V529.11693H437.28182Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
|
||||
<path d="M490.36468,545.70532a3.31768,3.31768,0,0,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
|
||||
<path d="M317.84538,466.081a3.31768,3.31768,0,0,1-3.31767-3.31768,9.953,9.953,0,1,0-19.90608,0,3.31768,3.31768,0,1,1-6.63535,0,16.58839,16.58839,0,1,1,33.17678,0,3.31768,3.31768,0,0,1-3.31768,3.31768" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
|
||||
<path d="M370.92825,635.28265h79.62429A26.5409,26.5409,0,0,0,477.094,608.74122v-92.895H397.46968a26.54091,26.54091,0,0,0-26.54143,26.54143Z" transform="translate(-35.5 -118.5)" fill="#ffff50" fill-rule="evenodd" />
|
||||
<path d="M457.21444,556.98543H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,1,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0-66.10674H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.29459H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414m0,26.54143H390.80778a1.32707,1.32707,0,0,1,0-2.65414h66.40666a1.32707,1.32707,0,0,1,0,2.65414M477.094,474.19076c-.01592,0-.0292-.008-.04512-.00663-4.10064.13934-6.04083,4.24132-7.75274,7.86024-1.78623,3.78215-3.16771,6.24122-5.43171,6.16691-2.50685-.09024-3.94007-2.92222-5.45825-5.91874-1.74377-3.44243-3.73438-7.34667-7.91333-7.20069-4.04227.138-5.98907,3.70784-7.70631,6.857-1.82738,3.35484-3.07084,5.39455-5.46887,5.30033-2.55727-.09289-3.91619-2.39536-5.48877-5.06013-1.75306-2.96733-3.77951-6.30359-7.8775-6.18946-3.97326.13669-5.92537,3.16507-7.64791,5.83912-1.82207,2.82666-3.09872,4.5492-5.52725,4.447-2.61832-.09289-3.9706-2.00388-5.53522-4.21611-1.757-2.4856-3.737-5.299-7.82308-5.16231-3.88567.13271-5.83779,2.61434-7.559,4.80135-1.635,2.07555-2.9116,3.71846-5.61218,3.615a1.32793,1.32793,0,1,0-.09555,2.65414c4.00377.134,6.03154-2.38873,7.79257-4.6275,1.562-1.9853,2.91027-3.69855,5.56441-3.78879,2.55594-.10882,3.75429,1.47968,5.56707,4.04093,1.7212,2.43385,3.67465,5.19416,7.60545,5.33616,4.11789.138,6.09921-2.93946,7.8536-5.66261,1.56861-2.43385,2.92221-4.53461,5.50734-4.62352,2.37944-.08892,3.67466,1.79154,5.50072,4.885,1.72121,2.91557,3.67069,6.21865,7.67977,6.36463,4.14709.14332,6.14965-3.47693,7.89475-6.68181,1.51155-2.77092,2.93814-5.38791,5.46621-5.4755,2.37944-.05573,3.62025,2.11668,5.45558,5.74622,1.71459,3.388,3.65875,7.22591,7.73019,7.37321l.22429.004c4.06614,0,5.99571-4.08074,7.70364-7.68905,1.51154-3.19825,2.94211-6.21069,5.3972-6.33411Z" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
|
||||
<path d="M344.38682,635.28265h53.08286V582.19979H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
|
||||
<path d="M424.01111,602.10586a6.60242,6.60242,0,0,0-.848.08493c-.05042-.19906-.09821-.39945-.15394-.59852A6.62667,6.62667,0,1,0,416.45211,590.21q-.2203-.22491-.44458-.44589a6.62391,6.62391,0,1,0-11.39689-6.56369c-.1964-.05575-.39413-.10218-.59054-.15262a6.63957,6.63957,0,1,0-13.10084,0c-.19641.05042-.39414.09687-.59055.15262a6.62767,6.62767,0,1,0-11.39689,6.56369,26.52755,26.52755,0,1,0,44.2313,25.52756,6.6211,6.6211,0,1,0,.848-13.18579" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
|
||||
<path d="M344.38682,555.65836h53.08286V529.11693H344.38682Z" transform="translate(-35.5 -118.5)" fill="#3ecc5f" fill-rule="evenodd" />
|
||||
<path d="M410.74039,545.70532a3.31768,3.31768,0,1,0,0-6.63536,3.41133,3.41133,0,0,0-.42333.04247c-.02655-.09953-.04911-.19907-.077-.29859a3.319,3.319,0,0,0-1.278-6.37923,3.28174,3.28174,0,0,0-2.00122.68742q-.10947-.11346-.22294-.22295a3.282,3.282,0,0,0,.67149-1.98265,3.31768,3.31768,0,0,0-6.37-1.2992,13.27078,13.27078,0,1,0,0,25.54082,3.31768,3.31768,0,0,0,6.37-1.2992,3.282,3.282,0,0,0-.67149-1.98265q.11347-.10947.22294-.22294a3.28174,3.28174,0,0,0,2.00122.68742,3.31768,3.31768,0,0,0,1.278-6.37923c.02786-.0982.05042-.19907.077-.29859a3.41325,3.41325,0,0,0,.42333.04246" transform="translate(-35.5 -118.5)" fill="#44d860" fill-rule="evenodd" />
|
||||
<path d="M424.01111,447.8338a3.60349,3.60349,0,0,1-.65028-.06636,3.34415,3.34415,0,0,1-.62372-.18579,3.44679,3.44679,0,0,1-.572-.30522,5.02708,5.02708,0,0,1-.50429-.4114,3.88726,3.88726,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.60248,3.60248,0,0,1,.06636-.65027,3.82638,3.82638,0,0,1,.18447-.62373,3.48858,3.48858,0,0,1,.30656-.57064,3.197,3.197,0,0,1,.91436-.91568,3.44685,3.44685,0,0,1,.572-.30523,3.344,3.344,0,0,1,.62372-.18578,3.06907,3.06907,0,0,1,1.30053,0,3.22332,3.22332,0,0,1,1.19436.491,5.02835,5.02835,0,0,1,.50429.41139,4.8801,4.8801,0,0,1,.41139.50429,3.38246,3.38246,0,0,1,.30522.57064,3.47806,3.47806,0,0,1,.25215,1.274A3.36394,3.36394,0,0,1,426.36,446.865a5.02708,5.02708,0,0,1-.50429.4114,3.3057,3.3057,0,0,1-1.84463.55737m26.54143-1.65884a3.38754,3.38754,0,0,1-2.35024-.96877,5.04185,5.04185,0,0,1-.41007-.50428,3.27532,3.27532,0,0,1-.55737-1.84463,3.38659,3.38659,0,0,1,.96744-2.34892,5.02559,5.02559,0,0,1,.50429-.41139,3.44685,3.44685,0,0,1,.572-.30523,3.3432,3.3432,0,0,1,.62373-.18579,3.06952,3.06952,0,0,1,1.30052,0,3.22356,3.22356,0,0,1,1.19436.491,5.02559,5.02559,0,0,1,.50429.41139,3.38792,3.38792,0,0,1,.96876,2.34892,3.72635,3.72635,0,0,1-.06636.65026,3.37387,3.37387,0,0,1-.18579.62373,4.71469,4.71469,0,0,1-.30522.57064,4.8801,4.8801,0,0,1-.41139.50429,5.02559,5.02559,0,0,1-.50429.41139,3.30547,3.30547,0,0,1-1.84463.55737" transform="translate(-35.5 -118.5)" fill-rule="evenodd" />
|
||||
</svg>
|
After Width: | Height: | Size: 12 KiB |
BIN
logo-small.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
250
pom.xml
@ -1,18 +1,20 @@
|
||||
<?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">
|
||||
<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.amithkoujalgi</groupId>
|
||||
<groupId>io.github.ollama4j</groupId>
|
||||
<artifactId>ollama4j</artifactId>
|
||||
<version>1.0.25</version>
|
||||
<version>ollama4j-revision</version>
|
||||
|
||||
<name>Ollama4j</name>
|
||||
<description>Java library for interacting with Ollama API.</description>
|
||||
<url>https://github.com/amithkoujalgi/ollama4j</url>
|
||||
<url>https://github.com/ollama4j/ollama4j</url>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>11</maven.compiler.source>
|
||||
<maven.compiler.target>11</maven.compiler.target>
|
||||
<maven.compiler.release>11</maven.compiler.release>
|
||||
<project.build.outputTimestamp>${git.commit.time}</project.build.outputTimestamp><!-- populated via git-commit-id-plugin -->
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
|
||||
<maven-failsafe-plugin.version>3.0.0-M5</maven-failsafe-plugin.version>
|
||||
@ -31,15 +33,15 @@
|
||||
<licenses>
|
||||
<license>
|
||||
<name>MIT License</name>
|
||||
<url>https://raw.githubusercontent.com/amithkoujalgi/ollama4j/main/LICENSE</url>
|
||||
<url>https://raw.githubusercontent.com/ollama4j/ollama4j/main/LICENSE</url>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<scm>
|
||||
<connection>scm:git:git@github.com:amithkoujalgi/ollama4j.git</connection>
|
||||
<developerConnection>scm:git:https://github.com/amithkoujalgi/ollama4j.git</developerConnection>
|
||||
<url>https://github.com/amithkoujalgi/ollama4j</url>
|
||||
<tag>v1.0.25</tag>
|
||||
<connection>scm:git:git@github.com:ollama4j/ollama4j.git</connection>
|
||||
<developerConnection>scm:git:https://github.com/ollama4j/ollama4j.git</developerConnection>
|
||||
<url>https://github.com/ollama4j/ollama4j</url>
|
||||
<tag>ollama4j-revision</tag>
|
||||
</scm>
|
||||
|
||||
<build>
|
||||
@ -47,7 +49,7 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>3.3.0</version>
|
||||
<version>3.3.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
@ -60,37 +62,25 @@
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>3.5.0</version>
|
||||
<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>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<outputDirectory>${project.build.directory}</outputDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<!-- <plugin>-->
|
||||
<!-- <groupId>org.apache.maven.plugins</groupId>-->
|
||||
<!-- <artifactId>maven-gpg-plugin</artifactId>-->
|
||||
<!-- <version>1.5</version>-->
|
||||
<!-- <executions>-->
|
||||
<!-- <execution>-->
|
||||
<!-- <id>sign-artifacts</id>-->
|
||||
<!-- <phase>verify</phase>-->
|
||||
<!-- <goals>-->
|
||||
<!-- <goal>sign</goal>-->
|
||||
<!-- </goals>-->
|
||||
<!-- <configuration>-->
|
||||
<!-- <!– This is necessary for gpg to not try to use the pinentry programs –>-->
|
||||
<!-- <gpgArguments>-->
|
||||
<!-- <arg>--pinentry-mode</arg>-->
|
||||
<!-- <arg>loopback</arg>-->
|
||||
<!-- </gpgArguments>-->
|
||||
<!-- </configuration>-->
|
||||
<!-- </execution>-->
|
||||
<!-- </executions>-->
|
||||
<!-- </plugin>-->
|
||||
|
||||
<!-- Surefire Plugin for Unit Tests -->
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
@ -99,7 +89,7 @@
|
||||
<configuration>
|
||||
<skipTests>${skipUnitTests}</skipTests>
|
||||
<includes>
|
||||
<include>**/unittests/*.java</include>
|
||||
<include>**/unittests/**/*.java</include>
|
||||
</includes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
@ -127,16 +117,52 @@
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-release-plugin</artifactId>
|
||||
<version>3.0.1</version>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<version>1.5</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>sign-artifacts</id>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>io.github.git-commit-id</groupId>
|
||||
<artifactId>git-commit-id-maven-plugin</artifactId>
|
||||
<version>9.0.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>revision</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<!-- <goals>install</goals>-->
|
||||
<tagNameFormat>v@{project.version}</tagNameFormat>
|
||||
<dateFormat>yyyy-MM-dd'T'HH:mm:ss'Z'</dateFormat>
|
||||
<dateFormatTimeZone>Etc/UTC</dateFormatTimeZone>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
<pluginManagement>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.14.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.4.2</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</pluginManagement>
|
||||
</build>
|
||||
|
||||
<dependencies>
|
||||
@ -146,15 +172,25 @@
|
||||
<version>${lombok.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.jsoup</groupId>
|
||||
<artifactId>jsoup</artifactId>
|
||||
<version>1.18.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.15.3</version>
|
||||
<version>2.17.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.datatype</groupId>
|
||||
<artifactId>jackson-datatype-jsr310</artifactId>
|
||||
<version>2.17.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.3.11</version>
|
||||
<version>1.5.6</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -174,30 +210,105 @@
|
||||
<version>4.1.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.json</groupId>
|
||||
<artifactId>json</artifactId>
|
||||
<version>20240205</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.testcontainers</groupId>
|
||||
<artifactId>ollama</artifactId>
|
||||
<version>1.20.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>ossrh</id>
|
||||
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
|
||||
</snapshotRepository>
|
||||
<repository>
|
||||
<id>ossrh</id>
|
||||
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2</url>
|
||||
<id>mvn-repo-id</id>
|
||||
</repository>
|
||||
</distributionManagement>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>ossrh</id>
|
||||
<activation>
|
||||
<activeByDefault>true</activeByDefault>
|
||||
</activation>
|
||||
<properties>
|
||||
<gpg.executable>gpg2</gpg.executable>
|
||||
<test.env>unit</test.env>
|
||||
<skipUnitTests>false</skipUnitTests>
|
||||
<skipIntegrationTests>true</skipIntegrationTests>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.sonatype.central</groupId>
|
||||
<artifactId>central-publishing-maven-plugin</artifactId>
|
||||
<version>0.5.0</version>
|
||||
<extensions>true</extensions>
|
||||
<configuration>
|
||||
<publishingServerId>mvn-repo-id</publishingServerId>
|
||||
<autoPublish>true</autoPublish>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>unit-tests</id>
|
||||
<properties>
|
||||
<test.env>unit</test.env>
|
||||
<skipUnitTests>false</skipUnitTests>
|
||||
<skipIntegrationTests>true</skipIntegrationTests>
|
||||
<skipGpgPluginDuringTests>true</skipGpgPluginDuringTests>
|
||||
</properties>
|
||||
<activation>
|
||||
<activeByDefault>true</activeByDefault>
|
||||
<activeByDefault>false</activeByDefault>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
<version>0.8.11</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>prepare-agent</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>report</id>
|
||||
<phase>test</phase>
|
||||
<goals>
|
||||
<goal>report</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<version>1.5</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>sign-artifacts</id>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<skip>${skipGpgPluginDuringTests}</skip>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>integration-tests</id>
|
||||
@ -205,7 +316,29 @@
|
||||
<test.env>integration</test.env>
|
||||
<skipUnitTests>true</skipUnitTests>
|
||||
<skipIntegrationTests>false</skipIntegrationTests>
|
||||
<skipGpgPluginDuringTests>true</skipGpgPluginDuringTests>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<version>1.5</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>sign-artifacts</id>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<skip>${skipGpgPluginDuringTests}</skip>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
<profile>
|
||||
<id>ci-cd</id>
|
||||
@ -249,9 +382,28 @@
|
||||
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.jacoco</groupId>
|
||||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
<version>0.8.7</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
<goal>prepare-agent</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>report</id>
|
||||
<phase>test</phase>
|
||||
<goals>
|
||||
<goal>report</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
@ -1,432 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core;
|
||||
|
||||
import io.github.amithkoujalgi.ollama4j.core.exceptions.OllamaBaseException;
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.*;
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.request.CustomModelFileContentsRequest;
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.request.CustomModelFilePathRequest;
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.request.ModelEmbeddingsRequest;
|
||||
import io.github.amithkoujalgi.ollama4j.core.models.request.ModelRequest;
|
||||
import io.github.amithkoujalgi.ollama4j.core.utils.Utils;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpRequest;
|
||||
import java.net.http.HttpResponse;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/** The base Ollama API class. */
|
||||
@SuppressWarnings("DuplicatedCode")
|
||||
public class OllamaAPI {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(OllamaAPI.class);
|
||||
private final String host;
|
||||
private long requestTimeoutSeconds = 3;
|
||||
private boolean verbose = true;
|
||||
|
||||
/**
|
||||
* Instantiates the Ollama API.
|
||||
*
|
||||
* @param host the host address of Ollama server
|
||||
*/
|
||||
public OllamaAPI(String host) {
|
||||
if (host.endsWith("/")) {
|
||||
this.host = host.substring(0, host.length() - 1);
|
||||
} else {
|
||||
this.host = host;
|
||||
}
|
||||
}
|
||||
|
||||
public void setRequestTimeoutSeconds(long requestTimeoutSeconds) {
|
||||
this.requestTimeoutSeconds = requestTimeoutSeconds;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set/unset logging of responses
|
||||
*
|
||||
* @param verbose true/false
|
||||
*/
|
||||
public void setVerbose(boolean verbose) {
|
||||
this.verbose = verbose;
|
||||
}
|
||||
|
||||
/**
|
||||
* List available models from Ollama server.
|
||||
*
|
||||
* @return the list
|
||||
*/
|
||||
public List<Model> listModels()
|
||||
throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
|
||||
String url = this.host + "/api/tags";
|
||||
HttpClient httpClient = HttpClient.newHttpClient();
|
||||
HttpRequest httpRequest =
|
||||
HttpRequest.newBuilder()
|
||||
.uri(new URI(url))
|
||||
.header("Accept", "application/json")
|
||||
.header("Content-type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.GET()
|
||||
.build();
|
||||
HttpResponse<String> response =
|
||||
httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
|
||||
int statusCode = response.statusCode();
|
||||
String responseString = response.body();
|
||||
if (statusCode == 200) {
|
||||
return Utils.getObjectMapper()
|
||||
.readValue(responseString, ListModelsResponse.class)
|
||||
.getModels();
|
||||
} else {
|
||||
throw new OllamaBaseException(statusCode + " - " + responseString);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Pull a model on the Ollama server from the list of <a
|
||||
* href="https://ollama.ai/library">available models</a>.
|
||||
*
|
||||
* @param modelName the name of the model
|
||||
*/
|
||||
public void pullModel(String modelName)
|
||||
throws OllamaBaseException, IOException, URISyntaxException, InterruptedException {
|
||||
String url = this.host + "/api/pull";
|
||||
String jsonData = new ModelRequest(modelName).toString();
|
||||
HttpRequest request =
|
||||
HttpRequest.newBuilder()
|
||||
.uri(new URI(url))
|
||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
|
||||
.header("Accept", "application/json")
|
||||
.header("Content-type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.build();
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
HttpResponse<InputStream> response =
|
||||
client.send(request, HttpResponse.BodyHandlers.ofInputStream());
|
||||
int statusCode = response.statusCode();
|
||||
InputStream responseBodyStream = response.body();
|
||||
String responseString = "";
|
||||
try (BufferedReader reader =
|
||||
new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
ModelPullResponse modelPullResponse =
|
||||
Utils.getObjectMapper().readValue(line, ModelPullResponse.class);
|
||||
if (verbose) {
|
||||
logger.info(modelPullResponse.getStatus());
|
||||
}
|
||||
}
|
||||
}
|
||||
if (statusCode != 200) {
|
||||
throw new OllamaBaseException(statusCode + " - " + responseString);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets model details from the Ollama server.
|
||||
*
|
||||
* @param modelName the model
|
||||
* @return the model details
|
||||
*/
|
||||
public ModelDetail getModelDetails(String modelName)
|
||||
throws IOException, OllamaBaseException, InterruptedException {
|
||||
String url = this.host + "/api/show";
|
||||
String jsonData = new ModelRequest(modelName).toString();
|
||||
HttpRequest request =
|
||||
HttpRequest.newBuilder()
|
||||
.uri(URI.create(url))
|
||||
.header("Accept", "application/json")
|
||||
.header("Content-type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
|
||||
.build();
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
int statusCode = response.statusCode();
|
||||
String responseBody = response.body();
|
||||
if (statusCode == 200) {
|
||||
return Utils.getObjectMapper().readValue(responseBody, ModelDetail.class);
|
||||
} else {
|
||||
throw new OllamaBaseException(statusCode + " - " + responseBody);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a custom model from a model file. Read more about custom model file creation <a
|
||||
* href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md">here</a>.
|
||||
*
|
||||
* @param modelName the name of the custom model to be created.
|
||||
* @param modelFilePath the path to model file that exists on the Ollama server.
|
||||
*/
|
||||
public void createModelWithFilePath(String modelName, String modelFilePath)
|
||||
throws IOException, InterruptedException, OllamaBaseException {
|
||||
String url = this.host + "/api/create";
|
||||
String jsonData = new CustomModelFilePathRequest(modelName, modelFilePath).toString();
|
||||
HttpRequest request =
|
||||
HttpRequest.newBuilder()
|
||||
.uri(URI.create(url))
|
||||
.header("Accept", "application/json")
|
||||
.header("Content-Type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
||||
.build();
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
int statusCode = response.statusCode();
|
||||
String responseString = response.body();
|
||||
if (statusCode != 200) {
|
||||
throw new OllamaBaseException(statusCode + " - " + responseString);
|
||||
}
|
||||
// FIXME: Ollama API returns HTTP status code 200 for model creation failure cases. Correct this
|
||||
// if the issue is fixed in the Ollama API server.
|
||||
if (responseString.contains("error")) {
|
||||
throw new OllamaBaseException(responseString);
|
||||
}
|
||||
if (verbose) {
|
||||
logger.info(responseString);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a custom model from a model file. Read more about custom model file creation <a
|
||||
* href="https://github.com/jmorganca/ollama/blob/main/docs/modelfile.md">here</a>.
|
||||
*
|
||||
* @param modelName the name of the custom model to be created.
|
||||
* @param modelFileContents the path to model file that exists on the Ollama server.
|
||||
*/
|
||||
public void createModelWithModelFileContents(String modelName, String modelFileContents)
|
||||
throws IOException, InterruptedException, OllamaBaseException {
|
||||
String url = this.host + "/api/create";
|
||||
String jsonData = new CustomModelFileContentsRequest(modelName, modelFileContents).toString();
|
||||
HttpRequest request =
|
||||
HttpRequest.newBuilder()
|
||||
.uri(URI.create(url))
|
||||
.header("Accept", "application/json")
|
||||
.header("Content-Type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
||||
.build();
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
int statusCode = response.statusCode();
|
||||
String responseString = response.body();
|
||||
if (statusCode != 200) {
|
||||
throw new OllamaBaseException(statusCode + " - " + responseString);
|
||||
}
|
||||
if (responseString.contains("error")) {
|
||||
throw new OllamaBaseException(responseString);
|
||||
}
|
||||
if (verbose) {
|
||||
logger.info(responseString);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a model from Ollama server.
|
||||
*
|
||||
* @param modelName the name of the model to be deleted.
|
||||
* @param ignoreIfNotPresent - ignore errors if the specified model is not present on Ollama
|
||||
* server.
|
||||
*/
|
||||
public void deleteModel(String modelName, boolean ignoreIfNotPresent)
|
||||
throws IOException, InterruptedException, OllamaBaseException {
|
||||
String url = this.host + "/api/delete";
|
||||
String jsonData = new ModelRequest(modelName).toString();
|
||||
HttpRequest request =
|
||||
HttpRequest.newBuilder()
|
||||
.uri(URI.create(url))
|
||||
.method("DELETE", HttpRequest.BodyPublishers.ofString(jsonData, StandardCharsets.UTF_8))
|
||||
.header("Accept", "application/json")
|
||||
.header("Content-type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.build();
|
||||
HttpClient client = HttpClient.newHttpClient();
|
||||
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
int statusCode = response.statusCode();
|
||||
String responseBody = response.body();
|
||||
if (statusCode == 404 && responseBody.contains("model") && responseBody.contains("not found")) {
|
||||
return;
|
||||
}
|
||||
if (statusCode != 200) {
|
||||
throw new OllamaBaseException(statusCode + " - " + responseBody);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate embeddings for a given text from a model
|
||||
*
|
||||
* @param model name of model to generate embeddings from
|
||||
* @param prompt text to generate embeddings for
|
||||
* @return embeddings
|
||||
*/
|
||||
public List<Double> generateEmbeddings(String model, String prompt)
|
||||
throws IOException, InterruptedException, OllamaBaseException {
|
||||
String url = this.host + "/api/embeddings";
|
||||
String jsonData = new ModelEmbeddingsRequest(model, prompt).toString();
|
||||
HttpClient httpClient = HttpClient.newHttpClient();
|
||||
HttpRequest request =
|
||||
HttpRequest.newBuilder()
|
||||
.uri(URI.create(url))
|
||||
.header("Accept", "application/json")
|
||||
.header("Content-type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
|
||||
.build();
|
||||
HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
|
||||
int statusCode = response.statusCode();
|
||||
String responseBody = response.body();
|
||||
if (statusCode == 200) {
|
||||
EmbeddingResponse embeddingResponse =
|
||||
Utils.getObjectMapper().readValue(responseBody, EmbeddingResponse.class);
|
||||
return embeddingResponse.getEmbedding();
|
||||
} else {
|
||||
throw new OllamaBaseException(statusCode + " - " + responseBody);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ask a question to a model running on Ollama server. This is a sync/blocking call.
|
||||
*
|
||||
* @param model the ollama model to ask the question to
|
||||
* @param promptText the prompt/question text
|
||||
* @return OllamaResult - that includes response text and time taken for response
|
||||
*/
|
||||
public OllamaResult ask(String model, String promptText)
|
||||
throws OllamaBaseException, IOException, InterruptedException {
|
||||
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, promptText);
|
||||
return askSync(ollamaRequestModel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ask a question to a model running on Ollama server and get a callback handle that can be used
|
||||
* to check for status and get the response from the model later. This would be an
|
||||
* async/non-blocking call.
|
||||
*
|
||||
* @param model the ollama model to ask the question to
|
||||
* @param promptText the prompt/question text
|
||||
* @return the ollama async result callback handle
|
||||
*/
|
||||
public OllamaAsyncResultCallback askAsync(String model, String promptText) {
|
||||
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, promptText);
|
||||
HttpClient httpClient = HttpClient.newHttpClient();
|
||||
URI uri = URI.create(this.host + "/api/generate");
|
||||
OllamaAsyncResultCallback ollamaAsyncResultCallback =
|
||||
new OllamaAsyncResultCallback(httpClient, uri, ollamaRequestModel, requestTimeoutSeconds);
|
||||
ollamaAsyncResultCallback.start();
|
||||
return ollamaAsyncResultCallback;
|
||||
}
|
||||
|
||||
/**
|
||||
* With one or more image files, ask a question to a model running on Ollama server. This is a
|
||||
* sync/blocking call.
|
||||
*
|
||||
* @param model the ollama model to ask the question to
|
||||
* @param promptText the prompt/question text
|
||||
* @param imageFiles the list of image files to use for the question
|
||||
* @return OllamaResult - that includes response text and time taken for response
|
||||
*/
|
||||
public OllamaResult askWithImageFiles(String model, String promptText, List<File> imageFiles)
|
||||
throws OllamaBaseException, IOException, InterruptedException {
|
||||
List<String> images = new ArrayList<>();
|
||||
for (File imageFile : imageFiles) {
|
||||
images.add(encodeFileToBase64(imageFile));
|
||||
}
|
||||
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, promptText, images);
|
||||
return askSync(ollamaRequestModel);
|
||||
}
|
||||
|
||||
/**
|
||||
* With one or more image URLs, ask a question to a model running on Ollama server. This is a
|
||||
* sync/blocking call.
|
||||
*
|
||||
* @param model the ollama model to ask the question to
|
||||
* @param promptText the prompt/question text
|
||||
* @param imageURLs the list of image URLs to use for the question
|
||||
* @return OllamaResult - that includes response text and time taken for response
|
||||
*/
|
||||
public OllamaResult askWithImageURLs(String model, String promptText, List<String> imageURLs)
|
||||
throws OllamaBaseException, IOException, InterruptedException, URISyntaxException {
|
||||
List<String> images = new ArrayList<>();
|
||||
for (String imageURL : imageURLs) {
|
||||
images.add(encodeByteArrayToBase64(loadImageBytesFromUrl(imageURL)));
|
||||
}
|
||||
OllamaRequestModel ollamaRequestModel = new OllamaRequestModel(model, promptText, images);
|
||||
return askSync(ollamaRequestModel);
|
||||
}
|
||||
|
||||
private static String encodeFileToBase64(File file) throws IOException {
|
||||
return Base64.getEncoder().encodeToString(Files.readAllBytes(file.toPath()));
|
||||
}
|
||||
|
||||
private static String encodeByteArrayToBase64(byte[] bytes) {
|
||||
return Base64.getEncoder().encodeToString(bytes);
|
||||
}
|
||||
|
||||
private static byte[] loadImageBytesFromUrl(String imageUrl)
|
||||
throws IOException, URISyntaxException {
|
||||
URL url = new URI(imageUrl).toURL();
|
||||
try (InputStream in = url.openStream();
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
|
||||
byte[] buffer = new byte[1024];
|
||||
int bytesRead;
|
||||
while ((bytesRead = in.read(buffer)) != -1) {
|
||||
out.write(buffer, 0, bytesRead);
|
||||
}
|
||||
return out.toByteArray();
|
||||
}
|
||||
}
|
||||
|
||||
private OllamaResult askSync(OllamaRequestModel ollamaRequestModel)
|
||||
throws OllamaBaseException, IOException, InterruptedException {
|
||||
long startTime = System.currentTimeMillis();
|
||||
HttpClient httpClient = HttpClient.newHttpClient();
|
||||
URI uri = URI.create(this.host + "/api/generate");
|
||||
HttpRequest request =
|
||||
HttpRequest.newBuilder(uri)
|
||||
.POST(
|
||||
HttpRequest.BodyPublishers.ofString(
|
||||
Utils.getObjectMapper().writeValueAsString(ollamaRequestModel)))
|
||||
.header("Content-Type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.build();
|
||||
HttpResponse<InputStream> response =
|
||||
httpClient.send(request, HttpResponse.BodyHandlers.ofInputStream());
|
||||
int statusCode = response.statusCode();
|
||||
InputStream responseBodyStream = response.body();
|
||||
StringBuilder responseBuffer = new StringBuilder();
|
||||
try (BufferedReader reader =
|
||||
new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
|
||||
String line;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
if (statusCode == 404) {
|
||||
OllamaErrorResponseModel ollamaResponseModel =
|
||||
Utils.getObjectMapper().readValue(line, OllamaErrorResponseModel.class);
|
||||
responseBuffer.append(ollamaResponseModel.getError());
|
||||
} else {
|
||||
OllamaResponseModel ollamaResponseModel =
|
||||
Utils.getObjectMapper().readValue(line, OllamaResponseModel.class);
|
||||
if (!ollamaResponseModel.isDone()) {
|
||||
responseBuffer.append(ollamaResponseModel.getResponse());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (statusCode != 200) {
|
||||
throw new OllamaBaseException(responseBuffer.toString());
|
||||
} else {
|
||||
long endTime = System.currentTimeMillis();
|
||||
return new OllamaResult(responseBuffer.toString().trim(), endTime - startTime, statusCode);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class Model {
|
||||
|
||||
private String name;
|
||||
@JsonProperty("modified_at")
|
||||
private String modifiedAt;
|
||||
private String digest;
|
||||
private long size;
|
||||
@JsonProperty("details")
|
||||
private ModelMeta modelMeta;
|
||||
|
||||
|
||||
/**
|
||||
* Returns the model name without its version
|
||||
*
|
||||
* @return model name
|
||||
*/
|
||||
public String getModelName() {
|
||||
return name.split(":")[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the model version without its name
|
||||
*
|
||||
* @return model version
|
||||
*/
|
||||
public String getModelVersion() {
|
||||
return name.split(":")[1];
|
||||
}
|
||||
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import java.util.Map;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class ModelDetail {
|
||||
private String license;
|
||||
|
||||
@JsonProperty("modelfile")
|
||||
private String modelFile;
|
||||
|
||||
private String parameters;
|
||||
private String template;
|
||||
private String system;
|
||||
private Map<String, String> details;
|
||||
}
|
@ -1,155 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.models;
|
||||
|
||||
import io.github.amithkoujalgi.ollama4j.core.exceptions.OllamaBaseException;
|
||||
import io.github.amithkoujalgi.ollama4j.core.utils.Utils;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.URI;
|
||||
import java.net.http.HttpClient;
|
||||
import java.net.http.HttpRequest;
|
||||
import java.net.http.HttpResponse;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.time.Duration;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Queue;
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public class OllamaAsyncResultCallback extends Thread {
|
||||
private final HttpClient client;
|
||||
private final URI uri;
|
||||
private final OllamaRequestModel ollamaRequestModel;
|
||||
private final Queue<String> queue = new LinkedList<>();
|
||||
private String result;
|
||||
private boolean isDone;
|
||||
private boolean succeeded;
|
||||
|
||||
private long requestTimeoutSeconds;
|
||||
|
||||
private int httpStatusCode;
|
||||
private long responseTime = 0;
|
||||
|
||||
public OllamaAsyncResultCallback(
|
||||
HttpClient client,
|
||||
URI uri,
|
||||
OllamaRequestModel ollamaRequestModel,
|
||||
long requestTimeoutSeconds) {
|
||||
this.client = client;
|
||||
this.ollamaRequestModel = ollamaRequestModel;
|
||||
this.uri = uri;
|
||||
this.isDone = false;
|
||||
this.result = "";
|
||||
this.queue.add("");
|
||||
this.requestTimeoutSeconds = requestTimeoutSeconds;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
long startTime = System.currentTimeMillis();
|
||||
HttpRequest request =
|
||||
HttpRequest.newBuilder(uri)
|
||||
.POST(
|
||||
HttpRequest.BodyPublishers.ofString(
|
||||
Utils.getObjectMapper().writeValueAsString(ollamaRequestModel)))
|
||||
.header("Content-Type", "application/json")
|
||||
.timeout(Duration.ofSeconds(requestTimeoutSeconds))
|
||||
.build();
|
||||
HttpResponse<InputStream> response =
|
||||
client.send(request, HttpResponse.BodyHandlers.ofInputStream());
|
||||
int statusCode = response.statusCode();
|
||||
this.httpStatusCode = statusCode;
|
||||
|
||||
InputStream responseBodyStream = response.body();
|
||||
try (BufferedReader reader =
|
||||
new BufferedReader(new InputStreamReader(responseBodyStream, StandardCharsets.UTF_8))) {
|
||||
String line;
|
||||
StringBuilder responseBuffer = new StringBuilder();
|
||||
while ((line = reader.readLine()) != null) {
|
||||
if (statusCode == 404) {
|
||||
OllamaErrorResponseModel ollamaResponseModel =
|
||||
Utils.getObjectMapper().readValue(line, OllamaErrorResponseModel.class);
|
||||
queue.add(ollamaResponseModel.getError());
|
||||
responseBuffer.append(ollamaResponseModel.getError());
|
||||
} else {
|
||||
OllamaResponseModel ollamaResponseModel =
|
||||
Utils.getObjectMapper().readValue(line, OllamaResponseModel.class);
|
||||
queue.add(ollamaResponseModel.getResponse());
|
||||
if (!ollamaResponseModel.isDone()) {
|
||||
responseBuffer.append(ollamaResponseModel.getResponse());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.isDone = true;
|
||||
this.succeeded = true;
|
||||
this.result = responseBuffer.toString();
|
||||
long endTime = System.currentTimeMillis();
|
||||
responseTime = endTime - startTime;
|
||||
}
|
||||
if (statusCode != 200) {
|
||||
throw new OllamaBaseException(this.result);
|
||||
}
|
||||
} catch (IOException | InterruptedException | OllamaBaseException e) {
|
||||
this.isDone = true;
|
||||
this.succeeded = false;
|
||||
this.result = "[FAILED] " + e.getMessage();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the status of the thread. This does not indicate that the request was successful or a
|
||||
* failure, rather it is just a status flag to indicate if the thread is active or ended.
|
||||
*
|
||||
* @return boolean - status
|
||||
*/
|
||||
public boolean isComplete() {
|
||||
return isDone;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTTP response status code for the request that was made to Ollama server.
|
||||
*
|
||||
* @return int - the status code for the request
|
||||
*/
|
||||
public int getHttpStatusCode() {
|
||||
return httpStatusCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the status of the request. Indicates if the request was successful or a failure. If the
|
||||
* request was a failure, the `getResponse()` method will return the error message.
|
||||
*
|
||||
* @return boolean - status
|
||||
*/
|
||||
public boolean isSucceeded() {
|
||||
return succeeded;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the final response when the execution completes. Does not return intermediate results.
|
||||
*
|
||||
* @return String - response text
|
||||
*/
|
||||
public String getResponse() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public Queue<String> getStream() {
|
||||
return queue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the response time in milliseconds.
|
||||
*
|
||||
* @return long - response time in milliseconds.
|
||||
*/
|
||||
public long getResponseTime() {
|
||||
return responseTime;
|
||||
}
|
||||
|
||||
public void setRequestTimeoutSeconds(long requestTimeoutSeconds) {
|
||||
this.requestTimeoutSeconds = requestTimeoutSeconds;
|
||||
}
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.models;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class OllamaErrorResponseModel {
|
||||
|
||||
private String error;
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.models;
|
||||
|
||||
|
||||
import static io.github.amithkoujalgi.ollama4j.core.utils.Utils.getObjectMapper;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import java.util.List;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class OllamaRequestModel {
|
||||
|
||||
private String model;
|
||||
private String prompt;
|
||||
private List<String> images;
|
||||
|
||||
public OllamaRequestModel(String model, String prompt) {
|
||||
this.model = model;
|
||||
this.prompt = prompt;
|
||||
}
|
||||
|
||||
public OllamaRequestModel(String model, String prompt, List<String> images) {
|
||||
this.model = model;
|
||||
this.prompt = prompt;
|
||||
this.images = images;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
try {
|
||||
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.models;
|
||||
|
||||
import static io.github.amithkoujalgi.ollama4j.core.utils.Utils.getObjectMapper;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
|
||||
/** The type Ollama result. */
|
||||
@Getter
|
||||
@SuppressWarnings("unused")
|
||||
@Data
|
||||
public class OllamaResult {
|
||||
/**
|
||||
* -- GETTER --
|
||||
* Get the response text
|
||||
*
|
||||
* @return String - response text
|
||||
*/
|
||||
private final String response;
|
||||
|
||||
/**
|
||||
* -- GETTER --
|
||||
* Get the response status code.
|
||||
*
|
||||
* @return int - response status code
|
||||
*/
|
||||
private int httpStatusCode;
|
||||
|
||||
/**
|
||||
* -- GETTER --
|
||||
* Get the response time in milliseconds.
|
||||
*
|
||||
* @return long - response time in milliseconds
|
||||
*/
|
||||
private long responseTime = 0;
|
||||
|
||||
public OllamaResult(String response, long responseTime, int httpStatusCode) {
|
||||
this.response = response;
|
||||
this.responseTime = responseTime;
|
||||
this.httpStatusCode = httpStatusCode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
try {
|
||||
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.models.request;
|
||||
|
||||
import static io.github.amithkoujalgi.ollama4j.core.utils.Utils.getObjectMapper;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class ModelEmbeddingsRequest {
|
||||
private String model;
|
||||
private String prompt;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
try {
|
||||
return getObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(this);
|
||||
} catch (JsonProcessingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,63 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.types;
|
||||
|
||||
/**
|
||||
* A class to provide constants for all the supported models by Ollama.
|
||||
*
|
||||
* <p>Refer to the full list of models and the details here: <a
|
||||
* href="https://ollama.ai/library">https://ollama.ai/library</a>
|
||||
*/
|
||||
@SuppressWarnings("ALL")
|
||||
public class OllamaModelType {
|
||||
public static final String LLAMA2 = "llama2";
|
||||
public static final String MISTRAL = "mistral";
|
||||
public static final String LLAVA = "llava";
|
||||
public static final String MIXTRAL = "mixtral";
|
||||
public static final String STARLING_LM = "starling-lm";
|
||||
public static final String NEURAL_CHAT = "neural-chat";
|
||||
public static final String CODELLAMA = "codellama";
|
||||
public static final String LLAMA2_UNCENSORED = "llama2-uncensored";
|
||||
public static final String DOLPHIN_MIXTRAL = "dolphin-mixtral";
|
||||
public static final String ORCA_MINI = "orca-mini";
|
||||
public static final String VICUNA = "vicuna";
|
||||
public static final String WIZARD_VICUNA_UNCENSORED = "wizard-vicuna-uncensored";
|
||||
public static final String PHIND_CODELLAMA = "phind-codellama";
|
||||
public static final String ZEPHYR = "zephyr";
|
||||
public static final String WIZARDCODER = "wizardcoder";
|
||||
public static final String MISTRAL_OPENORCA = "mistral-openorca";
|
||||
public static final String NOUS_HERMES = "nous-hermes";
|
||||
public static final String DEEPSEEK_CODER = "deepseek-coder";
|
||||
public static final String WIZARD_MATH = "wizard-math";
|
||||
public static final String LLAMA2_CHINESE = "llama2-chinese";
|
||||
public static final String FALCON = "falcon";
|
||||
public static final String ORCA2 = "orca2";
|
||||
public static final String STABLE_BELUGA = "stable-beluga";
|
||||
public static final String CODEUP = "codeup";
|
||||
public static final String EVERYTHINGLM = "everythinglm";
|
||||
public static final String MEDLLAMA2 = "medllama2";
|
||||
public static final String WIZARDLM_UNCENSORED = "wizardlm-uncensored";
|
||||
public static final String STARCODER = "starcoder";
|
||||
public static final String DOLPHIN22_MISTRAL = "dolphin2.2-mistral";
|
||||
public static final String OPENCHAT = "openchat";
|
||||
public static final String WIZARD_VICUNA = "wizard-vicuna";
|
||||
public static final String OPENHERMES25_MISTRAL = "openhermes2.5-mistral";
|
||||
public static final String OPEN_ORCA_PLATYPUS2 = "open-orca-platypus2";
|
||||
public static final String YI = "yi";
|
||||
public static final String YARN_MISTRAL = "yarn-mistral";
|
||||
public static final String SAMANTHA_MISTRAL = "samantha-mistral";
|
||||
public static final String SQLCODER = "sqlcoder";
|
||||
public static final String YARN_LLAMA2 = "yarn-llama2";
|
||||
public static final String MEDITRON = "meditron";
|
||||
public static final String STABLELM_ZEPHYR = "stablelm-zephyr";
|
||||
public static final String OPENHERMES2_MISTRAL = "openhermes2-mistral";
|
||||
public static final String DEEPSEEK_LLM = "deepseek-llm";
|
||||
public static final String MISTRALLITE = "mistrallite";
|
||||
public static final String DOLPHIN21_MISTRAL = "dolphin2.1-mistral";
|
||||
public static final String WIZARDLM = "wizardlm";
|
||||
public static final String CODEBOOGA = "codebooga";
|
||||
public static final String MAGICODER = "magicoder";
|
||||
public static final String GOLIATH = "goliath";
|
||||
public static final String NEXUSRAVEN = "nexusraven";
|
||||
public static final String ALFRED = "alfred";
|
||||
public static final String XWINLM = "xwinlm";
|
||||
public static final String BAKLLAVA = "bakllava";
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.utils;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
public class Utils {
|
||||
public static ObjectMapper getObjectMapper() {
|
||||
return new ObjectMapper();
|
||||
}
|
||||
}
|
1441
src/main/java/io/github/ollama4j/OllamaAPI.java
Normal file
@ -1,4 +1,4 @@
|
||||
package io.github.amithkoujalgi.ollama4j.core.exceptions;
|
||||
package io.github.ollama4j.exceptions;
|
||||
|
||||
public class OllamaBaseException extends Exception {
|
||||
|
@ -0,0 +1,8 @@
|
||||
package io.github.ollama4j.exceptions;
|
||||
|
||||
public class RoleNotFoundException extends Exception {
|
||||
|
||||
public RoleNotFoundException(String s) {
|
||||
super(s);
|
||||
}
|
||||
}
|