Compare commits
2142 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dd44933515 | ||
|
|
1e8ce52d98 | ||
|
|
9b10b3e7a1 | ||
|
|
e767b6eba3 | ||
|
|
63a2b5b3c4 | ||
|
|
936bc64b82 | ||
|
|
4efa7d4464 | ||
|
|
b3cb417796 | ||
|
|
676ff5fa69 | ||
|
|
65d5e03f7f | ||
|
|
be8de1a1bd | ||
|
|
06777e1660 | ||
|
|
0c936cecc0 | ||
|
|
61c6e742d5 | ||
|
|
e306e6ca94 | ||
|
|
f00e0e6080 | ||
|
|
a6c0b43539 | ||
|
|
2033f5168e | ||
|
|
26c39576df | ||
|
|
730e5608bb | ||
|
|
91c76d4152 | ||
|
|
f177723711 | ||
|
|
020167c7cf | ||
|
|
077b88bafa | ||
|
|
0a568244fd | ||
|
|
bb2bd77a64 | ||
|
|
ecdbcd815e | ||
|
|
e457720e8a | ||
|
|
c9665fb20b | ||
|
|
3466f04992 | ||
|
|
ece2ec2d90 | ||
|
|
e6bc7a2ba2 | ||
|
|
79980feb7b | ||
|
|
575ff103cf | ||
|
|
893ae60a6a | ||
|
|
ec1f87a896 | ||
|
|
2a4416d223 | ||
|
|
253ca92203 | ||
|
|
178b78f87b | ||
|
|
f173188dcf | ||
|
|
75d3b34452 | ||
|
|
84051d7d89 | ||
|
|
ed12f45a26 | ||
|
|
1b82aea753 | ||
|
|
1d512b4986 | ||
|
|
26ca3df605 | ||
|
|
0685a79748 | ||
|
|
6e660d11c9 | ||
|
|
272eae5d66 | ||
|
|
9570933506 | ||
|
|
42b727e926 | ||
|
|
14a495cbb5 | ||
|
|
91cee2eaa8 | ||
|
|
4555969d38 | ||
|
|
12897a9a62 | ||
|
|
9310f88537 | ||
|
|
d042a055cf | ||
|
|
4d3224657f | ||
|
|
2cc4a0769e | ||
|
|
7f186be742 | ||
|
|
5038d15574 | ||
|
|
b61d825cbc | ||
|
|
de60ad7da6 | ||
|
|
055ead550c | ||
|
|
bc2e889d72 | ||
|
|
3f51af9a96 | ||
|
|
241b9009ba | ||
|
|
03befc9b12 | ||
|
|
04363a504c | ||
|
|
3dcc8695b2 | ||
|
|
179357b28a | ||
|
|
ae74c6ca55 | ||
|
|
cd5db277f3 | ||
|
|
9b12290c17 | ||
|
|
2932d305b0 | ||
|
|
07e2c49a7a | ||
|
|
8d40fc0aef | ||
|
|
aa31d041f3 | ||
|
|
d81a050d73 | ||
|
|
7614718204 | ||
|
|
596db603e0 | ||
|
|
fc6345e246 | ||
|
|
549686a7a4 | ||
|
|
b553bba1d8 | ||
|
|
223d310ea2 | ||
|
|
5dea9ef323 | ||
|
|
87c52dfd02 | ||
|
|
7941b12d50 | ||
|
|
b5f6550de2 | ||
|
|
77b44f6db0 | ||
|
|
303d8ed64e | ||
|
|
72fbbc092c | ||
|
|
8e6b9afeb7 | ||
|
|
05c169bb37 | ||
|
|
4e8ead66a8 | ||
|
|
bc26cf8b2f | ||
|
|
cb425a073d | ||
|
|
19efc83455 | ||
|
|
7216a06f5f | ||
|
|
895f1c8e9e | ||
|
|
17901406aa | ||
|
|
6ed68b574b | ||
|
|
912cc0074a | ||
|
|
591f5a522c | ||
|
|
9306a0bb2c | ||
|
|
132eac0f51 | ||
|
|
77cc1cd42f | ||
|
|
977001b801 | ||
|
|
6eb06e8626 | ||
|
|
439a2680fd | ||
|
|
af4e9988c4 | ||
|
|
4b77325f63 | ||
|
|
e919d28f1c | ||
|
|
fa4d808a5f | ||
|
|
387b7c7887 | ||
|
|
7b8b3a66ae | ||
|
|
5927ca8032 | ||
|
|
bdb81260ac | ||
|
|
238bc11a50 | ||
|
|
9986c183ea | ||
|
|
8a4c20d59a | ||
|
|
ab7fb5117c | ||
|
|
de24ffcf0d | ||
|
|
a60baa55fb | ||
|
|
1ac8de6c3a | ||
|
|
5d59acd1f4 | ||
|
|
f6ce2fd432 | ||
|
|
029775420c | ||
|
|
4808ce778a | ||
|
|
58c8068079 | ||
|
|
2d9dd81e76 | ||
|
|
2c5350329a | ||
|
|
acdc3f9470 | ||
|
|
ca45fce8ac | ||
|
|
c0316a6b5d | ||
|
|
8dad9362e7 | ||
|
|
2b1482d2b4 | ||
|
|
0b568e204e | ||
|
|
39e566ba91 | ||
|
|
27ad9b1302 | ||
|
|
f75606d7f5 | ||
|
|
3675938df6 | ||
|
|
b5bcce7f85 | ||
|
|
05c0aa3882 | ||
|
|
2d9bf14ecb | ||
|
|
7815e02dd4 | ||
|
|
d951e36945 | ||
|
|
16b31c3e35 | ||
|
|
f2f37ae444 | ||
|
|
ec9add9a51 | ||
|
|
d99f03e4f3 | ||
|
|
f16b0f628b | ||
|
|
0e9e9648e6 | ||
|
|
6f94a076f7 | ||
|
|
acb825f4f5 | ||
|
|
5075d13902 | ||
|
|
b3c6c8c84b | ||
|
|
fc411091c8 | ||
|
|
a7623e64fa | ||
|
|
af1d4b9ba4 | ||
|
|
1d581464e6 | ||
|
|
acf1c14122 | ||
|
|
7d3a25f8c0 | ||
|
|
faf3584acd | ||
|
|
5ef198a5b2 | ||
|
|
c08b9e89f0 | ||
|
|
64b2073e63 | ||
|
|
7ee0d9067d | ||
|
|
f28693c8c7 | ||
|
|
2943bed5d4 | ||
|
|
37afa3411f | ||
|
|
1ee21f5150 | ||
|
|
93f4ceabc1 | ||
|
|
370ebdee24 | ||
|
|
52fed6023f | ||
|
|
823f8d58bb | ||
|
|
09b71846be | ||
|
|
167ef000f4 | ||
|
|
00ee4c2697 | ||
|
|
d4a8ff0683 | ||
|
|
ccccb8e7e6 | ||
|
|
c4be3b43e5 | ||
|
|
265d2a79be | ||
|
|
24d0fdb262 | ||
|
|
23b1b36f8c | ||
|
|
81c75e1024 | ||
|
|
694f551625 | ||
|
|
7607abc726 | ||
|
|
e9f9d92989 | ||
|
|
c23688e2de | ||
|
|
a4388c5e65 | ||
|
|
e9d6899fc2 | ||
|
|
b17577c138 | ||
|
|
ec106d743d | ||
|
|
4258392fc7 | ||
|
|
020a956c89 | ||
|
|
998d08f155 | ||
|
|
20d95dc45e | ||
|
|
1eab6c8590 | ||
|
|
bafda233e2 | ||
|
|
e412ed3bcb | ||
|
|
9f785dbafe | ||
|
|
7d3a208f8b | ||
|
|
2a63439b16 | ||
|
|
b7ed32f455 | ||
|
|
7e6b611a19 | ||
|
|
34d54c75f7 | ||
|
|
7cb14ff07a | ||
|
|
91047d1619 | ||
|
|
1151d14466 | ||
|
|
c56072aa7b | ||
|
|
484b0aa96b | ||
|
|
1b35a3b16e | ||
|
|
5a5bbe3852 | ||
|
|
c61b289bd1 | ||
|
|
f835e330b8 | ||
|
|
af6a70c9fb | ||
|
|
e0775446c9 | ||
|
|
de1cd8c264 | ||
|
|
37e261ff93 | ||
|
|
8bc28fb11d | ||
|
|
22cfedcaff | ||
|
|
8220dc6115 | ||
|
|
e296d387e1 | ||
|
|
95c2a52775 | ||
|
|
18a973b666 | ||
|
|
842036688d | ||
|
|
41bdd6d6d9 | ||
|
|
1cdfa8087c | ||
|
|
46f928165c | ||
|
|
f7840782a4 | ||
|
|
b803ed19d3 | ||
|
|
69c3635ce7 | ||
|
|
51e56e17ee | ||
|
|
b744dffefd | ||
|
|
70f670dcf7 | ||
|
|
c627527a6f | ||
|
|
c7b67a978e | ||
|
|
60af173c4a | ||
|
|
4f2fcc82f0 | ||
|
|
322fb34d4b | ||
|
|
3e1e4a1857 | ||
|
|
caf5c3d74c | ||
|
|
692058bbdd | ||
|
|
015c155582 | ||
|
|
bf71e472c4 | ||
|
|
f38c072f07 | ||
|
|
2f7a8698a0 | ||
|
|
5541bc09c8 | ||
|
|
6a9865ace7 | ||
|
|
f28208d35b | ||
|
|
75559a55aa | ||
|
|
185dcb61f7 | ||
|
|
3e74d383fe | ||
|
|
87e97e40f4 | ||
|
|
5a75f2c00f | ||
|
|
e6260a7bb6 | ||
|
|
7a8a9fc807 | ||
|
|
30304ccc56 | ||
|
|
5b17fa5dda | ||
|
|
687a881ad2 | ||
|
|
0db630a123 | ||
|
|
261f62e353 | ||
|
|
4ce17acd00 | ||
|
|
6c35ee4960 | ||
|
|
e66adf60c5 | ||
|
|
cf8745ef78 | ||
|
|
529ffdb7e3 | ||
|
|
8d1c5226ec | ||
|
|
f136214290 | ||
|
|
f9606ce9b7 | ||
|
|
d8fe677933 | ||
|
|
f3765a20b9 | ||
|
|
a6e1b2c7cb | ||
|
|
eed9e401a2 | ||
|
|
f188396395 | ||
|
|
9c5ff1699a | ||
|
|
b1d3979ed9 | ||
|
|
5f8b76c8f2 | ||
|
|
1bb746aaed | ||
|
|
07b3bdf181 | ||
|
|
e62888659f | ||
|
|
0adee07d40 | ||
|
|
bbe7491f2f | ||
|
|
d48a789442 | ||
|
|
e6014e89bf | ||
|
|
1509c536f9 | ||
|
|
0d8cdee60a | ||
|
|
d3c07a098d | ||
|
|
5a8ea884a9 | ||
|
|
02b46a1784 | ||
|
|
a733e5c1d4 | ||
|
|
7858aff2e2 | ||
|
|
cab0957fd3 | ||
|
|
3f607b3978 | ||
|
|
4f783b911c | ||
|
|
4492017b96 | ||
|
|
13dee7d89e | ||
|
|
6babd5c0ce | ||
|
|
1b2cad2a2c | ||
|
|
723b37955a | ||
|
|
84dd1b57fe | ||
|
|
ed16914ac3 | ||
|
|
7941f4d54d | ||
|
|
db93ac5d4b | ||
|
|
fd0e0405af | ||
|
|
9a43622cef | ||
|
|
bfeb64b48f | ||
|
|
833553c3a3 | ||
|
|
dbbcf2564f | ||
|
|
cd85a51980 | ||
|
|
60870a7a3e | ||
|
|
32ce564b7c | ||
|
|
ecb873c488 | ||
|
|
f58cff5bcc | ||
|
|
f0bb6883f8 | ||
|
|
b1eb564706 | ||
|
|
4a7efdc552 | ||
|
|
ffbf57292c | ||
|
|
ccc46a09b5 | ||
|
|
9d86cb57ac | ||
|
|
7ee179ee1f | ||
|
|
00a908ae12 | ||
|
|
058c902dc7 | ||
|
|
b8c9b3ffa3 | ||
|
|
8a447107dd | ||
|
|
44e0b20202 | ||
|
|
51e83bcc26 | ||
|
|
efcad4996d | ||
|
|
48548684c0 | ||
|
|
8ec90f194f | ||
|
|
60cdf61737 | ||
|
|
2e165a0e0a | ||
|
|
00fa4fa0fa | ||
|
|
13292fc4ca | ||
|
|
a5a06da3fc | ||
|
|
ade2f6f5d1 | ||
|
|
b3253562a5 | ||
|
|
7e8e80f29e | ||
|
|
88007d7552 | ||
|
|
a6339bb973 | ||
|
|
551630f0f1 | ||
|
|
413255ddc7 | ||
|
|
41eb85c933 | ||
|
|
1a1d9c7257 | ||
|
|
1685c60e3c | ||
|
|
8503d7a07b | ||
|
|
878cc023a0 | ||
|
|
a47a54f207 | ||
|
|
e86143dbb0 | ||
|
|
eb5af38f33 | ||
|
|
5dcac18ba5 | ||
|
|
3daef910c0 | ||
|
|
44d34f9090 | ||
|
|
377f7668c5 | ||
|
|
6607e666dc | ||
|
|
778c571288 | ||
|
|
7482797605 | ||
|
|
662dffea3b | ||
|
|
19cd607c96 | ||
|
|
75a370cc06 | ||
|
|
5adbfe14ab | ||
|
|
52db15706d | ||
|
|
cfe7a1068e | ||
|
|
ebe92ef16d | ||
|
|
37b8fc5577 | ||
|
|
4d30e5b158 | ||
|
|
694bedc25b | ||
|
|
3e4325edab | ||
|
|
70201e8db8 | ||
|
|
b36a7833a6 | ||
|
|
eb4e12d3c5 | ||
|
|
498fe2458c | ||
|
|
0277d16daf | ||
|
|
e439a6ddac | ||
|
|
fafc467173 | ||
|
|
fc33162ec6 | ||
|
|
c5ad172616 | ||
|
|
54b4203683 | ||
|
|
3f5f418d0e | ||
|
|
8303b09129 | ||
|
|
b224d7ffad | ||
|
|
daec439d52 | ||
|
|
2d4b284218 | ||
|
|
6b9550238f | ||
|
|
b8d3e3669a | ||
|
|
91fe41106e | ||
|
|
9cf52bb7e4 | ||
|
|
e694c82343 | ||
|
|
1af9dbb083 | ||
|
|
6d5ca5a3e1 | ||
|
|
7f0d1bd414 | ||
|
|
7426a4f819 | ||
|
|
07f36fa95a | ||
|
|
f03525f431 | ||
|
|
3832ef0236 | ||
|
|
1197266912 | ||
|
|
469a1cb6a2 | ||
|
|
bba4e0b529 | ||
|
|
5923b6d89e | ||
|
|
e9f86e320b | ||
|
|
b0ee78586c | ||
|
|
6f46e6afc6 | ||
|
|
53eabe0c06 | ||
|
|
65dade4838 | ||
|
|
2ab8fb78b1 | ||
|
|
bf815e4463 | ||
|
|
a1c362a4f7 | ||
|
|
b015b0e83d | ||
|
|
71ebf31a54 | ||
|
|
30d60aaae9 | ||
|
|
583fa3c188 | ||
|
|
7316e6b9d3 | ||
|
|
4759c4ac96 | ||
|
|
466ef3f8f1 | ||
|
|
59000a47cb | ||
|
|
a5c16ad600 | ||
|
|
de15a7a3fc | ||
|
|
dd31936746 | ||
|
|
e8176b41ef | ||
|
|
1a5405e24c | ||
|
|
c837f3779e | ||
|
|
1c6ed9bc6d | ||
|
|
c7764c7470 | ||
|
|
6c630bc6c3 | ||
|
|
9a5bf4c701 | ||
|
|
2e9275c0f3 | ||
|
|
ba0ba6b59f | ||
|
|
23f61d49e0 | ||
|
|
6f8f846086 | ||
|
|
06dce4729b | ||
|
|
6dd90931e8 | ||
|
|
47b754c07b | ||
|
|
b47f30ad77 | ||
|
|
e6b21144e2 | ||
|
|
c2bf405489 | ||
|
|
63719747cb | ||
|
|
dbbd4b9777 | ||
|
|
a0f38e079f | ||
|
|
e9567741eb | ||
|
|
b26a6e25d1 | ||
|
|
f69f9e3523 | ||
|
|
d51011314f | ||
|
|
2668e42e7f | ||
|
|
aeaebfb515 | ||
|
|
e00c6b486e | ||
|
|
5fccccfdff | ||
|
|
b98a0cfe1b | ||
|
|
3e7e73ddd6 | ||
|
|
bea0aa5445 | ||
|
|
02658ad4fd | ||
|
|
cbae8b68fb | ||
|
|
3a75838196 | ||
|
|
6c1861b319 | ||
|
|
21fe1a917b | ||
|
|
6f1d799759 | ||
|
|
1b4a51f4a2 | ||
|
|
0369eb6e0e | ||
|
|
375685530f | ||
|
|
c5cfd0f2cf | ||
|
|
e1a5c17775 | ||
|
|
e358723baa | ||
|
|
c8c5d50b1a | ||
|
|
c25bf97831 | ||
|
|
23b71b0dff | ||
|
|
998e2aec30 | ||
|
|
0c6b6de09e | ||
|
|
cc22e1b013 | ||
|
|
5b69252337 | ||
|
|
a0e9530fa4 | ||
|
|
260aa61818 | ||
|
|
4471c1e37f | ||
|
|
609e7ee19c | ||
|
|
0b1b262512 | ||
|
|
43413cd21f | ||
|
|
bf4c2f219e | ||
|
|
037e157648 | ||
|
|
6b80bb3f37 | ||
|
|
9e31ebff93 | ||
|
|
54132efd67 | ||
|
|
510d9b3a29 | ||
|
|
3e0c882e27 | ||
|
|
0eb000c3ea | ||
|
|
6f8a65c529 | ||
|
|
a31cd0dec1 | ||
|
|
08b379c2ab | ||
|
|
4a471979eb | ||
|
|
d693baccbc | ||
|
|
1baebb8d0e | ||
|
|
010486fb36 | ||
|
|
6a135b1ed7 | ||
|
|
e6ffb6b52c | ||
|
|
1ab59865b5 | ||
|
|
05138cbd0a | ||
|
|
9bdb48807b | ||
|
|
b334db0fca | ||
|
|
2f034f807a | ||
|
|
69c9e8cc08 | ||
|
|
a353d883a0 | ||
|
|
6d59ad7fc9 | ||
|
|
aec44a0b89 | ||
|
|
516af86575 | ||
|
|
465ef0b772 | ||
|
|
814aca6d69 | ||
|
|
4446de00d3 | ||
|
|
5ea8b16f84 | ||
|
|
d61bddf56c | ||
|
|
a129b017b9 | ||
|
|
34118078bf | ||
|
|
d5ba916978 | ||
|
|
78d1a29bc1 | ||
|
|
6fa2dbc042 | ||
|
|
8a6722ba97 | ||
|
|
afcfc60637 | ||
|
|
c015eeb5dd | ||
|
|
826c3dc9cc | ||
|
|
d5ceff2691 | ||
|
|
553beae848 | ||
|
|
a038e4911b | ||
|
|
ff44734774 | ||
|
|
0ee7cc8c47 | ||
|
|
541ce04ebc | ||
|
|
8eccd8a5e4 | ||
|
|
cffc14a46a | ||
|
|
3723904512 | ||
|
|
fbb95ca342 | ||
|
|
093e276908 | ||
|
|
c83b8f2768 | ||
|
|
80fe5ce182 | ||
|
|
24a0d8b073 | ||
|
|
870d9ecdbf | ||
|
|
3b7a9358c3 | ||
|
|
afbeee9e82 | ||
|
|
8c12a69570 | ||
|
|
4f89319b40 | ||
|
|
bbfd320ed4 | ||
|
|
c793d8a69e | ||
|
|
1acf969c6e | ||
|
|
2c4bf91a61 | ||
|
|
eb09aba747 | ||
|
|
fdd4c02461 | ||
|
|
eda33e092f | ||
|
|
a25689fabf | ||
|
|
cfe46fd9f5 | ||
|
|
fb818ead60 | ||
|
|
a4b2552540 | ||
|
|
da5b07e913 | ||
|
|
c4a1ae9375 | ||
|
|
d6fe5d9a63 | ||
|
|
0d04018622 | ||
|
|
6f280b1ccc | ||
|
|
68e7c297e0 | ||
|
|
732332a3c5 | ||
|
|
8fc7f980aa | ||
|
|
4110e71e84 | ||
|
|
939811e9b5 | ||
|
|
a4d88612c1 | ||
|
|
55be90cdd2 | ||
|
|
1c7a562880 | ||
|
|
57a36967bf | ||
|
|
c7c32a7467 | ||
|
|
9d33d8c0fa | ||
|
|
a94062469a | ||
|
|
38090b2553 | ||
|
|
a53178cab9 | ||
|
|
59edb99f04 | ||
|
|
abd6f58aee | ||
|
|
f413dc62cd | ||
|
|
1d7d51a7ab | ||
|
|
22f6db0a6b | ||
|
|
55a23eae25 | ||
|
|
7e277e9381 | ||
|
|
fa7b40ab86 | ||
|
|
5e5fe4b7af | ||
|
|
d3c0111121 | ||
|
|
b9966eb3d4 | ||
|
|
427575e958 | ||
|
|
59032a06d5 | ||
|
|
9262aea7a5 | ||
|
|
ff26b19d2b | ||
|
|
3cfe5aabe5 | ||
|
|
0afe66ac39 | ||
|
|
afe91a2633 | ||
|
|
2b12a5514e | ||
|
|
093eb473cb | ||
|
|
bd3b590153 | ||
|
|
d042e073cc | ||
|
|
d23f2849d4 | ||
|
|
d4e5c95711 | ||
|
|
677d49d438 | ||
|
|
2930b57c78 | ||
|
|
6814dadd21 | ||
|
|
632f55a9e8 | ||
|
|
f1120f24a1 | ||
|
|
d8a5a01cea | ||
|
|
4daf16e5f9 | ||
|
|
86a3505d89 | ||
|
|
c7d825bddb | ||
|
|
08c3aa496d | ||
|
|
327045be43 | ||
|
|
76e1bed8f9 | ||
|
|
a57e1e7a14 | ||
|
|
ce9c14f894 | ||
|
|
ba0187798a | ||
|
|
d2d9f4888e | ||
|
|
fe36adb7b9 | ||
|
|
2a84524d19 | ||
|
|
c6b95f8776 | ||
|
|
db056c896d | ||
|
|
e3d995a74f | ||
|
|
e15dc23bbe | ||
|
|
055e5e8d26 | ||
|
|
c33954cd93 | ||
|
|
e21c0648ae | ||
|
|
7bcb49b6e7 | ||
|
|
df9c5ff263 | ||
|
|
82f37971c5 | ||
|
|
25d8cdd9cd | ||
|
|
971f1cd897 | ||
|
|
17bce930ba | ||
|
|
35715096f4 | ||
|
|
2dcfb3c2f0 | ||
|
|
7e4a61f2ac | ||
|
|
385057f09e | ||
|
|
45e725ac9c | ||
|
|
673d0d367c | ||
|
|
906ebee075 | ||
|
|
cd4baa3fa5 | ||
|
|
6afbd8032e | ||
|
|
f440ddbe1d | ||
|
|
2e209ab28b | ||
|
|
849c38c0a4 | ||
|
|
06a47ee457 | ||
|
|
5f2442450c | ||
|
|
dbb06466bf | ||
|
|
58a02f06ea | ||
|
|
ba16afd3c2 | ||
|
|
f91cdf8e18 | ||
|
|
18f7e6e7ed | ||
|
|
8d701ebe22 | ||
|
|
dd2225b1aa | ||
|
|
a1e4f4bde7 | ||
|
|
21987f60c7 | ||
|
|
bfacd65971 | ||
|
|
a9c383e62c | ||
|
|
0816cec4bc | ||
|
|
acfdc8da77 | ||
|
|
85a343363b | ||
|
|
1dfd6d7391 | ||
|
|
b757ba664f | ||
|
|
9f80c2ab76 | ||
|
|
179c70dba8 | ||
|
|
bbcdb8413d | ||
|
|
d8ace4d34c | ||
|
|
4679f07336 | ||
|
|
8cdab5f31a | ||
|
|
7828bd6f2e | ||
|
|
cf8c9c2a3d | ||
|
|
5bb3689562 | ||
|
|
5132b01ab1 | ||
|
|
a3934b3aaa | ||
|
|
6d10f98498 | ||
|
|
841cbff249 | ||
|
|
89178bcebd | ||
|
|
b499b3fe2a | ||
|
|
8b9c26c468 | ||
|
|
5ec641837a | ||
|
|
7d7d4cf5c3 | ||
|
|
7fb7f200b3 | ||
|
|
7a93599fe8 | ||
|
|
92bab9fa61 | ||
|
|
7fa42daf89 | ||
|
|
2d010db83f | ||
|
|
275d4877a6 | ||
|
|
2667ef4544 | ||
|
|
fd07abbfc8 | ||
|
|
3090b84252 | ||
|
|
5dca48d9fc | ||
|
|
76f941f4e5 | ||
|
|
b27f59b12b | ||
|
|
4b3d3fe7ea | ||
|
|
2076543e32 | ||
|
|
4aac84e1c1 | ||
|
|
7823ef09dc | ||
|
|
215db8cab3 | ||
|
|
7b18919564 | ||
|
|
c957a6cb43 | ||
|
|
7dd72c1d25 | ||
|
|
cb33fb67fe | ||
|
|
15c5873c20 | ||
|
|
7594401461 | ||
|
|
1ea7675fc9 | ||
|
|
e86899eec4 | ||
|
|
39faae68c0 | ||
|
|
4a8920f9a4 | ||
|
|
9a11a3cd63 | ||
|
|
70fea6c6b6 | ||
|
|
607534021b | ||
|
|
3f49b5a4ab | ||
|
|
b97ca9d19d | ||
|
|
9ebf3a4d80 | ||
|
|
01cdc54ad0 | ||
|
|
0f796a79ec | ||
|
|
e24ca9ec28 | ||
|
|
ba330712f8 | ||
|
|
38d8d2bb56 | ||
|
|
f495d338eb | ||
|
|
14a2006c76 | ||
|
|
afcd22d30c | ||
|
|
bd4931e70b | ||
|
|
032ad3b521 | ||
|
|
57f1c53214 | ||
|
|
e2922968d6 | ||
|
|
e23c803cee | ||
|
|
0308699849 | ||
|
|
3f9c20a399 | ||
|
|
cbbbe2da9a | ||
|
|
ac3e5089a2 | ||
|
|
3af06a3d5a | ||
|
|
4511c6ae7c | ||
|
|
a3c6045328 | ||
|
|
b0630c1a98 | ||
|
|
0b7910d4af | ||
|
|
d57772f9e7 | ||
|
|
f941948d11 | ||
|
|
37ad1d5397 | ||
|
|
7feaf34702 | ||
|
|
b545aceb47 | ||
|
|
2b8e5a86cc | ||
|
|
7ae00832bd | ||
|
|
fbd76f8ebe | ||
|
|
70d0ee4310 | ||
|
|
20303feb3a | ||
|
|
150cd18bf3 | ||
|
|
192cd53003 | ||
|
|
a50deb2762 | ||
|
|
4aed6bd274 | ||
|
|
77626d28d1 | ||
|
|
0c8c565ab0 | ||
|
|
0a1a6cd041 | ||
|
|
f8f9d066db | ||
|
|
9f65e8de98 | ||
|
|
9ae828cf11 | ||
|
|
cf0b7628d0 | ||
|
|
f6aaecb04f | ||
|
|
14c9bea663 | ||
|
|
80cbaca935 | ||
|
|
425496844b | ||
|
|
88daa841fd | ||
|
|
509a8a412c | ||
|
|
7100614de5 | ||
|
|
d9b3482b1a | ||
|
|
91a5643c5c | ||
|
|
fd2328ab40 | ||
|
|
a38f3227e2 | ||
|
|
a1263951e9 | ||
|
|
7c9847fe48 | ||
|
|
737ebfd521 | ||
|
|
42e9504ba8 | ||
|
|
9e8491b814 | ||
|
|
c418449311 | ||
|
|
690e9d8ed3 | ||
|
|
6b648ee3ad | ||
|
|
f4fbc91515 | ||
|
|
bddd1d0fcb | ||
|
|
bc8b92a77d | ||
|
|
9d02c354dd | ||
|
|
b499851097 | ||
|
|
f24495e0e6 | ||
|
|
7fd57d737e | ||
|
|
28578310d1 | ||
|
|
a86f95117e | ||
|
|
c30ba2e551 | ||
|
|
d1b2037676 | ||
|
|
10f623154e | ||
|
|
89a8dbb81a | ||
|
|
19c5af3ebc | ||
|
|
70ee9ddf91 | ||
|
|
8f28f6cc1e | ||
|
|
815966cb25 | ||
|
|
21bdf45d6f | ||
|
|
bd5008136a | ||
|
|
cbc8a02179 | ||
|
|
c52ed333fa | ||
|
|
ad4145e48c | ||
|
|
311d58e1ed | ||
|
|
eb65532386 | ||
|
|
06213ea814 | ||
|
|
ca8a7d8368 | ||
|
|
6936875a82 | ||
|
|
1238cadd31 | ||
|
|
cb2b1dccc5 | ||
|
|
23f2057868 | ||
|
|
2f9241b5a3 | ||
|
|
230d160602 | ||
|
|
d341b1efe8 | ||
|
|
ae10ff4a5f | ||
|
|
8dfa0bf047 | ||
|
|
2c563ad280 | ||
|
|
3ce06a938c | ||
|
|
c17dbbeb92 | ||
|
|
6736551ba3 | ||
|
|
0e01362469 | ||
|
|
a5ed4f2af2 | ||
|
|
69775b6d6e | ||
|
|
22289a0002 | ||
|
|
7f5981594c | ||
|
|
7e084ef1e0 | ||
|
|
a1e5195c8b | ||
|
|
5133b6e73b | ||
|
|
648f1a5c71 | ||
|
|
98d0ffecf1 | ||
|
|
423d61796d | ||
|
|
af0972c539 | ||
|
|
fcf878e1f3 | ||
|
|
c28d7d3414 | ||
|
|
c11742f443 | ||
|
|
9e068fad4f | ||
|
|
37879a7850 | ||
|
|
93b41170d1 | ||
|
|
f1545d2b2f | ||
|
|
e6da0f9a8c | ||
|
|
0f4c3518d3 | ||
|
|
5beedc9734 | ||
|
|
408f4780ce | ||
|
|
12258f02d7 | ||
|
|
2047b0c973 | ||
|
|
49834e3b00 | ||
|
|
138f12f957 | ||
|
|
4395ed8065 | ||
|
|
346499f12c | ||
|
|
d8f2eac6e0 | ||
|
|
1842017393 | ||
|
|
17a06f152c | ||
|
|
220e5516ab | ||
|
|
cf08eaf786 | ||
|
|
4ee5ac7c20 | ||
|
|
89ef23de50 | ||
|
|
799efb5974 | ||
|
|
ec41482324 | ||
|
|
7eaf9367fe | ||
|
|
f2db8d7d99 | ||
|
|
4f7237b158 | ||
|
|
a2e4e4bede | ||
|
|
8e77b3dc82 | ||
|
|
8196ab62f9 | ||
|
|
5def14e3bb | ||
|
|
cd05f262a6 | ||
|
|
4d5d3e6433 | ||
|
|
60658a8037 | ||
|
|
ac474fce38 | ||
|
|
ad59180fb8 | ||
|
|
419b044ac5 | ||
|
|
abf6f963ea | ||
|
|
c39c4e4ec4 | ||
|
|
175169c156 | ||
|
|
002cd14a65 | ||
|
|
75c9ebbc54 | ||
|
|
c6d668bacf | ||
|
|
c9a8abafa4 | ||
|
|
6de4a4873a | ||
|
|
3132430737 | ||
|
|
d11354f9c8 | ||
|
|
105dbf49e4 | ||
|
|
8e0bae894d | ||
|
|
e9f608174b | ||
|
|
46210695b6 | ||
|
|
b0059654c9 | ||
|
|
f04ead7c37 | ||
|
|
0208688801 | ||
|
|
1f2ffce85b | ||
|
|
91c8b137f1 | ||
|
|
adb2e8cc5f | ||
|
|
6707ccc463 | ||
|
|
4e7812fe55 | ||
|
|
7fab8d6586 | ||
|
|
6b3ef61dd2 | ||
|
|
a352940dfd | ||
|
|
7d8e8eb0cf | ||
|
|
128829c477 | ||
|
|
9e5585776c | ||
|
|
e5ff85f6fb | ||
|
|
d5de59d411 | ||
|
|
4977b55106 | ||
|
|
689202e00e | ||
|
|
148923c13a | ||
|
|
f24d71c71c | ||
|
|
78bac4ae05 | ||
|
|
c6e8443631 | ||
|
|
d21f22ffa1 | ||
|
|
b820daf38f | ||
|
|
b8bc6bee83 | ||
|
|
382507051f | ||
|
|
f06ec485cb | ||
|
|
87b9a93fa1 | ||
|
|
b86e68a29d | ||
|
|
e58bd0e485 | ||
|
|
6634d603a8 | ||
|
|
1377a44a1a | ||
|
|
89b8ec3546 | ||
|
|
50b4788a91 | ||
|
|
b3f4794d91 | ||
|
|
1e30a072d4 | ||
|
|
5c7797dbca | ||
|
|
7d2ef728e6 | ||
|
|
07f8fb5c5b | ||
|
|
a7d9102c33 | ||
|
|
60337086f9 | ||
|
|
34c3f70203 | ||
|
|
9a48f72041 | ||
|
|
0819b83d0b | ||
|
|
d15b9bc272 | ||
|
|
15a78b19ad | ||
|
|
653681967e | ||
|
|
997741119a | ||
|
|
fae7900f19 | ||
|
|
5d1dd3e2b7 | ||
|
|
d2f9c43c8e | ||
|
|
f2dc9709b7 | ||
|
|
3fe94a67b0 | ||
|
|
6d153022f6 | ||
|
|
48d249db9e | ||
|
|
60f6a1c6f1 | ||
|
|
cccea484e4 | ||
|
|
804c04f7b9 | ||
|
|
bb15c9605d | ||
|
|
a4afada746 | ||
|
|
cadeaac769 | ||
|
|
1c3d129e08 | ||
|
|
0a5a91619e | ||
|
|
184873213c | ||
|
|
f56522cb8e | ||
|
|
8ff3890ba8 | ||
|
|
94c69eb8e3 | ||
|
|
377e979800 | ||
|
|
913dcdfbcd | ||
|
|
3b630841bd | ||
|
|
e45edbb992 | ||
|
|
93edd5427f | ||
|
|
8159d1ab25 | ||
|
|
76cb543347 | ||
|
|
f040418cf1 | ||
|
|
a8dec1c9d5 | ||
|
|
8291b898ca | ||
|
|
079f409238 | ||
|
|
d5c9b5cb32 | ||
|
|
7ff1bd9f8b | ||
|
|
89915dcb4c | ||
|
|
312528d471 | ||
|
|
e56c5e67dd | ||
|
|
1770bb174b | ||
|
|
ab51ae9091 | ||
|
|
1c229dad91 | ||
|
|
27815d982c | ||
|
|
d257629f81 | ||
|
|
9b68062fa9 | ||
|
|
089e0d028b | ||
|
|
11ce3e2268 | ||
|
|
9239c2c2ed | ||
|
|
67b1178aec | ||
|
|
4eda79cc3a | ||
|
|
731ad03348 | ||
|
|
376eaf64cd | ||
|
|
8222615280 | ||
|
|
e3deb29f8e | ||
|
|
14fbf594b2 | ||
|
|
86c831f7e2 | ||
|
|
351fb31a34 | ||
|
|
4be4c53222 | ||
|
|
54db0152b9 | ||
|
|
81f1450c1c | ||
|
|
d22fd6dfe3 | ||
|
|
7d7ce92e46 | ||
|
|
2aedd3c819 | ||
|
|
3b1234d084 | ||
|
|
19c10b1418 | ||
|
|
00a67e9524 | ||
|
|
d23f7da8e3 | ||
|
|
f57f9f672d | ||
|
|
69dee75c34 | ||
|
|
a60321b68e | ||
|
|
5bdcb4e69c | ||
|
|
00f599ea78 | ||
|
|
32ac0622ff | ||
|
|
29c1c18042 | ||
|
|
ad4fa4b2f4 | ||
|
|
720139c3c1 | ||
|
|
44b3247869 | ||
|
|
eaa27ca841 | ||
|
|
2ea8a832a0 | ||
|
|
44eab74888 | ||
|
|
db2581459f | ||
|
|
982ac1859c | ||
|
|
d8f01876e5 | ||
|
|
86575b2946 | ||
|
|
a627f56a64 | ||
|
|
28105ee027 | ||
|
|
f01a12b1d2 | ||
|
|
dd1e5e145a | ||
|
|
b8087c4c8e | ||
|
|
d036fdfc26 | ||
|
|
f915b2bd14 | ||
|
|
6aa88761b8 | ||
|
|
9c42c8be6b | ||
|
|
b4f71e06b3 | ||
|
|
f48426623d | ||
|
|
bf1187f465 | ||
|
|
867e1007d1 | ||
|
|
228ad68042 | ||
|
|
776550d5ce | ||
|
|
47fc7e1ce6 | ||
|
|
215ab6e66a | ||
|
|
3c3e48b18c | ||
|
|
7afee2d55c | ||
|
|
4228965c9b | ||
|
|
c6487f2e48 | ||
|
|
886d49e3a4 | ||
|
|
4f65dde201 | ||
|
|
c0e78fd56d | ||
|
|
dd2a3f712b | ||
|
|
4cb91a042e | ||
|
|
928f273bbe | ||
|
|
7923903d21 | ||
|
|
104eeea274 | ||
|
|
90c5b3c410 | ||
|
|
1195f843a3 | ||
|
|
a374288cea | ||
|
|
3417164ec2 | ||
|
|
a1729b9b9e | ||
|
|
d503b3e867 | ||
|
|
e59de8c9b1 | ||
|
|
6cb38d92c0 | ||
|
|
56da96b2e9 | ||
|
|
22014cfcbc | ||
|
|
17776daed8 | ||
|
|
32a505d841 | ||
|
|
51d0c9b8b0 | ||
|
|
46ebc55e2b | ||
|
|
8397187231 | ||
|
|
8c4ef9270d | ||
|
|
4912c0ee30 | ||
|
|
1ebd5c3648 | ||
|
|
2a0b943bb4 | ||
|
|
dcdd1edde2 | ||
|
|
8ca39a436c | ||
|
|
0a7392f6ec | ||
|
|
fdf78525b4 | ||
|
|
15ed208996 | ||
|
|
f8eaff574f | ||
|
|
2b5341f53a | ||
|
|
991f500775 | ||
|
|
586654e2af | ||
|
|
9e52ae9e98 | ||
|
|
dabf71bc3c | ||
|
|
a2e79c94be | ||
|
|
71b6905008 | ||
|
|
1167f6ddf9 | ||
|
|
b22a7dae5d | ||
|
|
85c62efca1 | ||
|
|
ad6f6bb0ed | ||
|
|
a6b7432837 | ||
|
|
8abc8ded82 | ||
|
|
4deb849fb1 | ||
|
|
8edbd7094f | ||
|
|
6b4c4f10b5 | ||
|
|
20617614ae | ||
|
|
2399d91f61 | ||
|
|
d38089ab57 | ||
|
|
7416ca9ae1 | ||
|
|
aed4313cfc | ||
|
|
ec6dc0daaf | ||
|
|
6ba0d8e379 | ||
|
|
255b69dc58 | ||
|
|
d84188b221 | ||
|
|
70ad78990a | ||
|
|
d4e83b060a | ||
|
|
a346f79b39 | ||
|
|
36af9776e6 | ||
|
|
62a83dc9bb | ||
|
|
4a1e6a2275 | ||
|
|
9a068dadbf | ||
|
|
bb2693c792 | ||
|
|
ecddf98430 | ||
|
|
ec0c35b7ed | ||
|
|
924b1215ce | ||
|
|
c792fa819f | ||
|
|
c9e05dc184 | ||
|
|
724557fc7b | ||
|
|
7fc484ba7a | ||
|
|
cac26dafe3 | ||
|
|
416feb13ef | ||
|
|
1b3fc68a87 | ||
|
|
d734be61cf | ||
|
|
8cdfaf41ec | ||
|
|
08993ff109 | ||
|
|
fba0338787 | ||
|
|
345afec47e | ||
|
|
6118d1ff57 | ||
|
|
e549824fe2 | ||
|
|
3caf0a79d8 | ||
|
|
c45030af44 | ||
|
|
a1ce12296f | ||
|
|
1aeea3d854 | ||
|
|
2e5cc49cb3 | ||
|
|
7211eb9cf5 | ||
|
|
dd883dc53a | ||
|
|
70b04d16c0 | ||
|
|
14682d5354 | ||
|
|
f5734826cb | ||
|
|
9a516bed47 | ||
|
|
f28fb89af8 | ||
|
|
f5793149a9 | ||
|
|
73ad444086 | ||
|
|
290712c3fe | ||
|
|
3abe7ccb26 | ||
|
|
dc86e44a07 | ||
|
|
d136a6be44 | ||
|
|
88f096977b | ||
|
|
ca2f962e95 | ||
|
|
8e1445b15b | ||
|
|
6ab649312f | ||
|
|
352168d6c2 | ||
|
|
9b88976f36 | ||
|
|
1da453306e | ||
|
|
18fa3e2384 | ||
|
|
53d402480c | ||
|
|
44c8d09342 | ||
|
|
1105d8814f | ||
|
|
8eb3c441ec | ||
|
|
fd81446ba3 | ||
|
|
b7fad04870 | ||
|
|
086d5f8324 | ||
|
|
6aae9864d3 | ||
|
|
b3b6278af2 | ||
|
|
12d6c4da7d | ||
|
|
42d4bc6b14 | ||
|
|
e5cd0237e3 | ||
|
|
446ac7649d | ||
|
|
12d32ac99c | ||
|
|
ff31759423 | ||
|
|
9f934929c6 | ||
|
|
81beb7940c | ||
|
|
13894e1fd5 | ||
|
|
7357b6eff1 | ||
|
|
b615c0719e | ||
|
|
e323a6d69b | ||
|
|
3cbc5b0d52 | ||
|
|
880368635e | ||
|
|
2d61591c22 | ||
|
|
0bbb5cff85 | ||
|
|
c8194a7364 | ||
|
|
956dd71d91 | ||
|
|
bb613a8e1d | ||
|
|
682b70011f | ||
|
|
efe86ce159 | ||
|
|
4839f2901a | ||
|
|
170bce2c02 | ||
|
|
f84606325c | ||
|
|
a2e53d5e41 | ||
|
|
9b61f0b5f7 | ||
|
|
b9d0533d92 | ||
|
|
0e0e751ef7 | ||
|
|
8855529637 | ||
|
|
a46f70c4b0 | ||
|
|
03a6b491b2 | ||
|
|
3675ab4864 | ||
|
|
ddfbf31bc8 | ||
|
|
42773e808c | ||
|
|
9afb2a14ef | ||
|
|
c70ca78cdc | ||
|
|
e10b260988 | ||
|
|
1b0318564e | ||
|
|
4c39960917 | ||
|
|
50617594fd | ||
|
|
102f5c3f53 | ||
|
|
6283d9fe83 | ||
|
|
05c1903784 | ||
|
|
8a219b6e9c | ||
|
|
b4902090e7 | ||
|
|
57dce91c91 | ||
|
|
7271164256 | ||
|
|
f8ec6b4464 | ||
|
|
699545366b | ||
|
|
b1c86fee3b | ||
|
|
45c5a2598d | ||
|
|
44f8f20ea7 | ||
|
|
138f5223bd | ||
|
|
43013c4fd4 | ||
|
|
4696577636 | ||
|
|
4007c871ae | ||
|
|
e21a8530f3 | ||
|
|
4722da9642 | ||
|
|
cf4a524988 | ||
|
|
d7dbb715ef | ||
|
|
32ec54172e | ||
|
|
a3eb17b7d4 | ||
|
|
69344a6aa6 | ||
|
|
1412ed6a00 | ||
|
|
208ccc83ec | ||
|
|
70f74cde68 | ||
|
|
667b975400 | ||
|
|
8e5db72140 | ||
|
|
fc1b8f6fb6 | ||
|
|
c6fa98ce3e | ||
|
|
fd238ff792 | ||
|
|
e06a0c6ae0 | ||
|
|
07dc04f40e | ||
|
|
dd4cf66be1 | ||
|
|
035165b534 | ||
|
|
447904f0ab | ||
|
|
0d949140f4 | ||
|
|
c40f642afa | ||
|
|
523af5b3aa | ||
|
|
ba79334863 | ||
|
|
474afa5efe | ||
|
|
1c6f1d94f5 | ||
|
|
e05474e7e0 | ||
|
|
4daac334bc | ||
|
|
fc4b57d9f6 | ||
|
|
da854703aa | ||
|
|
d1bfb245df | ||
|
|
9ad44f0e77 | ||
|
|
4fb8d5c6d4 | ||
|
|
71cbe5160d | ||
|
|
b782683e60 | ||
|
|
360b59cdb2 | ||
|
|
737fb6417b | ||
|
|
211c5623e8 | ||
|
|
098a8e4fb1 | ||
|
|
518f3c0c99 | ||
|
|
1c52ddf792 | ||
|
|
0fba1e27c5 | ||
|
|
da6cd5ddc4 | ||
|
|
dbdca7d8d1 | ||
|
|
ddf6fd9c09 | ||
|
|
17107a0337 | ||
|
|
f69eafe95a | ||
|
|
679db51453 | ||
|
|
58bf917775 | ||
|
|
679f0f24a4 | ||
|
|
ec3b837d00 | ||
|
|
f0daa45ae0 | ||
|
|
29a581d2b0 | ||
|
|
699e9ff878 | ||
|
|
26bd3533d8 | ||
|
|
7c8c475c3a | ||
|
|
8a488b9e39 | ||
|
|
07ca137bdf | ||
|
|
d4552117f6 | ||
|
|
c0ad64d9a3 | ||
|
|
ea85ebdacb | ||
|
|
039ed78253 | ||
|
|
9dfe1bb003 | ||
|
|
9b1a66c969 | ||
|
|
93d5cb128c | ||
|
|
24af888c41 | ||
|
|
2f1bb5c2c8 | ||
|
|
e71ebb8068 | ||
|
|
efb4bd6780 | ||
|
|
6165ae56c2 | ||
|
|
8b4dd16255 | ||
|
|
c8dbe8ee7b | ||
|
|
f9420e1209 | ||
|
|
36bf42a860 | ||
|
|
aab75a6ead | ||
|
|
1a46734485 | ||
|
|
e9e49ea098 | ||
|
|
08012c71b1 | ||
|
|
870af19ba4 | ||
|
|
4d30f7d1d9 | ||
|
|
d26a4ffcea | ||
|
|
2752e0d607 | ||
|
|
7039c202c8 | ||
|
|
8917228dbb | ||
|
|
51c59d0059 | ||
|
|
6ded4c1d75 | ||
|
|
c24389cff5 | ||
|
|
45f892dfdd | ||
|
|
e0b381d523 | ||
|
|
16175137e5 | ||
|
|
9fe1c8ae13 | ||
|
|
d74f8e03d3 | ||
|
|
1ae6669fbf | ||
|
|
50575b749b | ||
|
|
ba37b28fb5 | ||
|
|
7dfbcd2e5a | ||
|
|
5f97357fe0 | ||
|
|
bb1c1b39d8 | ||
|
|
ba99089a12 | ||
|
|
b1269fdad2 | ||
|
|
ffdb291fe0 | ||
|
|
af9ceb00a0 | ||
|
|
43423432ce | ||
|
|
5f9ac5a630 | ||
|
|
efe41aaaca | ||
|
|
02187b19bb | ||
|
|
8389108653 | ||
|
|
dbc59b2952 | ||
|
|
efc7b08cd9 | ||
|
|
c82d34b659 | ||
|
|
d920e4d0a7 | ||
|
|
80d1ad5b6f | ||
|
|
ce53bc52c5 | ||
|
|
740453fa18 | ||
|
|
2be7c84203 | ||
|
|
ad95e88838 | ||
|
|
bd9aa578f4 | ||
|
|
9b991eb4fe | ||
|
|
98081bc0d3 | ||
|
|
5d52dc5b35 | ||
|
|
b6d5392c0c | ||
|
|
fca7a5ff32 | ||
|
|
4ded32cc64 | ||
|
|
4a234c8db3 | ||
|
|
e28adf2884 | ||
|
|
5abaed9d08 | ||
|
|
e582639efa | ||
|
|
05536aab6b | ||
|
|
455f78b178 | ||
|
|
79913d4c17 | ||
|
|
738f050086 | ||
|
|
442c913de3 | ||
|
|
d3ab3f1b70 | ||
|
|
6946e038c2 | ||
|
|
00af6baeb6 | ||
|
|
c10602b6c5 | ||
|
|
fe415e1508 | ||
|
|
3280715ca0 | ||
|
|
afec4394f9 | ||
|
|
c50eb8a691 | ||
|
|
21c55b4c0d | ||
|
|
e42111a8af | ||
|
|
6a8c1fe423 | ||
|
|
6879daccc6 | ||
|
|
074123b9b9 | ||
|
|
d101297995 | ||
|
|
350fd89c8d | ||
|
|
8d1e988059 | ||
|
|
b5ae64cb3c | ||
|
|
d3d47dce0b | ||
|
|
e487ec5370 | ||
|
|
70607cbbbb | ||
|
|
b3d7d6a79d | ||
|
|
e1aaff2053 | ||
|
|
a1211f40d7 | ||
|
|
089e4bee12 | ||
|
|
447c1b90e7 | ||
|
|
aa23da60a3 | ||
|
|
e04fe921eb | ||
|
|
5ff9df9d4c | ||
|
|
0f6e4ff683 | ||
|
|
6dd2b05bf5 | ||
|
|
e3557cd8b7 | ||
|
|
927e477f68 | ||
|
|
946305d977 | ||
|
|
903a01745f | ||
|
|
1e14a24f06 | ||
|
|
5b092d59f4 | ||
|
|
03cb86ee46 | ||
|
|
0288804f2e | ||
|
|
49af2148fe | ||
|
|
7cb64cb2f9 | ||
|
|
e9ea0195b0 | ||
|
|
09544dee09 | ||
|
|
0459666beb | ||
|
|
61dde8ed89 | ||
|
|
fefaa2271d | ||
|
|
3065cea562 | ||
|
|
5f6dcf9f2e | ||
|
|
73a107690d | ||
|
|
9b961ed496 | ||
|
|
7504669f2b | ||
|
|
408b7413e9 | ||
|
|
162b219f2b | ||
|
|
8f2f053968 | ||
|
|
d124266923 | ||
|
|
6e3f66c0f1 | ||
|
|
52c5f4170a | ||
|
|
8016a57b5e | ||
|
|
cc051ceb4b | ||
|
|
252b35b2f0 | ||
|
|
ef21d78c99 | ||
|
|
1d9c1333f2 | ||
|
|
f0222f6d08 | ||
|
|
d2ddbef08f | ||
|
|
d20746613a | ||
|
|
316b7d471a | ||
|
|
2b09caa237 | ||
|
|
7009793170 | ||
|
|
62a89f79b7 | ||
|
|
cc064ea57d | ||
|
|
21f8d63e89 | ||
|
|
c5d297a9ed | ||
|
|
a57d529f39 | ||
|
|
106cdbe455 | ||
|
|
10ce4ee11c | ||
|
|
02f40785aa | ||
|
|
a5ffa2342f | ||
|
|
9d4bfdf47c | ||
|
|
d587632700 | ||
|
|
a0686428ff | ||
|
|
48719ee0dd | ||
|
|
1a31a2efcf | ||
|
|
0430fa67b6 | ||
|
|
491a1a949a | ||
|
|
20ef5bfc93 | ||
|
|
8faa63c3c6 | ||
|
|
de5aa5c32e | ||
|
|
fab57cc395 | ||
|
|
c4dcb51c91 | ||
|
|
a6ca2076d5 | ||
|
|
643e018947 | ||
|
|
110d7646fc | ||
|
|
18254850ab | ||
|
|
24b5aaef0a | ||
|
|
6290b463f5 | ||
|
|
eb5e3096e0 | ||
|
|
6e1ba11e59 | ||
|
|
239b31bc85 | ||
|
|
309ba7234c | ||
|
|
5d8dbbdba4 | ||
|
|
71f2d54258 | ||
|
|
9e714d032b | ||
|
|
ebeae543ee | ||
|
|
b249bbb5b5 | ||
|
|
e438853b09 | ||
|
|
c18d52d1af | ||
|
|
a79604b601 | ||
|
|
06f99ceb3c | ||
|
|
56a1a61c77 | ||
|
|
877532a167 | ||
|
|
cc9eae5d18 | ||
|
|
4636390f7f | ||
|
|
a0a7ab7ec8 | ||
|
|
499adf86a0 | ||
|
|
897170ab15 | ||
|
|
28090216f6 | ||
|
|
fc040825b2 | ||
|
|
5a6547677c | ||
|
|
3e252036c3 | ||
|
|
b484795b8e | ||
|
|
6233a957b4 | ||
|
|
52b88de7f4 | ||
|
|
e0a59cff68 | ||
|
|
d0e294d8a5 | ||
|
|
73e38fccf3 | ||
|
|
b2afbaa315 | ||
|
|
07bf365c7c | ||
|
|
dd1badae81 | ||
|
|
48b9116195 | ||
|
|
771f9bcfa1 | ||
|
|
e5b1350523 | ||
|
|
9c868ee10b | ||
|
|
69c8f45830 | ||
|
|
25f3f2367e | ||
|
|
138f4e3f3c | ||
|
|
0885fc6c23 | ||
|
|
c13953311a | ||
|
|
c42ec32a95 | ||
|
|
e3b32e412c | ||
|
|
5fac39afed | ||
|
|
c641b8df58 | ||
|
|
a1b2289074 | ||
|
|
e34db979b6 | ||
|
|
b1b037f0ea | ||
|
|
e0949e232b | ||
|
|
256e8de40a | ||
|
|
fd60db766e | ||
|
|
d5a4830761 | ||
|
|
3096544cf2 | ||
|
|
63675b3299 | ||
|
|
2951fc92d7 | ||
|
|
cc77bc4076 | ||
|
|
1ca99b6eb0 | ||
|
|
60c23d9e3a | ||
|
|
c652a7fd2d | ||
|
|
1e2af083f0 | ||
|
|
4cb28aeffb | ||
|
|
4cdfe8fc4f | ||
|
|
5d9d50157e | ||
|
|
458e794d00 | ||
|
|
9e736d4340 | ||
|
|
5469e81a87 | ||
|
|
d199c4c35f | ||
|
|
76d041f633 | ||
|
|
90d463c12a | ||
|
|
befcbcdd5d | ||
|
|
3f0de45ec6 | ||
|
|
4aec581306 | ||
|
|
b06628ee31 | ||
|
|
6d9091bef5 | ||
|
|
341abf03ff | ||
|
|
19e042037a | ||
|
|
2bb989e9d8 | ||
|
|
244b76ffed | ||
|
|
8a0d92e2d7 | ||
|
|
0e6f09b241 | ||
|
|
61f6b8c0d4 | ||
|
|
38144a7a69 | ||
|
|
e5130fb3f3 | ||
|
|
333cb3445c | ||
|
|
645fd96634 | ||
|
|
a1460a5bf9 | ||
|
|
8932fc0c36 | ||
|
|
71e794c26f | ||
|
|
a474c31e02 | ||
|
|
c89bd49973 | ||
|
|
6d8e889917 | ||
|
|
f142999bce | ||
|
|
c07401cf76 | ||
|
|
b142de15a8 | ||
|
|
a9623ef85a | ||
|
|
a8f13f334f | ||
|
|
8fa0b69c67 | ||
|
|
fee99779bf | ||
|
|
d61b0dd55c | ||
|
|
4e98acbca7 | ||
|
|
b8e6883a81 | ||
|
|
237195e20e | ||
|
|
4def8cce36 | ||
|
|
71799add0b | ||
|
|
e398a76779 | ||
|
|
33a9304428 | ||
|
|
cfd76b8472 | ||
|
|
ef5e9d66c1 | ||
|
|
c3465d6982 | ||
|
|
736744be3a | ||
|
|
d0e84385f2 | ||
|
|
fc65d8a9fe | ||
|
|
35b469e488 | ||
|
|
e1bf1f0e86 | ||
|
|
8775ce730a | ||
|
|
a5613cb08a | ||
|
|
f792b1e301 | ||
|
|
e2fff5dc47 | ||
|
|
a8a25ceac2 | ||
|
|
67156e6aec | ||
|
|
5de2ab6098 | ||
|
|
ebdb423d3e | ||
|
|
6d249645a6 | ||
|
|
f180b2ba94 | ||
|
|
3328a41f08 | ||
|
|
f688529150 | ||
|
|
11ccb92755 | ||
|
|
ca87b4ede9 | ||
|
|
262f3ccb59 | ||
|
|
a7e00898cb | ||
|
|
0fcf234f07 | ||
|
|
33ad9b8e64 | ||
|
|
55785d50c3 | ||
|
|
bfbe273ffd | ||
|
|
9ddf3b58c3 | ||
|
|
a0b12b001a | ||
|
|
ec06d2c446 | ||
|
|
68ac1e0193 | ||
|
|
45a42faec8 | ||
|
|
3934633947 | ||
|
|
7688228b9c | ||
|
|
118f1143ff | ||
|
|
e8a13f0813 | ||
|
|
1466aef554 | ||
|
|
36d200580b | ||
|
|
ba633c4015 | ||
|
|
ddb07def0d | ||
|
|
74403e3536 | ||
|
|
305c25ae1a | ||
|
|
208ddddc6a | ||
|
|
cc05013715 | ||
|
|
6c1693b8f4 | ||
|
|
922983bd53 | ||
|
|
18dbad5edb | ||
|
|
0da4db4310 | ||
|
|
ea144de438 | ||
|
|
6b17aeb32d | ||
|
|
348cc0cf0e | ||
|
|
08a057bdd5 | ||
|
|
0679b2a7bd | ||
|
|
f88a5867b4 | ||
|
|
245a9cbf63 | ||
|
|
10be8dfad9 | ||
|
|
70f5d0ed3c | ||
|
|
bbae7dd83c | ||
|
|
154de8c629 | ||
|
|
cf74fa4a70 | ||
|
|
8e62af77b9 | ||
|
|
4a487aff23 | ||
|
|
992e54c218 | ||
|
|
99f5a6082e | ||
|
|
b63856ecb4 | ||
|
|
b8e7488a95 | ||
|
|
d06b2cf24b | ||
|
|
05b7542115 | ||
|
|
ecd005cac0 | ||
|
|
9c6e7bdea2 | ||
|
|
5a6ab9cc85 | ||
|
|
8f200cf53f | ||
|
|
f8e5e118e1 | ||
|
|
3d8d6145f2 | ||
|
|
4af194d74b | ||
|
|
b734984d6d | ||
|
|
e98141f4c3 | ||
|
|
9d30fda26d | ||
|
|
795ec9eb55 | ||
|
|
ee005de662 | ||
|
|
75e5a6b6de | ||
|
|
20ce3d0c78 | ||
|
|
8c36079f74 | ||
|
|
e9adb58c16 | ||
|
|
33a8eb0470 | ||
|
|
603f838115 | ||
|
|
0bfc094e18 | ||
|
|
9c321ac070 | ||
|
|
8a824167cf | ||
|
|
fa428932a8 | ||
|
|
941c7f23a3 | ||
|
|
e44e6df221 | ||
|
|
f044a89d50 | ||
|
|
f17d9da36c | ||
|
|
325cb0f7fb | ||
|
|
b34d4fa741 | ||
|
|
c4364b9100 | ||
|
|
cba371678d | ||
|
|
8585976f37 | ||
|
|
b6441683c6 | ||
|
|
55c97241b5 | ||
|
|
e2e96f9aa4 | ||
|
|
501e7606a0 | ||
|
|
0a950d9382 | ||
|
|
c736604366 | ||
|
|
b0b07bde6c | ||
|
|
14f8c151c8 | ||
|
|
45b8670c25 | ||
|
|
c9c0ba67c6 | ||
|
|
9b6c5ddba4 | ||
|
|
54d4fd0e08 | ||
|
|
e695b9ab8c | ||
|
|
cec932d88a | ||
|
|
262a8574d1 | ||
|
|
e62788ad79 | ||
|
|
1a56344f12 | ||
|
|
a348f1a6ab | ||
|
|
39ad1c6ce6 | ||
|
|
745d6bfeed | ||
|
|
6eb7df717c | ||
|
|
c0789dc57b | ||
|
|
841ed95521 | ||
|
|
ddac693762 | ||
|
|
30a9674f25 | ||
|
|
d6e6ed1cfa | ||
|
|
e1f0128576 | ||
|
|
17cbbb0b01 | ||
|
|
391db80499 | ||
|
|
605058c72a | ||
|
|
1d3bdf8fdb | ||
|
|
a2609973b8 | ||
|
|
09e1235832 | ||
|
|
8b8bb15866 | ||
|
|
c043eb54ae | ||
|
|
8178004e6d | ||
|
|
3bb10128ef | ||
|
|
ec1395d072 | ||
|
|
ef5c13f968 | ||
|
|
c52affc6d9 | ||
|
|
609d358b1a | ||
|
|
98cf095b65 | ||
|
|
0e1cdb6536 | ||
|
|
08c86927cb | ||
|
|
cec54e3a8a | ||
|
|
f466751f4d | ||
|
|
9aaf475c8a | ||
|
|
156421d30a | ||
|
|
045c2252d6 | ||
|
|
7c424e0d5f | ||
|
|
779fa531a5 | ||
|
|
404d47f1a1 | ||
|
|
6e957584ac | ||
|
|
d527b644f4 | ||
|
|
9ab327a2b6 | ||
|
|
c82cd0862a | ||
|
|
9f47fc8e34 | ||
|
|
97cf8339aa | ||
|
|
a08b152358 | ||
|
|
6c8689e4ae | ||
|
|
e01ecf1419 | ||
|
|
38f24a037d | ||
|
|
270f7b3eb3 | ||
|
|
81a615d7dd | ||
|
|
8ebb12820c | ||
|
|
d697d752c2 | ||
|
|
3d6e8d53fe | ||
|
|
5f1e37fff0 | ||
|
|
fdd727712f | ||
|
|
a4f407f595 | ||
|
|
ef24485ada | ||
|
|
f212cc7174 | ||
|
|
022017dd0f | ||
|
|
084a8becc5 | ||
|
|
5489e98b9c | ||
|
|
34b5a86d1d | ||
|
|
dc9946fc03 | ||
|
|
88eeee3f4b | ||
|
|
dbaa892665 | ||
|
|
8c3d5a49da | ||
|
|
fdfab39942 | ||
|
|
800bb4f458 | ||
|
|
b5972e9311 | ||
|
|
d1d210605e | ||
|
|
3678aa5614 | ||
|
|
12b5ef6540 | ||
|
|
8273bf26b7 | ||
|
|
2f1756cc15 | ||
|
|
e8f568d79c | ||
|
|
3ef05f4803 | ||
|
|
a19cbde2d7 | ||
|
|
a327294ee9 | ||
|
|
db57eeaefe | ||
|
|
6fae6fb2a4 | ||
|
|
4cd76311ad | ||
|
|
34661c33a2 | ||
|
|
126d3f4563 | ||
|
|
80ae132cad | ||
|
|
fb6ebd19fc | ||
|
|
345856e7be | ||
|
|
041074ccd6 | ||
|
|
3801105b2a | ||
|
|
0d4e7d46c2 | ||
|
|
4fbe8ac6b1 | ||
|
|
9fc6c97139 | ||
|
|
b6f07099cd | ||
|
|
7b7f6d3bc8 | ||
|
|
fe860aaf83 | ||
|
|
2c9496bcf1 | ||
|
|
20df0f5330 | ||
|
|
fd11b78552 | ||
|
|
fe6720fa06 | ||
|
|
0fb81189ca | ||
|
|
12b3eeae9e | ||
|
|
022d695309 | ||
|
|
6a0adfbfbb | ||
|
|
354605e73e | ||
|
|
d92a2d03a7 | ||
|
|
2ad2055bcb | ||
|
|
7ac5a4766d | ||
|
|
2e3a4a6a9b | ||
|
|
c631b61a81 | ||
|
|
f585a71744 | ||
|
|
58a7171911 | ||
|
|
9cebd7f856 | ||
|
|
f77336ba61 | ||
|
|
87e6b1eab9 | ||
|
|
bcbee05a9e | ||
|
|
54a387326c | ||
|
|
5f3f6b7c61 | ||
|
|
9acc722f7f | ||
|
|
4b6ec248a6 | ||
|
|
a8a82d274a | ||
|
|
216acf545f | ||
|
|
9677eae791 | ||
|
|
5bb14a05a0 | ||
|
|
0f1ebcae18 | ||
|
|
6dc0df3afb | ||
|
|
963cd165eb | ||
|
|
e3f8a95784 | ||
|
|
d93395ae48 | ||
|
|
8346e1193c | ||
|
|
6631fc38db | ||
|
|
53abd1a506 | ||
|
|
71b0012e8c | ||
|
|
cf1cdc3fe1 | ||
|
|
e3cd8b4150 | ||
|
|
51363d280d | ||
|
|
d9d133dfb9 | ||
|
|
3d4576ae38 | ||
|
|
c8293998d9 | ||
|
|
ba60c869c9 | ||
|
|
3d7381446d | ||
|
|
2646c8554d | ||
|
|
b8976426eb | ||
|
|
ecc6fbfeb2 | ||
|
|
7b1c62ba53 | ||
|
|
6a4f1b2188 | ||
|
|
5efae1ad55 | ||
|
|
84654ffc5d | ||
|
|
e347823ff4 | ||
|
|
05be6bd877 | ||
|
|
13a3122bf3 | ||
|
|
99a2c934a3 | ||
|
|
541cd59a49 | ||
|
|
d27dc71dfe | ||
|
|
8e627a5809 | ||
|
|
f2e293a149 | ||
|
|
6baaaaf91a | ||
|
|
79b3f8273a | ||
|
|
5dc399b32e | ||
|
|
f64fa06e22 | ||
|
|
b4949f7f0b | ||
|
|
644c3b787f | ||
|
|
90e1d9e3d6 | ||
|
|
1a9023d396 | ||
|
|
df1d74a879 | ||
|
|
116595b351 | ||
|
|
feb4f17e3d | ||
|
|
c125995d94 | ||
|
|
247e75595c | ||
|
|
ff2dbadc9d | ||
|
|
1ad8b150e8 | ||
|
|
56bd69d5af | ||
|
|
09bb3686cc | ||
|
|
96c0b21285 | ||
|
|
80fb56b8a5 | ||
|
|
b669aa2395 | ||
|
|
bea196aa30 | ||
|
|
292f0420ad | ||
|
|
bed3aff059 | ||
|
|
fc99431754 | ||
|
|
68018ef397 | ||
|
|
7190b3811d | ||
|
|
72f8fde7ef | ||
|
|
60e9a61647 | ||
|
|
9ba173bc2d | ||
|
|
6aa69da3ef | ||
|
|
148e8f468f | ||
|
|
f6f7a62d80 | ||
|
|
5c4f0d42b7 | ||
|
|
052b25af0a | ||
|
|
a85ff941ca | ||
|
|
d1ff812021 | ||
|
|
13b16a4364 | ||
|
|
4a5ed7f06c | ||
|
|
3f962a55c3 | ||
|
|
63b3696af0 | ||
|
|
d2f9bca1cf | ||
|
|
2f18383349 | ||
|
|
588f35b6e9 | ||
|
|
99f9c3f8e2 | ||
|
|
4e370d7a18 | ||
|
|
3675aa348a | ||
|
|
4b6d8af218 | ||
|
|
a82d1becc3 | ||
|
|
38f0df3d53 | ||
|
|
29a64be939 | ||
|
|
99995b2497 | ||
|
|
5e16074b92 | ||
|
|
efe5e09c3a | ||
|
|
6df728c445 | ||
|
|
96a9fa07f0 | ||
|
|
2dd15e9f63 | ||
|
|
8141be97f6 | ||
|
|
b225d1188c | ||
|
|
34b202b868 | ||
|
|
16874e1953 | ||
|
|
9f42a1a036 | ||
|
|
343854752c | ||
|
|
dccfae3853 | ||
|
|
76562f4250 | ||
|
|
205dc90746 | ||
|
|
922222a813 | ||
|
|
4854258047 | ||
|
|
92cbfef7ab | ||
|
|
74409c2c64 | ||
|
|
1b85958bcc | ||
|
|
e592f6eac8 | ||
|
|
7c35da9fc4 | ||
|
|
c93dcc948a | ||
|
|
59ffd1dc94 | ||
|
|
bc09143856 | ||
|
|
bc5e60defb | ||
|
|
01b310635e | ||
|
|
794bad8bcb | ||
|
|
d5a2de6222 | ||
|
|
150105505b | ||
|
|
319f066aec | ||
|
|
eb6cd4f8d0 | ||
|
|
edffbad837 | ||
|
|
75c1016ec0 | ||
|
|
74605f6159 | ||
|
|
cbc978ea08 | ||
|
|
b45e1d8c0d | ||
|
|
7919787fb7 | ||
|
|
e64357698d | ||
|
|
84bd579077 | ||
|
|
f9e09ba490 | ||
|
|
3ff4e19dd2 | ||
|
|
4fb8c2c5e1 | ||
|
|
34d5cd2bd8 | ||
|
|
4e03dfea43 | ||
|
|
3c58ab5fcb | ||
|
|
26c3977fb9 | ||
|
|
def909a913 | ||
|
|
6562ec6531 | ||
|
|
064b2fbc4a | ||
|
|
0ea901c7c1 | ||
|
|
7b907add77 | ||
|
|
84d774ea34 | ||
|
|
26bddcb65c | ||
|
|
97609e4995 | ||
|
|
14a816d173 | ||
|
|
378b96ec1b | ||
|
|
ea734ba1c8 | ||
|
|
9c494705a8 | ||
|
|
cc36b87345 | ||
|
|
c832e456e0 | ||
|
|
3ef1b7073d | ||
|
|
738cf650b3 | ||
|
|
cc951450fb | ||
|
|
75c16432a4 | ||
|
|
8b41eb9f14 | ||
|
|
1cbacf20dc | ||
|
|
0bb5c808e5 | ||
|
|
c8ef619090 | ||
|
|
952bd39536 | ||
|
|
18e94d9e60 | ||
|
|
78012b8111 | ||
|
|
0baed742e4 | ||
|
|
6aa998e047 | ||
|
|
d00f51b531 | ||
|
|
e6e3acdbe4 | ||
|
|
7c1d70aa17 | ||
|
|
e42fd8ae91 | ||
|
|
16c6bfce8e | ||
|
|
44292afff2 | ||
|
|
1812473d27 | ||
|
|
b9937549aa | ||
|
|
185a1fbed7 | ||
|
|
95acb1583d | ||
|
|
c2b7a14ed5 | ||
|
|
6e4050fa81 | ||
|
|
aa6846395d | ||
|
|
49abb9df9c | ||
|
|
d8fa967b43 | ||
|
|
f409e16137 | ||
|
|
b11b00a9ff | ||
|
|
778df6be71 | ||
|
|
48363ec861 | ||
|
|
3a5d93d673 | ||
|
|
90efc2ea7a | ||
|
|
f7e03f6d63 | ||
|
|
1c52a6993f | ||
|
|
6c3074061b | ||
|
|
c14cbe926a | ||
|
|
8054bdc896 | ||
|
|
e55e9a7b67 | ||
|
|
2335f11b00 | ||
|
|
95c7b07c20 | ||
|
|
8dd5756ce9 | ||
|
|
209975e065 | ||
|
|
2d6c3cd4fa | ||
|
|
ca195097d7 | ||
|
|
ded606c7cb | ||
|
|
48e5ac0169 | ||
|
|
02e216c135 | ||
|
|
7eabf8ab0f | ||
|
|
88ef86ad5c | ||
|
|
ca2c942b65 | ||
|
|
dbb54cfcfa | ||
|
|
3646fd1449 | ||
|
|
996832dc72 | ||
|
|
41d36a5ecc | ||
|
|
f4fdfe8d8c | ||
|
|
28df08b907 | ||
|
|
dffbfee62b | ||
|
|
53810a0ff7 | ||
|
|
56394d2879 | ||
|
|
b32673db8e | ||
|
|
a3d1212e79 | ||
|
|
d7205aed36 | ||
|
|
0404e33437 | ||
|
|
f65d157244 | ||
|
|
f76af869f1 | ||
|
|
5ccb01343e | ||
|
|
b3c1507708 | ||
|
|
9f78db0579 | ||
|
|
ebfbef1f68 | ||
|
|
9b1048caf7 | ||
|
|
12cfb48f16 | ||
|
|
4b0639cfbd | ||
|
|
cbecd7b66f | ||
|
|
702486dab7 | ||
|
|
29081f4429 | ||
|
|
124d97c26d | ||
|
|
55965eea7d | ||
|
|
925177b150 | ||
|
|
78197bb5c3 | ||
|
|
da3f4dc7e4 | ||
|
|
715d56d4f0 | ||
|
|
8b2af0b5ef | ||
|
|
23d77ee338 | ||
|
|
8dcc21052f | ||
|
|
5bb42e56a8 | ||
|
|
7722a9c347 | ||
|
|
36d25c4f1d | ||
|
|
01b6a10cd1 | ||
|
|
4ce072c4b3 | ||
|
|
4089e38283 | ||
|
|
89ad362758 | ||
|
|
f0d4a4cf9a | ||
|
|
82c725817e | ||
|
|
596e11ec6d | ||
|
|
634f0b4cc4 | ||
|
|
c28755ccd2 | ||
|
|
2ddee7e745 | ||
|
|
e92bc0e2e6 | ||
|
|
1610d2ebd9 | ||
|
|
3e59be7f1d | ||
|
|
d078e7b1f6 | ||
|
|
4d910936b7 | ||
|
|
5c7d7f558d | ||
|
|
5f2be2a9bb | ||
|
|
3a1c5a6dab | ||
|
|
429e1b4b48 | ||
|
|
83e1088d42 | ||
|
|
71e8ddd9a2 | ||
|
|
d00c5da8b7 | ||
|
|
3e3a1ecbc8 | ||
|
|
ef6a0044f4 | ||
|
|
c73feebf25 | ||
|
|
ad41ef3991 | ||
|
|
1482fd4d4d | ||
|
|
b02323ade6 | ||
|
|
89c7819cb7 | ||
|
|
6a0297cc86 | ||
|
|
7669b85da6 | ||
|
|
6e70b914c2 | ||
|
|
9bcca43299 | ||
|
|
1673bb5558 | ||
|
|
88d1a29a84 | ||
|
|
da98b92dd4 | ||
|
|
7ad96036b0 | ||
|
|
58d86d7876 | ||
|
|
a15711e635 | ||
|
|
e590d75b20 | ||
|
|
49ab201c30 | ||
|
|
ba47f2ab39 | ||
|
|
874cffd256 | ||
|
|
52f68167ce | ||
|
|
f08e9539f1 | ||
|
|
37f7f9fd1d | ||
|
|
b9fb656657 | ||
|
|
86e2bec9a0 | ||
|
|
c2249eadb2 | ||
|
|
b2718d330c | ||
|
|
31e933207f | ||
|
|
9c76150895 | ||
|
|
83ed8561ee | ||
|
|
88c42b3043 | ||
|
|
6308388dfc | ||
|
|
802472cd99 | ||
|
|
f664a74e77 | ||
|
|
bfd516c1a4 | ||
|
|
58c2c3b71a | ||
|
|
effb52f859 | ||
|
|
55f5be7b03 | ||
|
|
9a63f89f33 | ||
|
|
53809298c0 | ||
|
|
5b37e988e6 | ||
|
|
75ff871217 | ||
|
|
979088b3dc | ||
|
|
255781e135 | ||
|
|
b2d229c116 | ||
|
|
f4cef377ca | ||
|
|
20cb314171 | ||
|
|
07cf5a214a | ||
|
|
7364bac8ae | ||
|
|
62704cac09 | ||
|
|
77755c0284 | ||
|
|
4c135ea316 | ||
|
|
0a86220d42 | ||
|
|
362063f5fe | ||
|
|
571e8c2548 | ||
|
|
4b79d8216f | ||
|
|
61e131f95c | ||
|
|
af30d01e85 | ||
|
|
171ce19e1f | ||
|
|
e588f7c528 | ||
|
|
c9fc4d1296 | ||
|
|
11f0a9f196 | ||
|
|
48870d9170 | ||
|
|
279662620b | ||
|
|
2ec8da89e8 | ||
|
|
bf427cd8dd | ||
|
|
1d77fe712c | ||
|
|
2f31de5ed5 | ||
|
|
d97682fdac | ||
|
|
f5cf09424b | ||
|
|
a2c668268f | ||
|
|
d688ddf92c | ||
|
|
8f36572a9b | ||
|
|
41ac1e24c9 | ||
|
|
6c2a8a5bce | ||
|
|
e111eda6ae | ||
|
|
e562114f6b | ||
|
|
46269ddfd3 | ||
|
|
0ba838b53a | ||
|
|
8271abe729 | ||
|
|
c12ec1fd03 | ||
|
|
257a421e45 | ||
|
|
4e6b66b139 | ||
|
|
3ff5074cf5 | ||
|
|
68e635cc32 | ||
|
|
67a8795b1f | ||
|
|
79b1b1d350 | ||
|
|
afd162de01 | ||
|
|
8f491d72de | ||
|
|
5889eceba4 | ||
|
|
89354def9b | ||
|
|
b1940519c3 | ||
|
|
ecf9730cd7 | ||
|
|
017e8c1aef | ||
|
|
a6f313589e | ||
|
|
70f6b8266c | ||
|
|
8bfd5828e6 | ||
|
|
92d81d3b16 | ||
|
|
61403138d5 | ||
|
|
ea3dc2cfa3 | ||
|
|
260272dca2 | ||
|
|
bf8914d0c8 | ||
|
|
faad1297f4 | ||
|
|
0f993b332e | ||
|
|
fa218ff5aa | ||
|
|
a8b83da872 | ||
|
|
c9db5321e7 | ||
|
|
77a45f4215 | ||
|
|
b86a3bb0c5 | ||
|
|
a52c1c8380 | ||
|
|
eff1436857 | ||
|
|
30459ee4ba | ||
|
|
feac71ce1e | ||
|
|
1a1b044d12 | ||
|
|
e4c445f805 | ||
|
|
4b02a8c788 | ||
|
|
b6772d8fc3 | ||
|
|
2a7e4f2b71 | ||
|
|
4915b7214d | ||
|
|
c747562897 | ||
|
|
bab7f39d47 | ||
|
|
36537606da | ||
|
|
ea9ae4ae28 | ||
|
|
d2083dd395 | ||
|
|
a71440f62a | ||
|
|
7db97d8aa9 | ||
|
|
f0f6390366 | ||
|
|
2fbc609233 |
2
.gitattributes
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
# Exclude tests data file from programming stats on Github
|
||||
tests/data/** linguist-vendored
|
||||
42
.github/ISSUE_TEMPLATE/bug-report.md
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
name: Bug Report
|
||||
about: Create a bug to help fix something that might not be working correctly
|
||||
title: "[FIX]"
|
||||
labels: fix
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Describe the bug
|
||||
A clear and concise description of what the bug is. Please include what you were expecting to happen vs. what actually happened.
|
||||
|
||||
## To Reproduce
|
||||
Steps to reproduce the behavior:
|
||||
|
||||
## Screenshots
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
## Platform
|
||||
- Server:
|
||||
- [ ] Cloud-Hosted (https://app.khoj.dev)
|
||||
- [ ] Self-Hosted Docker
|
||||
- [ ] Self-Hosted Python package
|
||||
- [ ] Self-Hosted source code
|
||||
- Client:
|
||||
- [ ] Obsidian
|
||||
- [ ] Emacs
|
||||
- [ ] Desktop app
|
||||
- [ ] Web browser
|
||||
- [ ] WhatsApp
|
||||
- OS:
|
||||
- [ ] Windows
|
||||
- [ ] macOS
|
||||
- [ ] Linux
|
||||
- [ ] Android
|
||||
- [ ] iOS
|
||||
|
||||
### If self-hosted
|
||||
- Server Version [e.g. 1.0.1]:
|
||||
|
||||
## Additional context
|
||||
Add any other context about the problem here.
|
||||
11
.github/ISSUE_TEMPLATE/feature-request.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest an idea to help make Khoj a better tool
|
||||
title: "[IDEA]"
|
||||
labels: "upgrade"
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Describe the feature you'd like
|
||||
A clear and concise description of what you want to happen. Include any relevant links or screenshots or inspiration.
|
||||
4
.github/workflows/build_khoj_el.yml
vendored
@@ -21,9 +21,9 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.9
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v1
|
||||
with: { python-version: 3.9 }
|
||||
with: { python-version: 3.11 }
|
||||
- name: ⏬️ Install Dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
|
||||
99
.github/workflows/desktop.yml
vendored
Normal file
@@ -0,0 +1,99 @@
|
||||
name: desktop
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "*"
|
||||
branches:
|
||||
- 'master'
|
||||
paths:
|
||||
- src/interface/desktop/**
|
||||
- .github/workflows/desktop.yml
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: 🖥️ Build, Release Desktop App
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
TODESKTOP_ACCESS_TOKEN: ${{ secrets.TODESKTOP_ACCESS_TOKEN }}
|
||||
TODESKTOP_EMAIL: ${{ secrets.TODESKTOP_EMAIL }}
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
working-directory: src/interface/desktop
|
||||
steps:
|
||||
- name: ⬇️ Checkout Code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: ⤵️ Install Node
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: "lts/*"
|
||||
|
||||
- name: ⚙️ Setup Desktop Build
|
||||
run: |
|
||||
yarn
|
||||
npm install -g @todesktop/cli
|
||||
sed -i "s/\"id\": \"\"/\"id\": \"${{ secrets.TODESKTOP_ID }}\"/g" todesktop.json
|
||||
|
||||
- name: ⚙️ Build Desktop App
|
||||
run: |
|
||||
npx todesktop build
|
||||
|
||||
- name: 📦 Release Desktop App
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
npx todesktop release --latest --force
|
||||
|
||||
- name: ⤵️ Get Desktop Apps
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: |
|
||||
build_no=`npx todesktop builds --latest | tail -n 1 | awk -F'/' '{print $NF}'`
|
||||
sleep 900 # wait for 15 minutes for the build to be available
|
||||
wget https://download.khoj.dev/builds/$build_no/mac/dmg/arm64 -O khoj-${{ github.ref_name }}-arm64.dmg
|
||||
wget https://download.khoj.dev/builds/$build_no/mac/dmg/x64 -O khoj-${{ github.ref_name }}-x64.dmg
|
||||
wget https://download.khoj.dev/builds/$build_no/windows/nsis/x64 -O khoj-${{ github.ref_name }}-x64.exe
|
||||
wget https://download.khoj.dev/builds/$build_no/linux/deb/x64 -O khoj-${{ github.ref_name }}-x64.deb
|
||||
wget https://download.khoj.dev/builds/$build_no/linux/appImage/x64 -O khoj-${{ github.ref_name }}-x64.AppImage
|
||||
|
||||
- name: ⏫ Upload Mac ARM App
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
if-no-files-found: warn
|
||||
name: khoj-${{ github.ref_name }}-arm64.dmg
|
||||
path: src/interface/desktop/khoj-${{ github.ref_name }}-arm64.dmg
|
||||
|
||||
- name: ⏫ Upload Mac x64 App
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
if-no-files-found: warn
|
||||
name: khoj-${{ github.ref_name }}-x64.dmg
|
||||
path: src/interface/desktop/khoj-${{ github.ref_name }}-x64.dmg
|
||||
|
||||
- name: ⏫ Upload Windows App
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
if-no-files-found: warn
|
||||
name: khoj-${{ github.ref_name }}-x64.exe
|
||||
path: src/interface/desktop/khoj-${{ github.ref_name }}-x64.exe
|
||||
|
||||
- name: ⏫ Upload Debian App
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
if-no-files-found: warn
|
||||
name: khoj-${{ github.ref_name }}-x64.deb
|
||||
path: src/interface/desktop/khoj-${{ github.ref_name }}-x64.deb
|
||||
|
||||
- name: ⏫ Upload Linux App Image
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
if-no-files-found: warn
|
||||
name: khoj-${{ github.ref_name }}-x64.AppImage
|
||||
path: src/interface/desktop/khoj-${{ github.ref_name }}-x64.AppImage
|
||||
66
.github/workflows/dockerize.yml
vendored
@@ -8,23 +8,52 @@ on:
|
||||
- master
|
||||
paths:
|
||||
- src/khoj/**
|
||||
- config/**
|
||||
- src/interface/web/**
|
||||
- pyproject.toml
|
||||
- Dockerfile
|
||||
- prod.Dockerfile
|
||||
- docker-compose.yml
|
||||
- .github/workflows/dockerize.yml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
tag:
|
||||
description: 'Docker image tag'
|
||||
default: 'dev'
|
||||
khoj:
|
||||
description: 'Build Khoj docker image'
|
||||
type: boolean
|
||||
default: true
|
||||
khoj-cloud:
|
||||
description: 'Build Khoj cloud docker image'
|
||||
type: boolean
|
||||
default: true
|
||||
|
||||
env:
|
||||
DOCKER_IMAGE_TAG: ${{ github.ref == 'refs/heads/master' && 'latest' || github.ref_name }}
|
||||
# Tag Image with tag name on release
|
||||
# else with user specified tag (default 'dev') if triggered via workflow
|
||||
# else with run_id if triggered via a pull request
|
||||
# else with 'pre' (if push to master)
|
||||
DOCKER_IMAGE_TAG: ${{ github.ref_type == 'tag' && github.ref_name || github.event_name == 'workflow_dispatch' && github.event.inputs.tag || 'pre' }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build Docker Image, Push to Container Registry
|
||||
name: Publish Khoj Docker Images
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
image:
|
||||
- 'local'
|
||||
- 'cloud'
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
# Get all history to correctly infer Khoj version using hatch
|
||||
fetch-depth: 0
|
||||
|
||||
- name: 🧹 Delete huge unnecessary tools folder
|
||||
run: rm -rf /opt/hostedtoolcache
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
@@ -36,12 +65,39 @@ jobs:
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.PAT }}
|
||||
|
||||
- name: Get App Version
|
||||
id: hatch
|
||||
run: echo "version=$(pipx run hatch version)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: 🧹 Delete huge unnecessary tools folder
|
||||
run: rm -rf /opt/hostedtoolcache
|
||||
|
||||
- name: 📦 Build and Push Docker Image
|
||||
uses: docker/build-push-action@v2
|
||||
if: (matrix.image == 'local' && github.event_name == 'workflow_dispatch') && github.event.inputs.khoj == 'true' || (matrix.image == 'local' && github.event_name == 'push')
|
||||
with:
|
||||
context: .
|
||||
file: Dockerfile
|
||||
platforms: linux/amd64, linux/arm64
|
||||
push: true
|
||||
tags: ghcr.io/${{ github.repository }}:${{ env.DOCKER_IMAGE_TAG }}
|
||||
tags: |
|
||||
ghcr.io/${{ github.repository }}:${{ env.DOCKER_IMAGE_TAG }}
|
||||
${{ github.ref_type == 'tag' && format('ghcr.io/{0}:latest', github.repository) || '' }}
|
||||
build-args: |
|
||||
PORT=8000
|
||||
VERSION=${{ steps.hatch.outputs.version }}
|
||||
PORT=42110
|
||||
|
||||
- name: 📦️⛅️ Build and Push Cloud Docker Image
|
||||
uses: docker/build-push-action@v2
|
||||
if: (matrix.image == 'cloud' && github.event_name == 'workflow_dispatch') && github.event.inputs.khoj-cloud == 'true' || (matrix.image == 'cloud' && github.event_name == 'push')
|
||||
with:
|
||||
context: .
|
||||
file: prod.Dockerfile
|
||||
platforms: linux/amd64, linux/arm64
|
||||
push: true
|
||||
tags: |
|
||||
ghcr.io/${{ github.repository }}-cloud:${{ env.DOCKER_IMAGE_TAG }}
|
||||
${{ github.ref_type == 'tag' && format('ghcr.io/{0}-cloud:latest', github.repository) || '' }}
|
||||
build-args: |
|
||||
VERSION=${{ steps.hatch.outputs.version }}
|
||||
PORT=42110
|
||||
|
||||
46
.github/workflows/github_pages_deploy.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
name: build and deploy github pages for documentation
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pages: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
environment:
|
||||
name: github-pages
|
||||
url: https://docs.khoj.dev
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
# 👇 Build steps
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 18.x
|
||||
cache: yarn
|
||||
cache-dependency-path: documentation/yarn.lock
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
cd documentation
|
||||
yarn install --frozen-lockfile --non-interactive
|
||||
- name: Build
|
||||
run: |
|
||||
cd documentation
|
||||
yarn build
|
||||
# 👆 Build steps
|
||||
- name: Setup Pages
|
||||
uses: actions/configure-pages@v3
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-pages-artifact@v2
|
||||
with:
|
||||
# 👇 Specify build output path
|
||||
path: documentation/build
|
||||
- name: Deploy to GitHub Pages
|
||||
id: deployment
|
||||
uses: actions/deploy-pages@v2
|
||||
48
.github/workflows/pre-commit.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
name: pre-commit
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- src/**
|
||||
- tests/**
|
||||
- config/**
|
||||
- pyproject.toml
|
||||
- .pre-commit-config.yml
|
||||
- .github/workflows/test.yml
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- src/khoj/**
|
||||
- tests/**
|
||||
- config/**
|
||||
- pyproject.toml
|
||||
- .pre-commit-config.yml
|
||||
- .github/workflows/test.yml
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Setup Application and Lint
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3.11
|
||||
|
||||
- name: ⏬️ Install Dependencies
|
||||
run: |
|
||||
sudo apt update && sudo apt install -y libegl1
|
||||
python -m pip install --upgrade pip
|
||||
|
||||
- name: ⬇️ Install Application
|
||||
run: pip install --no-cache-dir --upgrade .[dev]
|
||||
|
||||
- name: 🌡️ Validate Application
|
||||
run: pre-commit run --hook-stage manual --all
|
||||
38
.github/workflows/pypi.yml
vendored
@@ -8,6 +8,7 @@ on:
|
||||
- 'master'
|
||||
paths:
|
||||
- src/khoj/**
|
||||
- src/interface/web/**
|
||||
- pyproject.toml
|
||||
- .github/workflows/pypi.yml
|
||||
pull_request:
|
||||
@@ -15,26 +16,41 @@ on:
|
||||
- 'master'
|
||||
paths:
|
||||
- src/khoj/**
|
||||
- src/interface/web/**
|
||||
- pyproject.toml
|
||||
- .github/workflows/pypi.yml
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
name: Publish Python Package to PyPI
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
id-token: write
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Python 3.10
|
||||
- name: Set up Python 3.11
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.10'
|
||||
python-version: '3.11'
|
||||
|
||||
- name: ⬇️ Install Application
|
||||
- name: ⬇️ Install Server
|
||||
run: python -m pip install --upgrade pip && pip install --upgrade .
|
||||
|
||||
- name: ⬇️ Install Web Client
|
||||
run: |
|
||||
yarn install
|
||||
yarn pypiciexport
|
||||
working-directory: src/interface/web
|
||||
|
||||
- name: 📂 Copy Generated Files
|
||||
run: |
|
||||
mkdir -p src/khoj/interface/compiled
|
||||
cp -r /opt/hostedtoolcache/Python/3.11.10/x64/lib/python3.11/site-packages/khoj/interface/compiled/* src/khoj/interface/compiled/
|
||||
|
||||
- name: ⚙️ Build Python Package
|
||||
run: |
|
||||
# Setup Environment for Reproducible Builds
|
||||
@@ -42,23 +58,23 @@ jobs:
|
||||
export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
|
||||
rm -rf dist
|
||||
|
||||
# Build PyPi Package
|
||||
# Build PyPI Package
|
||||
pipx run build
|
||||
|
||||
- name: 🌡️ Validate Python Package
|
||||
run: |
|
||||
# Validate PyPi Package
|
||||
pipx run check-wheel-contents dist/*.whl
|
||||
pipx run check-wheel-contents dist/*.whl --ignore W004
|
||||
pipx run twine check dist/*
|
||||
|
||||
- name: ⏫ Upload Python Package Artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: khoj-assistant
|
||||
path: dist/*.whl
|
||||
name: khoj
|
||||
path: dist/khoj-*.whl
|
||||
|
||||
- name: 📦 Publish Python Package to PyPI
|
||||
if: startsWith(github.ref, 'refs/tags') || github.ref == 'refs/heads/master'
|
||||
uses: pypa/gh-action-pypi-publish@v1.6.4
|
||||
uses: pypa/gh-action-pypi-publish@v1.8.14
|
||||
with:
|
||||
password: ${{ secrets.PYPI_API_KEY }}
|
||||
skip-existing: true
|
||||
|
||||
108
.github/workflows/release.yml
vendored
@@ -15,6 +15,8 @@ jobs:
|
||||
publish_obsidian_plugin:
|
||||
name: 💎 Publish Obsidian Plugin
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
@@ -62,109 +64,3 @@ jobs:
|
||||
src/interface/obsidian/main.js
|
||||
src/interface/obsidian/manifest.json
|
||||
src/interface/obsidian/styles.css
|
||||
|
||||
publish_desktop_apps:
|
||||
name: 🖥️ Publish Desktop Apps
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-latest
|
||||
extension: deb
|
||||
- os: macos-latest
|
||||
extension: dmg
|
||||
- os: windows-latest
|
||||
extension: exe
|
||||
runs-on: ${{ matrix.os }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
- name: Set up Python 3.9
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.9'
|
||||
|
||||
- name: ⏬️ Install Dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
if [ "$RUNNER_OS" == "Linux" ]; then
|
||||
sudo apt install libegl1 libxcb-xinerama0 python3-tk -y
|
||||
fi
|
||||
python -m pip install --upgrade pip
|
||||
pip install pyinstaller
|
||||
|
||||
- name: ⬇️ Install Khoj App
|
||||
run: |
|
||||
pip install --upgrade .
|
||||
|
||||
- name: 📦 Package Khoj App
|
||||
shell: bash
|
||||
run: |
|
||||
# Setup Environment for Reproducible Builds
|
||||
export PYTHONHASHSEED=42
|
||||
export SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
|
||||
|
||||
pyinstaller --noconfirm Khoj.spec
|
||||
if [ "$RUNNER_OS" == "Windows" ]; then
|
||||
mv dist/Khoj.exe dist/khoj_"$GITHUB_REF_NAME"_amd64.exe
|
||||
fi
|
||||
|
||||
- name: 💻 Create Mac App DMG
|
||||
if: matrix.os == 'macos-latest'
|
||||
run: |
|
||||
# Install Mac DMG Creator
|
||||
brew install create-dmg
|
||||
# Copy app to separate dmg folder
|
||||
mkdir -p dist/dmg && cp -r dist/Khoj.app dist/dmg
|
||||
# Create disk image with the app
|
||||
create-dmg \
|
||||
--volname "Khoj" \
|
||||
--volicon "src/khoj/interface/web/assets/icons/favicon.icns" \
|
||||
--window-pos 200 120 \
|
||||
--window-size 600 300 \
|
||||
--icon-size 100 \
|
||||
--icon "Khoj.app" 175 120 \
|
||||
--hide-extension "Khoj.app" \
|
||||
--app-drop-link 425 120 \
|
||||
"dist/khoj_"$GITHUB_REF_NAME"_amd64.dmg" \
|
||||
"dist/dmg/"
|
||||
|
||||
- uses: ruby/setup-ruby@v1
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
with:
|
||||
ruby-version: '3.0'
|
||||
- name: 🐧 Create Debian Package
|
||||
if: matrix.os == 'ubuntu-latest'
|
||||
shell: bash
|
||||
env:
|
||||
DEBIAN_PACKAGE_VERSION: ${{ inputs.version }}
|
||||
run: |
|
||||
# Install Debian Packager
|
||||
gem install fpm
|
||||
|
||||
# Copy app files into expected output directory structure
|
||||
mkdir -p package/opt package/usr/share/applications package/usr/share/icons/hicolor/128x128/apps
|
||||
cp -r dist/Khoj package/opt/Khoj
|
||||
cp src/khoj/interface/web/assets/icons/favicon-128x128.png package/usr/share/icons/hicolor/128x128/apps/Khoj.png
|
||||
cp Khoj.desktop package/usr/share/applications
|
||||
|
||||
# Fix permissions to be usable by non-root users
|
||||
find package/usr/share -type f -exec chmod 644 -- {} +
|
||||
chmod 755 package/opt/Khoj
|
||||
|
||||
# Package the app
|
||||
if [ -z "$DEBIAN_PACKAGE_VERSION" ]; then
|
||||
DEBIAN_PACKAGE_VERSION=$(echo $GITHUB_REF_NAME | sed -E 's/v(.*)/\1/g')
|
||||
fi
|
||||
fpm -C package -s dir -t deb -n Khoj --version $DEBIAN_PACKAGE_VERSION -p dist/khoj_"$GITHUB_REF_NAME"_amd64.deb
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: khoj_${{github.ref_name}}_amd64.${{matrix.extension}}
|
||||
path: dist/khoj_${{github.ref_name}}_amd64.${{matrix.extension}}
|
||||
|
||||
- name: 🌈 Release
|
||||
uses: softprops/action-gh-release@v1
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
generate_release_notes: true
|
||||
files: dist/khoj_${{github.ref_name}}_amd64.${{matrix.extension}}
|
||||
|
||||
54
.github/workflows/test.yml
vendored
@@ -2,8 +2,6 @@ name: test
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- 'master'
|
||||
paths:
|
||||
- src/khoj/**
|
||||
- tests/**
|
||||
@@ -13,7 +11,7 @@ on:
|
||||
- .github/workflows/test.yml
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- master
|
||||
paths:
|
||||
- src/khoj/**
|
||||
- tests/**
|
||||
@@ -26,32 +24,66 @@ jobs:
|
||||
test:
|
||||
name: Run Tests
|
||||
runs-on: ubuntu-latest
|
||||
container: ubuntu:jammy
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python_version:
|
||||
- '3.8'
|
||||
- '3.9'
|
||||
- '3.10'
|
||||
- '3.11'
|
||||
- '3.12'
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: ankane/pgvector
|
||||
env:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_USER: postgres
|
||||
ports:
|
||||
- 5432:5432
|
||||
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: ${{ matrix.python_version }}
|
||||
|
||||
- name: ⏬️ Install Dependencies
|
||||
- name: Install Git
|
||||
run: |
|
||||
sudo apt update && sudo apt install -y libegl1
|
||||
apt update && apt install -y git
|
||||
|
||||
- name: ⏬️ Install Dependencies
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
run: |
|
||||
apt update && apt install -y libegl1 sqlite3 libsqlite3-dev libsqlite3-0 ffmpeg libsm6 libxext6
|
||||
|
||||
- name: ⬇️ Install Postgres
|
||||
env:
|
||||
DEBIAN_FRONTEND: noninteractive
|
||||
run : |
|
||||
apt install -y postgresql postgresql-client && apt install -y postgresql-server-dev-14
|
||||
|
||||
- name: ⬇️ Install pip
|
||||
run: |
|
||||
apt install -y python3-pip
|
||||
python -m ensurepip --upgrade
|
||||
python -m pip install --upgrade pip
|
||||
|
||||
- name: ⬇️ Install Application
|
||||
run: pip install --upgrade .[dev]
|
||||
|
||||
- name: 🌡️ Validate Application
|
||||
run: pre-commit run --hook-stage manual --all
|
||||
run: sed -i 's/dynamic = \["version"\]/version = "0.0.0"/' pyproject.toml && pip install --upgrade .[dev]
|
||||
|
||||
- name: 🧪 Test Application
|
||||
env:
|
||||
POSTGRES_HOST: postgres
|
||||
POSTGRES_PORT: 5432
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_DB: postgres
|
||||
run: pytest
|
||||
timeout-minutes: 10
|
||||
|
||||
10
.gitignore
vendored
@@ -12,15 +12,19 @@ __pycache__
|
||||
.vscode
|
||||
.env
|
||||
.venv/*
|
||||
todesktop.json
|
||||
|
||||
# Build artifacts
|
||||
/src/khoj/interface/web/images
|
||||
/src/khoj/interface/built/
|
||||
/src/khoj/interface/compiled/404.html
|
||||
/build/
|
||||
/dist/
|
||||
khoj_assistant.egg-info
|
||||
/config/khoj*.yml
|
||||
.pytest_cache
|
||||
khoj.log
|
||||
*.log
|
||||
/src/khoj/static
|
||||
|
||||
# Obsidian plugin artifacts
|
||||
# ---
|
||||
@@ -29,10 +33,12 @@ node_modules
|
||||
|
||||
# Don't include the compiled obsidian main.js file in the repo.
|
||||
# They should be uploaded to GitHub releases instead.
|
||||
main.js
|
||||
src/interface/obsidian/main.js
|
||||
|
||||
# Exclude sourcemaps
|
||||
*.map
|
||||
# IntelliJ
|
||||
.idea
|
||||
|
||||
# obsidian
|
||||
data.json
|
||||
|
||||
@@ -15,6 +15,13 @@ repos:
|
||||
- id: check-toml
|
||||
- id: check-yaml
|
||||
|
||||
- repo: https://github.com/pycqa/isort
|
||||
rev: 5.12.0
|
||||
hooks:
|
||||
- id: isort
|
||||
name: isort (python)
|
||||
args: ["--profile", "black", "--filter-files"]
|
||||
|
||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||
rev: v1.0.0
|
||||
hooks:
|
||||
|
||||
46
Dockerfile
@@ -1,18 +1,48 @@
|
||||
# syntax=docker/dockerfile:1
|
||||
FROM ubuntu:kinetic
|
||||
LABEL org.opencontainers.image.source https://github.com/khoj-ai/khoj
|
||||
FROM ubuntu:jammy
|
||||
LABEL homepage="https://khoj.dev"
|
||||
LABEL repository="https://github.com/khoj-ai/khoj"
|
||||
LABEL org.opencontainers.image.source="https://github.com/khoj-ai/khoj"
|
||||
LABEL org.opencontainers.image.description="Your second brain, containerized for personal, local deployment."
|
||||
|
||||
# Install System Dependencies
|
||||
RUN apt update -y && \
|
||||
apt -y install python3-pip python3-pyqt6 git
|
||||
RUN apt update -y && apt -y install \
|
||||
python3-pip \
|
||||
swig \
|
||||
curl \
|
||||
# Required by RapidOCR
|
||||
libgl1 \
|
||||
libglx-mesa0 \
|
||||
libglib2.0-0 && \
|
||||
# Required by Next.js Web app
|
||||
curl -sL https://deb.nodesource.com/setup_20.x | bash - && \
|
||||
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
|
||||
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
|
||||
apt update -y && apt -y --no-install-recommends install nodejs yarn && \
|
||||
apt clean && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install Python Dependencies
|
||||
RUN pip install --upgrade pip && \
|
||||
pip install git+https://github.com/khoj-ai/khoj.git
|
||||
# Install Application
|
||||
WORKDIR /app
|
||||
COPY pyproject.toml .
|
||||
COPY README.md .
|
||||
ARG VERSION=0.0.0
|
||||
RUN sed -i "s/dynamic = \\[\"version\"\\]/version = \"$VERSION\"/" pyproject.toml && \
|
||||
pip install --no-cache-dir .
|
||||
|
||||
# Copy Source Code
|
||||
COPY . .
|
||||
|
||||
# Set the PYTHONPATH environment variable in order for it to find the Django app.
|
||||
ENV PYTHONPATH=/app/src:$PYTHONPATH
|
||||
|
||||
# Go to the directory src/interface/web and export the built Next.js assets
|
||||
WORKDIR /app/src/interface/web
|
||||
RUN bash -c "yarn install --frozen-lockfile --verbose && yarn ciexport && yarn cache clean"
|
||||
WORKDIR /app
|
||||
|
||||
# Run the Application
|
||||
# There are more arguments required for the application to run,
|
||||
# but these should be passed in through the docker-compose.yml file.
|
||||
ARG PORT
|
||||
EXPOSE ${PORT}
|
||||
ENTRYPOINT ["khoj"]
|
||||
ENTRYPOINT ["python3", "src/khoj/main.py"]
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Type=Application
|
||||
Name=Khoj
|
||||
Comment=A natural language search engine for your personal notes, transactions and images.
|
||||
Path=/opt
|
||||
Exec=/opt/Khoj
|
||||
Icon=Khoj
|
||||
115
Khoj.spec
@@ -1,115 +0,0 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
from os.path import join
|
||||
from platform import system
|
||||
from PyInstaller.utils.hooks import copy_metadata
|
||||
import sysconfig
|
||||
|
||||
datas = [
|
||||
('src/khoj/interface/web', 'src/khoj/interface/web'),
|
||||
(f'{sysconfig.get_paths()["purelib"]}/transformers', 'transformers')
|
||||
]
|
||||
datas += copy_metadata('tqdm')
|
||||
datas += copy_metadata('regex')
|
||||
datas += copy_metadata('requests')
|
||||
datas += copy_metadata('packaging')
|
||||
datas += copy_metadata('filelock')
|
||||
datas += copy_metadata('numpy')
|
||||
datas += copy_metadata('tokenizers')
|
||||
|
||||
block_cipher = None
|
||||
|
||||
a = Analysis(
|
||||
['src/khoj/main.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=datas,
|
||||
hiddenimports=['huggingface_hub.repository'],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
win_no_prefer_redirects=False,
|
||||
win_private_assemblies=False,
|
||||
cipher=block_cipher,
|
||||
noarchive=False,
|
||||
)
|
||||
|
||||
# Filter out unused and/or duplicate shared libs
|
||||
torch_lib_paths = {
|
||||
join('torch', 'lib', 'libtorch_cuda.so'),
|
||||
join('torch', 'lib', 'libtorch_cpu.so'),
|
||||
}
|
||||
a.datas = [entry for entry in a.datas if not entry[0] in torch_lib_paths]
|
||||
|
||||
os_path_separator = '\\' if system() == 'Windows' else '/'
|
||||
a.datas = [entry for entry in a.datas if not f'torch{os_path_separator}_C.cp' in entry[0]]
|
||||
a.datas = [entry for entry in a.datas if not f'torch{os_path_separator}_dl.cp' in entry[0]]
|
||||
|
||||
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
|
||||
|
||||
if system() != 'Darwin':
|
||||
# Add Splash screen to show on app launch
|
||||
splash = Splash(
|
||||
'src/khoj/interface/web/assets/icons/favicon-128x128.png',
|
||||
binaries=a.binaries,
|
||||
datas=a.datas,
|
||||
text_pos=(10, 160),
|
||||
text_size=12,
|
||||
text_color='black',
|
||||
minify_script=True,
|
||||
always_on_top=True
|
||||
)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.zipfiles,
|
||||
a.datas,
|
||||
splash,
|
||||
splash.binaries,
|
||||
[],
|
||||
name='Khoj',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=False,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch='x86_64',
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
icon='src/khoj/interface/web/assets/icons/favicon-128x128.ico',
|
||||
)
|
||||
else:
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.zipfiles,
|
||||
a.datas,
|
||||
[],
|
||||
name='Khoj',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=False,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch='x86_64',
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
icon='src/khoj/interface/web/assets/icons/favicon.icns',
|
||||
)
|
||||
app = BUNDLE(
|
||||
exe,
|
||||
name='Khoj.app',
|
||||
icon='src/khoj/interface/web/assets/icons/favicon.icns',
|
||||
bundle_identifier=None,
|
||||
)
|
||||
152
LICENSE
@@ -1,23 +1,21 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
@@ -26,44 +24,34 @@ them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
@@ -72,7 +60,7 @@ modification follow.
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
@@ -549,35 +537,45 @@ to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
@@ -619,3 +617,45 @@ Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
528
README.md
@@ -1,504 +1,78 @@
|
||||
<h1><img src="src/khoj/interface/web/assets/icons/khoj-logo-sideways.svg" width="330" alt="Khoj Logo"></h1>
|
||||
<p align="center"><img src="src/khoj/interface/web/assets/icons/khoj-logo-sideways-500.png" width="230" alt="Khoj Logo"></p>
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://github.com/khoj-ai/khoj/actions/workflows/test.yml)
|
||||
[](https://github.com/khoj-ai/khoj/pkgs/container/khoj)
|
||||
[](https://pypi.org/project/khoj-assistant/)
|
||||
[](https://pypi.org/project/khoj/)
|
||||

|
||||
|
||||
*An AI personal assistant for your digital brain*
|
||||
</div>
|
||||
|
||||
**Supported Plugins**
|
||||
<div align="center">
|
||||
<b>The open-source, personal AI for your digital brain</b>
|
||||
</div>
|
||||
|
||||
[](https://github.com/khoj-ai/khoj/tree/master/src/interface/obsidian#readme)
|
||||
[](https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs#readme)
|
||||
<br />
|
||||
|
||||
## Table of Contents
|
||||
<div align="center">
|
||||
|
||||
- [Features](#Features)
|
||||
- [Demos](#Demos)
|
||||
- [Khoj in Obsidian](#khoj-in-obsidian)
|
||||
- [Khoj in Emacs, Browser](#khoj-in-emacs-browser)
|
||||
- [Interfaces](#Interfaces)
|
||||
- [Architecture](#Architecture)
|
||||
- [Setup](#Setup)
|
||||
- [Install](#1-Install)
|
||||
- [Run](#2-Run)
|
||||
- [Configure](#3-Configure)
|
||||
- [Install Plugins](#4-install-interface-plugins)
|
||||
- [Use](#Use)
|
||||
- [Khoj Search](#Khoj-search)
|
||||
- [Khoj Chat](#Khoj-chat)
|
||||
- [Upgrade](#Upgrade)
|
||||
- [Khoj Server](#upgrade-khoj-server)
|
||||
- [Khoj.el](#upgrade-khoj-on-emacs)
|
||||
- [Khoj Obsidian](#upgrade-khoj-on-obsidian)
|
||||
- [Uninstall](#uninstall)
|
||||
- [Troubleshoot](#Troubleshoot)
|
||||
- [Advanced Usage](#advanced-usage)
|
||||
- [Access Khoj on Mobile](#access-khoj-on-mobile)
|
||||
- [Use OpenAI Models for Search](#use-openai-models-for-search)
|
||||
- [Search across Different Languages](#search-across-different-languages)
|
||||
- [Miscellaneous](#Miscellaneous)
|
||||
- [Setup OpenAI API key in Khoj](#set-your-openai-api-key-in-khoj)
|
||||
- [GPT API](#gpt-api)
|
||||
- [Performance](#Performance)
|
||||
- [Query Performance](#Query-performance)
|
||||
- [Indexing Performance](#Indexing-performance)
|
||||
- [Miscellaneous](#Miscellaneous-1)
|
||||
- [Development](#Development)
|
||||
- [Visualize Codebase](#visualize-codebase)
|
||||
- [Setup](#Setup)
|
||||
- [Using Pip](#Using-Pip)
|
||||
- [Using Docker](#Using-Docker)
|
||||
- [Using Conda](#Using-Conda)
|
||||
- [Validate](#Validate)
|
||||
- [Credits](#Credits)
|
||||
[📑 Docs](https://docs.khoj.dev)
|
||||
<span> • </span>
|
||||
[🏮 App](https://khoj.dev)
|
||||
<span> • </span>
|
||||
[💬 Discord](https://discord.gg/BDgyabRM6e)
|
||||
<span> • </span>
|
||||
[📚 Blog](https://blog.khoj.dev)
|
||||
|
||||
## Features
|
||||
- **Search**
|
||||
- **Local**: Your personal data stays local. All search and indexing is done on your machine. *Unlike chat which requires access to GPT.*
|
||||
- **Incremental**: Incremental search for a fast, search-as-you-type experience
|
||||
- **Chat**
|
||||
- **Faster answers**: Find answers faster, smoother than search. No need to manually scan through your notes to find answers.
|
||||
- **Iterative discovery**: Iteratively explore and (re-)discover your notes
|
||||
- **Assisted creativity**: Smoothly weave across answers retrieval and content generation
|
||||
- **General**
|
||||
- **Natural**: Advanced natural language understanding using Transformer based ML Models
|
||||
- **Pluggable**: Modular architecture makes it easy to plug in new data sources, frontends and ML models
|
||||
- **Multiple Sources**: Index your Org-mode and Markdown notes, Beancount transactions, PDF files, Github repositories, and Photos
|
||||
- **Multiple Interfaces**: Interact from your [Web Browser](./src/khoj/interface/web/index.html), [Emacs](./src/interface/emacs/khoj.el) or [Obsidian](./src/interface/obsidian/)
|
||||
</div>
|
||||
|
||||
## Demos
|
||||
### Khoj in Obsidian
|
||||
https://github.com/khoj-ai/khoj/assets/6413477/3e33d8ea-25bb-46c8-a3bf-c92f78d0f56b
|
||||
<div align="left">
|
||||
|
||||
<details><summary>Description</summary>
|
||||
***
|
||||
|
||||
- Install Khoj via `pip` and start Khoj backend in non-gui mode
|
||||
- Install Khoj plugin via Community Plugins settings pane on Obsidian app
|
||||
- Check the new Khoj plugin settings
|
||||
- Let Khoj backend index the markdown, pdf, Github markdown files in the current Vault
|
||||
- Open Khoj plugin on Obsidian via Search button on Left Pane
|
||||
- Search \"*Announce plugin to folks*\" in the [Obsidian Plugin docs](https://marcus.se.net/obsidian-plugin-docs/)
|
||||
- Jump to the [search result](https://marcus.se.net/obsidian-plugin-docs/publishing/submit-your-plugin)
|
||||
</details>
|
||||
[Khoj](https://khoj.dev) is a personal, open-source AI application for you to extend your capabilities.
|
||||
- Share your documents to extend your digital brain.
|
||||
- Access the internet, getting fresh information.
|
||||
- You can share pdf, markdown, org-mode, notion files and github repositories.
|
||||
- Fast, accurate semantic search on top of your docs.
|
||||
- Create images, talk out loud, play your messages.
|
||||
- Available Desktop, Emacs, Obsidian, Web and Whatsapp.
|
||||
- Khoj is open-source, self-hostable. Always.
|
||||
|
||||
### Khoj in Emacs, Browser
|
||||
https://user-images.githubusercontent.com/6413477/184735169-92c78bf1-d827-4663-9087-a1ea194b8f4b.mp4
|
||||
***
|
||||
|
||||
<details><summary>Description</summary>
|
||||
</div>
|
||||
|
||||
- Install Khoj via pip
|
||||
- Start Khoj app
|
||||
- Add this readme and [khoj.el readme](https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs) as org-mode for Khoj to index
|
||||
- Search \"*Setup editor*\" on the Web and Emacs. Re-rank the results for better accuracy
|
||||
- Top result is what we are looking for, the [section to Install Khoj.el on Emacs](https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs#2-Install-Khojel)
|
||||
</details>
|
||||
## See it in action
|
||||
|
||||
<details><summary>Analysis</summary>
|
||||

|
||||
|
||||
- The results do not have any words used in the query
|
||||
- *Based on the top result it seems the re-ranking model understands that Emacs is an editor?*
|
||||
- The results incrementally update as the query is entered
|
||||
- The results are re-ranked, for better accuracy, once user hits enter
|
||||
</details>
|
||||
Go to https://app.khoj.dev to see Khoj live.
|
||||
|
||||
### Interfaces
|
||||
## Full feature list
|
||||
You can see the full feature list [here](https://docs.khoj.dev/category/features).
|
||||
|
||||

|
||||
## Self-Host
|
||||
|
||||
## Architecture
|
||||
To get started with self-hosting Khoj, [read the docs](https://docs.khoj.dev/get-started/setup).
|
||||
|
||||

|
||||
## Contributors
|
||||
Cheers to our awesome contributors! 🎉
|
||||
|
||||
## Setup
|
||||
These are the general setup instructions for Khoj.
|
||||
<a href="https://github.com/khoj-ai/khoj/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=khoj-ai/khoj" />
|
||||
</a>
|
||||
|
||||
- Make sure [python](https://realpython.com/installing-python/) and [pip](https://pip.pypa.io/en/stable/installation/) are installed on your machine
|
||||
- Check the [Khoj.el Readme](https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs#Setup) to setup Khoj with Emacs<br />
|
||||
Its simpler as it can skip the server *install*, *run* and *configure* step below.
|
||||
- Check the [Khoj Obsidian Readme](https://github.com/khoj-ai/khoj/tree/master/src/interface/obsidian#Setup) to setup Khoj with Obsidian<br />
|
||||
Its simpler as it can skip the *configure* step below.
|
||||
Made with [contrib.rocks](https://contrib.rocks).
|
||||
|
||||
### 1. Install
|
||||
- On Linux/MacOS
|
||||
```shell
|
||||
python -m pip install khoj-assistant
|
||||
```
|
||||
### Interested in Contributing?
|
||||
|
||||
- On Windows
|
||||
```shell
|
||||
py -m pip install khoj-assistant
|
||||
```
|
||||
We are always looking for contributors to help us build new features, improve the project documentation, or fix bugs. If you're interested, please see our [Contributing Guidelines](https://docs.khoj.dev/contributing/development) and check out our [Contributors Project Board](https://github.com/orgs/khoj-ai/projects/4).
|
||||
|
||||
### 2. Run
|
||||
## [Sponsors](https://github.com/sponsors/khoj-ai)
|
||||
Shout out to our brilliant sponsors! 🌈
|
||||
|
||||
```shell
|
||||
khoj
|
||||
```
|
||||
|
||||
Note: To start Khoj automatically in the background use [Task scheduler](https://www.windowscentral.com/how-create-automated-task-using-task-scheduler-windows-10) on Windows or [Cron](https://en.wikipedia.org/wiki/Cron) on Mac, Linux (e.g with `@reboot khoj`)
|
||||
|
||||
### 3. Configure
|
||||
|
||||
1. Enable content types and point to files to search in the First Run Screen that pops up on app start
|
||||
2. Click `Configure` and wait. The app will download ML models and index the content for search
|
||||
|
||||
### 4. Install Interface Plugins
|
||||
Khoj exposes a web interface by default.<br />
|
||||
The optional steps below allow using Khoj from within an existing application like Obsidian or Emacs.
|
||||
|
||||
- **Khoj Obsidian**:<br />
|
||||
[Install](https://github.com/khoj-ai/khoj/tree/master/src/interface/obsidian#2-Setup-Plugin) the Khoj Obsidian plugin
|
||||
|
||||
- **Khoj Emacs**:<br />
|
||||
[Install](https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs#2-Install-Khojel) khoj.el
|
||||
|
||||
## Use
|
||||
### Khoj Search
|
||||
- **Khoj via Obsidian**
|
||||
- Click the *Khoj search* icon 🔎 on the [Ribbon](https://help.obsidian.md/User+interface/Workspace/Ribbon) or Search for *Khoj: Search* in the [Command Palette](https://help.obsidian.md/Plugins/Command+palette)
|
||||
- **Khoj via Emacs**
|
||||
- Run `M-x khoj <user-query>`
|
||||
- **Khoj via Web**
|
||||
- Open <http://localhost:8000/> via desktop interface or directly
|
||||
- **Khoj via API**
|
||||
- See the Khoj FastAPI [Swagger Docs](http://localhost:8000/docs), [ReDocs](http://localhost:8000/redocs)
|
||||
|
||||
<details><summary>Query Filters</summary>
|
||||
|
||||
Use structured query syntax to filter the natural language search results
|
||||
- **Word Filter**: Get entries that include/exclude a specified term
|
||||
- Entries that contain term_to_include: `+"term_to_include"`
|
||||
- Entries that contain term_to_exclude: `-"term_to_exclude"`
|
||||
- **Date Filter**: Get entries containing dates in YYYY-MM-DD format from specified date (range)
|
||||
- Entries from April 1st 1984: `dt:"1984-04-01"`
|
||||
- Entries after March 31st 1984: `dt>="1984-04-01"`
|
||||
- Entries before April 2nd 1984 : `dt<="1984-04-01"`
|
||||
- **File Filter**: Get entries from a specified file
|
||||
- Entries from incoming.org file: `file:"incoming.org"`
|
||||
- Combined Example
|
||||
- `what is the meaning of life? file:"1984.org" dt>="1984-01-01" dt<="1985-01-01" -"big" -"brother"`
|
||||
- Adds all filters to the natural language query. It should return entries
|
||||
- from the file *1984.org*
|
||||
- containing dates from the year *1984*
|
||||
- excluding words *"big"* and *"brother"*
|
||||
- that best match the natural language query *"what is the meaning of life?"*
|
||||
|
||||
</details>
|
||||
|
||||
### Khoj Chat
|
||||
#### Overview
|
||||
- Creates a personal assistant for you to inquire and engage with your notes
|
||||
- Uses [ChatGPT](https://openai.com/blog/chatgpt) and [Khoj search](#khoj-search)
|
||||
- Supports multi-turn conversations with the relevant notes for context
|
||||
- Shows reference notes used to generate a response
|
||||
- **Note**: *Your query and top notes from khoj search will be sent to OpenAI for processing*
|
||||
|
||||
#### Setup
|
||||
- [Setup your OpenAI API key in Khoj](#set-your-openai-api-key-in-khoj)
|
||||
|
||||
#### Use
|
||||
1. Open [/chat](http://localhost:8000/chat)[^2]
|
||||
2. Type your queries and see response by Khoj from your notes
|
||||
|
||||
#### Demo
|
||||

|
||||
|
||||
### Details
|
||||
1. Your query is used to retrieve the most relevant notes, if any, using Khoj search
|
||||
2. These notes, the last few messages and associated metadata is passed to ChatGPT along with your query for a response
|
||||
|
||||
## Upgrade
|
||||
### Upgrade Khoj Server
|
||||
```shell
|
||||
pip install --upgrade khoj-assistant
|
||||
```
|
||||
|
||||
*Note: To upgrade to the latest pre-release version of the khoj server run below command*
|
||||
```shell
|
||||
# Maps to the latest commit on the master branch
|
||||
pip install --upgrade --pre khoj-assistant
|
||||
```
|
||||
|
||||
### Upgrade Khoj on Emacs
|
||||
- Use your Emacs Package Manager to Upgrade
|
||||
- See [khoj.el readme](https://github.com/khoj-ai/khoj/tree/master/src/interface/emacs#Upgrade) for details
|
||||
|
||||
### Upgrade Khoj on Obsidian
|
||||
- Upgrade via the Community plugins tab on the settings pane in the Obsidian app
|
||||
- See the [khoj plugin readme](https://github.com/khoj-ai/khoj/tree/master/src/interface/obsidian#2-Setup-Plugin) for details
|
||||
|
||||
## Uninstall
|
||||
1. (Optional) Hit `Ctrl-C` in the terminal running the khoj server to stop it
|
||||
2. Delete the khoj directory in your home folder (i.e `~/.khoj` on Linux, Mac or `C:\Users\<your-username>\.khoj` on Windows)
|
||||
3. Uninstall the khoj server with `pip uninstall khoj-assistant`
|
||||
4. (Optional) Uninstall khoj.el or the khoj obsidian plugin in the standard way on Emacs, Obsidian
|
||||
|
||||
## Troubleshoot
|
||||
|
||||
#### Install fails while building Tokenizer dependency
|
||||
- **Details**: `pip install khoj-assistant` fails while building the `tokenizers` dependency. Complains about Rust.
|
||||
- **Fix**: Install Rust to build the tokenizers package. For example on Mac run:
|
||||
```shell
|
||||
brew install rustup
|
||||
rustup-init
|
||||
source ~/.cargo/env
|
||||
```
|
||||
- **Refer**: [Issue with Fix](https://github.com/khoj-ai/khoj/issues/82#issuecomment-1241890946) for more details
|
||||
|
||||
#### Search starts giving wonky results
|
||||
- **Fix**: Open [/api/update?force=true](http://localhost:8000/api/update?force=true)[^2] in browser to regenerate index from scratch
|
||||
- **Note**: *This is a fix for when you percieve the search results have degraded. Not if you think they've always given wonky results*
|
||||
|
||||
#### Khoj in Docker errors out with \"Killed\" in error message
|
||||
- **Fix**: Increase RAM available to Docker Containers in Docker Settings
|
||||
- **Refer**: [StackOverflow Solution](https://stackoverflow.com/a/50770267), [Configure Resources on Docker for Mac](https://docs.docker.com/desktop/mac/#resources)
|
||||
|
||||
#### Khoj errors out complaining about Tensors mismatch or null
|
||||
- **Mitigation**: Disable `image` search using the desktop GUI
|
||||
|
||||
## Advanced Usage
|
||||
### Access Khoj on Mobile
|
||||
1. [Setup Khoj](#Setup) on your personal server. This can be any always-on machine, i.e an old computer, RaspberryPi(?) etc
|
||||
2. [Install](https://tailscale.com/kb/installation/) [Tailscale](tailscale.com/) on your personal server and phone
|
||||
3. Open the Khoj web interface of the server from your phone browser.<br /> It should be `http://tailscale-ip-of-server:8000` or `http://name-of-server:8000` if you've setup [MagicDNS](https://tailscale.com/kb/1081/magicdns/)
|
||||
4. Click the [Add to Homescreen](https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Add_to_home_screen) button
|
||||
5. Enjoy exploring your notes, transactions and images from your phone!
|
||||
|
||||

|
||||
|
||||
### Use OpenAI Models for Search
|
||||
#### Setup
|
||||
1. Set `encoder-type`, `encoder` and `model-directory` under `asymmetric` and/or `symmetric` `search-type` in your `khoj.yml`[^1]:
|
||||
```diff
|
||||
asymmetric:
|
||||
- encoder: "sentence-transformers/multi-qa-MiniLM-L6-cos-v1"
|
||||
+ encoder: text-embedding-ada-002
|
||||
+ encoder-type: khoj.utils.models.OpenAI
|
||||
cross-encoder: "cross-encoder/ms-marco-MiniLM-L-6-v2"
|
||||
- encoder-type: sentence_transformers.SentenceTransformer
|
||||
- model_directory: "~/.khoj/search/asymmetric/"
|
||||
+ model-directory: null
|
||||
```
|
||||
2. [Setup your OpenAI API key in Khoj](#set-your-openai-api-key-in-khoj)
|
||||
3. Restart Khoj server to generate embeddings. It will take longer than with offline models.
|
||||
|
||||
#### Warnings
|
||||
This configuration *uses an online model*
|
||||
- It will **send all notes to OpenAI** to generate embeddings
|
||||
- **All queries will be sent to OpenAI** when you search with Khoj
|
||||
- You will be **charged by OpenAI** based on the total tokens processed
|
||||
- It *requires an active internet connection* to search and index
|
||||
|
||||
### Search across Different Languages
|
||||
To search for notes in multiple, different languages, you can use a [multi-lingual model](https://www.sbert.net/docs/pretrained_models.html#multi-lingual-models).<br />
|
||||
For example, the [paraphrase-multilingual-MiniLM-L12-v2](https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2) supports [50+ languages](https://www.sbert.net/docs/pretrained_models.html#:~:text=we%20used%20the%20following%2050%2B%20languages), has good search quality and speed. To use it:
|
||||
1. Manually update `search-type > asymmetric > encoder` to `paraphrase-multilingual-MiniLM-L12-v2` in your `~/.khoj/khoj.yml` file for now. See diff of `khoj.yml` below for illustration:
|
||||
```diff
|
||||
asymmetric:
|
||||
- encoder: "sentence-transformers/multi-qa-MiniLM-L6-cos-v1"
|
||||
+ encoder: "paraphrase-multilingual-MiniLM-L12-v2"
|
||||
cross-encoder: "cross-encoder/ms-marco-MiniLM-L-6-v2"
|
||||
model_directory: "~/.khoj/search/asymmetric/"
|
||||
```
|
||||
|
||||
2. Regenerate your content index. For example, by opening [\<khoj-url\>/api/update?t=force](http://localhost:8000/api/update?t=force)
|
||||
|
||||
## Miscellaneous
|
||||
### Set your OpenAI API key in Khoj
|
||||
If you want, Khoj can be configured to use OpenAI for search and chat.<br />
|
||||
Add your OpenAI API to Khoj by using either of the two options below:
|
||||
- Open the Khoj desktop GUI, add your [OpenAI API key](https://beta.openai.com/account/api-keys) and click *Configure*
|
||||
Ensure khoj is started **without** the `--no-gui` flag. Check your system tray to see if Khoj is minimized there.
|
||||
- Set `openai-api-key` field under `processor.conversation` section in your `khoj.yml`[^1] to your [OpenAI API key](https://beta.openai.com/account/api-keys) and restart khoj:
|
||||
```diff
|
||||
processor:
|
||||
conversation:
|
||||
- openai-api-key: # "YOUR_OPENAI_API_KEY"
|
||||
+ openai-api-key: sk-aaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhh
|
||||
model: "text-davinci-003"
|
||||
conversation-logfile: "~/.khoj/processor/conversation/conversation_logs.json"
|
||||
```
|
||||
|
||||
**Warning**: *This will enable Khoj to send your query and note(s) to OpenAI for processing*
|
||||
|
||||
### GPT API
|
||||
- The [chat](http://localhost:8000/api/chat), [answer](http://localhost:8000/api/beta/answer) and [search](http://localhost:8000/api/beta/search) API endpoints use [OpenAI API](https://openai.com/api/)
|
||||
- They are disabled by default
|
||||
- To use them:
|
||||
1. [Setup your OpenAI API key in Khoj](#set-your-openai-api-key-in-khoj)
|
||||
2. Interact with them from the [Khoj Swagger docs](http://locahost:8000/docs)[^2]
|
||||
|
||||
### Index Github Repository for Search, Chat
|
||||
The Khoj Github plugin can index issues, commit messages and markdown, org-mode and PDF files from any repositories you have access to. This allows you to chat or search with these repositories. Get answers, resolve issues or just explore a repo with the help of your AI personal assistant.
|
||||
|
||||
See the [Khoj FAQ](https://faq.khoj.dev) for a demo of Khoj search and chat. It makes the Khoj github repo available for exploring.
|
||||
|
||||
Note: *Khoj will ignore code files in the repository for now as the default AI model used works best with natural language text, not code.*
|
||||
|
||||
#### Setup Khoj Github plugin
|
||||
1. Get a [pat token](https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token) with `repo` and `read:org` scopes in the classic flow.
|
||||
2. Configure Khoj settings to include the `owner` and `repo_name`. The `owner` will be the organization name if the repo is in an organization. The `repo_name` will be the name of the repository. Optionally, you can also supply a branch name. If no branch name is supplied, the `master` branch will be used.
|
||||
|
||||
## Performance
|
||||
|
||||
### Query performance
|
||||
|
||||
- Semantic search using the bi-encoder is fairly fast at \<50 ms
|
||||
- Reranking using the cross-encoder is slower at \<2s on 15 results. Tweak `top_k` to tradeoff speed for accuracy of results
|
||||
- Filters in query (e.g by file, word or date) usually add \<20ms to query latency
|
||||
|
||||
### Indexing performance
|
||||
|
||||
- Indexing is more strongly impacted by the size of the source data
|
||||
- Indexing 100K+ line corpus of notes takes about 10 minutes
|
||||
- Indexing 4000+ images takes about 15 minutes and more than 8Gb of RAM
|
||||
- Note: *It should only take this long on the first run* as the index is incrementally updated
|
||||
|
||||
### Miscellaneous
|
||||
|
||||
- Testing done on a Mac M1 and a \>100K line corpus of notes
|
||||
- Search, indexing on a GPU has not been tested yet
|
||||
|
||||
## Development
|
||||
### Visualize Codebase
|
||||
|
||||
*[Interactive Visualization](https://mango-dune-07a8b7110.1.azurestaticapps.net/?repo=debanjum%2Fkhoj)*
|
||||
|
||||

|
||||
|
||||
### Setup
|
||||
#### Using Pip
|
||||
##### 1. Install
|
||||
|
||||
```shell
|
||||
# Get Khoj Code
|
||||
git clone https://github.com/khoj-ai/khoj && cd khoj
|
||||
|
||||
# Create, Activate Virtual Environment
|
||||
python3 -m venv .venv && source .venv/bin/activate
|
||||
|
||||
# Install Khoj for Development
|
||||
pip install -e .[dev]
|
||||
```
|
||||
|
||||
##### 2. Run
|
||||
1. Start Khoj
|
||||
```shell
|
||||
khoj -vv
|
||||
```
|
||||
2. Configure Khoj
|
||||
- **Via GUI**: Add files, directories to index in the GUI window that pops up on starting Khoj, then Click Configure
|
||||
- **Manually**:
|
||||
- Copy the `config/khoj_sample.yml` to `~/.khoj/khoj.yml`
|
||||
- Set `input-files` or `input-filter` in each relevant `content-type` section of `~/.khoj/khoj.yml`
|
||||
- Set `input-directories` field in `image` `content-type` section
|
||||
- Delete `content-type` and `processor` sub-section(s) irrelevant for your use-case
|
||||
- Restart khoj
|
||||
|
||||
Note: Wait after configuration for khoj to Load ML model, generate embeddings and expose API to query notes, images, transactions etc specified in config YAML
|
||||
|
||||
#### Using Docker
|
||||
##### 1. Clone
|
||||
|
||||
```shell
|
||||
git clone https://github.com/khoj-ai/khoj && cd khoj
|
||||
```
|
||||
|
||||
##### 2. Configure
|
||||
|
||||
- **Required**: Update [docker-compose.yml](./docker-compose.yml) to mount your images, (org-mode or markdown) notes, pdf, Github repositories, and beancount directories
|
||||
- **Optional**: Edit application configuration in [khoj_docker.yml](./config/khoj_docker.yml)
|
||||
|
||||
##### 3. Run
|
||||
|
||||
```shell
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
*Note: The first run will take time. Let it run, it\'s mostly not hung, just generating embeddings*
|
||||
|
||||
##### 4. Upgrade
|
||||
|
||||
```shell
|
||||
docker-compose build --pull
|
||||
```
|
||||
|
||||
#### Using Conda
|
||||
##### 1. Install Dependencies
|
||||
- [Install Conda](https://docs.conda.io/projects/conda/en/latest/user-guide/install/index.html)
|
||||
|
||||
##### 2. Install Khoj
|
||||
```shell
|
||||
git clone https://github.com/khoj-ai/khoj && cd khoj
|
||||
conda env create -f config/environment.yml
|
||||
conda activate khoj
|
||||
python3 -m pip install pyqt6 # As conda does not support pyqt6 yet
|
||||
```
|
||||
|
||||
##### 3. Configure
|
||||
- Copy the `config/khoj_sample.yml` to `~/.khoj/khoj.yml`
|
||||
- Set `input-files` or `input-filter` in each relevant `content-type` section of `~/.khoj/khoj.yml`
|
||||
- Set `input-directories` field in `image` `content-type` section
|
||||
- Delete `content-type`, `processor` sub-sections irrelevant for your use-case
|
||||
|
||||
##### 4. Run
|
||||
```shell
|
||||
python3 -m src.khoj.main -vv
|
||||
```
|
||||
Load ML model, generate embeddings and expose API to query notes, images, transactions etc specified in config YAML
|
||||
|
||||
##### 5. Upgrade
|
||||
```shell
|
||||
cd khoj
|
||||
git pull origin master
|
||||
conda deactivate khoj
|
||||
conda env update -f config/environment.yml
|
||||
conda activate khoj
|
||||
```
|
||||
|
||||
### Validate
|
||||
#### Before Make Changes
|
||||
1. Install Git Hooks for Validation
|
||||
```shell
|
||||
pre-commit install -t pre-push -t pre-commit
|
||||
```
|
||||
- This ensures standard code formatting fixes and other checks run automatically on every commit and push
|
||||
- Note 1: If [pre-commit](https://pre-commit.com/#intro) didn't already get installed, [install it](https://pre-commit.com/#install) via `pip install pre-commit`
|
||||
- Note 2: To run the pre-commit changes manually, use `pre-commit run --hook-stage manual --all` before creating PR
|
||||
|
||||
#### Before Creating PR
|
||||
|
||||
1. Run Tests. If you get an error complaining about a missing `fast_tokenizer_file`, follow the solution [in this Github issue](https://github.com/UKPLab/sentence-transformers/issues/1659).
|
||||
```shell
|
||||
pytest
|
||||
```
|
||||
|
||||
2. Run MyPy to check types
|
||||
```shell
|
||||
mypy --config-file pyproject.toml
|
||||
```
|
||||
|
||||
#### After Creating PR
|
||||
- Automated [validation workflows](.github/workflows) run for every PR.
|
||||
|
||||
Ensure any issues seen by them our fixed
|
||||
|
||||
- Test the python packge created for a PR
|
||||
1. Download and extract the zipped `.whl` artifact generated from the pypi workflow run for the PR.
|
||||
2. Install (in your virtualenv) with `pip install /path/to/download*.whl>`
|
||||
3. Start and use the application to see if it works fine
|
||||
|
||||
|
||||
## Credits
|
||||
|
||||
- [Multi-QA MiniLM Model](https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1), [All MiniLM Model](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2) for Text Search. See [SBert Documentation](https://www.sbert.net/examples/applications/retrieve_rerank/README.html)
|
||||
- [OpenAI CLIP Model](https://github.com/openai/CLIP) for Image Search. See [SBert Documentation](https://www.sbert.net/examples/applications/image-search/README.html)
|
||||
- Charles Cave for [OrgNode Parser](http://members.optusnet.com.au/~charles57/GTD/orgnode.html)
|
||||
- [Org.js](https://mooz.github.io/org-js/) to render Org-mode results on the Web interface
|
||||
- [Markdown-it](https://github.com/markdown-it/markdown-it) to render Markdown results on the Web interface
|
||||
|
||||
|
||||
[^1]: Default Khoj config file @ `~/.khoj/khoj.yml`
|
||||
|
||||
[^2]: Default Khoj url @ http://localhost:8000
|
||||
<a href="http://github.com/beekeeb">
|
||||
<img src="https://raw.githubusercontent.com/beekeeb/piantor/main/docs/beekeeb.png" width=250/>
|
||||
</a>
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
name: khoj
|
||||
channels:
|
||||
- conda-forge
|
||||
dependencies:
|
||||
- python=3.8.*
|
||||
- numpy=1.22.4
|
||||
- pytorch=1.13.1
|
||||
- torchvision=0.14.1
|
||||
- transformers=4.21.0
|
||||
- sentence-transformers=2.1.0
|
||||
- fastapi=0.77.1
|
||||
- uvicorn=0.17.6
|
||||
- pyyaml=6.0
|
||||
- pytest=7.1.2
|
||||
- pillow=9.3.0
|
||||
- openai=0.20.0
|
||||
- pydantic=1.9.1
|
||||
- jinja2=3.1.2
|
||||
- aiofiles=0.8.0
|
||||
- huggingface_hub=0.8.1
|
||||
- dateparser=1.1.1
|
||||
- schedule=1.1.0
|
||||
@@ -1,116 +0,0 @@
|
||||
name: khoj
|
||||
channels:
|
||||
- conda-forge
|
||||
dependencies:
|
||||
- aiofiles=0.8.0=pyhd8ed1ab_0
|
||||
- asgiref=3.4.1=pyhd8ed1ab_0
|
||||
- attrs=21.2.0=pyhd8ed1ab_0
|
||||
- brotlipy=0.7.0=py39h5161555_1001
|
||||
- ca-certificates=2022.6.15=h4653dfc_0
|
||||
- certifi=2022.6.15=py39h2804cbe_0
|
||||
- cffi=1.14.6=py39hda8b47f_0
|
||||
- chardet=4.0.0=py39h2804cbe_1
|
||||
- charset-normalizer=2.0.0=pyhd8ed1ab_0
|
||||
- click=8.0.1=py39h2804cbe_0
|
||||
- colorama=0.4.4=pyh9f0ad1d_0
|
||||
- cryptography=3.4.7=py39h73257c9_0
|
||||
- dataclasses=0.8=pyhc8e2a94_3
|
||||
- dateparser=1.1.1=pyhd8ed1ab_0
|
||||
- et_xmlfile=1.0.1=py_1001
|
||||
- fastapi=0.68.2=pyhd8ed1ab_0
|
||||
- filelock=3.0.12=pyh9f0ad1d_0
|
||||
- freetype=2.10.4=h17b34a0_1
|
||||
- future=0.18.2=py39h2804cbe_3
|
||||
- h11=0.12.0=pyhd8ed1ab_0
|
||||
- huggingface_hub=0.2.1=pyhd8ed1ab_0
|
||||
- idna=3.1=pyhd3deb0d_0
|
||||
- importlib-metadata=4.6.4=py39h2804cbe_0
|
||||
- importlib_metadata=4.6.4=hd8ed1ab_0
|
||||
- iniconfig=1.1.1=pyh9f0ad1d_0
|
||||
- jbig=2.1=h3422bc3_2003
|
||||
- jinja2=3.0.3=pyhd8ed1ab_0
|
||||
- joblib=1.0.1=pyhd8ed1ab_0
|
||||
- jpeg=9d=h27ca646_0
|
||||
- lcms2=2.12=had6a04f_0
|
||||
- lerc=2.2.1=h9f76cd9_0
|
||||
- libblas=3.9.0=11_osxarm64_openblas
|
||||
- libcblas=3.9.0=11_osxarm64_openblas
|
||||
- libcxx=12.0.1=h168391b_0
|
||||
- libdeflate=1.7=h27ca646_5
|
||||
- libffi=3.3=h9f76cd9_2
|
||||
- libgfortran=5.0.0.dev0=11_0_1_hf114ba7_23
|
||||
- libgfortran5=11.0.1.dev0=hf114ba7_23
|
||||
- liblapack=3.9.0=11_osxarm64_openblas
|
||||
- libopenblas=0.3.17=openmp_h5dd58f0_1
|
||||
- libpng=1.6.37=hf7e6567_2
|
||||
- libprotobuf=3.16.0=hccf11d3_0
|
||||
- libtiff=4.3.0=hc6122e1_1
|
||||
- libwebp-base=1.2.1=h3422bc3_0
|
||||
- llvm-openmp=12.0.1=hf3c4609_1
|
||||
- lz4-c=1.9.3=hbdafb3b_1
|
||||
- markupsafe=2.0.1=py39h5161555_1
|
||||
- more-itertools=8.8.0=pyhd8ed1ab_0
|
||||
- ncurses=6.2=h9aa5885_4
|
||||
- ninja=1.10.2=h4d860bb_0
|
||||
- nltk=3.6.2=pyhd8ed1ab_0
|
||||
- numpy=1.21.4=py39h1f3b974_0
|
||||
- olefile=0.46=pyh9f0ad1d_1
|
||||
- openai=0.11.4=py39h2804cbe_0
|
||||
- openjpeg=2.4.0=h062765e_1
|
||||
- openpyxl=3.0.9=pyhd8ed1ab_0
|
||||
- openssl=1.1.1q=ha287fd2_0
|
||||
- packaging=21.0=pyhd8ed1ab_0
|
||||
- pandas=1.3.4=py39h7f752ed_1
|
||||
- pandas-stubs=1.2.0.38=py39h2804cbe_0
|
||||
- pillow=8.3.2=py39ha74c66e_0
|
||||
- pip=21.2.4=pyhd8ed1ab_0
|
||||
- pluggy=0.13.1=py39h2804cbe_4
|
||||
- py=1.10.0=pyhd3deb0d_0
|
||||
- pycparser=2.20=pyh9f0ad1d_2
|
||||
- pydantic=1.8.2=py39h5161555_2
|
||||
- pyopenssl=20.0.1=pyhd8ed1ab_0
|
||||
- pyparsing=2.4.7=pyh9f0ad1d_0
|
||||
- pysocks=1.7.1=py39h2804cbe_3
|
||||
- pytest=6.2.5=py39h2804cbe_1
|
||||
- python=3.9.7=h54d631c_3_cpython
|
||||
- python-dateutil=2.8.2=pyhd8ed1ab_0
|
||||
- python-tzdata=2022.1=pyhd8ed1ab_0
|
||||
- python_abi=3.9=2_cp39
|
||||
- pytorch=1.9.0=cpu_py39he8fdc14_2
|
||||
- pytorch-cpu=1.9.0=cpu_py39hd610c6a_2
|
||||
- pytz=2021.3=pyhd8ed1ab_0
|
||||
- pytz-deprecation-shim=0.1.0.post0=py39h2804cbe_2
|
||||
- pyyaml=5.4.1=py39h5161555_1
|
||||
- readline=8.1=hedafd6a_0
|
||||
- regex=2021.8.21=py39h5161555_0
|
||||
- requests=2.26.0=pyhd8ed1ab_0
|
||||
- sacremoses=0.0.43=pyh9f0ad1d_0
|
||||
- scikit-learn=0.24.2=py39hef7049f_1
|
||||
- scipy=1.7.0=py39h5060c3b_0
|
||||
- sentence-transformers=2.1.0=pyhd8ed1ab_0
|
||||
- sentencepiece=0.1.95=py39h4d2d688_1
|
||||
- setuptools=57.4.0=py39h2804cbe_0
|
||||
- six=1.16.0=pyh6c4a22f_0
|
||||
- sleef=3.5.1=h27ca646_1
|
||||
- sqlite=3.36.0=h72a2b83_0
|
||||
- starlette=0.14.2=pyhd8ed1ab_0
|
||||
- threadpoolctl=2.2.0=pyh8a188c0_0
|
||||
- tk=8.6.11=he1e0b03_0
|
||||
- tokenizers=0.10.3=py39hab32027_1
|
||||
- toml=0.10.2=pyhd8ed1ab_0
|
||||
- torchvision=0.10.1=py39h0a40b5a_0_cpu
|
||||
- tqdm=4.62.1=pyhd8ed1ab_0
|
||||
- transformers=4.14.1=pyhd8ed1ab_0
|
||||
- typing-extensions=3.10.0.0=hd8ed1ab_0
|
||||
- typing_extensions=3.10.0.0=pyha770c72_0
|
||||
- tzdata=2021a=he74cb21_1
|
||||
- tzlocal=4.2=py39h2804cbe_1
|
||||
- urllib3=1.26.6=pyhd8ed1ab_0
|
||||
- uvicorn=0.16.0=py39h2804cbe_0
|
||||
- wheel=0.37.0=pyhd8ed1ab_1
|
||||
- xz=5.2.5=h642e427_1
|
||||
- yaml=0.2.5=h642e427_0
|
||||
- zipp=3.5.0=pyhd8ed1ab_0
|
||||
- zlib=1.2.11=h31e879b_1009
|
||||
- zstd=1.5.0=h861e0a7_0
|
||||
prefix: /opt/homebrew/Caskroom/miniforge/base/envs/khoj
|
||||
@@ -1,55 +0,0 @@
|
||||
content-type:
|
||||
# The /data/folder/ prefix to the folders is here because this is
|
||||
# the directory to which the local files are copied in the docker-compose.
|
||||
# If changing, the docker-compose volumes should also be changed to match.
|
||||
org:
|
||||
input-files: null
|
||||
input-filter: ["/data/org/**/*.org"]
|
||||
compressed-jsonl: "/data/embeddings/notes.jsonl.gz"
|
||||
embeddings-file: "/data/embeddings/note_embeddings.pt"
|
||||
index_heading_entries: false
|
||||
|
||||
markdown:
|
||||
input-files: null
|
||||
input-filter: ["/data/markdown/**/*.markdown"]
|
||||
compressed-jsonl: "/data/embeddings/markdown.jsonl.gz"
|
||||
embeddings-file: "/data/embeddings/markdown_embeddings.pt"
|
||||
|
||||
ledger:
|
||||
input-files: null
|
||||
input-filter: ["/data/ledger/**/*.beancount"]
|
||||
compressed-jsonl: /data/embeddings/transactions.jsonl.gz
|
||||
embeddings-file: /data/embeddings/transaction_embeddings.pt
|
||||
|
||||
image:
|
||||
input-directories: ["/data/images/"]
|
||||
embeddings-file: "/data/embeddings/image_embeddings.pt"
|
||||
batch-size: 50
|
||||
use-xmp-metadata: false
|
||||
|
||||
music:
|
||||
input-files: ["/data/music/music.org"]
|
||||
input-filter: null
|
||||
compressed-jsonl: "/data/embeddings/songs.jsonl.gz"
|
||||
embeddings-file: "/data/embeddings/song_embeddings.pt"
|
||||
|
||||
search-type:
|
||||
symmetric:
|
||||
encoder: "sentence-transformers/all-MiniLM-L6-v2"
|
||||
cross-encoder: "cross-encoder/ms-marco-MiniLM-L-6-v2"
|
||||
model_directory: "/data/models/symmetric"
|
||||
|
||||
asymmetric:
|
||||
encoder: "sentence-transformers/multi-qa-MiniLM-L6-cos-v1"
|
||||
cross-encoder: "cross-encoder/ms-marco-MiniLM-L-6-v2"
|
||||
model_directory: "/data/models/asymmetric"
|
||||
|
||||
image:
|
||||
encoder: "sentence-transformers/clip-ViT-B-32"
|
||||
model_directory: "/data/models/image_encoder"
|
||||
|
||||
processor:
|
||||
#conversation:
|
||||
# openai-api-key: null
|
||||
# model: "text-davinci-003"
|
||||
# conversation-logfile: "/data/embeddings/conversation_logs.json"
|
||||
@@ -1,56 +0,0 @@
|
||||
content-type:
|
||||
org:
|
||||
input-files: # ["/path/to/org-file.org"] REQUIRED IF input-filter IS NOT SET OR
|
||||
input-filter: # ["/path/to/org/*.org"] REQUIRED IF input-files IS NOT SET
|
||||
compressed-jsonl: "~/.khoj/content/org/org.jsonl.gz"
|
||||
embeddings-file: "~/.khoj/content/org/org_embeddings.pt"
|
||||
index_heading_entries: false # Set to true to index entries with empty body
|
||||
|
||||
markdown:
|
||||
input-files: # ["/path/to/markdown-file.md"] REQUIRED IF input-filter IS NOT SET OR
|
||||
input-filter: # ["/path/to/markdown/*.md"] REQUIRED IF input-files IS NOT SET
|
||||
compressed-jsonl: "~/.khoj/content/markdown/markdown.jsonl.gz"
|
||||
embeddings-file: "~/.khoj/content/markdown/markdown_embeddings.pt"
|
||||
|
||||
ledger:
|
||||
input-files: # ["/path/to/ledger-file.beancount"] REQUIRED IF input-filter is not set OR
|
||||
input-filter: # ["/path/to/ledger/*.beancount"] REQUIRED IF input-files is not set
|
||||
compressed-jsonl: "~/.khoj/content/ledger/ledger.jsonl.gz"
|
||||
embeddings-file: "~/.khoj/content/ledger/ledger_embeddings.pt"
|
||||
|
||||
image:
|
||||
input-directories: # ["/path/to/images/"] REQUIRED IF input-filter IS NOT SET OR
|
||||
input-filter: # ["/path/to/images/*.jpg"] REQUIRED IF input-directories IS NOT SET
|
||||
embeddings-file: "~/.khoj/content/image/image_embeddings.pt"
|
||||
batch-size: 50
|
||||
use-xmp-metadata: false
|
||||
|
||||
music:
|
||||
input-files: # ["/path/to/music-file.org"] REQUIRED IF input-filter IS NOT SET OR
|
||||
input-filter: # ["/path/to/music/*.org"] REQUIRED IF input-files IS NOT SET
|
||||
compressed-jsonl: "~/.khoj/content/music/music.jsonl.gz"
|
||||
embeddings-file: "~/.khoj/content/music/music_embeddings.pt"
|
||||
|
||||
search-type:
|
||||
symmetric:
|
||||
encoder: "sentence-transformers/all-MiniLM-L6-v2"
|
||||
cross-encoder: "cross-encoder/ms-marco-MiniLM-L-6-v2"
|
||||
encoder-type: sentence_transformers.SentenceTransformer
|
||||
model_directory: "~/.khoj/search/symmetric/"
|
||||
|
||||
asymmetric:
|
||||
encoder: "sentence-transformers/multi-qa-MiniLM-L6-cos-v1"
|
||||
cross-encoder: "cross-encoder/ms-marco-MiniLM-L-6-v2"
|
||||
encoder-type: sentence_transformers.SentenceTransformer
|
||||
model_directory: "~/.khoj/search/asymmetric/"
|
||||
|
||||
image:
|
||||
encoder: "sentence-transformers/clip-ViT-B-32"
|
||||
encoder-type: sentence_transformers.SentenceTransformer
|
||||
model_directory: "~/.khoj/search/image/"
|
||||
|
||||
processor:
|
||||
conversation:
|
||||
openai-api-key: # "YOUR_OPENAI_API_KEY"
|
||||
model: "text-davinci-003"
|
||||
conversation-logfile: "~/.khoj/processor/conversation/conversation_logs.json"
|
||||
@@ -1,30 +1,66 @@
|
||||
version: "3.9"
|
||||
services:
|
||||
database:
|
||||
image: ankane/pgvector
|
||||
ports:
|
||||
- "5432:5432"
|
||||
environment:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
POSTGRES_DB: postgres
|
||||
volumes:
|
||||
- khoj_db:/var/lib/postgresql/data/
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
server:
|
||||
depends_on:
|
||||
database:
|
||||
condition: service_healthy
|
||||
# Use the following line to use the latest version of khoj. Otherwise, it will build from source.
|
||||
image: ghcr.io/khoj-ai/khoj:latest
|
||||
# Uncomment the following line to build from source. This will take a few minutes. Comment the next two lines out if you want to use the offiicial image.
|
||||
# build:
|
||||
# context: .
|
||||
ports:
|
||||
# If changing the local port (left hand side), no other changes required.
|
||||
# If changing the remote port (right hand side),
|
||||
# change the port in the args in the build section,
|
||||
# as well as the port in the command section to match
|
||||
- "8000:8000"
|
||||
- "42110:42110"
|
||||
working_dir: /app
|
||||
volumes:
|
||||
- .:/app
|
||||
# These mounted volumes hold the raw data that should be indexed for search.
|
||||
# The path in your local directory (left hand side)
|
||||
# points to the files you want to index.
|
||||
# The path of the mounted directory (right hand side),
|
||||
# must match the path prefix in your config file.
|
||||
- ./tests/data/org/:/data/org/
|
||||
- ./tests/data/images/:/data/images/
|
||||
- ./tests/data/ledger/:/data/ledger/
|
||||
- ./tests/data/music/:/data/music/
|
||||
- ./tests/data/markdown/:/data/markdown/
|
||||
- ./tests/data/pdf/:/data/pdf/
|
||||
# Embeddings and models are populated after the first run
|
||||
# You can set these volumes to point to empty directories on host
|
||||
- ./tests/data/embeddings/:/data/embeddings/
|
||||
- ./tests/data/models/:/data/models/
|
||||
- khoj_config:/root/.khoj/
|
||||
- khoj_models:/root/.cache/torch/sentence_transformers
|
||||
# Use 0.0.0.0 to explicitly set the host ip for the service on the container. https://pythonspeed.com/articles/docker-connection-refused/
|
||||
command: --no-gui --host="0.0.0.0" --port=8000 -c=config/khoj_docker.yml -vv
|
||||
environment:
|
||||
- POSTGRES_DB=postgres
|
||||
- POSTGRES_USER=postgres
|
||||
- POSTGRES_PASSWORD=postgres
|
||||
- POSTGRES_HOST=database
|
||||
- POSTGRES_PORT=5432
|
||||
- KHOJ_DJANGO_SECRET_KEY=secret
|
||||
- KHOJ_DEBUG=False
|
||||
- KHOJ_ADMIN_EMAIL=username@example.com
|
||||
- KHOJ_ADMIN_PASSWORD=password
|
||||
# Uncomment lines below to use chat models by each provider.
|
||||
# Ensure you set your provider specific API keys.
|
||||
# ---
|
||||
# - OPENAI_API_KEY=your_openai_api_key
|
||||
# - GEMINI_API_KEY=your_gemini_api_key
|
||||
# - ANTHROPIC_API_KEY=your_anthropic_api_key
|
||||
# Uncomment the necessary lines below to make your instance publicly accessible.
|
||||
# Replace the KHOJ_DOMAIN with either your domain or IP address (no http/https prefix).
|
||||
# Proceed with caution, especially if you are using anonymous mode.
|
||||
# ---
|
||||
# - KHOJ_NO_HTTPS=True
|
||||
# - KHOJ_DOMAIN=192.168.0.104
|
||||
# - KHOJ_DOMAIN=khoj.example.com
|
||||
command: --host="0.0.0.0" --port=42110 -vv --anonymous-mode --non-interactive
|
||||
|
||||
|
||||
volumes:
|
||||
khoj_config:
|
||||
khoj_db:
|
||||
khoj_models:
|
||||
|
||||
|
Before Width: | Height: | Size: 979 KiB |
|
Before Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 1.1 MiB |
20
documentation/.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
documentation/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.
|
||||
BIN
documentation/assets/img/admin_get_emali_login.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
documentation/assets/img/admin_successful_login_url.png
Normal file
|
After Width: | Height: | Size: 66 KiB |
BIN
documentation/assets/img/agents_page_full.png
Normal file
|
After Width: | Height: | Size: 511 KiB |
BIN
documentation/assets/img/dream_house.png
Normal file
|
After Width: | Height: | Size: 3.0 MiB |
BIN
documentation/assets/img/example_chatmodel_option.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
documentation/assets/img/example_openai_processor_config.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
documentation/assets/img/example_search_model_admin_settings.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
documentation/assets/img/favicon-128x128.ico
Normal file
|
After Width: | Height: | Size: 170 KiB |
BIN
documentation/assets/img/file_filters_conversation.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
documentation/assets/img/khoj-logo-sideways-200.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
documentation/assets/img/khoj-logo-sideways-500.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
5385
documentation/assets/img/khoj-logo-sideways.svg
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 350 KiB After Width: | Height: | Size: 350 KiB |
BIN
documentation/assets/img/khoj_chat_on_desktop.png
Normal file
|
After Width: | Height: | Size: 298 KiB |
|
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 302 KiB |
BIN
documentation/assets/img/khoj_chat_on_obsidian.png
Normal file
|
After Width: | Height: | Size: 394 KiB |
BIN
documentation/assets/img/khoj_chat_on_web.png
Normal file
|
After Width: | Height: | Size: 187 KiB |
74
documentation/assets/img/khoj_clients.svg
Normal file
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 544 KiB After Width: | Height: | Size: 544 KiB |
62
documentation/assets/img/khoj_datasources.svg
Normal file
|
After Width: | Height: | Size: 43 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 333 KiB After Width: | Height: | Size: 333 KiB |
|
Before Width: | Height: | Size: 445 KiB After Width: | Height: | Size: 445 KiB |
BIN
documentation/assets/img/khoj_search_on_desktop.png
Normal file
|
After Width: | Height: | Size: 333 KiB |
BIN
documentation/assets/img/khoj_search_on_emacs.png
Normal file
|
After Width: | Height: | Size: 420 KiB |
BIN
documentation/assets/img/khoj_search_on_obsidian.png
Normal file
|
After Width: | Height: | Size: 478 KiB |
BIN
documentation/assets/img/khoj_search_on_web.png
Normal file
|
After Width: | Height: | Size: 268 KiB |
BIN
documentation/assets/img/khoj_web_app_home.png
Normal file
|
After Width: | Height: | Size: 214 KiB |
BIN
documentation/assets/img/magic_link.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
documentation/assets/img/mic_chat_icon.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
BIN
documentation/assets/img/plants_i_got.png
Normal file
|
After Width: | Height: | Size: 3.0 MiB |
BIN
documentation/assets/img/pwa_install_1.png
Normal file
|
After Width: | Height: | Size: 103 KiB |
BIN
documentation/assets/img/pwa_install_2.png
Normal file
|
After Width: | Height: | Size: 119 KiB |
BIN
documentation/assets/img/pwa_install_3.png
Normal file
|
After Width: | Height: | Size: 265 KiB |
BIN
documentation/assets/img/quadratic_equation_khoj_web.gif
Normal file
|
After Width: | Height: | Size: 19 MiB |
BIN
documentation/assets/img/search_agents_markdown.png
Normal file
|
After Width: | Height: | Size: 336 KiB |
BIN
documentation/assets/img/select_file_filter.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
documentation/assets/img/speaker_icon.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
documentation/assets/img/summarize.jpg
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
documentation/assets/img/text_to_speech.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
documentation/assets/img/using_khoj_for_studying.gif
Normal file
|
After Width: | Height: | Size: 32 MiB |
3
documentation/babel.config.js
Normal file
@@ -0,0 +1,3 @@
|
||||
module.exports = {
|
||||
presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
|
||||
};
|
||||
8
documentation/docs/advanced/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Advanced Self Hosting",
|
||||
"position": 6,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Advanced setup for Self Hosting Khoj server"
|
||||
}
|
||||
}
|
||||
73
documentation/docs/advanced/admin.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# Admin Panel
|
||||
> Describes the Khoj settings configurable via the admin panel
|
||||
|
||||
## App Settings
|
||||
### Agents
|
||||
Add all the agents you want to use for your different use-cases like Writer, Researcher, Therapist etc.
|
||||
- `Personality`: This is a prompt to tell the chat model how to tune the personality of the agent.
|
||||
- `Chat model`: The chat model to use for the agent.
|
||||
- `Name`: The name of the agent. This field helps give the agent a unique identity across the app.
|
||||
- `Avatar`: Url to the agents profile picture. It help give the agent a unique visual identity across the app.
|
||||
- `Style color`, `Style icon`: These fields help give the agent a unique, visually identifiable identity across the app.
|
||||
- `Slug`: This is the agent name to use in urls.
|
||||
- `Public`: Check this if the agent is expected to be visible to all users on this Khoj server.
|
||||
- `Managed by admin`: Check this if the agent is managed by admin, not by any user.
|
||||
- `Creator`: The user who created the agent.
|
||||
- `Tools`: The list of tools available to this agent. Tools include notes, image, online. This field is not currently configurable and only supports all tools (i.e `["*"]`)
|
||||
|
||||
### Chat Model Options
|
||||
Add all the chat models you want to try, use and switch between for your different use-cases. For each chat model you add:
|
||||
- `Chat model`: The name of an [OpenAI](https://platform.openai.com/docs/models), [Anthropic](https://docs.anthropic.com/en/docs/about-claude/models#model-names), [Gemini](https://cloud.google.com/vertex-ai/generative-ai/docs/learn/models#gemini-models) or [Offline](https://huggingface.co/models?pipeline_tag=text-generation&library=gguf) chat model.
|
||||
- `Model type`: The chat model provider like `OpenAI`, `Offline`.
|
||||
- `Vision enabled`: Set to `true` if your model supports vision. This is currently only supported for vision capable OpenAI models like `gpt-4o`
|
||||
- `Max prompt size`, `Subscribed max prompt size`: These are optional fields. They are used to truncate the context to the maximum context size that can be passed to the model. This can help with accuracy and cost-saving.<br />
|
||||
- `Tokenizer`: This is an optional field. It is used to accurately count tokens and truncate context passed to the chat model to stay within the models max prompt size.
|
||||

|
||||
|
||||
### Server Chat Settings
|
||||
The server chat settings are used as:
|
||||
1. The default chat models for subscribed (`Advanced` field) and unsubscribed (`Default` field) users.
|
||||
2. The chat model for all intermediate steps like intent detection, web search etc. during chat response generation.
|
||||
|
||||
If a server chat setting is not added the first ChatModelOption in your config is used as the default chat model.
|
||||
|
||||
To add a server chat setting:
|
||||
- Set your preferred default chat models in the `Default` fields of your [ServerChatSettings](http://localhost:42110/server/admin/database/serverchatsettings/)
|
||||
- The `Advanced` field doesn't need to be set when self-hosting. When unset, the `Default` chat model is used for all users and the intermediate steps.
|
||||
|
||||
|
||||
### OpenAI Processor Conversation Configs
|
||||
These settings configure chat model providers to be accessed over API.
|
||||
The name of this setting is kind of a misnomer, we know, it'll hopefully be changed at some point.
|
||||
For each chat model provider you [add](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add):
|
||||
- `Api key`: Set to your [OpenAI](https://platform.openai.com/api-keys), [Anthropic](https://console.anthropic.com/account/keys) or [Gemini](https://aistudio.google.com/app/apikey) API keys.
|
||||
- `Name`: Give the configuration any friendly name like `OpenAI`, `Gemini`, `Anthropic`.
|
||||
- `Api base url`: Set the API base URL. This is only relevant to set if you're using another OpenAI-compatible proxy server like [Ollama](/advanced/ollama) or [LMStudio](/advanced/lmstudio).
|
||||

|
||||
|
||||
### Search Model Configs
|
||||
Search models are used to generate vector embeddings of your documents for natural language search and chat. You can choose any [embeddings models on HuggingFace](https://huggingface.co/models?pipeline_tag=sentence-similarity) to try, use for your to create vector embeddings of your documents for natural language search and chat.
|
||||
|
||||
<img src="/img/example_search_model_admin_settings.png" alt="Example Search Model Settings" style={{width: 500}} />
|
||||
|
||||
### Text to Image Model Options
|
||||
Add text to image generation models with these settings. Khoj currently supports text to image models available via OpenAI, Stability or Replicate API
|
||||
- `api-key`: Set to your OpenAI, Stability or Replicate API key
|
||||
- `model`: Set the model name available over the selected model provider
|
||||
- `model-type`: Set to the appropiate model provider
|
||||
- `openai-config`: For image generation models available via OpenAI (compatible) API you can set the appropriate OpenAI Processor Conversation Settings instead of specifying the `api-key` field above
|
||||
|
||||
### Speech to Text Model Options
|
||||
Add speech to text models with these settings. Khoj currently only supports whisper speech to text model via OpenAI API or Offline
|
||||
|
||||
### Voice Model Options
|
||||
Add text to speech models with these settings. Khoj currently supports models from [ElevenLabs](https://elevenlabs.io/).
|
||||
|
||||
## User Data
|
||||
- Users, Entrys, Conversations, Subscriptions, Github configs, Notion configs, User search configs, User conversation configs, User voice configs
|
||||
|
||||
## Miscellaneous Data
|
||||
- Process Locks: Persistent Locks for Automations
|
||||
- Client Applications:
|
||||
|
||||
Client applications allow you to setup third party applications that can query your Khoj server using a client application ID + secret. The secret would go in a bearer token.
|
||||
52
documentation/docs/advanced/authentication.md
Normal file
@@ -0,0 +1,52 @@
|
||||
# Authenticate
|
||||
|
||||
:::info
|
||||
This is only helpful for self-hosted users or teams. If you're using [Khoj Cloud](https://app.khoj.dev), both Magic Links and Google OAuth work.
|
||||
:::
|
||||
|
||||
By default, most of the instructions for self-hosting Khoj assume a single user, and so the default configuration is to run in anonymous mode. However, if you want to enable authentication, you can do so either with with [Magic Links](#using-magic-links) or [Google OAuth](#using-google-oauth) as shown below. This can be helpful to make Khoj securely accessible to you and your team.
|
||||
|
||||
:::tip[Note]
|
||||
Remove the `--anonymous-mode` flag from your khoj start up command or docker-compose file to enable authentication.
|
||||
:::
|
||||
|
||||
## Using Magic Links
|
||||
The most secure way to do this is to integrate with [Resend](https://resend.com) by setting up an account and adding an environment variable for `RESEND_API_KEY`. You can get your API key [here](https://resend.com/api-keys). This will allow you to automatically send sign-in links to users who want to log in.
|
||||
|
||||
It's still possible to use the magic links feature without Resend, but you'll need to manually send the magic links to users who want to log in.
|
||||
|
||||
## Manually sending magic links
|
||||
|
||||
1. The user will have to enter their email address in the login form.
|
||||
They'll click `Send Magic Link`. Without the Resend API key, this will just create an unverified account for them in the backend
|
||||
<img src="/img/magic_link.png" alt="Magic link login form" width="400"/>
|
||||
|
||||
2. You can get their magic link using the admin panel
|
||||
Go to the [admin panel](http://localhost:42110/server/admin/database/khojuser/). You'll see a list of users. Search for the user you want to send a magic link to. Tick the checkbox next to their row, and use the action drop down at the top to 'Get email login URL'. This will generate a magic link that you can send to the user, which will appear at the top of the admin interface.
|
||||
|
||||
| Get email login URL | Retrieved login URL |
|
||||
|---------------------|---------------------|
|
||||
| <img src="/img/admin_get_emali_login.png" alt="Get user magic sign in link" width="400" />| <img src="/img/admin_successful_login_url.png" alt="Successfully retrieved a login URL" width="400" />|
|
||||
|
||||
3. Send the magic link to the user. They can click on it to log in.
|
||||
|
||||
Once they click on the link, they'll automatically be logged in. They'll have to repeat this process for every new device they want to log in from, but they shouldn't have to repeat it on the same device.
|
||||
|
||||
A given magic link can only be used once. If the user tries to use it again, they'll be redirected to the login page to get a new magic link.
|
||||
|
||||
## Using Google OAuth
|
||||
|
||||
To set up your self-hosted Khoj with Google Auth, you need to create a project in the Google Cloud Console and enable the Google Auth API.
|
||||
|
||||
To implement this, you'll need to:
|
||||
1. You must use the `python` package or build from source, because you'll need to install additional packages for the google auth libraries (`prod`). The syntax to install the right packages is
|
||||
```
|
||||
pip install khoj[prod]
|
||||
```
|
||||
2. [Create authorization credentials](https://developers.google.com/identity/sign-in/web/sign-in) for your application.
|
||||
3. Open your [Google cloud console](https://console.developers.google.com/apis/credentials) and create a configuration like below for the relevant `OAuth 2.0 Client IDs` project:
|
||||

|
||||
|
||||
4. Configure these environment variables: `GOOGLE_CLIENT_SECRET`, and `GOOGLE_CLIENT_ID`. You can find these values in the Google cloud console, in the same place where you configured the authorized origins and redirect URIs.
|
||||
|
||||
That's it! That should be all you have to do. Now, when you reload Khoj without `--anonymous-mode`, you should be able to use your Google account to sign in.
|
||||
37
documentation/docs/advanced/litellm.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# LiteLLM
|
||||
:::info
|
||||
This is only helpful for self-hosted users. If you're using [Khoj Cloud](https://app.khoj.dev), you're limited to our first-party models.
|
||||
:::
|
||||
|
||||
:::info
|
||||
Khoj natively supports local LLMs [available on HuggingFace in GGUF format](https://huggingface.co/models?library=gguf). Using an OpenAI API proxy with Khoj maybe useful for ease of setup, trying new models or using commercial LLMs via API.
|
||||
:::
|
||||
|
||||
[LiteLLM](https://docs.litellm.ai/docs/proxy/quick_start) exposes an OpenAI compatible API that proxies requests to other LLM API services. This provides a standardized API to interact with both open-source and commercial LLMs.
|
||||
|
||||
Using LiteLLM with Khoj makes it possible to turn any LLM behind an API into your personal AI agent.
|
||||
|
||||
## Setup
|
||||
1. Install LiteLLM
|
||||
```bash
|
||||
pip install litellm[proxy]
|
||||
```
|
||||
2. Start LiteLLM and use Mistral tiny via Mistral API
|
||||
```
|
||||
export MISTRAL_API_KEY=<MISTRAL_API_KEY>
|
||||
litellm --model mistral/mistral-tiny --drop_params
|
||||
```
|
||||
3. Create a new [OpenAI Processor Conversation Config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) on your Khoj admin panel
|
||||
- Name: `proxy-name`
|
||||
- Api Key: `any string`
|
||||
- Api Base Url: **URL of your Openai Proxy API**
|
||||
4. Create a new [Chat Model Option](http://localhost:42110/server/admin/database/chatmodeloptions/add) on your Khoj admin panel.
|
||||
- Name: `llama3.1` (replace with the name of your local model)
|
||||
- Model Type: `Openai`
|
||||
- Openai Config: `<the proxy config you created in step 3>`
|
||||
- Max prompt size: `20000` (replace with the max prompt size of your model)
|
||||
- Tokenizer: *Do not set for OpenAI, Mistral, Llama3 based models*
|
||||
5. Create a new [Server Chat Setting](http://localhost:42110/server/admin/database/serverchatsettings/add/) on your Khoj admin panel
|
||||
- Default model: `<name of chat model option you created in step 4>`
|
||||
- Summarizer model: `<name of chat model option you created in step 4>`
|
||||
6. Go to [your config](http://localhost:42110/settings) and select the model you just created in the chat model dropdown.
|
||||
30
documentation/docs/advanced/lmstudio.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# LM Studio
|
||||
:::info
|
||||
This is only helpful for self-hosted users. If you're using [Khoj Cloud](https://app.khoj.dev), you're limited to our first-party models.
|
||||
:::
|
||||
|
||||
:::info
|
||||
Khoj natively supports local LLMs [available on HuggingFace in GGUF format](https://huggingface.co/models?library=gguf). Using an OpenAI API proxy with Khoj maybe useful for ease of setup, trying new models or using commercial LLMs via API.
|
||||
:::
|
||||
|
||||
[LM Studio](https://lmstudio.ai/) is a desktop app to chat with open-source LLMs on your local machine. LM Studio provides a neat interface for folks comfortable with a GUI.
|
||||
|
||||
LM Studio can expose an [OpenAI API compatible server](https://lmstudio.ai/docs/local-server). This makes it possible to turn chat models from LM Studio into your personal AI agents with Khoj.
|
||||
|
||||
## Setup
|
||||
1. Install [LM Studio](https://lmstudio.ai/) and download your preferred Chat Model
|
||||
2. Go to the Server Tab on LM Studio, Select your preferred Chat Model and Click the green Start Server button
|
||||
3. Create a new [OpenAI Processor Conversation Config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) on your Khoj admin panel
|
||||
- Name: `proxy-name`
|
||||
- Api Key: `any string`
|
||||
- Api Base Url: `http://localhost:1234/v1/` (default for LMStudio)
|
||||
4. Create a new [Chat Model Option](http://localhost:42110/server/admin/database/chatmodeloptions/add) on your Khoj admin panel.
|
||||
- Name: `llama3.1` (replace with the name of your local model)
|
||||
- Model Type: `Openai`
|
||||
- Openai Config: `<the proxy config you created in step 3>`
|
||||
- Max prompt size: `20000` (replace with the max prompt size of your model)
|
||||
- Tokenizer: *Do not set for OpenAI, mistral, llama3 based models*
|
||||
5. Create a new [Server Chat Setting](http://localhost:42110/server/admin/database/serverchatsettings/add/) on your Khoj admin panel
|
||||
- Default model: `<name of chat model option you created in step 4>`
|
||||
- Summarizer model: `<name of chat model option you created in step 4>`
|
||||
6. Go to [your config](http://localhost:42110/settings) and select the model you just created in the chat model dropdown.
|
||||
36
documentation/docs/advanced/ollama.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# Ollama
|
||||
:::info
|
||||
This is only helpful for self-hosted users. If you're using [Khoj Cloud](https://app.khoj.dev), you're limited to our first-party models.
|
||||
:::
|
||||
|
||||
:::info
|
||||
Khoj natively supports local LLMs [available on HuggingFace in GGUF format](https://huggingface.co/models?library=gguf). Using an OpenAI API proxy with Khoj maybe useful for ease of setup, trying new models or using commercial LLMs via API.
|
||||
:::
|
||||
|
||||
Ollama allows you to run [many popular open-source LLMs](https://ollama.com/library) locally from your terminal.
|
||||
For folks comfortable with the terminal, Ollama's terminal based flows can ease setup and management of chat models.
|
||||
|
||||
Ollama exposes a local [OpenAI API compatible server](https://github.com/ollama/ollama/blob/main/docs/openai.md#models). This makes it possible to use chat models from Ollama to create your personal AI agents with Khoj.
|
||||
|
||||
## Setup
|
||||
|
||||
1. Setup Ollama: https://ollama.com/
|
||||
2. Start your preferred model with Ollama. For example,
|
||||
```bash
|
||||
ollama run llama3.1
|
||||
```
|
||||
3. Create a new [OpenAI Processor Conversation Config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) on your Khoj admin panel
|
||||
- Name: `ollama`
|
||||
- Api Key: `any string`
|
||||
- Api Base Url: `http://localhost:11434/v1/` (default for Ollama)
|
||||
4. Create a new [Chat Model Option](http://localhost:42110/server/admin/database/chatmodeloptions/add) on your Khoj admin panel.
|
||||
- Name: `llama3.1` (replace with the name of your local model)
|
||||
- Model Type: `Openai`
|
||||
- Openai Config: `<the ollama config you created in step 3>`
|
||||
- Max prompt size: `20000` (replace with the max prompt size of your model)
|
||||
5. Create a new [Server Chat Setting](http://localhost:42110/server/admin/database/serverchatsettings/add/) on your Khoj admin panel
|
||||
- Default model: `<name of chat model option you created in step 4>`
|
||||
- Summarizer model: `<name of chat model option you created in step 4>`
|
||||
6. Go to [your config](http://localhost:42110/settings) and select the model you just created in the chat model dropdown.
|
||||
|
||||
That's it! You should now be able to chat with your Ollama model from Khoj. If you want to add additional models running on Ollama, repeat step 6 for each model.
|
||||
20
documentation/docs/advanced/remote.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# Remote Access
|
||||
|
||||
By default self-hosted Khoj is only accessible on the machine it is running. To securely access it from a remote machine:
|
||||
- Set the `KHOJ_DOMAIN` environment variable to your remotely accessible ip or domain via shell or docker-compose.yml.
|
||||
Examples: `KHOJ_DOMAIN=my.khoj-domain.com`, `KHOJ_DOMAIN=192.168.0.4`.
|
||||
- Ensure the Khoj Admin password and `KHOJ_DJANGO_SECRET_KEY` environment variable are securely set.
|
||||
- Setup [Authentication](/advanced/authentication).
|
||||
- Open access to the Khoj port (default: 42110) from your OS and Network firewall.
|
||||
|
||||
:::warning[Use HTTPS certificate]
|
||||
To expose Khoj on a custom domain over the public internet, use of an SSL certificate is strongly recommended. You can use [Let's Encrypt](https://letsencrypt.org/) to get a free SSL certificate for your domain.
|
||||
|
||||
To disable HTTPS, set the `KHOJ_NO_HTTPS` environment variable to `True`. This can be useful if Khoj is only accessible behind a secure, private network.
|
||||
:::
|
||||
|
||||
:::info[Try Tailscale]
|
||||
You can use [Tailscale](https://tailscale.com/) for easy, secure access to your self-hosted Khoj over the network.
|
||||
1. Set `KHOJ_DOMAIN` to your machines [tailscale ip](https://tailscale.com/kb/1452/connect-to-devices#identify-your-devices) or [fqdn on tailnet](https://tailscale.com/kb/1081/magicdns#fully-qualified-domain-names-vs-machine-names). E.g `KHOJ_DOMAIN=100.4.2.0` or `KHOJ_DOMAIN=khoj.tailfe8c.ts.net`
|
||||
2. Access Khoj by opening `http://tailscale-ip-of-server:42110` or `http://fqdn-of-server:42110` from any device on your tailscale network
|
||||
:::
|
||||
17
documentation/docs/advanced/support-multilingual-docs.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# Support Multilingual Docs
|
||||
Khoj uses an embedding model to understand documents. Multilingual embedding models improve the search quality for documents not in English. This affects both search and chat with docs experiences across Khoj.
|
||||
|
||||
To improve search and chat quality for non-english documents you can use a [multilingual model](https://www.sbert.net/docs/pretrained_models.html#multi-lingual-models).<br />
|
||||
For example, the [paraphrase-multilingual-MiniLM-L12-v2](https://huggingface.co/sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2) supports [50+ languages](https://www.sbert.net/docs/pretrained_models.html#:~:text=we%20used%20the%20following%2050%2B%20languages), has decent search quality and speed for a consumer machine.
|
||||
To use it:
|
||||
1. Open [the search config](http://localhost:42110/server/admin/database/searchmodelconfig/) on your server's admin settings page. Either create a new search model, if none exists, or update the existing one. For example,
|
||||
- Set the `bi_encoder` field to `sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2`
|
||||
- Set the `cross_encoder` field to `mixedbread-ai/mxbai-rerank-xsmall-v1`
|
||||
2. Regenerate your content index from all the relevant clients. This step is very important, as you'll need to re-encode all your content with the new model.
|
||||
|
||||
:::info[Note]
|
||||
Modern search/embedding model like [mixedbread-ai/mxbai-embed-large-v1](https://huggingface.co/mixedbread-ai/mxbai-embed-large-v1) expect a prefix to the query (or docs) string to improve encoding. Update the `bi_encoder_query_encode_config` field of your [embedding model](http://localhost:42110/server/admin/database/searchmodelconfig/) with `{prompt: <prefix-prompt>}` to improve the search quality of these models.
|
||||
|
||||
E.g. `{prompt: "Represent this query for searching documents"}`. You can pass any valid JSON object that the SentenceTransformer `encode` function accepts
|
||||
|
||||
:::
|
||||
37
documentation/docs/advanced/use-openai-proxy.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Use OpenAI Proxy
|
||||
:::info
|
||||
This is only helpful for self-hosted users. If you're using [Khoj Cloud](https://app.khoj.dev), you're limited to our first-party models.
|
||||
:::
|
||||
|
||||
:::info
|
||||
Khoj natively supports local LLMs [available on HuggingFace in GGUF format](https://huggingface.co/models?library=gguf). Using an OpenAI API proxy with Khoj maybe useful for ease of setup, trying new models or using commercial LLMs via API.
|
||||
:::
|
||||
|
||||
Khoj can use any OpenAI API compatible server including [Ollama](/advanced/ollama), [LMStudio](/advanced/lmstudio) and [LiteLLM](/advanced/litellm).
|
||||
Configuring this allows you to use non-standard, open or commercial, local or hosted LLM models for Khoj
|
||||
|
||||
Combine them with Khoj can turn your favorite LLM into an AI agent. Allowing you to chat with your docs, find answers from the internet, build custom agents and run automations.
|
||||
|
||||
For specific integrations, see our [Ollama](/advanced/ollama), [LMStudio](/advanced/lmstudio) and [LiteLLM](/advanced/litellm) setup docs. For general instructions to setup Khoj with an OpenAI API proxy see below.
|
||||
|
||||
## General Setup
|
||||
|
||||
1. Start your preferred OpenAI API compatible app
|
||||
3. Create a new [OpenAI Processor Conversation Config](http://localhost:42110/server/admin/database/openaiprocessorconversationconfig/add) on your Khoj admin panel
|
||||
- Name: `proxy-name`
|
||||
- Api Key: `any string`
|
||||
- Api Base Url: **URL of your Openai Proxy API**
|
||||
4. Create a new [Chat Model Option](http://localhost:42110/server/admin/database/chatmodeloptions/add) on your Khoj admin panel.
|
||||
- Name: `llama3` (replace with the name of your local model)
|
||||
- Model Type: `Openai`
|
||||
- Openai Config: `<the proxy config you created in step 3>`
|
||||
- Max prompt size: `2000` (replace with the max prompt size of your model)
|
||||
- Tokenizer: *Do not set for OpenAI, mistral, llama3 based models*
|
||||
5. Create a new [Server Chat Setting](http://localhost:42110/server/admin/database/serverchatsettings/add/) on your Khoj admin panel
|
||||
- Default model: `<name of chat model option you created in step 4>`
|
||||
- Summarizer model: `<name of chat model option you created in step 4>`
|
||||
6. Go to [your config](http://localhost:42110/settings) and select the model you just created in the chat model dropdown.
|
||||
8
documentation/docs/clients/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Clients",
|
||||
"position": 4,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Different ways for indexing data with the Khoj backend. To see online data sources, go to https://docs.khoj.dev/category/data-sources"
|
||||
}
|
||||
}
|
||||
34
documentation/docs/clients/desktop.md
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Desktop
|
||||
|
||||
> Query your Second Brain from your machine
|
||||
|
||||
Use the Desktop app to chat and search with Khoj.
|
||||
You can also share your files, folders with Khoj using the app.
|
||||
Khoj will keep these files in sync to provide contextual responses when you search or chat.
|
||||
|
||||
## Features
|
||||
- **Chat**
|
||||
- **Faster answers**: Find answers quickly, from your private notes or the public internet
|
||||
- **Assisted creativity**: Smoothly weave across retrieving answers and generating content
|
||||
- **Iterative discovery**: Iteratively explore and re-discover your notes
|
||||
- **Quick access**: Use [Khoj Mini](/features/khoj_mini) on the desktop to quickly pull up a mini chat module for quicker answers
|
||||
- **Search**
|
||||
- **Natural**: Advanced natural language understanding using Transformer based ML Models
|
||||
- **Incremental**: Incremental search for a fast, search-as-you-type experience
|
||||
|
||||
## Setup
|
||||
|
||||
1. Install the [Khoj Desktop app](https://khoj.dev/downloads) for your OS
|
||||
2. Generate an API key on the [Khoj Web App](https://app.khoj.dev/settings#clients)
|
||||
3. Set your Khoj API Key on the *Settings* page of the Khoj Desktop app
|
||||
4. [Optional] Add any files, folders you'd like Khoj to be aware of on the *Settings* page and Click *Save*
|
||||
These files and folders will be automatically kept in sync for you
|
||||
|
||||
## Interface
|
||||
| Chat | Search |
|
||||
|:----:|:------:|
|
||||
|  |  |
|
||||
137
documentation/docs/clients/emacs.md
Normal file
@@ -0,0 +1,137 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Emacs
|
||||
|
||||
<img src="https://stable.melpa.org/packages/khoj-badge.svg" width="130" alt="Melpa Stable Badge" />
|
||||
<img src="https://melpa.org/packages/khoj-badge.svg" width="150" alt="Melpa Badge" />
|
||||
|
||||
<img src="https://github.com/khoj-ai/khoj/actions/workflows/build_khoj_el.yml/badge.svg" width="150" alt="Build Badge" />
|
||||
<img src="https://github.com/khoj-ai/khoj/actions/workflows/test_khoj_el.yml/badge.svg" width="150" alt="Test Badge" />
|
||||
|
||||
<br />
|
||||
<br />
|
||||
> Query your Second Brain from Emacs
|
||||
|
||||
## Features
|
||||
- **Chat**
|
||||
- **Faster answers**: Find answers quickly, from your private notes or the public internet
|
||||
- **Assisted creativity**: Smoothly weave across retrieving answers and generating content
|
||||
- **Iterative discovery**: Iteratively explore and re-discover your notes
|
||||
- **Search**
|
||||
- **Natural**: Advanced natural language understanding using Transformer based ML Models
|
||||
- **Incremental**: Incremental search for a fast, search-as-you-type experience
|
||||
|
||||
## Interface
|
||||
|
||||
| Search | Chat |
|
||||
|:------:|:----:|
|
||||
|  |  |
|
||||
|
||||
## Setup
|
||||
1. Generate an API key on the [Khoj Web App](https://app.khoj.dev/settings#clients)
|
||||
2. Add below snippet to your Emacs config file, usually at `~/.emacs.d/init.el`
|
||||
|
||||
|
||||
#### **Direct Install**
|
||||
*Khoj will index your org-agenda files, by default*
|
||||
|
||||
```elisp
|
||||
;; Install Khoj.el
|
||||
M-x package-install khoj
|
||||
|
||||
; Set your Khoj API key
|
||||
(setq khoj-api-key "YOUR_KHOJ_CLOUD_API_KEY")
|
||||
```
|
||||
|
||||
#### **Minimal Install**
|
||||
*Khoj will index your org-agenda files, by default*
|
||||
|
||||
```elisp
|
||||
;; Install Khoj client from MELPA Stable
|
||||
(use-package khoj
|
||||
:ensure t
|
||||
:pin melpa-stable
|
||||
:bind ("C-c s" . 'khoj)
|
||||
:config (setq khoj-api-key "YOUR_KHOJ_CLOUD_API_KEY"))
|
||||
```
|
||||
|
||||
#### **Standard Install**
|
||||
*Configures the specified org files, directories to be indexed by Khoj*
|
||||
|
||||
```elisp
|
||||
;; Install Khoj client from MELPA Stable
|
||||
(use-package khoj
|
||||
:ensure t
|
||||
:pin melpa-stable
|
||||
:bind ("C-c s" . 'khoj)
|
||||
:config (setq khoj-api-key "YOUR_KHOJ_CLOUD_API_KEY"
|
||||
khoj-org-directories '("~/docs/org-roam" "~/docs/notes")
|
||||
khoj-org-files '("~/docs/todo.org" "~/docs/work.org")))
|
||||
```
|
||||
|
||||
#### **Straight.el**
|
||||
*Configures the specified org files, directories to be indexed by Khoj*
|
||||
|
||||
```elisp
|
||||
;; Install Khoj client using Straight.el
|
||||
(use-package khoj
|
||||
:after org
|
||||
:straight (khoj :type git :host github :repo "khoj-ai/khoj" :files (:defaults "src/interface/emacs/khoj.el"))
|
||||
:bind ("C-c s" . 'khoj)
|
||||
:config (setq khoj-api-key "YOUR_KHOJ_CLOUD_API_KEY"
|
||||
khoj-org-directories '("~/docs/org-roam" "~/docs/notes")
|
||||
khoj-org-files '("~/docs/todo.org" "~/docs/work.org")))
|
||||
```
|
||||
|
||||
## Use
|
||||
### Search
|
||||
See [Khoj Search](/features/search) for details
|
||||
1. Hit `C-c s s` (or `M-x khoj RET s`) to open khoj search
|
||||
2. Enter your query in natural language<br/>
|
||||
E.g. *"What is the meaning of life?"*, *"My life goals for 2023"*
|
||||
|
||||
### Chat
|
||||
See [Khoj Chat](/features/chat) for details
|
||||
1. Hit `C-c s c` (or `M-x khoj RET c`) to open khoj chat
|
||||
2. Ask questions in a natural, conversational style<br/>
|
||||
E.g. *"When did I file my taxes last year?"*
|
||||
|
||||
### Find Similar Entries
|
||||
This feature finds entries similar to the one you are currently on.
|
||||
1. Move cursor to the org-mode entry, markdown section or text paragraph you want to find similar entries for
|
||||
2. Hit `C-c s f` (or `M-x khoj RET f`) to find similar entries
|
||||
|
||||
### Advanced Usage
|
||||
- Add [query filters](https://github.com/khoj-ai/khoj/#query-filters) during search to narrow down results further
|
||||
e.g. `What is the meaning of life? -"god" +"none" dt>"last week"`
|
||||
|
||||
- Use `C-c C-o 2` to open the current result at cursor in its source org file
|
||||
- This calls `M-x org-open-at-point` on the current entry and opens the second link in the entry.
|
||||
- The second link is the entries [org-id](https://orgmode.org/manual/Handling-Links.html#FOOT28), if set, or the heading text.
|
||||
The first link is the line number of the entry in the source file. This link is less robust to file changes.
|
||||
- Note: If you have [speed keys](https://orgmode.org/manual/Speed-Keys.html) enabled, `o 2` will also work
|
||||
|
||||
### Khoj Menu
|
||||

|
||||
Hit `C-c s` (or `M-x khoj`) to open the khoj menu above. Then:
|
||||
- Hit `t` until you preferred content type is selected in the khoj menu
|
||||
`Content Type` specifies the content to perform `Search`, `Update` or `Find Similar` actions on
|
||||
- Hit `n` twice and then enter number of results you want to see
|
||||
`Results Count` is used by the `Search` and `Find Similar` actions
|
||||
- Hit `-f u` to `force` update the khoj content index
|
||||
The `Force Update` switch is only used by the `Update` action
|
||||
|
||||
## Upgrade
|
||||
Use your Emacs package manager to upgrade `khoj.el`
|
||||
<!-- tabs:start -->
|
||||
|
||||
#### **With MELPA**
|
||||
1. Run `M-x package-refresh-content`
|
||||
2. Run `M-x package-reinstall khoj`
|
||||
|
||||
#### **With Straight.el**
|
||||
- Run `M-x straight-pull-package khoj`
|
||||
|
||||
<!-- tabs:end -->
|
||||
56
documentation/docs/clients/obsidian.md
Normal file
@@ -0,0 +1,56 @@
|
||||
---
|
||||
sidebar_position: 3
|
||||
---
|
||||
|
||||
# Obsidian
|
||||
|
||||
> Query your Second Brain from Obsidian
|
||||
|
||||

|
||||
|
||||
## Features
|
||||
- **Chat**
|
||||
- **Faster answers**: Find answers quickly, from your private notes or the public internet
|
||||
- **Assisted creativity**: Smoothly weave across retrieving answers and generating content
|
||||
- **Iterative discovery**: Iteratively explore and re-discover your notes
|
||||
- **Search**
|
||||
- **Natural**: Advanced natural language understanding using Transformer based ML Models
|
||||
- **Incremental**: Incremental search for a fast, search-as-you-type experience
|
||||
- **Similar**
|
||||
- **Discover**: Find similar notes to the current one
|
||||
|
||||
## Setup
|
||||
|
||||
1. Open [Khoj](https://obsidian.md/plugins?id=khoj) from the *Community plugins* tab in Obsidian settings panel
|
||||
2. Click *Install*, then *Enable* on the Khoj plugin page in Obsidian
|
||||
3. Generate an API key on the [Khoj Web App](https://app.khoj.dev/settings#clients)
|
||||
4. Set your Khoj API Key in the Khoj plugin settings in Obsidian
|
||||
|
||||
See the official [Obsidian Plugin Docs](https://help.obsidian.md/Extending+Obsidian/Community+plugins) for more details on installing Obsidian plugins.
|
||||
|
||||
## Use
|
||||
### Chat
|
||||
Click the *Khoj chat* icon 💬 on the [Ribbon](https://help.obsidian.md/User+interface/Workspace/Ribbon) or run *Khoj: Chat* from the [Command Palette](https://help.obsidian.md/Plugins/Command+palette) and ask questions in a natural, conversational style.<br />
|
||||
E.g. *"When did I file my taxes last year?"*
|
||||
|
||||
See [Khoj Chat](/features/chat) for more details
|
||||
|
||||
### Find Similar Notes
|
||||
To see other notes similar to the current one, run *Khoj: Find Similar Notes* from the [Command Palette](https://help.obsidian.md/Plugins/Command+palette)
|
||||
|
||||
### Search
|
||||
Run *Khoj: Search* from the [Command Palette](https://help.obsidian.md/Plugins/Command+palette)
|
||||
|
||||
See [Khoj Search](/features/search) for more details. Use [query filters](/miscellaneous/advanced#query-filters) to limit entries to search
|
||||
|
||||
[search_demo](https://user-images.githubusercontent.com/6413477/218801155-cd67e8b4-a770-404a-8179-d6b61caa0f93.mp4 ':include :type=mp4')
|
||||
|
||||
## Upgrade
|
||||
1. Open *Community plugins* tab in Obsidian settings
|
||||
2. Click the *Check for updates* button
|
||||
3. Click the *Update* button next to Khoj, if available
|
||||
|
||||
## Troubleshooting
|
||||
- Open the Khoj plugin settings pane, to configure Khoj
|
||||
- Toggle Enable/Disable Khoj, if setting changes have not applied
|
||||
- Click *Update* button to force index to refresh, if results are failing or stale
|
||||
43
documentation/docs/clients/web.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Web
|
||||
|
||||
> Query your Second Brain from your Web Browser
|
||||
|
||||
Without any desktop clients, you can start chatting with Khoj on the web. Bear in mind you do need one of the desktop clients in order to share and sync your data with Khoj.
|
||||
|
||||
Go see it here --> [Khoj Cloud](https://app.khoj.dev).
|
||||
|
||||

|
||||
|
||||
## Features
|
||||
- **Chat**
|
||||
- **Faster answers**: Find answers quickly, from your private notes or the public internet
|
||||
- **Assisted creativity**: Smoothly weave across retrieving answers and generating content
|
||||
- **Iterative discovery**: Iteratively explore and re-discover your notes
|
||||
- **Search**
|
||||
- **Natural**: Advanced natural language understanding using Transformer based ML Models
|
||||
- **Incremental**: Incremental search for a fast, search-as-you-type experience
|
||||
|
||||
## Setup
|
||||
No setup required. The Khoj web app is the default Khoj client. You can access it from any web browser. Try it on [Khoj Cloud](https://app.khoj.dev)
|
||||
|
||||
## Upload Documents
|
||||
You can upload documents to Khoj from the web interface, one at a time. This is useful for uploading documents from your phone or tablet. To upload a document:
|
||||
1. You can drag and drop the document into the chat window.
|
||||
2. Or click the paperclip icon in the chat window and select the document from your file system.
|
||||
|
||||

|
||||
|
||||
### Install on Phone
|
||||
You can optionally install Khoj as a [Progressive Web App (PWA)](https://web.dev/learn/pwa/installation). This makes it quick and easy to access Khoj on your phone.
|
||||
1. Login to [Khoj Cloud](https://app.khoj.dev) or your self-hosted Khoj server from the web browser (prefer Chrome/Edge) on your phone
|
||||
2. Open the 3 dot menu on the browser and click the "Add to Home screen" option
|
||||
3. Click "Install" on the next screen to add the Khoj icon to your phone Home screen
|
||||
|
||||
**Process via Screenshots**
|
||||
| Step 1 | Step 2 | Step 3|
|
||||
|:---:|:---:|:---:|
|
||||
|  |  |  |
|
||||
30
documentation/docs/clients/whatsapp.md
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
# WhatsApp
|
||||
|
||||
> Query your Second Brain from WhatsApp
|
||||
|
||||
Text [+1 (848) 800 4242](https://wa.me/18488004242) or scan the QQ code below on your phone to chat with Khoj on WhatsApp.
|
||||
|
||||
Without any desktop clients, you can start chatting with Khoj on WhatsApp. Bear in mind you do need one of the desktop clients in order to share and sync your data with Khoj. The WhatsApp AI bot will work right away for answering generic queries and using Khoj in default mode.
|
||||
|
||||
In order to use Khoj on WhatsApp with your own data, you need to setup a Khoj Cloud account and connect your WhatsApp account to it. This is a one time setup and you can do it from the [Khoj Cloud config page](https://app.khoj.dev/settings).
|
||||
|
||||
If you hit usage limits for the WhatsApp bot, upgrade to [a paid plan](https://khoj.dev/pricing) on Khoj Cloud.
|
||||
|
||||
<img src="https://khoj-web-bucket.s3.amazonaws.com/khojwhatsapp.png" alt="WhatsApp QR Code" width="300" height="300" />
|
||||
|
||||
## Features
|
||||
|
||||
- **Slash Commands**: Use slash commands to quickly access Khoj features
|
||||
- `/online`: Get responses from Khoj powered by online search.
|
||||
- `/dream`: Generate an image in response to your prompt.
|
||||
- `/notes`: Explicitly force Khoj to retrieve context from your notes. Note: You'll need to connect your WhatsApp account to a Khoj Cloud account for this to work.
|
||||
|
||||
We have more commands under development, including `/share` to uploading documents directly to your Khoj account from WhatsApp, and `/speak` in order to get a speech response from Khoj. Feel free to [raise an issue](https://github.com/khoj-ai/flint/issues) if you have any suggestions for new commands.
|
||||
|
||||
## Source Code
|
||||
|
||||
You can find all of the code for the WhatsApp bot in the the [flint repository](https://github.com/khoj-ai/flint). As all of our code, it is open source and you can contribute to it.
|
||||
8
documentation/docs/contributing/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Contributing",
|
||||
"position": 2,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Development Setup"
|
||||
}
|
||||
}
|
||||
252
documentation/docs/contributing/development.mdx
Normal file
@@ -0,0 +1,252 @@
|
||||
---
|
||||
sidebar_position: 0
|
||||
---
|
||||
|
||||
# Development
|
||||
|
||||
Welcome to the development docs of Khoj! Thanks for you interesting in being a contributor ❤️. Open source contributors are a corner-store of the Khoj community. We welcome all contributions, big or small.
|
||||
|
||||
To get started with contributing, check out the official GitHub docs on [contributing to an open-source project](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project).
|
||||
|
||||
Join the [Discord](https://discord.gg/WaxF3SkFPU) server and click the ✅ for the question "Are you interested in becoming a contributor?" in the `#welcome-and-rules` channel. This will give you access to the `#contributors` channel where you can ask questions and get help from other contributors.
|
||||
|
||||
If you're looking for a place to get started, check out the list of [Github Issues](https://github.com/khoj-ai/khoj/issues) with the tag `good first issue` to find issues that are good for first-time contributors.
|
||||
|
||||
## Local Server Installation
|
||||
### Using Pip
|
||||
#### 1. Khoj Installation
|
||||
```mdx-code-block
|
||||
import Tabs from '@theme/Tabs';
|
||||
import TabItem from '@theme/TabItem';
|
||||
```
|
||||
|
||||
<Tabs groupId="operating-systems" queryString="os">
|
||||
<TabItem value="macos" label="MacOS">
|
||||
```shell
|
||||
# Get Khoj Code
|
||||
git clone https://github.com/khoj-ai/khoj && cd khoj
|
||||
|
||||
# Create, Activate Virtual Environment
|
||||
python3 -m venv .venv && source .venv/bin/activate
|
||||
|
||||
# For MacOS or zsh users run this
|
||||
pip install -e '.[dev]'
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="windows" label="Windows">
|
||||
```shell
|
||||
# Get Khoj Code
|
||||
git clone https://github.com/khoj-ai/khoj && cd khoj
|
||||
|
||||
# Create, Activate Virtual Environment
|
||||
python3 -m venv .venv && .venv\Scripts\activate
|
||||
|
||||
# Install Khoj for Development
|
||||
pip install -e '.[dev]'
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="linux" label="Linux">
|
||||
```shell
|
||||
# Get Khoj Code
|
||||
git clone https://github.com/khoj-ai/khoj && cd khoj
|
||||
|
||||
# Create, Activate Virtual Environment
|
||||
python3 -m venv .venv && source .venv/bin/activate
|
||||
|
||||
# Install Khoj for Development
|
||||
pip install -e '.[dev]'
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
#### 2. Postgres Installation & Setup
|
||||
|
||||
Khoj uses the `pgvector` package to store embeddings of your index in a Postgres database. To use this, you need to have Postgres installed.
|
||||
|
||||
<Tabs groupId="operating-systems" queryString="os">
|
||||
<TabItem value="macos" label="MacOS">
|
||||
Install [Postgres.app](https://postgresapp.com/). This comes pre-installed with `pgvector` and relevant dependencies.
|
||||
</TabItem>
|
||||
<TabItem value="windows" label="Windows">
|
||||
1. Use the [recommended installer](https://www.postgresql.org/download/windows/).
|
||||
2. Follow instructions to [Install PgVector](https://github.com/pgvector/pgvector#windows) in case you need to manually install it. Windows support is experimental for pgvector currently, so we recommend using Docker. Refer to Windows Installation Notes below if there are errors.
|
||||
</TabItem>
|
||||
<TabItem value="linux" label="Linux">
|
||||
From [official instructions](https://wiki.postgresql.org/wiki/Apt)
|
||||
</TabItem>
|
||||
<TabItem value="source" label="From Source">
|
||||
1. Follow instructions to [Install Postgres](https://www.postgresql.org/download/)
|
||||
2. Follow instructions to [Install PgVector](https://github.com/pgvector/pgvector#installation) in case you need to manually install it.
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
##### Create the Khoj database
|
||||
|
||||
Make sure to update your environment variables to match your Postgres configuration if you're using a different name. The default values should work for most people. When prompted for a password, you can use the default password `postgres`, or configure it to your preference. Make sure to set the environment variable `POSTGRES_PASSWORD` to the same value as the password you set here.
|
||||
|
||||
<Tabs groupId="operating-systems" queryString="os">
|
||||
<TabItem value="macos" label="MacOS">
|
||||
```shell
|
||||
createdb khoj -U postgres --password
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="windows" label="Windows">
|
||||
```shell
|
||||
createdb -U postgres khoj --password
|
||||
```
|
||||
</TabItem>
|
||||
<TabItem value="linux" label="Linux">
|
||||
```shell
|
||||
sudo -u postgres createdb khoj --password
|
||||
```
|
||||
</TabItem>
|
||||
</Tabs>
|
||||
|
||||
#### 3. Run
|
||||
1. Start Khoj
|
||||
```bash
|
||||
khoj -vv
|
||||
```
|
||||
2. Configure Khoj
|
||||
- **Via the Desktop application**: Add files, directories to index using the settings page of your desktop application. Click "Save" to immediately trigger indexing.
|
||||
|
||||
Note: Wait after configuration for khoj to Load ML model, generate embeddings and expose API to query notes, images, documents etc specified in config YAML
|
||||
|
||||
#### Windows Installation Notes
|
||||
1. Command `khoj` Not Recognized
|
||||
- Try reactivating the virtual environment and rerunning the `khoj` command.
|
||||
- If it still doesn't work repeat the installation process.
|
||||
2. Python Package Missing
|
||||
- Use `pip install xxx` and try running the `khoj` command.
|
||||
3. Command `createdb` Not Recognized
|
||||
- make sure path to postgres binaries is included in environment variables. It usually looks something like
|
||||
```
|
||||
C:\Program Files\PostgreSQL\16\bin
|
||||
```
|
||||
4. Connection Refused on port xxxx
|
||||
- Locate the `pg_hba.conf` file in the location where postgres was installed.
|
||||
- Edit the file to have **trust** as the method for user postgres, local, and host connections.
|
||||
- Below is an example:
|
||||
```
|
||||
host all postgres 127.0.0.1/32 trust
|
||||
# "local" is for Unix domain socket connections only
|
||||
local all all trust
|
||||
# IPv4 local connections:
|
||||
host all all 127.0.0.1/32 trust
|
||||
# IPv6 local connections:
|
||||
host all all ::1/128 trust
|
||||
```
|
||||
4. Errors with installing pgvector
|
||||
- Reinstall Visual Studio 2022 Build Tools with:
|
||||
1. desktop development with c++ selected in workloads
|
||||
2. MSVC (C++ Build Tools), Windows 10/11 SDK, and C++/CLI support for build tools selected in individual components.
|
||||
- Open the x64 Native Tools Command Prompt as an Administrator
|
||||
- Follow the pgvector windows installation [instructions](https://github.com/pgvector/pgvector?tab=readme-ov-file#windows) in this command prompt.
|
||||
|
||||
### Using Docker
|
||||
|
||||
Make sure you install the latest version of [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/).
|
||||
|
||||
#### 1. Clone
|
||||
|
||||
```shell
|
||||
git clone https://github.com/khoj-ai/khoj && cd khoj
|
||||
```
|
||||
|
||||
#### 2. Configure
|
||||
|
||||
1. Update [docker-compose.yml](https://github.com/khoj-ai/khoj/blob/master/docker-compose.yml) to use relevant environment variables.
|
||||
2. Comment out the `image` line and uncomment the `build` line in the `server` service
|
||||
|
||||
#### 3. Run
|
||||
|
||||
This will start the Khoj server, and the database.
|
||||
|
||||
```shell
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
#### 4. Upgrade
|
||||
|
||||
If you've made changes to the codebase, you'll need to rebuild the Docker image before running the container again.
|
||||
|
||||
```shell
|
||||
docker-compose build --no-cache
|
||||
```
|
||||
|
||||
## Update clients
|
||||
In whichever clients you're using for testing, you'll need to update the server URL to point to your local server. By default, the local server URL should be `http://127.0.0.1:42110`.
|
||||
|
||||
## Validate
|
||||
### Before Making Changes
|
||||
1. Install Git Hooks for Validation
|
||||
```shell
|
||||
./scripts/dev_setup.sh
|
||||
```
|
||||
- This ensures standard code formatting fixes and other checks run automatically on every commit and push
|
||||
- Note 1: If [pre-commit](https://pre-commit.com/#intro) didn't already get installed, [install it](https://pre-commit.com/#install) via `pip install pre-commit`
|
||||
- Note 2: To run the pre-commit changes manually, use `pre-commit run --hook-stage manual --all` before creating PR
|
||||
|
||||
### Before Creating PR
|
||||
|
||||
:::tip[Note]
|
||||
You should be in an active virtual environment for Khoj in order to run the unit tests and linter.
|
||||
:::
|
||||
|
||||
1. Ensure that you have a [Github Issue](https://github.com/khoj-ai/khoj/issues) that can be linked to the PR. If not, create one. Make sure you've tagged one of the maintainers to the issue. This will ensure that the maintainers are notified of the PR and can review it. It's best discuss the code design on an existing issue or Discord thread before creating a PR. This helps get your PR merged faster.
|
||||
1. Run unit tests.
|
||||
```shell
|
||||
pytest
|
||||
```
|
||||
2. Run the linter.
|
||||
```shell
|
||||
mypy
|
||||
```
|
||||
4. Think about how to add unit tests to verify the functionality you're adding in the PR. If you're not sure how to do this, ask for help in the Github issue or on Discord's `#contributors` channel.
|
||||
|
||||
### After Creating PR
|
||||
1. Automated [validation workflows](https://github.com/khoj-ai/khoj/tree/master/.github/workflows) should run for every PR. Tag one of the maintainers in the PR to trigger it.
|
||||
|
||||
## Obsidian Plugin Development
|
||||
### Plugin development setup
|
||||
The core code for the Obsidian plugin is under `src/interface/obsidian`. The file `main.ts` is a good place to start.
|
||||
|
||||
1. In your CLI, go to the directory `src/interface/obsidian` in the Khoj repository.
|
||||
2. Run `yarn install` to install the dependencies.
|
||||
3. Run `yarn dev` to start the development server. This will continually rebuild the plugin as you make changes to the code.
|
||||
- Your code changes will be outputted to a file called `main.js` in the `obsidian` directory.
|
||||
|
||||
### Loading your development plugin in Obsidian
|
||||
1. Make sure you have the Khoj plugin installed in Obsidian. [See the plugin page](https://publish.obsidian.md/hub/02+-+Community+Expansions/02.05+All+Community+Expansions/Plugins/khoj).
|
||||
1. Open Obsidian and go to your settings (gear icon in the bottom left corner)
|
||||
2. Click on 'Community Plugins' in the left panel
|
||||
3. Next to the 'Installed Plugins' heading, click on the folder icon to open the folder with the plugin's source code.
|
||||
4. Open the `khoj` folder in the file explorer that opens. You'll see a file called `main.js` in this folder. To test your changes, replace this file with the `main.js` file that was generated by the development server in the previous section.
|
||||
|
||||
## Create Khoj Release (Only for Maintainers)
|
||||
Follow the steps below to [release](https://github.com/khoj-ai/khoj/releases/) Khoj. This will create a stable release of Khoj on [Pypi](https://pypi.org/project/khoj/), [Melpa](https://stable.melpa.org/#%252Fkhoj) and [Obsidian](https://obsidian.md/plugins?id%253Dkhoj). It will also create desktop apps of Khoj and attach them to the latest release.
|
||||
|
||||
1. Create and tag release commit by running the bump_version script. The release commit sets version number in required metadata files.
|
||||
```shell
|
||||
./scripts/bump_version.sh -c "<release_version>"
|
||||
```
|
||||
2. Push commit and then the tag to trigger the release workflow to create Release with auto generated release notes.
|
||||
```shell
|
||||
git push origin master # push release commit to khoj repository
|
||||
git push origin <release_version> # push release tag to khoj repository
|
||||
```
|
||||
3. [Optional] Update the Release Notes to highlight new features, fixes and updates
|
||||
|
||||
## Architecture
|
||||
|
||||

|
||||
|
||||
## Visualize Codebase
|
||||
|
||||
*[Interactive Visualization](https://mango-dune-07a8b7110.1.azurestaticapps.net/?repo=khoj-ai%2Fkhoj)*
|
||||
|
||||

|
||||
|
||||
## Visualize Khoj Obsidian Plugin Codebase
|
||||
|
||||

|
||||
8
documentation/docs/data-sources/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Data Sources",
|
||||
"position": 5,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Online data sources for indexing via Khoj"
|
||||
}
|
||||
}
|
||||
14
documentation/docs/data-sources/github_integration.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# Github integration
|
||||
|
||||
The Github integration allows you to index as many repositories as you want. It's currently default configured to index Issues, Commits, and all Markdown/Org files in each repository. For large repositories, this takes a fairly long time, but it works well for smaller projects.
|
||||
|
||||
# Configure your settings
|
||||
|
||||
1. Go to [https://app.khoj.dev/settings](https://app.khoj.dev/settings) and enter in settings for the data sources you want to index. You'll have to specify the file paths.
|
||||
|
||||
## Use the Github plugin
|
||||
|
||||
1. Generate a [classic PAT (personal access token)](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) from [Github](https://github.com/settings/tokens) with `repo` and `admin:org` scopes at least.
|
||||
2. Navigate to [https://app.khoj.dev/settings#github](https://app.khoj.dev/settings#github) to configure your Github settings. Enter in your PAT, along with details for each repository you want to index.
|
||||
3. Click `Save`. Go back to the settings page and click `Configure`.
|
||||
4. Go to [https://app.khoj.dev/](https://app.khoj.dev/) and start searching!
|
||||
19
documentation/docs/data-sources/notion_integration.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Notion Integration
|
||||
|
||||
The Notion integration allows you to search/chat with your Notion workspaces. [Notion](https://notion.so/) is a platform people use for taking notes, especially for collaboration.
|
||||
|
||||
Go to https://app.khoj.dev/settings to connect your Notion workspace(s) to Khoj.
|
||||
|
||||

|
||||
|
||||
|
||||
## Self-Hosted Setup
|
||||
|
||||
1. Go to https://www.notion.so/my-integrations and create a new integration called Khoj to get an API key.
|
||||

|
||||
3. Share all the workspaces that you want to integrate with the Khoj integration you just made in the previous step
|
||||

|
||||
4. In the first step, you generated an API key. Use the newly generated API Key in your Khoj settings, by default at [http://localhost:42110/settings#notion](http://localhost:42110/settings#notion). Click `Save`.
|
||||
5. Click `Configure` in http://localhost:42110/settings to index your Notion workspace(s).
|
||||
|
||||
That's it! You should be ready to start searching and chatting. Make sure you've configured your [chat settings](/get-started/setup#2-configure).
|
||||
16
documentation/docs/data-sources/share_your_data.md
Normal file
@@ -0,0 +1,16 @@
|
||||
---
|
||||
sidebar_position: 0
|
||||
keywords: ["upload data", "upload files", "share data", "share files", "pdf ai", "ai for pdf", "ai for documents", "ai for files", "local ai pdf", "local ai documents", "local ai files"]
|
||||
|
||||
---
|
||||
|
||||
# Upload your data
|
||||
|
||||
There are several ways you can get started with sharing your data with the Khoj AI.
|
||||
|
||||
- Drag and drop your documents via [the web UI](/clients/web/#upload-documents). This is best if you have a one-off document you need to interact with.
|
||||
- Use the desktop app to [upload and sync your documents](/clients/desktop). This is best if you have a lot of documents on your computer or you need the docs to stay in sync.
|
||||
- Setup the sync options for either [Obsidian](/clients/obsidian) or [Emacs](/clients/emacs) to automatically sync your documents with Khoj. This is best if you are already using these tools and want to leverage Khoj's AI capabilities.
|
||||
- Configure your [Notion](/data-sources/notion_integration) or [Github](/data-sources/github_integration) to sync with Khoj. By providing your credentials, you can keep the data synced in the background.
|
||||
|
||||

|
||||
8
documentation/docs/features/_category_.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"label": "Features",
|
||||
"position": 3,
|
||||
"link": {
|
||||
"type": "generated-index",
|
||||
"description": "Features supported by Khoj"
|
||||
}
|
||||
}
|
||||
15
documentation/docs/features/agents.md
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
sidebar_position: 4
|
||||
---
|
||||
|
||||
# Agents
|
||||
|
||||
You can use agents to setup custom system prompts with Khoj. The server host can setup their own agents, which are accessible to all users. You can see ours at https://app.khoj.dev/agents.
|
||||
|
||||

|
||||
|
||||
## Creating an Agent (Self-Hosted)
|
||||
|
||||
Go to `server/admin/database/agent` on your server and click `Add Agent` to create a new one. You have to set it to `public` in order for it to be accessible to all the users on your server. To limit access to a specific user, do not set the `public` flag and add the user in the `Creator` field.
|
||||
|
||||
Set your custom prompt in the `personality` field.
|
||||
35
documentation/docs/features/all-features.md
Normal file
@@ -0,0 +1,35 @@
|
||||
---
|
||||
sidebar_position: 1
|
||||
---
|
||||
|
||||
# Overview
|
||||
|
||||
Khoj supports a variety of features, including search and chat with a wide range of data sources and interfaces.
|
||||
|
||||
#### [Search](/features/search)
|
||||
- **Local**: Your personal data stays local. All search and indexing is done on your machine when you [self-host](/get-started/setup)
|
||||
- **Incremental**: Incremental search for a fast, search-as-you-type experience
|
||||
|
||||
#### [Chat](/features/chat)
|
||||
- **Faster answers**: Find answers faster, smoother than search. No need to manually scan through your notes to find answers.
|
||||
- **Iterative discovery**: Iteratively explore and (re-)discover your notes
|
||||
- **Assisted creativity**: Smoothly weave across answers retrieval and content generation
|
||||
- **Works online or offline**: Chat using online or offline AI chat models
|
||||
|
||||
#### General
|
||||
- **Cloud or Self-Host**: Use [cloud](https://app.khoj.dev/login) to use Khoj anytime from anywhere or [self-host](/get-started/setup) for privacy
|
||||
- **Natural**: Advanced natural language understanding using Transformer based ML Models
|
||||
- **Pluggable**: Modular architecture makes it easy to plug in new data sources, frontends and ML models
|
||||
- **Multiple Sources**: Index your Org-mode, Markdown, PDF, plaintext files, Github repos and Notion pages
|
||||
- **Multiple Interfaces**: Interact from your Web Browser, Emacs, Obsidian, Desktop app or even Whatsapp
|
||||
|
||||
### Supported Interfaces
|
||||
Khoj is available as a [Desktop app](/clients/desktop), [Emacs package](/clients/emacs), [Obsidian plugin](/clients/obsidian), [Web app](/clients/web) and a [Whatsapp AI](https://khoj.dev/whatsapp).
|
||||
|
||||

|
||||
|
||||
### Supported Data Sources
|
||||
Khoj can understand your word, PDF, org-mode, markdown, plaintext files, [Github projects](/data-sources/github_integration) and [Notion pages](/data-sources/notion_integration).
|
||||
|
||||
|
||||

|
||||
9
documentation/docs/features/automations.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Automations
|
||||
|
||||
[Automations](https://app.khoj.dev/automations) are a powerful feature within Khoj to schedule repeated tasks for information retrieval directly from your account. You can run them at a specific time and interval. This is still an experimental feature, so please report any issues you encounter.
|
||||
|
||||
Khoj will use your local time zone to determine the scheduling localization. You can go back and configure the prompt any time you want from the automations page. You can also delete the automation if you no longer need it.
|
||||
|
||||
:::danger[Note]
|
||||
Automations will not deliver emails to self-hosted users out of the box. You'll have to have Resend and [Authentication](/advanced/authentication) setup to send emails.
|
||||
:::
|
||||
45
documentation/docs/features/chat.md
Normal file
@@ -0,0 +1,45 @@
|
||||
---
|
||||
sidebar_position: 2
|
||||
---
|
||||
|
||||
# Chat
|
||||
|
||||
You can configure Khoj to chat with you about anything. When relevant, it'll use any notes or documents you shared with it to respond. It acts as an excellent research assistant, search engine, or personal tutor.
|
||||
|
||||
<img src="https://assets.khoj.dev/vision_chat_example.png" alt="Chat on Web" style={{width: '400px'}}/>
|
||||
|
||||
### Overview
|
||||
- Creates a personal assistant for you to inquire and engage with your notes or online information as needed
|
||||
- You can choose to use Online or Offline Chat depending on your requirements
|
||||
- Supports multi-turn conversations with the relevant notes for context
|
||||
- Shows reference notes used to generate a response
|
||||
|
||||
### Setup (Self-Hosting)
|
||||
See [the setup guide](/get-started/setup.mdx) to configure your chat models.
|
||||
|
||||
### Use
|
||||
1. Open Khoj Chat
|
||||
- **On Web**: Open [/chat](https://app.khoj.dev/chat) in your web browser
|
||||
- **On Obsidian**: Search for *Khoj: Chat* in the [Command Palette](https://help.obsidian.md/Plugins/Command+palette)
|
||||
- **On Emacs**: Run `M-x khoj <user-query>`
|
||||
2. Enter your queries to chat with Khoj. Use [slash commands](#commands) and [query filters](/miscellaneous/advanced#query-filters) to change what Khoj uses to respond
|
||||
|
||||
|
||||
#### Details
|
||||
1. Your query is used to retrieve the most relevant notes, if any, using Khoj search using RAG.
|
||||
2. These notes, the last few messages and associated metadata is passed to the enabled chat model along with your query to generate a response
|
||||
|
||||
#### Conversation File Filters
|
||||
You can use conversation file filters to limit the notes used in the chat response. To do so, use the left panel in the web UI. Alternatively, you can also use [query filters](/miscellaneous/advanced#query-filters) to limit the notes used in the chat response.
|
||||
|
||||
<img src="/img/file_filters_conversation.png" alt="Conversation File Filter" style={{width: '400px'}}/>
|
||||
|
||||
#### Commands
|
||||
Slash commands allows you to change what Khoj uses to respond to your query
|
||||
- **/notes**: Limit chat to only respond using your notes, not just Khoj's general world knowledge as reference
|
||||
- **/general**: Limit chat to only respond using Khoj's general world knowledge, not using your notes as reference
|
||||
- **/default**: Allow chat to respond using your notes or it's general knowledge as reference. It's the default behavior when no slash command is used
|
||||
- **/online**: Use online information and incorporate it in the prompt to the LLM to send you a response.
|
||||
- **/image**: Generate an image in response to your query.
|
||||
- **/help**: Use /help to get all available commands and general information about Khoj
|
||||
- **/summarize**: Can be used to summarize 1 selected file filter for that conversation. Refer to [File Summarization](summarization) for details.
|
||||
15
documentation/docs/features/image_generation.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# Image Generation
|
||||
You can use Khoj to generate images from text prompts. You can get deeper into the details of our image generation flow in this blog post: https://blog.khoj.dev/posts/how-khoj-generates-images/.
|
||||
|
||||
To generate images, you just need to provide a prompt to Khoj in which the image generation is in the instructions. Khoj will automatically detect the image generation intent, augment your generation prompt, and then create the image. Here are some examples:
|
||||
| Prompt | Image |
|
||||
| --- | --- |
|
||||
| Paint a picture of the plants I got last month, pixar-animation |  |
|
||||
| Create a picture of my dream house, based on my interests |  |
|
||||
|
||||
|
||||
## Setup (Self-Hosting)
|
||||
|
||||
Right now, we only support integration with OpenAI's DALL-E. You need to have an OpenAI API key to use this feature. Here's how you can set it up:
|
||||
1. Setup your OpenAI API key. See instructions [here](/get-started/setup#2-configure)
|
||||
2. Create a text to image config at http://localhost:42110/server/admin/database/texttoimagemodelconfig/. We recommend the value `dall-e-3`.
|
||||
18
documentation/docs/features/keyboard_shortcuts.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# Keyboard Shortcuts
|
||||
|
||||
Oftentimes, having to leave your keyboard to move the mouse can break your flow. We want to make it as easy as possible for AI to flow with you as you are, so we've added some keyboard shortcuts to facilitate that.
|
||||
|
||||
## Obsidian
|
||||
|
||||
### Up/Down Arrow Keys (Chat Input)
|
||||
|
||||
- **Up Arrow Key**: Move up in the list of most recent messages in your chat window.
|
||||
- **Down Arrow Key**: Move down in the list of most recent messages in your chat window.
|
||||
|
||||
You can watch the demo to see how it works on [this sample conversation](http://app.khoj.dev/share/chat/in-particular-assess-the-prospect-for-brazil-/).
|
||||
|
||||
<img src="https://assets.khoj.dev/up_down_shortcuts.gif" height="300" alt="Up/Down Arrow Keys"></img>
|
||||
|
||||
### Enter (Chat Input)
|
||||
|
||||
Press 'Enter' to send the message you've typed in the chat window.
|
||||
9
documentation/docs/features/khoj_mini.md
Normal file
@@ -0,0 +1,9 @@
|
||||
# Desktop Quick Chat (Khoj Mini)
|
||||
|
||||
Once you have the Khoj [desktop application](https://khoj.dev/downloads) installed, you can use the desktop shortcut to quickly pull up a mini chat module for quicker answers. See the desktop setup instructions [in the docs](/clients/desktop.md) for more information.
|
||||
|
||||
To use it, you just have to copy the text you want to inject into your query, and then run `Ctrl + Shift + K` (or `Cmd + Shift + K` on Mac) to open the mini chat module. The text you copied will be automatically pasted into the chat module, and you can then hit enter to get the answer. You can edit the text before hitting enter if you want to refine your query.
|
||||
|
||||
The desktop shortcut is a great way to quickly get answers to your questions without having to switch between windows or tabs. It's especially useful when you're working on a project and need to quickly look up something without losing your focus.
|
||||
|
||||

|
||||