Compare commits
1039 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
686b09afd1 | ||
|
|
3cfec37e9d | ||
|
|
d3641c877c | ||
|
|
1094c65f2b | ||
|
|
abe082b9ab | ||
|
|
132cf69372 | ||
|
|
06a8a5e23d | ||
|
|
c42deab63b | ||
|
|
58f715e878 | ||
|
|
116936ffa9 | ||
|
|
f5d045eece | ||
|
|
8ac6494e60 | ||
|
|
f002896a24 | ||
|
|
8738c32fb0 | ||
|
|
896a3f1472 | ||
|
|
4284b78707 | ||
|
|
fac5b6b50d | ||
|
|
51e17a47fa | ||
|
|
42b2046f96 | ||
|
|
bb82b515e0 | ||
|
|
fe688cdf2d | ||
|
|
0d35326909 | ||
|
|
d857a391b3 | ||
|
|
772c1cde77 | ||
|
|
b6e441c5eb | ||
|
|
ac95828660 | ||
|
|
f252918228 | ||
|
|
5c360b5ae6 | ||
|
|
09fa602dde | ||
|
|
db2c0a0bdb | ||
|
|
c393002f1d | ||
|
|
16629e32a7 | ||
|
|
d67474170a | ||
|
|
e02a7ab350 | ||
|
|
d491105752 | ||
|
|
fe59eadcee | ||
|
|
946bd20dbf | ||
|
|
3c97757e4d | ||
|
|
9f33729ca9 | ||
|
|
a8d456f448 | ||
|
|
59177d307e | ||
|
|
bfb598d686 | ||
|
|
b780fbd6a7 | ||
|
|
7861229325 | ||
|
|
5b0516c28b | ||
|
|
740e8eb30c | ||
|
|
05a357dffe | ||
|
|
781fd45e39 | ||
|
|
80c8897e10 | ||
|
|
e933dacb05 | ||
|
|
cdf4f0e67d | ||
|
|
4dfeb21da3 | ||
|
|
d0d1a2cae8 | ||
|
|
f1f0ae2839 | ||
|
|
10d8c56e23 | ||
|
|
bb669ca3ff | ||
|
|
72ed72e595 | ||
|
|
e5735fddd1 | ||
|
|
fa92ef86b9 | ||
|
|
f39ea04178 | ||
|
|
bd4893ced9 | ||
|
|
b75e807f24 | ||
|
|
b2fdefdc0c | ||
|
|
896fec4b82 | ||
|
|
50bf7f9a3b | ||
|
|
da2831b948 | ||
|
|
b520988c64 | ||
|
|
a209856d48 | ||
|
|
f7942655a2 | ||
|
|
108e1b92ef | ||
|
|
f646ef8595 | ||
|
|
a7f25994d5 | ||
|
|
58fbf78c6e | ||
|
|
ae149069bf | ||
|
|
e5b8dea9ae | ||
|
|
b48eff4212 | ||
|
|
87e7c23da4 | ||
|
|
e6d53e3daa | ||
|
|
922cb433d3 | ||
|
|
a997f277ad | ||
|
|
1f4e5f6d71 | ||
|
|
ce2e926d76 | ||
|
|
bd79e7701f | ||
|
|
82871be054 | ||
|
|
8ba339e78f | ||
|
|
8e9c030600 | ||
|
|
9b8779ba08 | ||
|
|
bfac393ab1 | ||
|
|
76d20b2b76 | ||
|
|
b4933471cd | ||
|
|
c995bccef8 | ||
|
|
3deac290bf | ||
|
|
b7eb4c15de | ||
|
|
41a8536c16 | ||
|
|
1e618502c7 | ||
|
|
e9297c2c6a | ||
|
|
30a89fe4cb | ||
|
|
c41def5fbb | ||
|
|
b596976a96 | ||
|
|
e71708ee76 | ||
|
|
ddddd998c8 | ||
|
|
181b854342 | ||
|
|
40af63b1dd | ||
|
|
d2a56a2fed | ||
|
|
4b9b0dbbb9 | ||
|
|
c0135f5f21 | ||
|
|
8a4715293e | ||
|
|
69dc927a5a | ||
|
|
d5752ddbaa | ||
|
|
048f5a2d53 | ||
|
|
096afef629 | ||
|
|
f832d32c62 | ||
|
|
d7c6204e62 | ||
|
|
806109b748 | ||
|
|
b327e487a5 | ||
|
|
c98224dda3 | ||
|
|
5cea6015c0 | ||
|
|
fd47f73086 | ||
|
|
fc8f73fc55 | ||
|
|
1b8b11239c | ||
|
|
15dc7b220e | ||
|
|
c64d629a6a | ||
|
|
1a294c1fd3 | ||
|
|
a4f6128a89 | ||
|
|
021ec0595d | ||
|
|
6ceee7cb5e | ||
|
|
90d7d2a164 | ||
|
|
0c308fcf8b | ||
|
|
1aebe5f185 | ||
|
|
b188544386 | ||
|
|
7faa427e84 | ||
|
|
cb56d1e53e | ||
|
|
f28b7e41a8 | ||
|
|
c506442993 | ||
|
|
1cef206c13 | ||
|
|
d0e8c9c62e | ||
|
|
a4a8b7909c | ||
|
|
6c77134e82 | ||
|
|
93e302b7e8 | ||
|
|
78f52a7836 | ||
|
|
0d30b7ba73 | ||
|
|
31f7cf6cc5 | ||
|
|
b09e972c20 | ||
|
|
5fa2e3c5ac | ||
|
|
4723a08d98 | ||
|
|
3d9c1d5472 | ||
|
|
a75036b626 | ||
|
|
cf1a90c596 | ||
|
|
8aa6b53760 | ||
|
|
7e1d31b5a9 | ||
|
|
bc79d46d4b | ||
|
|
dfd2fed033 | ||
|
|
51559bc821 | ||
|
|
c7681342f7 | ||
|
|
0f4870a7a5 | ||
|
|
763b41b385 | ||
|
|
019bf67e2d | ||
|
|
9b2c3b242a | ||
|
|
4f55025906 | ||
|
|
489bb076a3 | ||
|
|
a9db5b57c5 | ||
|
|
fdb3720b41 | ||
|
|
00641a8652 | ||
|
|
5c56b375c7 | ||
|
|
d8d9b936c4 | ||
|
|
b237a3ec55 | ||
|
|
af894680cb | ||
|
|
58745f8c35 | ||
|
|
f699061dea | ||
|
|
3f72f88591 | ||
|
|
be59c2f6a7 | ||
|
|
795904a357 | ||
|
|
e8824987fa | ||
|
|
b6d650adfb | ||
|
|
710fa37847 | ||
|
|
e22031ca6c | ||
|
|
0c9e10dd2b | ||
|
|
0472dc2967 | ||
|
|
98d4a6ee75 | ||
|
|
c12159bfb4 | ||
|
|
abce1e9cf6 | ||
|
|
c3cc51c9a0 | ||
|
|
519b519458 | ||
|
|
e9d52ada73 | ||
|
|
e1f5483432 | ||
|
|
2c5f88b85f | ||
|
|
2e1bf66d3d | ||
|
|
952771e34d | ||
|
|
49bee95b12 | ||
|
|
0645b274da | ||
|
|
cf8786b194 | ||
|
|
be6269688b | ||
|
|
912b264a47 | ||
|
|
7ef1821557 | ||
|
|
4061b11922 | ||
|
|
bc171db945 | ||
|
|
eb365fef44 | ||
|
|
2e7047cb3b | ||
|
|
89a817d1c9 | ||
|
|
e788bcaabe | ||
|
|
9219903341 | ||
|
|
6939899baa | ||
|
|
732b6d7780 | ||
|
|
e361279208 | ||
|
|
946fda0843 | ||
|
|
97216eec59 | ||
|
|
9f4aa3160e | ||
|
|
8e4084f7ee | ||
|
|
ee718750e2 | ||
|
|
1e02544c3a | ||
|
|
98771284e4 | ||
|
|
efc4e860b7 | ||
|
|
e06d72e86e | ||
|
|
b712a821f8 | ||
|
|
4e3d817b63 | ||
|
|
78a85bf847 | ||
|
|
a5b913f1b1 | ||
|
|
7ee1a340e6 | ||
|
|
c722ced68d | ||
|
|
f89452acdd | ||
|
|
74d58d562b | ||
|
|
165fe077bc | ||
|
|
75494f8d01 | ||
|
|
bb727b0710 | ||
|
|
9b0706ed92 | ||
|
|
718108a552 | ||
|
|
025facbc2d | ||
|
|
87b4061302 | ||
|
|
618729a254 | ||
|
|
3f34c33d4c | ||
|
|
779ff29ed5 | ||
|
|
445a38924f | ||
|
|
7ec2253f0a | ||
|
|
6522cc7dfa | ||
|
|
40f527a021 | ||
|
|
4aaf9bfeb0 | ||
|
|
5efa70f3a1 | ||
|
|
d45d18cc3b | ||
|
|
8bdb35ff51 | ||
|
|
e56965a8ed | ||
|
|
d4e0a43771 | ||
|
|
00638d6ee7 | ||
|
|
da281ea9ec | ||
|
|
4f1ce640a7 | ||
|
|
2a2b919daf | ||
|
|
3f01cc9c63 | ||
|
|
bc70428d89 | ||
|
|
d55ccc9f64 | ||
|
|
27ef4dc8ea | ||
|
|
daa5b552b1 | ||
|
|
fe6c8897ce | ||
|
|
0dcda9822e | ||
|
|
06e1c5d68d | ||
|
|
d52da7d4e0 | ||
|
|
a42707064a | ||
|
|
02bcab8802 | ||
|
|
27291faa66 | ||
|
|
3878a50d0f | ||
|
|
15b8353c7d | ||
|
|
b950146031 | ||
|
|
887e1d53d6 | ||
|
|
1dcd39bfbe | ||
|
|
01dad96618 | ||
|
|
13401294ad | ||
|
|
8273c96bbc | ||
|
|
61c6b1e471 | ||
|
|
f06aca9874 | ||
|
|
3a4b4a866b | ||
|
|
7afa8f00b8 | ||
|
|
f6c5695df4 | ||
|
|
dd3a1b910b | ||
|
|
a66d9d2e98 | ||
|
|
fc6f28f26e | ||
|
|
d4b99ddcab | ||
|
|
df328b2a73 | ||
|
|
fadb389294 | ||
|
|
7c38d1da9a | ||
|
|
7c829febec | ||
|
|
7bdff9ce9c | ||
|
|
1599d144ce | ||
|
|
f2749cbb00 | ||
|
|
f7a8203454 | ||
|
|
d95f71e9e3 | ||
|
|
a43d845298 | ||
|
|
3e64f46d92 | ||
|
|
0335f16742 | ||
|
|
98dbec2cf7 | ||
|
|
d259eda6b4 | ||
|
|
7c8f2ab6f5 | ||
|
|
691476c821 | ||
|
|
efcb53cd6d | ||
|
|
21ab855871 | ||
|
|
aee5de29c7 | ||
|
|
78d15c2a2f | ||
|
|
54e0a0eab1 | ||
|
|
e6bad93b32 | ||
|
|
12d7ba5d73 | ||
|
|
5ad8c81ef3 | ||
|
|
cb6fe9d0da | ||
|
|
1cf76ee7df | ||
|
|
edebfdf5ef | ||
|
|
86436d55ff | ||
|
|
e31d6ec2c1 | ||
|
|
6bb10ca150 | ||
|
|
7aa75f8ee0 | ||
|
|
afd2c394d8 | ||
|
|
434c03c955 | ||
|
|
f4d4d6516c | ||
|
|
b6833ca3ea | ||
|
|
3ab934771f | ||
|
|
4245ea4998 | ||
|
|
9eb02b7e38 | ||
|
|
75af549c7f | ||
|
|
5e7c97b7b8 | ||
|
|
6c2a7574c3 | ||
|
|
ca9f36ef9f | ||
|
|
265434799f | ||
|
|
258de4471e | ||
|
|
d83bb9d2c7 | ||
|
|
093bfa2134 | ||
|
|
539bc77934 | ||
|
|
aabbe06e41 | ||
|
|
bb22fa6548 | ||
|
|
bd2509bd41 | ||
|
|
561516eeef | ||
|
|
2bdda4638d | ||
|
|
1ebc95a282 | ||
|
|
d0e8f7203c | ||
|
|
092bb9ab17 | ||
|
|
9de8849193 | ||
|
|
3d5da27079 | ||
|
|
c454fe07cb | ||
|
|
3e144c4227 | ||
|
|
d8b2887625 | ||
|
|
ba3b3280b4 | ||
|
|
390b8f5b86 | ||
|
|
d74e6a47d6 | ||
|
|
424c745cbb | ||
|
|
0abbcf1401 | ||
|
|
da1126ed3c | ||
|
|
56281d92f2 | ||
|
|
fde1618af2 | ||
|
|
22bb4c1e2e | ||
|
|
6331f4b845 | ||
|
|
5101c7a6dc | ||
|
|
02bf400bf3 | ||
|
|
11cbcca2d4 | ||
|
|
34422f9549 | ||
|
|
aeba79267a | ||
|
|
7473be5922 | ||
|
|
de59b3d2e5 | ||
|
|
08190c2f0d | ||
|
|
6a85c8c2b6 | ||
|
|
bbdab1d40e | ||
|
|
78ad2791cd | ||
|
|
5f3c8e9046 | ||
|
|
30057f01a6 | ||
|
|
3ea185315d | ||
|
|
a1ae08f62b | ||
|
|
91ec895fd2 | ||
|
|
1a33642635 | ||
|
|
e9681c8ed5 | ||
|
|
69ff65973f | ||
|
|
52ac445557 | ||
|
|
d45cb2f84a | ||
|
|
1cb71c6bfb | ||
|
|
fb59b60761 | ||
|
|
9334a0dcf6 | ||
|
|
c614f8b9ca | ||
|
|
478386c612 | ||
|
|
dfcffc7fc1 | ||
|
|
b4238257b6 | ||
|
|
38f47956cd | ||
|
|
7fed4d697f | ||
|
|
5ed89130ef | ||
|
|
3671e55001 | ||
|
|
3bcc3430fb | ||
|
|
d6233cd7b1 | ||
|
|
64708ea424 | ||
|
|
85a11d08b2 | ||
|
|
a7569037fe | ||
|
|
4726034344 | ||
|
|
9a57e94b79 | ||
|
|
761e35c226 | ||
|
|
5ebe0017a0 | ||
|
|
036097243a | ||
|
|
84de95d294 | ||
|
|
fdab383b26 | ||
|
|
060492dbf7 | ||
|
|
9d5fd24085 | ||
|
|
903f39fe17 | ||
|
|
2ef98c24be | ||
|
|
6d00f73e91 | ||
|
|
813eaacfd0 | ||
|
|
322ca757af | ||
|
|
a177a302d4 | ||
|
|
034108c218 | ||
|
|
0632dfed80 | ||
|
|
6c16fa9166 | ||
|
|
ac4854a47b | ||
|
|
b9a6b71fe9 | ||
|
|
aba50e958e | ||
|
|
52cbfeace3 | ||
|
|
bebf565c06 | ||
|
|
c9bb39d802 | ||
|
|
454a479fd8 | ||
|
|
d057ad3a45 | ||
|
|
a206d77287 | ||
|
|
14bd1b5404 | ||
|
|
450167c951 | ||
|
|
67445b40bc | ||
|
|
d3731d221a | ||
|
|
f6e2d13e21 | ||
|
|
77e6cf4157 | ||
|
|
fd3f32d083 | ||
|
|
f7544ea47b | ||
|
|
a1a9a0b463 | ||
|
|
dbfe1fca31 | ||
|
|
94f3b7f2d6 | ||
|
|
22a0f6bcfa | ||
|
|
c1d08c0ccc | ||
|
|
a4c19fbd0a | ||
|
|
ace84f015e | ||
|
|
bb7adc96ed | ||
|
|
ad63210f45 | ||
|
|
fa106eb24c | ||
|
|
3248e95d53 | ||
|
|
3e57c7f559 | ||
|
|
eaaf6f5978 | ||
|
|
6288dc9492 | ||
|
|
de573e4303 | ||
|
|
b3acd570f7 | ||
|
|
19904e648b | ||
|
|
785ba03239 | ||
|
|
366fe0eada | ||
|
|
225554f22c | ||
|
|
5627a4bfde | ||
|
|
113c57bcbe | ||
|
|
649de7f028 | ||
|
|
26d800981c | ||
|
|
40b1d22d9d | ||
|
|
2d0e6bd085 | ||
|
|
226cae5ab9 | ||
|
|
238381256d | ||
|
|
5fab3734fa | ||
|
|
884c2d9553 | ||
|
|
918d7fb257 | ||
|
|
0719f7bd4a | ||
|
|
9b74437417 | ||
|
|
bebbba399a | ||
|
|
14e22687e3 | ||
|
|
61347d9aaa | ||
|
|
5bf0dd0ef1 | ||
|
|
5545e84bb9 | ||
|
|
86c27e85ef | ||
|
|
fdeb1590d7 | ||
|
|
f8b8fcc172 | ||
|
|
5bbaa8264a | ||
|
|
0f3418daf5 | ||
|
|
7417de74da | ||
|
|
fe9cb437e5 | ||
|
|
2827c633cd | ||
|
|
dd1e2d5eb7 | ||
|
|
6293801bfa | ||
|
|
7f2aa97de7 | ||
|
|
2196930005 | ||
|
|
231afc4ac5 | ||
|
|
2dc0b0fbec | ||
|
|
72bb3f667b | ||
|
|
02d6b7c788 | ||
|
|
e098b2f1dc | ||
|
|
832a4d6638 | ||
|
|
4d570ecd4f | ||
|
|
067f3f4098 | ||
|
|
d682a8252f | ||
|
|
c6dd3076c5 | ||
|
|
b4f3a77b01 | ||
|
|
7141189102 | ||
|
|
3ba9c21828 | ||
|
|
7b388b287a | ||
|
|
e9ba00d38f | ||
|
|
a109c59cc6 | ||
|
|
91bc573571 | ||
|
|
2712ef21ff | ||
|
|
593af8f7dc | ||
|
|
96ebec9809 | ||
|
|
f35ba8e5a7 | ||
|
|
e36d9d794f | ||
|
|
10dcdb5491 | ||
|
|
025d405fe2 | ||
|
|
fe71efbbd2 | ||
|
|
56f6e69bc7 | ||
|
|
998e7833e8 | ||
|
|
110bf9391f | ||
|
|
48f2c95bb9 | ||
|
|
9f37e56173 | ||
|
|
af1cff6230 | ||
|
|
3760726354 | ||
|
|
6ddf0b23fc | ||
|
|
f680bdf54d | ||
|
|
834d36981f | ||
|
|
2fdca621e6 | ||
|
|
8c7f4a3a30 | ||
|
|
41da52d6ed | ||
|
|
446d9cb1b9 | ||
|
|
48a5853550 | ||
|
|
c129874d59 | ||
|
|
cc6fa4207a | ||
|
|
e27abe1f6b | ||
|
|
5cecef5836 | ||
|
|
ee89d0d7a4 | ||
|
|
6eeb1b4da1 | ||
|
|
b6c9bb4a65 | ||
|
|
20aad33850 | ||
|
|
02b51317b4 | ||
|
|
ba933c7450 | ||
|
|
856d7ce48f | ||
|
|
23f22cda18 | ||
|
|
0a9a7691b4 | ||
|
|
8d25a1d3ec | ||
|
|
2d1e53c3b5 | ||
|
|
71d0093768 | ||
|
|
cd554f573e | ||
|
|
2d016b7462 | ||
|
|
65515e7952 | ||
|
|
5906daff9f | ||
|
|
55cefccad1 | ||
|
|
87dac54f1e | ||
|
|
45b8d7e8de | ||
|
|
a478621730 | ||
|
|
a233ab9584 | ||
|
|
8d2a192515 | ||
|
|
dcaf972767 | ||
|
|
f9d43ac009 | ||
|
|
abcf48d5ec | ||
|
|
bf5145e632 | ||
|
|
f37cdabb15 | ||
|
|
e99c91aaa6 | ||
|
|
a4787bce5c | ||
|
|
f24e41f5ec | ||
|
|
85de3c1d64 | ||
|
|
c6f682310c | ||
|
|
991398b8d2 | ||
|
|
f452554663 | ||
|
|
57ff38e16f | ||
|
|
f7b55b501f | ||
|
|
cf7145ab54 | ||
|
|
1eedb9caba | ||
|
|
6390d64417 | ||
|
|
3d80eb288b | ||
|
|
5cb196535f | ||
|
|
982325d066 | ||
|
|
36f8755d09 | ||
|
|
fc96bb99cc | ||
|
|
1e4ffc2481 | ||
|
|
ee7496467b | ||
|
|
b5c98a4f63 | ||
|
|
090c880860 | ||
|
|
dd2a9bdee5 | ||
|
|
8d60ef505f | ||
|
|
b14514c105 | ||
|
|
11ffaaf2c5 | ||
|
|
e2ae571d15 | ||
|
|
f548e24e7d | ||
|
|
5605f1a892 | ||
|
|
88d10451c9 | ||
|
|
8a7bd689ae | ||
|
|
a9cdece341 | ||
|
|
babf03c218 | ||
|
|
9e169a48e3 | ||
|
|
e223390231 | ||
|
|
3257744c76 | ||
|
|
e1e112eaff | ||
|
|
5c37d29451 | ||
|
|
3a16f1a21c | ||
|
|
fa7b73f942 | ||
|
|
f8610d750d | ||
|
|
96a03e9927 | ||
|
|
a3b0ef066b | ||
|
|
9d084b633c | ||
|
|
4b4bea196a | ||
|
|
e247545afa | ||
|
|
93b44fc8f5 | ||
|
|
9aa6fd4904 | ||
|
|
c8bc9838e3 | ||
|
|
5c8c7fb9f2 | ||
|
|
d902d29c71 | ||
|
|
9d29b471bc | ||
|
|
4a33e04a08 | ||
|
|
a9ab9ebe8e | ||
|
|
24596a6e21 | ||
|
|
5cc01b8509 | ||
|
|
980b4d3db5 | ||
|
|
2b25e3cc2d | ||
|
|
565bfc8486 | ||
|
|
b17d14bb7d | ||
|
|
c11131d653 | ||
|
|
f7f4a8de4d | ||
|
|
6385794603 | ||
|
|
b8b26ad700 | ||
|
|
05611df056 | ||
|
|
d0085a23e6 | ||
|
|
bc6864c3dc | ||
|
|
b20d075d35 | ||
|
|
19c8a06d51 | ||
|
|
fcb915c988 | ||
|
|
9bffb9ffc0 | ||
|
|
c1d7c08c7a | ||
|
|
a5d590e0bd | ||
|
|
db544afa7c | ||
|
|
a259d034b8 | ||
|
|
9fc6a8c74a | ||
|
|
5c8f2f95f7 | ||
|
|
f1e16b209a | ||
|
|
ced23e1695 | ||
|
|
1db816150b | ||
|
|
1e48922bc9 | ||
|
|
8ba8488086 | ||
|
|
9639139b52 | ||
|
|
d9f5f4ede0 | ||
|
|
6609cb98dc | ||
|
|
74830f0ac8 | ||
|
|
9c7c74050b | ||
|
|
92a3d6d268 | ||
|
|
c4ce1236ea | ||
|
|
4eb2c9bd07 | ||
|
|
b1aafde7c9 | ||
|
|
87e4afe89b | ||
|
|
a14a8ae627 | ||
|
|
fb368a581c | ||
|
|
8e8ceb7439 | ||
|
|
e35ce2caa0 | ||
|
|
fd31a0b763 | ||
|
|
ba517b6a73 | ||
|
|
2f93dedfb6 | ||
|
|
67c52992d7 | ||
|
|
2d1ec9b3ad | ||
|
|
6067f5aff3 | ||
|
|
c6d9b15897 | ||
|
|
d5073f98ab | ||
|
|
8386f707cd | ||
|
|
cd876251b7 | ||
|
|
fb04889a31 | ||
|
|
b779e2806d | ||
|
|
240f60c0ca | ||
|
|
8d2230f24f | ||
|
|
610ebded3b | ||
|
|
80a84a5733 | ||
|
|
59fd94384d | ||
|
|
ee8cb0915e | ||
|
|
8cf643d972 | ||
|
|
26f4c92124 | ||
|
|
f351d4ea68 | ||
|
|
d70efe1d6f | ||
|
|
435b2fba25 | ||
|
|
d61de17df2 | ||
|
|
08a310c41f | ||
|
|
50716ff782 | ||
|
|
5e250b2f65 | ||
|
|
434af56abd | ||
|
|
6463427d93 | ||
|
|
af4c732d93 | ||
|
|
d4169bf066 | ||
|
|
afe5039cd3 | ||
|
|
2155489be3 | ||
|
|
eb36b71ac3 | ||
|
|
2230bc40c5 | ||
|
|
917e4e9262 | ||
|
|
3c6e5a6e00 | ||
|
|
7b75a99ba2 | ||
|
|
2e468fc8ca | ||
|
|
caa0755d9a | ||
|
|
fef1a1702b | ||
|
|
2a99e46353 | ||
|
|
8f9203c053 | ||
|
|
2053bbdb1b | ||
|
|
9e192c6d11 | ||
|
|
eef609a063 | ||
|
|
5bb9c550f6 | ||
|
|
db1c27cdc7 | ||
|
|
8863337606 | ||
|
|
59bd2a47b6 | ||
|
|
d057ba29f0 | ||
|
|
b500631a4d | ||
|
|
bf6084da69 | ||
|
|
b5f0ac3e1d | ||
|
|
1529c1e991 | ||
|
|
db6fc53840 | ||
|
|
a0c1320d47 | ||
|
|
5ca4049757 | ||
|
|
59ece446a2 | ||
|
|
d407e87dd9 | ||
|
|
c8412e7dc9 | ||
|
|
f6247fe11d | ||
|
|
613699fe59 | ||
|
|
c56c28be23 | ||
|
|
89ab17ea2e | ||
|
|
c608f86146 | ||
|
|
0a8b104bd7 | ||
|
|
439c819ff1 | ||
|
|
b08d81f887 | ||
|
|
bc0ac6d26b | ||
|
|
78d50e157f | ||
|
|
3d046974b8 | ||
|
|
dc2bf0409f | ||
|
|
97d097a490 | ||
|
|
c314312a57 | ||
|
|
db2dd91f03 | ||
|
|
2991c07467 | ||
|
|
adfad8ff7f | ||
|
|
1fbc407ecf | ||
|
|
3b0b2d68cc | ||
|
|
64db0e4f25 | ||
|
|
5cfa43287f | ||
|
|
a01b945bc9 | ||
|
|
3b99e05cdc | ||
|
|
8a46372418 | ||
|
|
9ae581e09b | ||
|
|
21288d1736 | ||
|
|
f9d266a6af | ||
|
|
692e75627b | ||
|
|
018424c0fa | ||
|
|
0490b83b9e | ||
|
|
00ace0b69c | ||
|
|
3f892bd810 | ||
|
|
d127060bc8 | ||
|
|
1829b22c01 | ||
|
|
9e193b16a1 | ||
|
|
6b7b03c245 | ||
|
|
c7e6448272 | ||
|
|
911512b36d | ||
|
|
ef15ca894e | ||
|
|
a63467d751 | ||
|
|
9d27de154b | ||
|
|
6d4b331db9 | ||
|
|
a6bb554fa4 | ||
|
|
f5b0d60ff1 | ||
|
|
d62f5b4f25 | ||
|
|
029a2f8090 | ||
|
|
98834ece54 | ||
|
|
9501c3f3a1 | ||
|
|
5bca15f12f | ||
|
|
753b164ea2 | ||
|
|
64492b8b33 | ||
|
|
80bdbf6bce | ||
|
|
9f0b1d6bad | ||
|
|
c44b944fa6 | ||
|
|
61419a5676 | ||
|
|
47227c1b84 | ||
|
|
4d66e0f828 | ||
|
|
46d9a6461f | ||
|
|
b74dd2341b | ||
|
|
af581bc903 | ||
|
|
42a8184ea0 | ||
|
|
f9f0b4bffd | ||
|
|
064c64e74c | ||
|
|
32686f9e3e | ||
|
|
fd9b6291af | ||
|
|
443ad37b6a | ||
|
|
7a87f13aa8 | ||
|
|
d4aa19d8f2 | ||
|
|
0c439c7827 | ||
|
|
bf7ee919b6 | ||
|
|
91bcf8c53e | ||
|
|
51bbdf26a3 | ||
|
|
ec8e2512bc | ||
|
|
34602b25df | ||
|
|
fc19c4cf09 | ||
|
|
9188752b41 | ||
|
|
6b40062504 | ||
|
|
72d1503fa3 | ||
|
|
2c6dbe13d9 | ||
|
|
318116627c | ||
|
|
379673cae1 | ||
|
|
aab6ee51eb | ||
|
|
91b7d81c1a | ||
|
|
5e2adb22f0 | ||
|
|
c031e6dcc9 | ||
|
|
8ee7407c4c | ||
|
|
006ad17c6a | ||
|
|
414b693303 | ||
|
|
dfa6586e5e | ||
|
|
5968bfeb12 | ||
|
|
5876a47da6 | ||
|
|
13eda40443 | ||
|
|
84cc4baf21 | ||
|
|
dfa4c0831c | ||
|
|
9329ddeac5 | ||
|
|
8d17f96600 | ||
|
|
3f088bce6a | ||
|
|
331d18c88f | ||
|
|
828829011a | ||
|
|
c2abbb579f | ||
|
|
2fc6e921e0 | ||
|
|
13b10720ac | ||
|
|
c766a0ed8a | ||
|
|
d5b24eca57 | ||
|
|
2e75851b02 | ||
|
|
d645a7406b | ||
|
|
9ccfda47b7 | ||
|
|
ccca0468da | ||
|
|
5b676ff4ad | ||
|
|
759a2330e6 | ||
|
|
86286efb54 | ||
|
|
99e8ba2256 | ||
|
|
f84fd93cbb | ||
|
|
cd682d4275 | ||
|
|
41115a96c0 | ||
|
|
b14a1db2f9 | ||
|
|
703583fff7 | ||
|
|
d33c99f564 | ||
|
|
05bf1b2265 | ||
|
|
dd7b4b98ae | ||
|
|
34656dfda0 | ||
|
|
7b5c35018b | ||
|
|
7630417679 | ||
|
|
63ce76413e | ||
|
|
1c1305fcb6 | ||
|
|
c3437b9367 | ||
|
|
e18c79ca71 | ||
|
|
d2d7eac9e0 | ||
|
|
84cf6b5658 | ||
|
|
b58249fc3a | ||
|
|
54d52d8d25 | ||
|
|
f298b90b69 | ||
|
|
e01c38efe0 | ||
|
|
71afe71192 | ||
|
|
62e87551ac | ||
|
|
c3ae38df8b | ||
|
|
9c77dfbddd | ||
|
|
7fc05af09e | ||
|
|
a9ae270335 | ||
|
|
b916183848 | ||
|
|
007fce2deb | ||
|
|
abc1e576b7 | ||
|
|
a74e1d7166 | ||
|
|
e765c3bf95 | ||
|
|
933c3fdfd6 | ||
|
|
f818260711 | ||
|
|
3acbf1ab17 | ||
|
|
9cb4280a16 | ||
|
|
60f752629f | ||
|
|
0558379ddb | ||
|
|
9c4eabfc9e | ||
|
|
b05dd0fde1 | ||
|
|
0df5152202 | ||
|
|
e044d3583d | ||
|
|
c5664c7e90 | ||
|
|
70f3373246 | ||
|
|
af16817a4a | ||
|
|
4358b6de4d | ||
|
|
f6aea484ce | ||
|
|
fbe1d8cfed | ||
|
|
16103029f5 | ||
|
|
cd3acb44ab | ||
|
|
bfd8be5df0 | ||
|
|
592e1a93a2 | ||
|
|
2b8ff7d32c | ||
|
|
4593eef2ff | ||
|
|
d91551e6be | ||
|
|
0a0fe31d3c | ||
|
|
9f889d8806 | ||
|
|
8bb5588305 | ||
|
|
661ee79943 | ||
|
|
60ee160131 | ||
|
|
008d0af010 | ||
|
|
f2fb0aedfd | ||
|
|
1dca5edcc6 | ||
|
|
1942cb0d67 | ||
|
|
bf6dbfb245 | ||
|
|
d37433eacd | ||
|
|
a3534407bf | ||
|
|
3091a90df6 | ||
|
|
41b8f4443c | ||
|
|
777f089423 | ||
|
|
b23e00f3e5 | ||
|
|
3b776b6639 | ||
|
|
dd8f2744bf | ||
|
|
7db8d3ea0f | ||
|
|
ad7a17bf40 | ||
|
|
76ac5238b6 | ||
|
|
add73aa2c5 | ||
|
|
bcf9491999 | ||
|
|
d0041a98b4 | ||
|
|
29d152784f | ||
|
|
cd7214ba8d | ||
|
|
6a84e73a82 | ||
|
|
98ce5103a0 | ||
|
|
c65a36d3ab | ||
|
|
b6e49da288 | ||
|
|
45998f9cf5 | ||
|
|
4197f63751 | ||
|
|
ace8134a16 | ||
|
|
7f1fecb84e | ||
|
|
bf172fab81 | ||
|
|
36f5648cae | ||
|
|
ab57bfcc4a | ||
|
|
11848b8f44 | ||
|
|
a11e0bd9c3 | ||
|
|
f6552d0d4f | ||
|
|
38d4db5d5f | ||
|
|
63cd379682 | ||
|
|
9136c9306a | ||
|
|
c9db9f33ea | ||
|
|
3d7178d06f | ||
|
|
a4ff5a3f73 | ||
|
|
814c5b3d3c | ||
|
|
e7e0677291 | ||
|
|
823f4b7ad1 | ||
|
|
a3c77480f7 | ||
|
|
e367265dbb | ||
|
|
7e0deb29e0 | ||
|
|
0d94db4331 | ||
|
|
177482b33a | ||
|
|
63b183a9fe | ||
|
|
858117f8c0 | ||
|
|
ac4355d2e1 | ||
|
|
ce7da2db66 | ||
|
|
0a4a1def1e | ||
|
|
35f4deca76 | ||
|
|
ba1451a0e9 | ||
|
|
40d69e6e20 | ||
|
|
b8ba947ba8 | ||
|
|
06be57815e | ||
|
|
81e37a5736 | ||
|
|
b8ea546b3f | ||
|
|
0bb31b985d | ||
|
|
453824260f | ||
|
|
a8fdffc3e9 | ||
|
|
24164d9454 | ||
|
|
4365a94ea9 | ||
|
|
7c1ec04380 | ||
|
|
09b6365321 | ||
|
|
eb2e383cc7 | ||
|
|
ae4c479f37 | ||
|
|
6a996272da | ||
|
|
1bf76ebe7a | ||
|
|
a19afca148 | ||
|
|
be3b680bc6 | ||
|
|
31dbcfde9f | ||
|
|
6d438aafdf | ||
|
|
1aaafcf631 | ||
|
|
7521bce77e | ||
|
|
c8dee29dc4 | ||
|
|
8f953d1fc4 | ||
|
|
970b62be25 | ||
|
|
b2b3aa651d | ||
|
|
b0e7d25464 | ||
|
|
b46048609c | ||
|
|
ae2887e956 | ||
|
|
7917766024 | ||
|
|
a1a63260dd | ||
|
|
6f2d556a87 | ||
|
|
565f9c8113 | ||
|
|
975e011e03 | ||
|
|
19ce6f66ca | ||
|
|
da6e26f95c | ||
|
|
71abe08f05 | ||
|
|
45ba5e1e01 | ||
|
|
139d0be52b | ||
|
|
1ba3d72a8a | ||
|
|
cd455b2a79 | ||
|
|
fa3f3e6264 | ||
|
|
9bf5a3ec76 | ||
|
|
95389e31f7 | ||
|
|
ea65d9b34b | ||
|
|
2dd2976efa | ||
|
|
64fde42c87 | ||
|
|
7a926b7086 | ||
|
|
562fd2692d | ||
|
|
935287a95a | ||
|
|
bd419a22f4 | ||
|
|
32f482b232 | ||
|
|
5d596bd3d5 | ||
|
|
ae88d79d6f | ||
|
|
1207e3e566 | ||
|
|
3449024678 | ||
|
|
8dba2c39e1 | ||
|
|
94c53804ce | ||
|
|
a1bcd798e1 | ||
|
|
6d51b3babe | ||
|
|
a5fe671ffe | ||
|
|
44e772f0fd | ||
|
|
a3c6d6800b | ||
|
|
19b1ff5a8d | ||
|
|
8d55587cf4 | ||
|
|
a754ceaf3b | ||
|
|
086ea83fac | ||
|
|
1ace8fb9a3 | ||
|
|
e0b23a26f2 | ||
|
|
7c16d08ec0 | ||
|
|
5157e62fed | ||
|
|
1fe2c49204 | ||
|
|
b9b50a0f5a | ||
|
|
23cc2f81e9 | ||
|
|
68cdf50cb6 | ||
|
|
2ae8d43216 | ||
|
|
0ea464f30f | ||
|
|
7cb035ba24 | ||
|
|
7231a847f7 | ||
|
|
4f0f950dd4 | ||
|
|
c1f4785392 | ||
|
|
b22c878cf9 | ||
|
|
3420f677b6 | ||
|
|
baee8cfe82 | ||
|
|
0b0570fa54 | ||
|
|
299409aa7b | ||
|
|
5284312eb3 | ||
|
|
86a0e7ce23 | ||
|
|
e0de04dddb | ||
|
|
19d7edb585 | ||
|
|
fbb75c97d0 | ||
|
|
7e9cac3478 | ||
|
|
be937956af | ||
|
|
c5c3826714 | ||
|
|
42fec3a95c | ||
|
|
64b9367ca1 | ||
|
|
5fcdf28c5c | ||
|
|
2556c19a9a | ||
|
|
8fd21ad5a7 | ||
|
|
efebcd6f1b | ||
|
|
05e681f98f | ||
|
|
17c59bedfe | ||
|
|
92ebd6a0b9 | ||
|
|
0d26b1d48e | ||
|
|
4973d7ad9c | ||
|
|
defc73651b | ||
|
|
eefc976d42 | ||
|
|
be33794a5f | ||
|
|
13439c5183 | ||
|
|
93030afe3e | ||
|
|
dfc40db835 | ||
|
|
7f48acc42e | ||
|
|
5661b11aee | ||
|
|
4b088e84c7 | ||
|
|
6d93059e25 | ||
|
|
a9970dd694 | ||
|
|
81421bccef | ||
|
|
f4ae980a75 |
12
.dockerignore
Normal file
@@ -0,0 +1,12 @@
|
||||
Dockerfile
|
||||
.dockerignore
|
||||
node_modules
|
||||
npm-debug.log
|
||||
README.md
|
||||
.next
|
||||
.git
|
||||
|
||||
.yalc/
|
||||
yalc.lock
|
||||
testApi/
|
||||
*.local.*
|
||||
30
.github/ISSUE_TEMPLATE/bugs.md
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
---
|
||||
name: 问题反馈
|
||||
about: 详细清晰的描述你遇到的问题
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
**例行检查**
|
||||
|
||||
[//]: # '方框内填 x 表示打钩'
|
||||
|
||||
- [ ] 我已确认目前没有类似 issue
|
||||
- [ ] 我已完整查看过项目 README,以及[项目文档](https://doc.tryfastgpt.ai/docs/intro/)
|
||||
- [ ] 我使用了自己的 key,并确认我的 key 是可正常使用的
|
||||
- [ ] 我理解并愿意跟进此 issue,协助测试和提供反馈
|
||||
- [x] 我理解并认可上述内容,并理解项目维护者精力有限,**不遵循规则的 issue 可能会被无视或直接关闭**
|
||||
|
||||
**你的版本**
|
||||
|
||||
- [ ] 公有云版本
|
||||
- [ ] 私有部署版本, 具体版本号:
|
||||
|
||||
**问题描述, 日志截图,配置文件等**
|
||||
|
||||
**复现步骤**
|
||||
|
||||
**预期结果**
|
||||
|
||||
**相关截图**
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: 飞书话题群
|
||||
url: https://oss.laf.run/otnvvf-imgs/fastgpt-feishu1.png
|
||||
about: FastGPT 全是问题群
|
||||
23
.github/ISSUE_TEMPLATE/features.md
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
---
|
||||
name: 功能请求
|
||||
about: 详细描述你期望的功能
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
**例行检查**
|
||||
|
||||
[//]: # '方框内填 x 表示打钩'
|
||||
|
||||
- [ ] 我已确认目前没有类似 features
|
||||
- [ ] 我已确认我已升级到最新版本
|
||||
- [ ] 我已完整查看过项目 README,已确定现有版本无法满足需求
|
||||
- [ ] 我理解并愿意跟进此 features,协助测试和提供反馈
|
||||
- [x] 我理解并认可上述内容,并理解项目维护者精力有限,**不遵循规则的 features 可能会被无视或直接关闭**
|
||||
|
||||
**功能描述**
|
||||
|
||||
**应用场景**
|
||||
|
||||
**相关示例**
|
||||
30
.github/gh-bot.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
version: v1
|
||||
debug: true
|
||||
action:
|
||||
printConfig: false
|
||||
release:
|
||||
retry: 15s
|
||||
actionName: Release
|
||||
allowOps:
|
||||
- cuisongliu
|
||||
bot:
|
||||
prefix: /
|
||||
spe: _
|
||||
allowOps:
|
||||
- sealos-ci-robot
|
||||
- sealos-release-robot
|
||||
email: sealos-ci-robot@sealos.io
|
||||
username: sealos-ci-robot
|
||||
repo:
|
||||
org: false
|
||||
|
||||
message:
|
||||
success: |
|
||||
🤖 says: Hooray! The action {{.Body}} has been completed successfully. 🎉
|
||||
format_error: |
|
||||
🤖 says: ‼️ There is a formatting issue with the action, kindly verify the action's format.
|
||||
permission_error: |
|
||||
🤖 says: ‼️ The action doesn't have permission to trigger.
|
||||
release_error: |
|
||||
🤖 says: ‼️ Release action failed.
|
||||
Error details: {{.Error}}
|
||||
BIN
.github/imgs/image.png
vendored
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
.github/imgs/intro1.png
vendored
|
Before Width: | Height: | Size: 548 KiB After Width: | Height: | Size: 173 KiB |
BIN
.github/imgs/intro2.png
vendored
|
Before Width: | Height: | Size: 437 KiB After Width: | Height: | Size: 273 KiB |
BIN
.github/imgs/intro3.png
vendored
|
Before Width: | Height: | Size: 574 KiB After Width: | Height: | Size: 168 KiB |
BIN
.github/imgs/intro4.png
vendored
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 159 KiB |
15
.github/imgs/logo-left.svg
vendored
Normal file
|
After Width: | Height: | Size: 10 KiB |
619
.github/imgs/logo.svg
vendored
@@ -1,599 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="256px" height="256px" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve"> <image id="image0" width="256" height="256" x="0" y="0"
|
||||
href="data:image/png;base64,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
|
||||
MDqUEekAAAAASUVORK5CYII=" />
|
||||
</svg>
|
||||
<svg width="49" height="48" viewBox="0 0 49 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path
|
||||
d="M20.3692 7.00001L28.9536 7V7.00294C29.0284 7.00099 29.1033 7.00002 29.1782 7.00002C30.3387 7.00002 31.4878 7.2344 32.5599 7.68979C33.6321 8.14518 34.6062 8.81265 35.4268 9.6541C36.2474 10.4956 36.8983 11.4945 37.3424 12.5939C37.7865 13.6933 38.0151 14.8716 38.0151 16.0616L20.3691 16.0616L20.3691 41C19.2418 41 18.1255 40.7655 17.084 40.3097C16.0425 39.854 15.0961 39.1861 14.299 38.344C13.5018 37.502 12.8695 36.5024 12.4381 35.4022C12.0566 34.4292 11.8388 33.3945 11.7935 32.3446H11.7846L11.7846 16.2792H11.7871C11.772 15.6165 11.8258 14.9506 11.9496 14.2938C12.2808 12.536 13.0984 10.9214 14.299 9.6541C15.4995 8.38681 17.0291 7.52377 18.6944 7.17413C19.2486 7.05776 19.8095 7 20.3692 7.00001Z"
|
||||
fill="url(#paint0_linear_1008_3495)" />
|
||||
<path
|
||||
d="M27.7569 29.8173H24.7138V21.5343H27.8019V21.5345C28.8803 21.5403 29.9474 21.7544 30.944 22.1651C31.9544 22.5815 32.8725 23.1919 33.6458 23.9613C34.4191 24.7308 35.0326 25.6442 35.4511 26.6496C35.8696 27.6549 36.085 28.7324 36.085 29.8205H27.7569V29.8173Z"
|
||||
fill="url(#paint1_linear_1008_3495)" />
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_1008_3495" x1="24.8999" y1="7" x2="24.8999" y2="41"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#326DFF" />
|
||||
<stop offset="1" stop-color="#8EAEFF" />
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear_1008_3495" x1="30.3994" y1="21.5343" x2="30.3994" y2="29.8205"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#326DFF" />
|
||||
<stop offset="1" stop-color="#8EAEFF" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 1.7 KiB |
4
.github/sync_imgs.yml
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
yangchuansheng/fastgpt-imgs:
|
||||
- source: docSite/assets/imgs/
|
||||
dest: imgs/
|
||||
deleteOrphaned: true
|
||||
96
.github/workflows/build-sandbox-image.yml
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
name: Build fastgpt-sandbox images
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- 'projects/sandbox/**'
|
||||
tags:
|
||||
- 'v*'
|
||||
jobs:
|
||||
build-fastgpt-sandbox-images:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
# install env
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
sudo apt update && sudo apt install -y nodejs npm
|
||||
- name: Set up QEMU (optional)
|
||||
uses: docker/setup-qemu-action@v2
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
with:
|
||||
driver-opts: network=host
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: /tmp/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-buildx-
|
||||
|
||||
# login docker
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_PAT }}
|
||||
- name: Login to Ali Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: registry.cn-hangzhou.aliyuncs.com
|
||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||
|
||||
# Set tag
|
||||
- name: Set image name and tag
|
||||
run: |
|
||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sandbox:latest" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Build and publish image for main branch or tag push event
|
||||
env:
|
||||
Git_Tag: ${{ env.Git_Tag }}
|
||||
Git_Latest: ${{ env.Git_Latest }}
|
||||
Ali_Tag: ${{ env.Ali_Tag }}
|
||||
Ali_Latest: ${{ env.Ali_Latest }}
|
||||
Docker_Hub_Tag: ${{ env.Docker_Hub_Tag }}
|
||||
Docker_Hub_Latest: ${{ env.Docker_Hub_Latest }}
|
||||
run: |
|
||||
docker buildx build \
|
||||
-f projects/sandbox/Dockerfile \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/fastgpt-sandbox" \
|
||||
--label "org.opencontainers.image.description=fastgpt-sandbox image" \
|
||||
--push \
|
||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||
-t ${Git_Tag} \
|
||||
-t ${Git_Latest} \
|
||||
-t ${Ali_Tag} \
|
||||
-t ${Ali_Latest} \
|
||||
-t ${Docker_Hub_Tag} \
|
||||
-t ${Docker_Hub_Latest} \
|
||||
.
|
||||
71
.github/workflows/deploy-docs.yml
vendored
@@ -1,71 +0,0 @@
|
||||
name: deploy-docs
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- 'docSite/**'
|
||||
branches:
|
||||
- 'main'
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
# This workflow contains jobs "deploy-production"
|
||||
deploy-production:
|
||||
# The environment this job references
|
||||
environment:
|
||||
name: Production
|
||||
url: ${{ steps.vercel-action.outputs.preview-url }}
|
||||
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
# Job outputs
|
||||
outputs:
|
||||
docs: ${{ steps.filter.outputs.docs }}
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
# Step 1 - Checks-out your repository under $GITHUB_WORKSPACE
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive # Fetch submodules
|
||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||
|
||||
# Step 2 Detect changes to Docs Content
|
||||
- name: Detect changes in doc content
|
||||
uses: dorny/paths-filter@v2
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
docs:
|
||||
- 'docSite/content/docs/**'
|
||||
base: main
|
||||
|
||||
# Step 3 - Install Hugo (specific version)
|
||||
- name: Install Hugo
|
||||
uses: peaceiris/actions-hugo@v2
|
||||
with:
|
||||
hugo-version: '0.117.0'
|
||||
extended: true
|
||||
|
||||
# Step 4 - Builds the site using Hugo
|
||||
- name: Build
|
||||
run: hugo -v --minify -s docSite
|
||||
env:
|
||||
HUGO_BASEURL: ${{ vars.BASE_URL }}
|
||||
|
||||
# Step 5 - Push our generated site to Vercel
|
||||
- name: Deploy to Vercel
|
||||
uses: amondnet/vercel-action@v25
|
||||
id: vercel-action
|
||||
with:
|
||||
vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required
|
||||
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} #Required
|
||||
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} #Required
|
||||
github-comment: false
|
||||
vercel-args: '--prod --local-config ../vercel.json' # Optional
|
||||
working-directory: docSite/public
|
||||
91
.github/workflows/docs-deploy-kubeconfig.yml
vendored
Normal file
@@ -0,0 +1,91 @@
|
||||
name: Deploy doc image by kubeconfig
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- 'docSite/**'
|
||||
branches:
|
||||
- 'main'
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
|
||||
jobs:
|
||||
build-fastgpt-docs-images:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Change baseURL
|
||||
run: sed -i 's|^baseURL =.*|baseURL = "https://doc.fastgpt.cn"|g' ./docSite/hugo.toml
|
||||
|
||||
- name: Get current date and time
|
||||
id: datetime
|
||||
run: echo "datetime=$(date +'%Y%m%d%H%M%S')" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
# list of Docker images to use as base name for tags
|
||||
images: |
|
||||
${{ secrets.DOCKER_HUB_NAME }}/fastgpt-docs
|
||||
ghcr.io/${{ github.repository_owner }}/fastgpt-docs
|
||||
registry.cn-hangzhou.aliyuncs.com/${{ secrets.ALI_HUB_USERNAME }}/fastgpt-docs
|
||||
tags: |
|
||||
${{ steps.datetime.outputs.datetime }}
|
||||
flavor: latest=false
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||
|
||||
- name: Login to ghcr.io
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_PAT }}
|
||||
|
||||
- name: Login to Aliyun
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: registry.cn-hangzhou.aliyuncs.com
|
||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||
|
||||
- name: Build and push Docker images to ghcr.io and DockerHub
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./docSite/Dockerfile
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
outputs:
|
||||
tags: ${{ steps.datetime.outputs.datetime }}
|
||||
update-docs-image:
|
||||
needs: build-fastgpt-docs-images
|
||||
runs-on: ubuntu-20.04
|
||||
if: github.repository == 'labring/FastGPT'
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
- uses: actions-hub/kubectl@master
|
||||
env:
|
||||
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
|
||||
with:
|
||||
args: set image deployment/fastgpt-docs fastgpt-docs=registry.cn-hangzhou.aliyuncs.com/${{ secrets.ALI_HUB_USERNAME }}/fastgpt-docs:${{ needs.build-fastgpt-docs-images.outputs.tags }}
|
||||
- uses: actions-hub/kubectl@master
|
||||
env:
|
||||
KUBE_CONFIG: ${{ secrets.KUBE_CONFIG }}
|
||||
with:
|
||||
args: annotate deployment/fastgpt-docs originImageName="registry.cn-hangzhou.aliyuncs.com/${{ secrets.ALI_HUB_USERNAME }}/fastgpt-docs:${{ needs.build-fastgpt-docs-images.outputs.tags }}" --overwrite
|
||||
79
.github/workflows/docs-deploy-vercel.yml
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
name: Deploy doc image to vercel
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- 'docSite/**'
|
||||
branches:
|
||||
- 'main'
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
# This workflow contains jobs "deploy-production"
|
||||
deploy-production:
|
||||
# The environment this job references
|
||||
environment:
|
||||
name: Production
|
||||
url: ${{ steps.vercel-action.outputs.preview-url }}
|
||||
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
# Job outputs
|
||||
outputs:
|
||||
docs: ${{ steps.filter.outputs.docs }}
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
# Step 1 - Checks-out your repository under $GITHUB_WORKSPACE
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: recursive # Fetch submodules
|
||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||
|
||||
# Step 2 Detect changes to Docs Content
|
||||
- name: Detect changes in doc content
|
||||
uses: dorny/paths-filter@v2
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
docs:
|
||||
- 'docSite/content/docs/**'
|
||||
base: main
|
||||
|
||||
- name: Add cdn for images
|
||||
run: |
|
||||
sed -i "s#\](/imgs/#\](https://cdn.jsdelivr.net/gh/yangchuansheng/fastgpt-imgs@main/imgs/#g" $(grep -rl "\](/imgs/" docSite/content/zh-cn/docs)
|
||||
|
||||
# Step 3 - Install Hugo (specific version)
|
||||
- name: Install Hugo
|
||||
uses: peaceiris/actions-hugo@v2
|
||||
with:
|
||||
hugo-version: '0.117.0'
|
||||
extended: true
|
||||
|
||||
# Step 4 - Builds the site using Hugo
|
||||
- name: Build
|
||||
run: cd docSite && hugo mod get -u github.com/colinwilson/lotusdocs@6d0568e && hugo -v --minify
|
||||
|
||||
# Step 5 - Push our generated site to Vercel
|
||||
- name: Deploy to Vercel
|
||||
uses: amondnet/vercel-action@v25
|
||||
id: vercel-action
|
||||
with:
|
||||
vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required
|
||||
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} #Required
|
||||
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} #Required
|
||||
github-comment: false
|
||||
vercel-args: '--prod --local-config ../vercel.json' # Optional
|
||||
working-directory: docSite/public
|
||||
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GH_PAT }}
|
||||
publish_dir: docSite/public
|
||||
98
.github/workflows/docs-preview.yml
vendored
Normal file
@@ -0,0 +1,98 @@
|
||||
name: Preview FastGPT docs
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
paths:
|
||||
- 'docSite/**'
|
||||
branches:
|
||||
- 'main'
|
||||
workflow_dispatch:
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
# This workflow contains jobs "deploy-production"
|
||||
deploy-preview:
|
||||
# The environment this job references
|
||||
environment:
|
||||
name: Preview
|
||||
url: ${{ steps.vercel-action.outputs.preview-url }}
|
||||
|
||||
# The type of runner that the job will run on
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
# Job outputs
|
||||
outputs:
|
||||
url: ${{ steps.vercel-action.outputs.preview-url }}
|
||||
|
||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||
steps:
|
||||
# Step 1 - Checks-out your repository under $GITHUB_WORKSPACE
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
submodules: recursive # Fetch submodules
|
||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||
|
||||
# Step 2 Detect changes to Docs Content
|
||||
- name: Detect changes in doc content
|
||||
uses: dorny/paths-filter@v2
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
docs:
|
||||
- 'docSite/content/docs/**'
|
||||
base: main
|
||||
|
||||
- name: Add cdn for images
|
||||
run: |
|
||||
sed -i "s#\](/imgs/#\](https://cdn.jsdelivr.net/gh/yangchuansheng/fastgpt-imgs@main/imgs/#g" $(grep -rl "\](/imgs/" docSite/content/zh-cn/docs)
|
||||
|
||||
# Step 3 - Install Hugo (specific version)
|
||||
- name: Install Hugo
|
||||
uses: peaceiris/actions-hugo@v2
|
||||
with:
|
||||
hugo-version: '0.117.0'
|
||||
extended: true
|
||||
|
||||
# Step 4 - Builds the site using Hugo
|
||||
- name: Build
|
||||
run: cd docSite && hugo mod get -u github.com/colinwilson/lotusdocs@6d0568e && hugo -v --minify
|
||||
|
||||
# Step 5 - Push our generated site to Vercel
|
||||
- name: Deploy to Vercel
|
||||
uses: amondnet/vercel-action@v25
|
||||
id: vercel-action
|
||||
with:
|
||||
vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required
|
||||
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} #Required
|
||||
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} #Required
|
||||
github-comment: false
|
||||
vercel-args: '--local-config ../vercel.json' # Optional
|
||||
working-directory: docSite/public
|
||||
alias-domains: | #Optional
|
||||
fastgpt-staging.vercel.app
|
||||
docsOutput:
|
||||
needs: [deploy-preview]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
- name: Write md
|
||||
run: |
|
||||
echo "# 🤖 Generated by deploy action" > report.md
|
||||
echo "[👀 Visit Preview](${{ needs.deploy-preview.outputs.url }})" >> report.md
|
||||
cat report.md
|
||||
- name: Gh Rebot for Sealos
|
||||
uses: labring/gh-rebot@v0.0.6
|
||||
if: ${{ (github.event_name == 'pull_request_target') }}
|
||||
with:
|
||||
version: v0.0.6
|
||||
env:
|
||||
GH_TOKEN: '${{ secrets.GH_PAT }}'
|
||||
SEALOS_TYPE: 'pr_comment'
|
||||
SEALOS_FILENAME: 'report.md'
|
||||
SEALOS_REPLACE_TAG: 'DEFAULT_REPLACE_DEPLOY'
|
||||
52
.github/workflows/fastgpt-image-personal.yml
vendored
Normal file
@@ -0,0 +1,52 @@
|
||||
name: Build FastGPT images in Personal warehouse
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- 'projects/app/**'
|
||||
- 'packages/**'
|
||||
branches:
|
||||
- 'main'
|
||||
jobs:
|
||||
build-fastgpt-images:
|
||||
runs-on: ubuntu-20.04
|
||||
if: github.repository != 'labring/FastGPT'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
with:
|
||||
driver-opts: network=host
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-buildx-
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_PAT }}
|
||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
||||
run: |
|
||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
- name: Build and publish image for main branch or tag push event
|
||||
env:
|
||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
||||
run: |
|
||||
docker buildx build \
|
||||
--build-arg name=app \
|
||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
||||
--label "org.opencontainers.image.description=fastgpt image" \
|
||||
--push \
|
||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||
-t ${DOCKER_REPO_TAGGED} \
|
||||
-f Dockerfile \
|
||||
.
|
||||
229
.github/workflows/fastgpt-image.yml
vendored
@@ -1,17 +1,17 @@
|
||||
name: Build fastgpt images and copy image to docker hub
|
||||
name: Build FastGPT images
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- 'client/**'
|
||||
branches:
|
||||
- 'main'
|
||||
- 'projects/app/**'
|
||||
- 'packages/**'
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
- 'v*'
|
||||
jobs:
|
||||
build-fastgpt-images:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
# install env
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
@@ -25,55 +25,234 @@ jobs:
|
||||
uses: docker/setup-buildx-action@v2
|
||||
with:
|
||||
driver-opts: network=host
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: /tmp/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-buildx-
|
||||
|
||||
# login docker
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_PAT }}
|
||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
||||
- name: Login to Ali Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: registry.cn-hangzhou.aliyuncs.com
|
||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||
|
||||
# Set tag
|
||||
- name: Set image name and tag
|
||||
run: |
|
||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt:latest" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Build and publish image for main branch or tag push event
|
||||
env:
|
||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
||||
run: |
|
||||
cd client && \
|
||||
docker buildx build \
|
||||
-f projects/app/Dockerfile \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--label "org.opencontainers.image.source= https://github.com/ ${{ github.repository_owner }}/FastGPT" \
|
||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
||||
--label "org.opencontainers.image.description=fastgpt image" \
|
||||
--label "org.opencontainers.image.licenses=MIT" \
|
||||
--push \
|
||||
-t ${DOCKER_REPO_TAGGED} \
|
||||
-f Dockerfile \
|
||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||
-t ${Git_Tag} \
|
||||
-t ${Git_Latest} \
|
||||
-t ${Ali_Tag} \
|
||||
-t ${Ali_Latest} \
|
||||
-t ${Docker_Hub_Tag} \
|
||||
-t ${Docker_Hub_Latest} \
|
||||
.
|
||||
push-to-docker-hub:
|
||||
needs: build-fastgpt-images
|
||||
build-fastgpt-images-sub-route:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout code
|
||||
# install env
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
sudo apt update && sudo apt install -y nodejs npm
|
||||
- name: Set up QEMU (optional)
|
||||
uses: docker/setup-qemu-action@v2
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
with:
|
||||
driver-opts: network=host
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: /tmp/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-buildx-
|
||||
|
||||
# login docker
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_PAT }}
|
||||
- name: Login to Ali Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: registry.cn-hangzhou.aliyuncs.com
|
||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
||||
|
||||
# Set tag
|
||||
- name: Set image name and tag
|
||||
run: |
|
||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||
echo "IMAGE_TAG=latest" >> $GITHUB_ENV
|
||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "IMAGE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route:latest" >> $GITHUB_ENV
|
||||
fi
|
||||
- name: Pull image from GitHub Container Registry
|
||||
run: docker pull ghcr.io/${{ github.repository_owner }}/fastgpt:${{env.IMAGE_TAG}}
|
||||
- name: Tag image with Docker Hub repository name and version tag
|
||||
run: docker tag ghcr.io/${{ github.repository_owner }}/fastgpt:${{env.IMAGE_TAG}} ${{ secrets.DOCKER_IMAGE_NAME }}:${{env.IMAGE_TAG}}
|
||||
- name: Push image to Docker Hub
|
||||
run: docker push ${{ secrets.DOCKER_IMAGE_NAME }}:${{env.IMAGE_TAG}}
|
||||
|
||||
- name: Build and publish image for main branch or tag push event
|
||||
env:
|
||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
||||
run: |
|
||||
docker buildx build \
|
||||
-f projects/app/Dockerfile \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--build-arg base_url=/fastai \
|
||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
||||
--label "org.opencontainers.image.description=fastgpt image" \
|
||||
--push \
|
||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||
-t ${Git_Tag} \
|
||||
-t ${Git_Latest} \
|
||||
-t ${Ali_Tag} \
|
||||
-t ${Ali_Latest} \
|
||||
-t ${Docker_Hub_Tag} \
|
||||
-t ${Docker_Hub_Latest} \
|
||||
.
|
||||
build-fastgpt-images-sub-route-gchat:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
# install env
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
sudo apt update && sudo apt install -y nodejs npm
|
||||
- name: Set up QEMU (optional)
|
||||
uses: docker/setup-qemu-action@v2
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
with:
|
||||
driver-opts: network=host
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: /tmp/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-buildx-
|
||||
|
||||
# login docker
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_PAT }}
|
||||
- name: Login to Ali Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: registry.cn-hangzhou.aliyuncs.com
|
||||
username: ${{ secrets.ALI_HUB_USERNAME }}
|
||||
password: ${{ secrets.ALI_HUB_PASSWORD }}
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_NAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_PASSWORD }}
|
||||
|
||||
# Set tag
|
||||
- name: Set image name and tag
|
||||
run: |
|
||||
if [[ "${{ github.ref_name }}" == "main" ]]; then
|
||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
else
|
||||
echo "Git_Tag=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route-gchat:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Git_Latest=ghcr.io/${{ github.repository_owner }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
echo "Ali_Tag=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route-gchat:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Ali_Latest=${{ secrets.ALI_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Tag=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route-gchat:${{ github.ref_name }}" >> $GITHUB_ENV
|
||||
echo "Docker_Hub_Latest=${{ secrets.DOCKER_IMAGE_NAME }}/fastgpt-sub-route-gchat:latest" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Build and publish image for main branch or tag push event
|
||||
env:
|
||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
||||
run: |
|
||||
docker buildx build \
|
||||
-f projects/app/Dockerfile \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
--build-arg base_url=/gchat \
|
||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
||||
--label "org.opencontainers.image.description=fastgpt-sub-route-gchat image" \
|
||||
--push \
|
||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||
-t ${Git_Tag} \
|
||||
-t ${Git_Latest} \
|
||||
-t ${Ali_Tag} \
|
||||
-t ${Ali_Latest} \
|
||||
-t ${Docker_Hub_Tag} \
|
||||
-t ${Docker_Hub_Latest} \
|
||||
.
|
||||
|
||||
29
.github/workflows/helm-release.yaml
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
name: Release helm chart
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*.*.*'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
helm:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-tags: true
|
||||
fetch-depth: 0
|
||||
- name: Set output
|
||||
id: vars
|
||||
run: echo "tag=$(git describe --tags)" >> $GITHUB_OUTPUT
|
||||
- name: Release Helm
|
||||
run: |
|
||||
echo ${{ secrets.GH_PAT }} | helm registry login ghcr.io -u ${{ github.repository_owner }} --password-stdin
|
||||
export APP_VERSION=${{ steps.vars.outputs.tag }}
|
||||
export HELM_VERSION=${{ steps.vars.outputs.tag }}
|
||||
export HELM_REPO=ghcr.io/${{ github.repository_owner }}
|
||||
helm dependency update files/helm/fastgpt
|
||||
helm package files/helm/fastgpt --version ${HELM_VERSION}-helm --app-version ${APP_VERSION} -d bin
|
||||
helm push bin/fastgpt-${HELM_VERSION}-helm.tgz oci://${HELM_REPO}
|
||||
81
.github/workflows/preview-fastgpt-image.yml
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
name: Preview FastGPT images
|
||||
on:
|
||||
pull_request_target:
|
||||
paths:
|
||||
- 'projects/app/**'
|
||||
- 'packages/**'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
preview-fastgpt-images:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
submodules: recursive # Fetch submodules
|
||||
fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
with:
|
||||
driver-opts: network=host
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: /tmp/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-buildx-
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.repository_owner }}
|
||||
password: ${{ secrets.GH_PAT }}
|
||||
- name: Set DOCKER_REPO_TAGGED based on branch or tag
|
||||
run: |
|
||||
echo "DOCKER_REPO_TAGGED=ghcr.io/${{ github.repository_owner }}/fastgpt-pr:${{ github.event.pull_request.head.sha }}" >> $GITHUB_ENV
|
||||
- name: Build image for PR
|
||||
env:
|
||||
DOCKER_REPO_TAGGED: ${{ env.DOCKER_REPO_TAGGED }}
|
||||
run: |
|
||||
docker buildx build \
|
||||
-f projects/app/Dockerfile \
|
||||
--label "org.opencontainers.image.source=https://github.com/${{ github.repository_owner }}/FastGPT" \
|
||||
--label "org.opencontainers.image.description=fastgpt-pr image" \
|
||||
--label "org.opencontainers.image.licenses=Apache" \
|
||||
--push \
|
||||
--cache-from=type=local,src=/tmp/.buildx-cache \
|
||||
--cache-to=type=local,dest=/tmp/.buildx-cache \
|
||||
-t ${DOCKER_REPO_TAGGED} \
|
||||
.
|
||||
# Add write md step after build
|
||||
- name: Write md
|
||||
run: |
|
||||
echo "# 🤖 Generated by deploy action" > report.md
|
||||
echo "📦 Preview Image: \`${DOCKER_REPO_TAGGED}\`" >> report.md
|
||||
cat report.md
|
||||
|
||||
- name: Gh Rebot for Sealos
|
||||
uses: labring/gh-rebot@v0.0.6
|
||||
if: ${{ (github.event_name == 'pull_request_target') }}
|
||||
with:
|
||||
version: v0.0.6
|
||||
env:
|
||||
GH_TOKEN: '${{ secrets.GH_PAT }}'
|
||||
SEALOS_TYPE: 'pr_comment'
|
||||
SEALOS_FILENAME: 'report.md'
|
||||
SEALOS_REPLACE_TAG: 'DEFAULT_REPLACE_DEPLOY'
|
||||
|
||||
helm-check:
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Helm Check
|
||||
run: |
|
||||
helm dependency update files/helm/fastgpt
|
||||
helm lint files/helm/fastgpt
|
||||
helm package files/helm/fastgpt
|
||||
35
.github/workflows/sync_imgs.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
name: Sync images
|
||||
on:
|
||||
pull_request_target:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- docSite/assets/imgs/**
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- docSite/assets/imgs/**
|
||||
workflow_dispatch:
|
||||
jobs:
|
||||
sync:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
if: ${{ (github.event_name == 'pull_request_target') }}
|
||||
with:
|
||||
ref: ${{ github.event.pull_request.head.ref }}
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Run GitHub File Sync
|
||||
uses: BetaHuhn/repo-file-sync-action@v1.21.0
|
||||
with:
|
||||
GH_PAT: ${{ secrets.IMG_GH_PAT }}
|
||||
CONFIG_PATH: .github/sync_imgs.yml
|
||||
ORIGINAL_MESSAGE: true
|
||||
SKIP_PR: true
|
||||
COMMIT_EACH_FILE: false
|
||||
12
.gitignore
vendored
@@ -33,4 +33,14 @@ dist/
|
||||
|
||||
# hugo
|
||||
**/.hugo_build.lock
|
||||
docSite/public/
|
||||
docSite/public/
|
||||
docSite/resources/_gen/
|
||||
docSite/.vercel
|
||||
*.local.*
|
||||
|
||||
|
||||
.idea/
|
||||
files/helm/fastgpt/fastgpt-0.1.0.tgz
|
||||
files/helm/fastgpt/charts/*.tgz
|
||||
|
||||
tmp/
|
||||
|
||||
9
.imgbotconfig
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"schedule": "daily", // daily|weekly|monthly
|
||||
"ignoredFiles": [
|
||||
"*.svg",
|
||||
"packages/*",
|
||||
"projects/*",
|
||||
],
|
||||
"minKBReduced": 200, // delay new prs until size reduction meets this threshold (default to 10)
|
||||
}
|
||||
3
.npmrc
Normal file
@@ -0,0 +1,3 @@
|
||||
public-hoist-pattern[]=*tiktoken*
|
||||
public-hoist-pattern[]=*@zilliz/milvus2-sdk-node*
|
||||
registry=https://registry.npmjs.org/
|
||||
@@ -1,4 +1,8 @@
|
||||
dist
|
||||
.vscode
|
||||
**/.DS_Store
|
||||
node_modules
|
||||
node_modules
|
||||
docSite/
|
||||
*.md
|
||||
|
||||
cl100l_base.ts
|
||||
46
.vscode/i18n-ally-custom-framework.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
# .vscode/i18n-ally-custom-framework.yml
|
||||
|
||||
# An array of strings which contain Language Ids defined by VS Code
|
||||
# You can check available language ids here: https://code.visualstudio.com/docs/languages/identifiers
|
||||
languageIds:
|
||||
- javascript
|
||||
- typescript
|
||||
- javascriptreact
|
||||
- typescriptreact
|
||||
|
||||
# An array of RegExes to find the key usage. **The key should be captured in the first match group**.
|
||||
# You should unescape RegEx strings in order to fit in the YAML file
|
||||
# To help with this, you can use https://www.freeformatter.com/json-escape.html
|
||||
usageMatchRegex:
|
||||
# The following example shows how to detect `t("your.i18n.keys")`
|
||||
# the `{key}` will be placed by a proper keypath matching regex,
|
||||
# you can ignore it and use your own matching rules as well
|
||||
- "[^\\w\\d]t\\(['\"`]({key})['\"`]"
|
||||
- "[^\\w\\d]commonT\\(['\"`]({key})['\"`]"
|
||||
# 支持 appT("your.i18n.keys")
|
||||
- "[^\\w\\d]appT\\(['\"`]({key})['\"`]"
|
||||
# 支持 datasetT("your.i18n.keys")
|
||||
- "[^\\w\\d]datasetT\\(['\"`]({key})['\"`]"
|
||||
- "[^\\w\\d]fileT\\(['\"`]({key})['\"`]"
|
||||
- "[^\\w\\d]publishT\\(['\"`]({key})['\"`]"
|
||||
- "[^\\w\\d]workflowT\\(['\"`]({key})['\"`]"
|
||||
- "[^\\w\\d]userT\\(['\"`]({key})['\"`]"
|
||||
- "[^\\w\\d]chatT\\(['\"`]({key})['\"`]"
|
||||
- "[^\\w\\d]i18nT\\(['\"`]({key})['\"`]"
|
||||
|
||||
# A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys
|
||||
# and works like how the i18next framework identifies the namespace scope from the
|
||||
# useTranslation() hook.
|
||||
# You should unescape RegEx strings in order to fit in the YAML file
|
||||
# To help with this, you can use https://www.freeformatter.com/json-escape.html
|
||||
scopeRangeRegex: "([^:]+):"
|
||||
|
||||
# An array of strings containing refactor templates.
|
||||
# The "$1" will be replaced by the keypath specified.
|
||||
# Optional: uncomment the following two lines to use
|
||||
|
||||
# refactorTemplates:
|
||||
# - i18n.get("$1")
|
||||
|
||||
# If set to true, only enables this custom framework (will disable all built-in frameworks)
|
||||
monopoly: false
|
||||
122
.vscode/nextapi.code-snippets
vendored
Normal file
@@ -0,0 +1,122 @@
|
||||
{
|
||||
// Place your FastGPT 工作区 snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
|
||||
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
|
||||
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
|
||||
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
|
||||
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
|
||||
// Placeholders with the same ids are connected.
|
||||
// Example:
|
||||
"Next api template": {
|
||||
"scope": "javascript,typescript",
|
||||
"prefix": "nextapi",
|
||||
"body": [
|
||||
"import type { ApiRequestProps, ApiResponseType } from '@fastgpt/service/type/next';",
|
||||
"import { NextAPI } from '@/service/middleware/entry';",
|
||||
"",
|
||||
"export type ${TM_FILENAME_BASE}Query = {};",
|
||||
"",
|
||||
"export type ${TM_FILENAME_BASE}Body = {};",
|
||||
"",
|
||||
"export type ${TM_FILENAME_BASE}Response = {};",
|
||||
"",
|
||||
"async function handler(",
|
||||
" req: ApiRequestProps<${TM_FILENAME_BASE}Body, ${TM_FILENAME_BASE}Query>,",
|
||||
" res: ApiResponseType<any>",
|
||||
"): Promise<${TM_FILENAME_BASE}Response> {",
|
||||
" $1",
|
||||
" return {}",
|
||||
"}",
|
||||
"",
|
||||
"export default NextAPI(handler);"
|
||||
],
|
||||
"description": "FastGPT Next API template"
|
||||
},
|
||||
"use context template": {
|
||||
"scope": "typescriptreact",
|
||||
"prefix": "context",
|
||||
"body": [
|
||||
"import React, { ReactNode } from 'react';",
|
||||
"import { createContext } from 'use-context-selector';",
|
||||
"",
|
||||
"type ContextType = {$1};",
|
||||
"",
|
||||
"export const Context = createContext<ContextType>({});",
|
||||
"",
|
||||
"const ContextProvider = ({ children }: { children: ReactNode }) => {",
|
||||
" const contextValue: ContextType = {};",
|
||||
" return <Context.Provider value={contextValue}>{children}</Context.Provider>;",
|
||||
"};",
|
||||
"",
|
||||
"export default ContextProvider"
|
||||
],
|
||||
"description": "FastGPT usecontext template"
|
||||
},
|
||||
|
||||
"Jest test template": {
|
||||
"scope": "typescriptreact",
|
||||
"prefix": "jesttest",
|
||||
"body": [
|
||||
"import '@/pages/api/__mocks__/base';",
|
||||
"import { root } from '@/pages/api/__mocks__/db/init';",
|
||||
"import { getTestRequest } from '@/test/utils';",
|
||||
"import { AppErrEnum } from '@fastgpt/global/common/error/code/app';",
|
||||
"import handler from './demo';",
|
||||
"",
|
||||
"// Import the schema",
|
||||
"import { MongoOutLink } from '@fastgpt/service/support/outLink/schema';",
|
||||
"",
|
||||
"beforeAll(async () => {",
|
||||
" // await MongoOutLink.create({",
|
||||
" // shareId: 'aaa',",
|
||||
" // appId: root.appId,",
|
||||
" // tmbId: root.tmbId,",
|
||||
" // teamId: root.teamId,",
|
||||
" // type: 'share',",
|
||||
" // name: 'aaa'",
|
||||
" // })",
|
||||
"});",
|
||||
"",
|
||||
"test('Should return a list of outLink', async () => {",
|
||||
" // Mock request",
|
||||
" const res = (await handler(",
|
||||
" ...getTestRequest({",
|
||||
" query: {",
|
||||
" appId: root.appId,",
|
||||
" type: 'share'",
|
||||
" },",
|
||||
" user: root",
|
||||
" })",
|
||||
" )) as any;",
|
||||
"",
|
||||
" expect(res.code).toBe(200);",
|
||||
" expect(res.data.length).toBe(2);",
|
||||
"});",
|
||||
"",
|
||||
"test('appId is required', async () => {",
|
||||
" const res = (await handler(",
|
||||
" ...getTestRequest({",
|
||||
" query: {",
|
||||
" type: 'share'",
|
||||
" },",
|
||||
" user: root",
|
||||
" })",
|
||||
" )) as any;",
|
||||
" expect(res.code).toBe(500);",
|
||||
" expect(res.error).toBe(AppErrEnum.unExist);",
|
||||
"});",
|
||||
"",
|
||||
"test('if type is not provided, return nothing', async () => {",
|
||||
" const res = (await handler(",
|
||||
" ...getTestRequest({",
|
||||
" query: {",
|
||||
" appId: root.appId",
|
||||
" },",
|
||||
" user: root",
|
||||
" })",
|
||||
" )) as any;",
|
||||
" expect(res.code).toBe(200);",
|
||||
" expect(res.data.length).toBe(0);",
|
||||
"});"
|
||||
]
|
||||
}
|
||||
}
|
||||
34
.vscode/settings.json
vendored
@@ -1,15 +1,33 @@
|
||||
{
|
||||
"editor.formatOnSave": true,
|
||||
"editor.mouseWheelZoom": true,
|
||||
"typescript.tsdk": "client/node_modules/typescript/lib",
|
||||
"prettier.prettierPath": "./node_modules/prettier",
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"prettier.prettierPath": "node_modules/prettier",
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"i18n-ally.localesPaths": [
|
||||
"client/public/locales"
|
||||
"packages/web/i18n",
|
||||
],
|
||||
"i18n-ally.enabledParsers": ["json"],
|
||||
"i18n-ally.keystyle": "nested",
|
||||
"i18n-ally.enabledParsers": [
|
||||
"json",
|
||||
"yaml",
|
||||
"js",
|
||||
"ts"
|
||||
],
|
||||
"i18n-ally.keystyle": "flat",
|
||||
"i18n-ally.sortKeys": true,
|
||||
"i18n-ally.keepFulfilled": true,
|
||||
"i18n-ally.sourceLanguage": "zh", // 根据此语言文件翻译其他语言文件的变量和内容
|
||||
"i18n-ally.displayLanguage": "en", // 显示语言
|
||||
"i18n-ally.keepFulfilled": false,
|
||||
"i18n-ally.sourceLanguage": "zh-CN", // 根据此语言文件翻译其他语言文件的变量和内容
|
||||
"i18n-ally.displayLanguage": "zh-CN", // 显示语言
|
||||
"i18n-ally.namespace": true,
|
||||
"i18n-ally.pathMatcher": "{locale}/{namespaces}.json",
|
||||
"i18n-ally.extract.targetPickingStrategy": "most-similar-by-key",
|
||||
"i18n-ally.translate.engines": ["google"],
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"markdown.copyFiles.destination": {
|
||||
"/docSite/content/**/*": "${documentWorkspaceFolder}/docSite/assets/imgs/"
|
||||
},
|
||||
"markdown.copyFiles.overwriteBehavior": "nameIncrementally",
|
||||
"markdown.copyFiles.transformPath": "const filename = uri.path.split('/').pop(); return `/imgs/${filename}`;"
|
||||
}
|
||||
2
LICENSE
@@ -5,7 +5,7 @@ The FastGPT is licensed under the Apache License 2.0, with the following additio
|
||||
1. FastGPT is permitted to be used for commercialization. You can use FastGPT as a "backend-as-a-service" for your other applications, or delivering it to enterprises as an application development platform. However, when the following conditions are met, you must contact the producer to obtain a commercial license:
|
||||
|
||||
a. Multi-tenant SaaS service: Unless explicitly authorized by FastGPT in writing, you may not use the FastGPT.AI source code to operate a multi-tenant SaaS service that is similar to the FastGPT.
|
||||
b. LOGO and copyright information: In the process of using FastGPT, you may not remove or moFastGPT the LOGO or copyright information in the FastGPT console.
|
||||
b. LOGO and copyright information: In the process of using FastGPT, you may not remove or modify the LOGO or copyright information in the FastGPT console.
|
||||
|
||||
Please contact yujinlong@sealos.io by email to inquire about licensing matters.
|
||||
|
||||
|
||||
25
Makefile
Normal file
@@ -0,0 +1,25 @@
|
||||
# 定义默认变量
|
||||
proxy=null
|
||||
image=null
|
||||
|
||||
# 定义目标
|
||||
.PHONY: build
|
||||
|
||||
# 检查 target 是否定义
|
||||
ifndef name
|
||||
$(error name is not defined)
|
||||
endif
|
||||
|
||||
filePath=./projects/$(name)/Dockerfile
|
||||
|
||||
dev:
|
||||
pnpm --prefix ./projects/$(name) dev
|
||||
|
||||
build:
|
||||
ifeq ($(proxy), taobao)
|
||||
docker build -f $(filePath) -t $(image) . --build-arg proxy=taobao
|
||||
else ifeq ($(proxy), clash)
|
||||
docker build -f $(filePath) -t $(image) . --network host --build-arg HTTP_PROXY=http://127.0.0.1:7890 --build-arg HTTPS_PROXY=http://127.0.0.1:7890
|
||||
else
|
||||
docker build -f $(filePath) -t $(image) .
|
||||
endif
|
||||
234
README.md
@@ -1,121 +1,219 @@
|
||||
<div align="center">
|
||||
|
||||
<a href="https://fastgpt.run/"><img src="/.github/imgs/logo.svg" width="120" height="120" alt="fastgpt logo"></a>
|
||||
<a href="https://tryfastgpt.ai/"><img src="/.github/imgs/logo.svg" width="120" height="120" alt="fastgpt logo"></a>
|
||||
|
||||
# FastGPT
|
||||
|
||||
<p align="center">
|
||||
<a href="./README_en.md">English</a> |
|
||||
<a href="./README.md">简体中文</a> |
|
||||
<a href="./README_ja.md">日语</a>
|
||||
</p>
|
||||
|
||||
FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!
|
||||
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://fastgpt.run/">线上体验</a>
|
||||
·
|
||||
<a href="https://doc.fastgpt.run/docs/intro">相关文档</a>
|
||||
·
|
||||
<a href="https://doc.fastgpt.run/docs/development">本地开发</a>
|
||||
·
|
||||
<a href="https://github.com/labring/FastGPT#-%E7%9B%B8%E5%85%B3%E9%A1%B9%E7%9B%AE">相关项目</a>
|
||||
<a href="https://tryfastgpt.ai/">
|
||||
<img height="21" src="https://img.shields.io/badge/在线使用-d4eaf7?style=flat-square&logo=spoj&logoColor=7d09f1" alt="cloud">
|
||||
</a>
|
||||
<a href="https://doc.tryfastgpt.ai/docs/intro">
|
||||
<img height="21" src="https://img.shields.io/badge/相关文档-7d09f1?style=flat-square" alt="document">
|
||||
</a>
|
||||
<a href="https://doc.tryfastgpt.ai/docs/development">
|
||||
<img height="21" src="https://img.shields.io/badge/本地开发-%23d4eaf7?style=flat-square&logo=xcode&logoColor=7d09f1" alt="development">
|
||||
</a>
|
||||
<a href="/#-%E7%9B%B8%E5%85%B3%E9%A1%B9%E7%9B%AE">
|
||||
<img height="21" src="https://img.shields.io/badge/相关项目-7d09f1?style=flat-square" alt="project">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
## 🛸 在线体验
|
||||
https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409bd33f6d4
|
||||
|
||||
[fastgpt.run](https://fastgpt.run/)(服务器在新加坡,部分地区可能无法直连)
|
||||
## 🛸 在线使用
|
||||
|
||||
- 🌍 国际版:[tryfastgpt.ai](https://tryfastgpt.ai/)
|
||||
|
||||
| | |
|
||||
| ---------------------------------- | ---------------------------------- |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|
||||
## 💡 功能
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
1. 强大的可视化编排,轻松构建 AI 应用
|
||||
- [x] 提供简易模式,无需操作编排
|
||||
- [x] 用户对话前引导
|
||||
- [x] 全局变量
|
||||
- [x] 知识库搜索
|
||||
- [x] 多 LLM 模型对话
|
||||
- [x] 文本内容提取成结构化数据
|
||||
- [x] HTTP 扩展
|
||||
- [ ] 沙盒 JS 运行模块
|
||||
- [ ] 连续对话引导
|
||||
- [ ] 对话多路线选择
|
||||
- [ ] 源文件引用追踪
|
||||
2. 丰富的知识库预处理
|
||||
## 💡 RoadMap
|
||||
|
||||
`1` 应用编排能力
|
||||
- [x] 对话工作流、插件工作流
|
||||
- [x] 工具调用
|
||||
- [x] Code sandbox
|
||||
- [x] 循环调用
|
||||
- [x] 用户选择
|
||||
- [x] 表单输入
|
||||
|
||||
`2` 知识库能力
|
||||
- [x] 多库复用,混用
|
||||
- [x] chunk 记录修改和删除
|
||||
- [x] 支持直接分段导入
|
||||
- [x] 支持 QA 拆分导入
|
||||
- [x] 支持手动输入内容
|
||||
- [x] 支持 url 读取导入
|
||||
- [x] 支持 CSV 批量导入问答对
|
||||
- [ ] 支持知识库单独设置向量模型
|
||||
- [ ] 源文件存储
|
||||
3. 多种效果测试渠道
|
||||
- [x] 支持手动输入,直接分段,QA 拆分导入
|
||||
- [x] 支持 txt,md,html,pdf,docx,pptx,csv,xlsx (有需要更多可 PR file loader),支持 url 读取、CSV 批量导入
|
||||
- [x] 混合检索 & 重排
|
||||
- [x] API 知识库
|
||||
- [ ] 自定义文件读取服务
|
||||
- [ ] 自定义分块服务
|
||||
|
||||
`3` 应用调试能力
|
||||
- [x] 知识库单点搜索测试
|
||||
- [x] 对话时反馈引用并可修改与删除
|
||||
- [x] 完整上下文呈现
|
||||
- [ ] 完整模块中间值呈现
|
||||
4. OpenAPI
|
||||
- [x] completions 接口(对齐 GPT 接口)
|
||||
- [ ] 知识库 CRUD
|
||||
5. 运营功能
|
||||
- [x] 完整模块中间值呈现
|
||||
- [ ] 高级编排 DeBug 模式
|
||||
|
||||
`4` OpenAPI 接口
|
||||
- [x] completions 接口 (chat 模式对齐 GPT 接口)
|
||||
- [x] 知识库 CRUD
|
||||
- [x] 对话 CRUD
|
||||
|
||||
`5` 运营能力
|
||||
- [x] 免登录分享窗口
|
||||
- [x] Iframe 一键嵌入
|
||||
- [ ] 统一查阅对话记录
|
||||
- [x] 聊天窗口嵌入支持自定义 Icon,默认打开,拖拽等功能
|
||||
- [x] 统一查阅对话记录,并对数据进行标注
|
||||
|
||||
`6` 其他
|
||||
- [x] 可视化模型配置。
|
||||
- [x] 支持语音输入和输出 (可配置语音输入语音回答)
|
||||
- [x] 模糊输入提示
|
||||
- [x] 模板市场
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 👨💻 开发
|
||||
|
||||
项目技术栈: NextJs + TS + ChakraUI + Mongo + Postgres(Vector 插件)
|
||||
项目技术栈:NextJs + TS + ChakraUI + MongoDB + PostgreSQL (PG Vector 插件)/Milvus
|
||||
|
||||
- **⚡ 快速部署**
|
||||
|
||||
> Sealos 的服务器在国外,不需要额外处理网络问题,无需服务器、无需魔法、无需域名,支持高并发 & 动态伸缩。点击以下按钮即可一键部署 👇
|
||||
> 使用 [Sealos](https://sealos.io) 服务,无需采购服务器、无需域名,支持高并发 & 动态伸缩,并且数据库应用采用 kubeblocks 的数据库,在 IO 性能方面,远超于简单的 Docker 容器部署。
|
||||
|
||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
|
||||
[点击查看 Sealos 一键部署 FastGPT 教程](https://doc.tryfastgpt.ai/docs/development/sealos/)
|
||||
|
||||
由于需要部署数据库,部署完后需要等待 2~4 分钟才能正常访问。默认用了最低配置,首次访问时会有些慢。
|
||||
* [快速开始本地开发](https://doc.tryfastgpt.ai/docs/development/intro/)
|
||||
* [部署 FastGPT](https://doc.tryfastgpt.ai/docs/development/sealos/)
|
||||
* [系统配置文件说明](https://doc.tryfastgpt.ai/docs/development/configuration/)
|
||||
* [多模型配置方案](https://doc.tryfastgpt.ai/docs/development/modelconfig/one-api/)
|
||||
* [版本更新/升级介绍](https://doc.tryfastgpt.ai/docs/development/upgrading/)
|
||||
* [OpenAPI API 文档](https://doc.tryfastgpt.ai/docs/development/openapi/)
|
||||
* [知识库结构详解](https://doc.tryfastgpt.ai/docs/guide/knowledge_base/rag/)
|
||||
|
||||
* [快开始本地开发](https://doc.fastgpt.run/docs/development)
|
||||
* [部署 FastGPT](https://doc.fastgpt.run/docs/installation)
|
||||
* [系统配置文件说明](https://doc.fastgpt.run/docs/installation/reference)
|
||||
* [多模型配置](https://doc.fastgpt.run/docs/installation/reference/models)
|
||||
* [版本升级](https://doc.fastgpt.run/docs/installation/upgrading)
|
||||
* [API 文档](https://kjqvjse66l.feishu.cn/docx/DmLedTWtUoNGX8xui9ocdUEjnNh?pre_pathname=%2Fdrive%2Fhome%2F)
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 🏘️ 社区交流群
|
||||
|
||||
| 交流群 | 小助手 |
|
||||
| --------------------------------------------------- | ---------------------------------------------- |
|
||||
|  |  |
|
||||
扫码加入飞书话题群:
|
||||
|
||||
## 👀 其他
|
||||

|
||||
|
||||
- [FastGpt 常见问题](https://kjqvjse66l.feishu.cn/docx/HtrgdT0pkonP4kxGx8qcu6XDnGh)
|
||||
- [docker 部署教程视频](https://www.bilibili.com/video/BV1jo4y147fT/)
|
||||
- [公众号接入视频教程](https://www.bilibili.com/video/BV1xh4y1t7fy/)
|
||||
- [FastGpt 知识库演示](https://www.bilibili.com/video/BV1Wo4y1p7i1/)
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 🏘️ 加入我们
|
||||
|
||||
我们正在寻找志同道合的小伙伴,加速 FastGPT 的发展。你可以通过 [FastGPT 2025 招聘](https://fael3z0zfze.feishu.cn/wiki/P7FOwEmPziVcaYkvVaacnVX1nvg)了解 FastGPT 的招聘信息。
|
||||
|
||||
## 💪 相关项目
|
||||
|
||||
- [Laf: 3 分钟快速接入三方应用](https://github.com/labring/laf)
|
||||
- [Sealos: 快速部署集群应用](https://github.com/labring/sealos)
|
||||
- [One API: 多模型管理,支持 Azure、文心一言等](https://github.com/songquanpeng/one-api)
|
||||
- [TuShan: 5 分钟搭建后台管理系统](https://github.com/msgbyte/tushan)
|
||||
- [Laf:3 分钟快速接入三方应用](https://github.com/labring/laf)
|
||||
- [Sealos:快速部署集群应用](https://github.com/labring/sealos)
|
||||
- [One API:多模型管理,支持 Azure、文心一言等](https://github.com/songquanpeng/one-api)
|
||||
- [TuShan:5 分钟搭建后台管理系统](https://github.com/msgbyte/tushan)
|
||||
|
||||
## 🤝 第三方生态
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
- [luolinAI: 企微机器人,开箱即用](https://github.com/luolin-ai/FastGPT-Enterprise-WeChatbot)
|
||||
|
||||
## 🌿 第三方生态
|
||||
|
||||
- [COW 个人微信/企微机器人](https://doc.tryfastgpt.ai/docs/use-cases/external-integration/onwechat/)
|
||||
- [SiliconCloud (硅基流动) —— 开源模型在线体验平台](https://cloud.siliconflow.cn/i/TR9Ym0c4)
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 👀 其他
|
||||
|
||||
- [保姆级 FastGPT 教程](https://www.bilibili.com/video/BV1n34y1A7Bo/?spm_id_from=333.999.0.0)
|
||||
- [接入飞书](https://www.bilibili.com/video/BV1Su4y1r7R3/?spm_id_from=333.999.0.0)
|
||||
- [接入企微](https://www.bilibili.com/video/BV1Tp4y1n72T/?spm_id_from=333.999.0.0)
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 🤝 参与贡献
|
||||
|
||||
我们非常欢迎各种形式的贡献。如果你对贡献代码感兴趣,可以查看我们的 GitHub [Issues](https://github.com/labring/FastGPT/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc),大展身手,向我们展示你的奇思妙想。
|
||||
|
||||
<a href="https://github.com/labring/FastGPT/graphs/contributors" target="_blank">
|
||||
<table>
|
||||
<tr>
|
||||
<th colspan="2">
|
||||
<br><img src="https://contrib.rocks/image?repo=labring/FastGPT"><br><br>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=active&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=dark">
|
||||
<img alt="Active participants of labring - past 28 days" src="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=active&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=light">
|
||||
</picture>****
|
||||
</td>
|
||||
<td rowspan="2">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-participants-growth/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=4x7&color_scheme=dark">
|
||||
<img alt="New trends of labring" src="https://next.ossinsight.io/widgets/official/compose-org-participants-growth/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=4x7&color_scheme=light">
|
||||
</picture>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=dark">
|
||||
<img alt="New participants of labring - past 28 days" src="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=light">
|
||||
</picture>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</a>
|
||||
|
||||
## 🌟 Star History
|
||||
|
||||
[](https://star-history.com/#labring/FastGPT&Date)
|
||||
<a href="https://github.com/labring/FastGPT/stargazers" target="_blank" style="display: block" align="center">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date&theme=dark" />
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date" />
|
||||
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date" />
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
<a href="#readme">
|
||||
<img src="https://img.shields.io/badge/-返回顶部-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 使用协议
|
||||
|
||||
本仓库遵循 [FstGPT Open Source License](./LICENSE) 开源协议。
|
||||
本仓库遵循 [FastGPT Open Source License](./LICENSE) 开源协议。
|
||||
|
||||
1. 允许作为后台服务直接商用,但不允许直接使用 saas 服务商用。
|
||||
2. 需保留相关版权信息。
|
||||
3. 完整请查看 [FstGPT Open Source License](./LICENSE)
|
||||
4. 联系方式:yujinlong@sealos.io, [点击查看定价策略](https://fael3z0zfze.feishu.cn/docx/F155dbirfo8vDDx2WgWc6extnwf)
|
||||
1. 允许作为后台服务直接商用,但不允许提供 SaaS 服务。
|
||||
2. 未经商业授权,任何形式的商用服务均需保留相关版权信息。
|
||||
3. 完整请查看 [FastGPT Open Source License](./LICENSE)
|
||||
4. 联系方式:Dennis@sealos.io,[点击查看商业版定价策略](https://doc.tryfastgpt.ai/docs/shopping_cart/intro/)
|
||||
|
||||
225
README_en.md
@@ -1,103 +1,90 @@
|
||||
<div align="center">
|
||||
<a href="https://fastgpt.run/"><img src="/.github/imgs/logo.svg" width="120" height="120" alt="fastgpt logo"></a>
|
||||
|
||||
<a href="https://tryfastgpt.ai/"><img src="/.github/imgs/logo.svg" width="120" height="120" alt="fastgpt logo"></a>
|
||||
|
||||
# FastGPT
|
||||
|
||||
FastGPT is a knowledge-based question answering system based on the LLM language model, providing out-of-the-box capabilities for data processing, model invocation, and more. It also allows for complex question answering scenarios through visual workflow orchestration using Flow!
|
||||
|
||||
</div>
|
||||

|
||||
|
||||
<p align="center">
|
||||
<a href="https://fastgpt.run/">Online</a>
|
||||
·
|
||||
<a href="https://doc.fastgpt.run/docs/intro">Document</a>
|
||||
·
|
||||
<a href="https://doc.fastgpt.run/docs/development">Development</a>
|
||||
·
|
||||
<a href="https://doc.fastgpt.run/docs/installation">Deploy</a>
|
||||
·
|
||||
<a href="#powered-by">Power By</a>
|
||||
<a href="./README_en.md">English</a> |
|
||||
<a href="./README.md">简体中文</a> |
|
||||
<a href="./README_ja.md">日语</a>
|
||||
</p>
|
||||
|
||||
## 🛸 Online
|
||||
FastGPT is a knowledge-based platform built on the LLMs, offers a comprehensive suite of out-of-the-box capabilities such as data processing, RAG retrieval, and visual AI workflow orchestration, letting you easily develop and deploy complex question-answering systems without the need for extensive setup or configuration.
|
||||
|
||||
[](https://github.com/labring/FastGPT/stargazers)
|
||||
[](https://github.com/labring/FastGPT/pulls)
|
||||
[](https://github.com/labring/FastGPT/pulls)
|
||||
[](https://github.com/labring/FastGPT/blob/main/LICENSE)
|
||||
[](https://doc.tryfastgpt.ai/docs/intro)
|
||||
[](https://doc.tryfastgpt.ai/docs/intro)
|
||||
[](https://tryfastgpt.ai/)
|
||||
|
||||
[](https://discord.gg/mp68xkZn2Q)
|
||||
[](https://oss.laf.run/otnvvf-imgs/feishu3.png)
|
||||
|
||||
</div>
|
||||
|
||||
## 🎥 Comprehensive Feature Demonstration
|
||||
|
||||
https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409bd33f6d4
|
||||
|
||||
## 🛸 Online Use
|
||||
|
||||
Website: [tryfastgpt.ai](https://tryfastgpt.ai/)
|
||||
|
||||
[fastgpt.run](https://fastgpt.run/)
|
||||
| | |
|
||||
| ---------------------------------- | ---------------------------------- |
|
||||
| Conversational AI Setup | Workflow Automation |
|
||||
|  |  |
|
||||
| Knowledge Base Setup | Integration Process |
|
||||
|  |  |
|
||||
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 💡 Features
|
||||
|
||||
1. Powerful visual orchestration for easy AI application building
|
||||
| **Features** | **Details** |
|
||||
|--------------------------------------------|---------------------------------------------------|
|
||||
| **Application Orchestration Features** | ✅ Offers a straightforward mode, eliminating the need for complex orchestration <br> ✅ Provides clear next-step instructions in dialogues <br> ✅ Facilitates workflow orchestration <br> ✅ Tracks references in source files <br> ✅ Encapsulates modules for enhanced reuse at multiple levels <br> ✅ Combines search and reordering functions <br> 🔜 Includes a tool module <br> 🔜 Integrates [Laf](https://github.com/labring/laf) for online HTTP module creation <br> 🔜 Plugin encapsulation capabilities |
|
||||
| **Knowledge Base Features** | ✅ Allows for the mixed use of multiple databases <br> ✅ Keeps track of modifications and deletions in data chunks <br> ✅ Enables specific vector models for each knowledge base <br> ✅ Stores original source files <br> ✅ Supports direct input and segment-based QA import <br> ✅ Compatible with a variety of file formats: pdf, docx, txt, html, md, csv <br> ✅ Facilitates URL reading and bulk CSV importing <br> 🔜 Supports PPT and Excel file import <br> 🔜 Features a file reader <br> 🔜 Offers diverse data preprocessing options |
|
||||
| **Application Debugging Features** | ✅ Enables targeted search testing within the knowledge base <br> ✅ Allows feedback, editing, and deletion during conversations <br> ✅ Presents the full context of interactions <br> ✅ Displays all intermediate values within modules <br> 🔜 Advanced Debug mode for orchestration |
|
||||
| **OpenAPI Interface** | ✅ The completions interface (aligned with GPT's chat mode interface) <br> ✅ CRUD operations for the knowledge base <br> 🔜 CRUD operations for conversation |
|
||||
| **Operational Features** | ✅ Share without requiring login <br> ✅ Easy embedding with Iframe <br> ✅ Customizable chat window embedding with features like default open, drag-and-drop <br> ✅ Centralizes conversation records for review and annotation |
|
||||
|
||||
- [x] Provides a simple mode without the need for orchestration operations
|
||||
- [x] User dialogue pre-guidance
|
||||
- [x] Global variables
|
||||
- [x] Knowledge base search
|
||||
- [x] Multi-LLM model dialogue
|
||||
- [x] Extraction of text content into structured data
|
||||
- [x] HTTP extension
|
||||
- [ ] Sandbox JS runtime module
|
||||
- [ ] Continuous dialogue guidance
|
||||
- [ ] Dialogue multi-path selection
|
||||
- [ ] Source file reference tracking
|
||||
|
||||
2. Rich knowledge base preprocessing
|
||||
|
||||
- [x] Multiple library reuse and mixing
|
||||
- [x] Chunk record modification and deletion
|
||||
- [x] Supports direct segment import
|
||||
- [x] Supports QA split import
|
||||
- [x] Supports manual input content
|
||||
- [ ] Supports URL import reading
|
||||
- [x] Supports batch import of Q&A pairs in CSV format
|
||||
- [ ] Supports separate vector model settings for knowledge bases
|
||||
- [ ] Source file storage
|
||||
|
||||
3. Multiple effect testing channels
|
||||
|
||||
- [x] Knowledge base single point search testing
|
||||
- [x] Feedback references and ability to modify and delete during dialogue
|
||||
- [x] Complete context presentation
|
||||
- [ ] Complete module intermediate value presentation
|
||||
|
||||
4. OpenAPI
|
||||
|
||||
- [x] completions interface (aligned with GPT interface)
|
||||
- [ ] Knowledge base CRUD
|
||||
|
||||
5. Operational functions
|
||||
|
||||
- [x] Login-free sharing window
|
||||
- [x] One-click embedding with Iframe
|
||||
- [ ] Unified access to dialogue records
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 👨💻 Development
|
||||
|
||||
Project tech stack: NextJs + TS + ChakraUI + Mongo + Postgres (Vector plugin)
|
||||
Project tech stack: NextJs + TS + ChakraUI + MongoDB + PostgreSQL (PG Vector plug-in)/Milvus
|
||||
|
||||
- [Getting Started with Local Development](https://doc.fastgpt.run/docs/development)
|
||||
- [Deploying FastGPT](https://doc.fastgpt.run/docs/installation)
|
||||
- [System Configuration File Explanation](https://doc.fastgpt.run/docs/installation/reference)
|
||||
- [Multi-model Configuration](https://doc.fastgpt.run/docs/installation/reference/models)
|
||||
- [V3 Upgrade V4 Initialization](https://doc.fastgpt.run/docs/installation/upgrading)
|
||||
- **⚡ Fast Deployment**
|
||||
|
||||
<!-- ## :point_right: RoadMap
|
||||
- [FastGpt RoadMap](https://kjqvjse66l.feishu.cn/docx/RVUxdqE2WolDYyxEKATcM0XXnte) -->
|
||||
> When using [Sealos](https://sealos.io) services, there is no need to purchase servers or domain names. It supports high concurrency and dynamic scaling, and the database application uses the kubeblocks database, which far exceeds the simple Docker container deployment in terms of IO performance.
|
||||
<div align="center">
|
||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
|
||||
</div>
|
||||
|
||||
<!-- ## 🏘️ Community
|
||||
Give it a 2-4 minute wait after deployment as it sets up the database. Initially, it might be a too slow since we're using the basic settings.
|
||||
|
||||
| Community Group | Assistant |
|
||||
| ------------------------------------------------- | ---------------------------------------------- |
|
||||
|  |  | -->
|
||||
[sealos one click deployment tutorial](https://doc.tryfastgpt.ai/docs/development/sealos/)
|
||||
|
||||
## 👀 Others
|
||||
- [Getting Started with Local Development](https://doc.tryfastgpt.ai/docs/development)
|
||||
- [Deploying FastGPT](https://doc.tryfastgpt.ai/docs/installation)
|
||||
- [Guide on System Configs](https://doc.tryfastgpt.ai/docs/installation/reference)
|
||||
- [Configuring Multiple Models](https://doc.tryfastgpt.ai/docs/installation/reference/models)
|
||||
- [Version Updates & Upgrades](https://doc.tryfastgpt.ai/docs/installation/upgrading)
|
||||
|
||||
- [FastGpt FAQ](https://kjqvjse66l.feishu.cn/docx/HtrgdT0pkonP4kxGx8qcu6XDnGh)
|
||||
- [Docker Deployment Tutorial Video](https://www.bilibili.com/video/BV1jo4y147fT/)
|
||||
- [Official Account Integration Video Tutorial](https://www.bilibili.com/video/BV1xh4y1t7fy/)
|
||||
- [FastGpt Knowledge Base Demo](https://www.bilibili.com/video/BV1Wo4y1p7i1/)
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 💪 Related Projects
|
||||
|
||||
@@ -106,10 +93,100 @@ Project tech stack: NextJs + TS + ChakraUI + Mongo + Postgres (Vector plugin)
|
||||
- [One API: Multi-model management, supports Azure, Wenxin Yiyuan, etc.](https://github.com/songquanpeng/one-api)
|
||||
- [TuShan: Build a backend management system in 5 minutes](https://github.com/msgbyte/tushan)
|
||||
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 🤝 Third-party Ecosystem
|
||||
|
||||
- [luolinAI: Enterprise WeChat bot, ready to use](https://github.com/luolin-ai/FastGPT-Enterprise-WeChatbot)
|
||||
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
|
||||
## 🏘️ Community & Support
|
||||
|
||||
+ 🌐 Visit the [FastGPT website](https://tryfastgpt.ai/) for full documentation and useful links.
|
||||
+ 💬 Join our [Discord server](https://discord.gg/mp68xkZn2Q) is to chat with FastGPT developers and other FastGPT users. This is a good place to learn about FastGPT, ask questions, and share your experiences.
|
||||
+ 🐞 Create [GitHub Issues](https://github.com/labring/FastGPT/issues/new/choose) for bug reports and feature requests.
|
||||
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 👀 Others
|
||||
|
||||
- [FastGPT FAQ](https://kjqvjse66l.feishu.cn/docx/HtrgdT0pkonP4kxGx8qcu6XDnGh)
|
||||
- [Docker Deployment Tutorial Video](https://www.bilibili.com/video/BV1jo4y147fT/)
|
||||
- [Official Account Integration Video Tutorial](https://www.bilibili.com/video/BV1xh4y1t7fy/)
|
||||
- [FastGPT Knowledge Base Demo](https://www.bilibili.com/video/BV1Wo4y1p7i1/)
|
||||
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 🌱 Contributors
|
||||
|
||||
We welcome all forms of contributions. If you are interested in contributing code, you can check out our GitHub [Issues](https://github.com/labring/FastGPT/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) to show us your ideas.
|
||||
|
||||
<a href="https://github.com/labring/FastGPT/graphs/contributors" target="_blank">
|
||||
<table>
|
||||
<tr>
|
||||
<th colspan="2">
|
||||
<br><img src="https://contrib.rocks/image?repo=labring/FastGPT"><br><br>
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=active&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=dark">
|
||||
<img alt="Active participants of labring - past 28 days" src="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=active&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=light">
|
||||
</picture>
|
||||
</td>
|
||||
<td rowspan="2">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-participants-growth/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=4x7&color_scheme=dark">
|
||||
<img alt="New trends of labring" src="https://next.ossinsight.io/widgets/official/compose-org-participants-growth/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=4x7&color_scheme=light">
|
||||
</picture>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=dark">
|
||||
<img alt="New participants of labring - past 28 days" src="https://next.ossinsight.io/widgets/official/compose-org-active-contributors/thumbnail.png?activity=new&period=past_28_days&owner_id=102226726&repo_ids=605673387&image_size=2x3&color_scheme=light">
|
||||
</picture>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</a>
|
||||
|
||||
|
||||
## 🌟 Star History
|
||||
|
||||
[](https://star-history.com/#labring/FastGPT&Date)
|
||||
<a href="https://github.com/labring/FastGPT/stargazers" target="_blank" style="display: block" align="center">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date&theme=dark" />
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date" />
|
||||
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=labring/FastGPT&type=Date" />
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
|
||||
## 📄 Usage Agreement
|
||||
|
||||
This repository complies with the [FastGPT Open Source License](./LICENSE) open source agreement.
|
||||
|
||||
1. Direct commercial use as a backend service is allowed, but provision of SaaS services is not allowed.
|
||||
2. Without commercial authorization, any form of commercial service must retain relevant copyright information.
|
||||
3. For full details, please see [FastGPT Open Source License](./LICENSE)
|
||||
4. Contact: Dennis@sealos.io , [click to view commercial version pricing strategy](https://doc.tryfastgpt.ai/docs/commercial)
|
||||
|
||||
<a href="#FastGPT">
|
||||
<img src="https://img.shields.io/badge/-Back_to_Top-7d09f1.svg" alt="#" align="right">
|
||||
</a>
|
||||
136
README_ja.md
Normal file
@@ -0,0 +1,136 @@
|
||||
<div align="center">
|
||||
|
||||
<a href="https://tryfastgpt.ai/"><img src="/.github/imgs/logo.svg" width="120" height="120" alt="fastgpt logo"></a>
|
||||
|
||||
# FastGPT
|
||||
|
||||
<p align="center">
|
||||
<a href="./README_en.md">English</a> |
|
||||
<a href="./README.md">简体中文</a> |
|
||||
<a href="./README_ja.md">日语</a>
|
||||
</p>
|
||||
|
||||
FastGPT は、LLM 上 に 構築 された 知識 ベースの Q&A システムで、すぐに 使 えるデータ 処理 とモデル 呼 び 出 し 機能 を 提供 し、Flow の 可視化 を 通 じてワークフローのオーケストレーションを 可能 にします!
|
||||
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://tryfastgpt.ai/">
|
||||
<img height="21" src="https://img.shields.io/badge/在线使用-d4eaf7?style=flat-square&logo=spoj&logoColor=7d09f1" alt="cloud">
|
||||
</a>
|
||||
<a href="https://doc.tryfastgpt.ai/docs/intro">
|
||||
<img height="21" src="https://img.shields.io/badge/相关文档-7d09f1?style=flat-square" alt="document">
|
||||
</a>
|
||||
<a href="https://doc.tryfastgpt.ai/docs/development">
|
||||
<img height="21" src="https://img.shields.io/badge/本地开发-%23d4eaf7?style=flat-square&logo=xcode&logoColor=7d09f1" alt="development">
|
||||
</a>
|
||||
<a href="/#-%E7%9B%B8%E5%85%B3%E9%A1%B9%E7%9B%AE">
|
||||
<img height="21" src="https://img.shields.io/badge/相关项目-7d09f1?style=flat-square" alt="project">
|
||||
</a>
|
||||
<a href="https://github.com/labring/FastGPT/blob/main/LICENSE">
|
||||
<img height="21" src="https://img.shields.io/badge/License-Apache--2.0-ffffff?style=flat-square&labelColor=d4eaf7&color=7d09f1" alt="license">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
https://github.com/labring/FastGPT/assets/15308462/7d3a38df-eb0e-4388-9250-2409bd33f6d4
|
||||
|
||||
## 🛸 クラウドサービスの 利用
|
||||
|
||||
[tryfastgpt.ai](https://tryfastgpt.ai/)
|
||||
|
||||
| | |
|
||||
| ---------------------------------- | ---------------------------------- |
|
||||
|  |  |
|
||||
|  |  |
|
||||
|
||||
## 💡 機能
|
||||
|
||||
1. パワフルなビジュアルワークフロー:AI アプリケーションを 簡単 に 作成
|
||||
|
||||
- [x] デッキのシンプルモード - マニュアルアレンジ 不要
|
||||
- [x] ユーザ 対話事前 ガイダンス
|
||||
- [x] グローバル 変数
|
||||
- [x] ナレッジベース 検索
|
||||
- [x] 複数 の LLM モデルによる 対話
|
||||
- [x] テキストマジック - 構造化 データへの 変換
|
||||
- [x] HTTP による 拡張
|
||||
- [ ] on-the-fly HTTP モジュールのための 埋 め 込 みLaf
|
||||
- [x] 次 の 対話 ステップへの 指示
|
||||
- [x] ソースファイル 参照 の 追跡
|
||||
- [ ] カスタムファイルリーダー
|
||||
- [ ] モジュールをプラグインにパッケージして 再利用 する
|
||||
|
||||
2. 広範 なナレッジベースの 前処理
|
||||
|
||||
- [x] 複数 のナレッジベースの 再利用 と 混合
|
||||
- [x] チャンクの 変更 と 削除 を 追跡
|
||||
- [x] 手動入力、直接分割、QA 分割 インポートをサポート
|
||||
- [x] URL フェッチとバッチ CSV インポートをサポート
|
||||
- [x] ナレッジベースにユニークなベクトルモデルを 設定可能
|
||||
- [x] オリジナルファイルの 保存
|
||||
- [ ] ファイル 学習 エージェント
|
||||
|
||||
3. 複数 の 効果測定 チャンネル
|
||||
|
||||
- [x] シングルポイントナレッジベース 検索 テスト
|
||||
- [x] 対話中 のフィードバック 参照 と 修正 ・ 削除機能
|
||||
- [x] 完全 なコンテキストの 提示
|
||||
- [ ] 完全 なモジュール 中間値提示
|
||||
|
||||
4. OpenAPI
|
||||
|
||||
- [x] 補完 インターフェイス (GPT インターフェイスに 合 わせる)
|
||||
- [ ] ナレッジベース CRUD
|
||||
|
||||
5. オペレーション 機能
|
||||
|
||||
- [x] ログイン 不要 の 共有 ウィンドウ
|
||||
- [x] Iframe によるワンクリック 埋 め 込 み
|
||||
- [ ] 対話記録 への 統一 されたアクセス
|
||||
|
||||
## 👨💻 開発
|
||||
|
||||
プロジェクトの 技術 スタック:NextJs + TS + ChakraUI + Mongo + Postgres (Vector プラグイン)
|
||||
|
||||
- **⚡ デプロイ**
|
||||
|
||||
[](https://cloud.sealos.io/?openapp=system-fastdeploy%3FtemplateName%3Dfastgpt)
|
||||
|
||||
デプロイ 後、データベースをセットアップするので、2~4分待 ってください。基本設定 を 使 っているので、最初 は 少 し 遅 いかもしれません。
|
||||
|
||||
- [ローカル 開発入門](https://doc.tryfastgpt.ai/docs/development)
|
||||
- [FastGPT のデプロイ](https://doc.tryfastgpt.ai/docs/installation)
|
||||
- [システム 設定 ガイド](https://doc.tryfastgpt.ai/docs/installation/reference)
|
||||
- [複数 モデルの 設定](https://doc.tryfastgpt.ai/docs/installation/reference/models)
|
||||
- [バージョン 更新 とアップグレード](https://doc.tryfastgpt.ai/docs/installation/upgrading)
|
||||
|
||||
<!-- ## :point_right: ロードマップ
|
||||
- [FastGPT ロードマップ](https://kjqvjse66l.feishu.cn/docx/RVUxdqE2WolDYyxEKATcM0XXnte) -->
|
||||
|
||||
<!-- ## 🏘️ コミュニティ
|
||||
|
||||
| コミュニティグループ | アシスタント |
|
||||
| ------------------------------------------------- | ---------------------------------------------- |
|
||||
|  |  | -->
|
||||
|
||||
## 👀 その 他
|
||||
|
||||
- [FastGPT FAQ](https://kjqvjse66l.feishu.cn/docx/HtrgdT0pkonP4kxGx8qcu6XDnGh)
|
||||
- [Docker 導入 チュートリアル 動画](https://www.bilibili.com/video/BV1jo4y147fT/)
|
||||
- [公式 アカウント 統合 ビデオチュートリアル](https://www.bilibili.com/video/BV1xh4y1t7fy/)
|
||||
- [FastGPT ナレッジベースデモ](https://www.bilibili.com/video/BV1Wo4y1p7i1/)
|
||||
|
||||
## 💪 関連 プロジェクト
|
||||
|
||||
- [Laf:サードパーティ 製 アプリケーションに 3 分 でクイックアクセス](https://github.com/labring/laf)
|
||||
- [Sealos:クラスタアプリケーションの 迅速 な 展開](https://github.com/labring/sealos)
|
||||
- [One API:マルチモデル 管理、Azure、Wenxin Yiyuan などをサポートします。](https://github.com/songquanpeng/one-api)
|
||||
- [TuShan:5 分 でバックエンド 管理 システムを 構築](https://github.com/msgbyte/tushan)
|
||||
|
||||
## 🤝 サードパーティエコシステム
|
||||
|
||||
- [luolinAI:すぐに 使 える 企業向 け WeChat ボット](https://github.com/luolin-ai/FastGPT-Enterprise-WeChatbot)
|
||||
|
||||
## 🌟 Star History
|
||||
|
||||
[](https://star-history.com/#labring/FastGPT&Date)
|
||||
BIN
bin/fastgpt-v1.0.0-helm.tgz
Normal file
@@ -1,21 +0,0 @@
|
||||
# 默认用户密码,用户名为 root,每次重启时会自动更新。
|
||||
DEFAULT_ROOT_PSW=123456
|
||||
# 代理
|
||||
# AXIOS_PROXY_HOST=127.0.0.1
|
||||
# AXIOS_PROXY_PORT=7890
|
||||
# 数据库最大连接数
|
||||
DB_MAX_LINK=5
|
||||
# token
|
||||
TOKEN_KEY=dfdasfdas
|
||||
# root key, 最高权限
|
||||
ROOT_KEY=fdafasd
|
||||
# openai 基本地址,可用作中转。
|
||||
OPENAI_BASE_URL=https://api.openai.com/v1
|
||||
# oneapi 地址,可以使用 oneapi 来实现多模型接入
|
||||
# ONEAPI_URL=https://xxxx.cloud.sealos.io/openai/v1
|
||||
# 通用key。可以是 openai 的也可以是 oneapi 的。
|
||||
# 此处逻辑:优先走 ONEAPI_URL,如果填写了 ONEAPI_URL,key 也需要是 ONEAPI 的 key
|
||||
CHAT_API_KEY=sk-xxxx
|
||||
# db
|
||||
MONGODB_URI=mongodb://username:password@0.0.0.0:27017/fastgpt
|
||||
PG_URL=postgresql://username:password@host:port/postgres
|
||||
32
client/.gitignore
vendored
@@ -1,32 +0,0 @@
|
||||
# dependencies
|
||||
node_modules/
|
||||
# next.js
|
||||
.next/
|
||||
out/
|
||||
# production
|
||||
build/
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
platform.json
|
||||
testApi/
|
||||
local/
|
||||
.husky/
|
||||
data/*.local.*
|
||||
@@ -1,65 +0,0 @@
|
||||
# Install dependencies only when needed
|
||||
FROM node:current-alpine AS deps
|
||||
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
||||
RUN apk add --no-cache libc6-compat && npm install -g pnpm
|
||||
WORKDIR /app
|
||||
|
||||
# Install dependencies based on the preferred package manager
|
||||
COPY package.json ./
|
||||
COPY pnpm-lock.yaml* ./
|
||||
RUN \
|
||||
[ -f pnpm-lock.yaml ] && pnpm fetch || \
|
||||
(echo "Lockfile not found." && exit 1)
|
||||
|
||||
# Rebuild the source code only when needed
|
||||
FROM node:current-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
COPY pnpm-lock.yaml* ./
|
||||
COPY package.json ./
|
||||
COPY . .
|
||||
|
||||
# Next.js collects completely anonymous telemetry data about general usage.
|
||||
# Learn more here: https://nextjs.org/telemetry
|
||||
# Uncomment the following line in case you want to disable telemetry during the build.
|
||||
ENV NEXT_TELEMETRY_DISABLED 1
|
||||
|
||||
RUN npm install -g pnpm
|
||||
RUN \
|
||||
[ -f pnpm-lock.yaml ] && (pnpm --offline install && pnpm run build) || \
|
||||
(echo "Lockfile not found." && exit 1)
|
||||
|
||||
# Production image, copy all the files and run next
|
||||
FROM node:current-alpine AS runner
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV production
|
||||
# Uncomment the following line in case you want to disable telemetry during runtime.
|
||||
ENV NEXT_TELEMETRY_DISABLED 1
|
||||
|
||||
RUN addgroup --system --gid 1001 nodejs
|
||||
RUN adduser --system --uid 1001 nextjs
|
||||
|
||||
RUN sed -i 's/https/http/' /etc/apk/repositories
|
||||
RUN apk add curl \
|
||||
&& apk add ca-certificates \
|
||||
&& update-ca-certificates
|
||||
|
||||
# You only need to copy next.config.js if you are NOT using the default configuration
|
||||
# COPY --from=builder /app/next.config.js ./
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder /app/package.json ./package.json
|
||||
# COPY --from=builder /app/.env* .
|
||||
|
||||
# Automatically leverage output traces to reduce image size
|
||||
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||
|
||||
USER nextjs
|
||||
|
||||
ENV PORT=3000
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
CMD ["node", "server.js"]
|
||||
@@ -1,63 +0,0 @@
|
||||
{
|
||||
"FeConfig": {
|
||||
"show_emptyChat": true,
|
||||
"show_register": false,
|
||||
"show_appStore": false,
|
||||
"show_userDetail": false,
|
||||
"show_git": true,
|
||||
"systemTitle": "FastGPT",
|
||||
"authorText": "Made by FastGPT Team.",
|
||||
"gitLoginKey": "",
|
||||
"scripts": []
|
||||
},
|
||||
"SystemParams": {
|
||||
"gitLoginSecret": "",
|
||||
"vectorMaxProcess": 15,
|
||||
"qaMaxProcess": 15,
|
||||
"pgIvfflatProbe": 20
|
||||
},
|
||||
"ChatModels": [
|
||||
{
|
||||
"model": "gpt-3.5-turbo",
|
||||
"name": "GPT35-4k",
|
||||
"contextMaxToken": 4000,
|
||||
"quoteMaxToken": 2000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
},
|
||||
{
|
||||
"model": "gpt-3.5-turbo-16k",
|
||||
"name": "GPT35-16k",
|
||||
"contextMaxToken": 16000,
|
||||
"quoteMaxToken": 8000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
},
|
||||
{
|
||||
"model": "gpt-4",
|
||||
"name": "GPT4-8k",
|
||||
"contextMaxToken": 8000,
|
||||
"quoteMaxToken": 4000,
|
||||
"maxTemperature": 1.2,
|
||||
"price": 0,
|
||||
"defaultSystem": ""
|
||||
}
|
||||
],
|
||||
"QAModels": [
|
||||
{
|
||||
"model": "gpt-3.5-turbo-16k",
|
||||
"name": "GPT35-16k",
|
||||
"maxToken": 16000,
|
||||
"price": 0
|
||||
}
|
||||
],
|
||||
"VectorModels": [
|
||||
{
|
||||
"model": "text-embedding-ada-002",
|
||||
"name": "Embedding-2",
|
||||
"price": 0
|
||||
}
|
||||
]
|
||||
}
|
||||
5
client/next-env.d.ts
vendored
@@ -1,5 +0,0 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/basic-features/typescript for more information.
|
||||
@@ -1,12 +0,0 @@
|
||||
//next-i18next.config.js
|
||||
/**
|
||||
* @type {import('next-i18next').UserConfig}
|
||||
*/
|
||||
|
||||
module.exports = {
|
||||
i18n: {
|
||||
defaultLocale: 'en',
|
||||
locales: ['en', 'zh', 'zh-Hans'],
|
||||
localeDetection: false
|
||||
}
|
||||
};
|
||||
@@ -1,40 +0,0 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const { i18n } = require('./next-i18next.config');
|
||||
|
||||
const nextConfig = {
|
||||
i18n,
|
||||
output: 'standalone',
|
||||
reactStrictMode: false,
|
||||
compress: true,
|
||||
|
||||
webpack(config, { isServer }) {
|
||||
if (!isServer) {
|
||||
config.resolve = {
|
||||
...config.resolve,
|
||||
fallback: {
|
||||
...config.resolve.fallback,
|
||||
fs: false
|
||||
}
|
||||
};
|
||||
}
|
||||
config.experiments = {
|
||||
asyncWebAssembly: true,
|
||||
layers: true
|
||||
};
|
||||
config.module = {
|
||||
...config.module,
|
||||
rules: config.module.rules.concat([
|
||||
{
|
||||
test: /\.svg$/i,
|
||||
issuer: /\.[jt]sx?$/,
|
||||
use: ['@svgr/webpack']
|
||||
}
|
||||
]),
|
||||
exprContextCritical: false
|
||||
};
|
||||
|
||||
return config;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = nextConfig;
|
||||
@@ -1,90 +0,0 @@
|
||||
{
|
||||
"name": "fastgpt",
|
||||
"version": "3.7",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@chakra-ui/icons": "^2.0.17",
|
||||
"@chakra-ui/react": "^2.7.0",
|
||||
"@chakra-ui/system": "^2.5.8",
|
||||
"@dqbd/tiktoken": "^1.0.7",
|
||||
"@emotion/react": "^11.10.6",
|
||||
"@emotion/styled": "^11.10.6",
|
||||
"@mozilla/readability": "^0.4.4",
|
||||
"@next/font": "13.1.6",
|
||||
"@tanstack/react-query": "^4.24.10",
|
||||
"@types/nprogress": "^0.2.0",
|
||||
"axios": "^1.3.3",
|
||||
"cookie": "^0.5.0",
|
||||
"crypto": "^1.0.1",
|
||||
"date-fns": "^2.30.0",
|
||||
"dayjs": "^1.11.7",
|
||||
"echarts": "^5.4.1",
|
||||
"formidable": "^2.1.1",
|
||||
"framer-motion": "^9.0.6",
|
||||
"hyperdown": "^2.4.29",
|
||||
"i18next": "^22.5.1",
|
||||
"immer": "^9.0.19",
|
||||
"js-cookie": "^3.0.5",
|
||||
"jsdom": "^22.1.0",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"lodash": "^4.17.21",
|
||||
"mammoth": "^1.5.1",
|
||||
"mermaid": "^10.2.3",
|
||||
"mongoose": "^6.10.0",
|
||||
"nanoid": "^4.0.1",
|
||||
"next": "13.1.6",
|
||||
"next-i18next": "^13.3.0",
|
||||
"nextjs-cors": "^2.1.2",
|
||||
"nprogress": "^0.2.0",
|
||||
"openai": "^3.3.0",
|
||||
"papaparse": "^5.4.1",
|
||||
"pg": "^8.10.0",
|
||||
"react": "18.2.0",
|
||||
"react-day-picker": "^8.7.1",
|
||||
"react-dom": "18.2.0",
|
||||
"react-hook-form": "^7.43.1",
|
||||
"react-i18next": "^12.3.1",
|
||||
"react-markdown": "^8.0.7",
|
||||
"react-syntax-highlighter": "^15.5.0",
|
||||
"reactflow": "^11.7.4",
|
||||
"rehype-katex": "^6.0.2",
|
||||
"remark-breaks": "^3.0.3",
|
||||
"remark-gfm": "^3.0.1",
|
||||
"remark-math": "^5.1.1",
|
||||
"request-ip": "^3.3.0",
|
||||
"sass": "^1.58.3",
|
||||
"tunnel": "^0.0.6",
|
||||
"winston": "^3.10.0",
|
||||
"winston-mongodb": "^5.1.1",
|
||||
"zustand": "^4.3.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@svgr/webpack": "^6.5.1",
|
||||
"@types/cookie": "^0.5.1",
|
||||
"@types/formidable": "^2.0.5",
|
||||
"@types/js-cookie": "^3.0.3",
|
||||
"@types/jsdom": "^21.1.1",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/lodash": "^4.14.191",
|
||||
"@types/node": "18.14.0",
|
||||
"@types/papaparse": "^5.3.7",
|
||||
"@types/pg": "^8.6.6",
|
||||
"@types/react": "18.0.28",
|
||||
"@types/react-dom": "18.0.11",
|
||||
"@types/react-syntax-highlighter": "^15.5.6",
|
||||
"@types/request-ip": "^0.0.37",
|
||||
"@types/tunnel": "^0.0.3",
|
||||
"eslint": "8.34.0",
|
||||
"eslint-config-next": "13.1.6",
|
||||
"typescript": "4.9.5"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
}
|
||||
}
|
||||
12275
client/pnpm-lock.yaml
generated
@@ -1,21 +0,0 @@
|
||||
### 常见问题
|
||||
|
||||
- [**Git 地址**,点击查看项目地址](https://github.com/labring/FastGPT)
|
||||
- [本地部署 FastGPT](https://doc.fastgpt.run/docs/installation)
|
||||
- [API 文档](https://kjqvjse66l.feishu.cn/docx/DmLedTWtUoNGX8xui9ocdUEjnNh?pre_pathname=%2Fdrive%2Fhome%2F)
|
||||
- **反馈问卷**: 如果你遇到任何使用问题或有期望的功能,可以[填写该问卷](https://www.wjx.cn/vm/rLIw1uD.aspx#)
|
||||
- **问题文档**: [先看文档,再提问](https://kjqvjse66l.feishu.cn/docx/HtrgdT0pkonP4kxGx8qcu6XDnGh)
|
||||
|
||||
**价格表**
|
||||
| 计费项 | 价格: 元/ 1K tokens(包含上下文)|
|
||||
| --- | --- |
|
||||
| 知识库 - 索引 | 0.002 |
|
||||
| FastAI4k - 对话 | 0.015 |
|
||||
| FastAI16k - 对话 | 0.03 |
|
||||
| FastAI-Plus - 对话 | 0.45 |
|
||||
| 文件拆分 | 0.03 |
|
||||
|
||||
**其他问题**
|
||||
| 交流群 | 小助手 |
|
||||
| ----------------------- | -------------------- |
|
||||
|  |  |
|
||||
@@ -1,8 +0,0 @@
|
||||
### Fast GPT V4.2
|
||||
|
||||
1. 新增 - 应用日志初版,可观测到所有对话记录
|
||||
2. 新增 - 好友邀请链接,[点击查看](/account?currentTab=promotion)
|
||||
3. 新增 - Iframe 嵌入页面图标可拖拽
|
||||
4. 优化 - 知识库搜索提示词
|
||||
5. 优化 - [使用文档](https://doc.fastgpt.run/docs/intro/)
|
||||
6. [点击查看高级编排介绍文档](https://doc.fastgpt.run/docs/workflow)
|
||||
|
Before Width: | Height: | Size: 17 KiB |
@@ -1,3 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1440" height="900" viewBox="0 0 1440 900" fill="none"><defs><path id="path_0"
|
||||
transform="translate(0 0) rotate(0 720 450)"
|
||||
d="M0,900L1440,900L1440,0L0,0L0,900Z" /><linearGradient id="linear_0" x1="45.776671171188354%" y1="3.4534157006028896%" x2="45.77667520943754%" y2="95.15074645348403%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#4D3AF9" stop-opacity="1" /><stop offset="0.4571722174852774" stop-color="#3B4DFE" stop-opacity="1" /><stop offset="1" stop-color="#1A68FF" stop-opacity="1" /></linearGradient><linearGradient id="linear_1" x1="50%" y1="2.535076530612245%" x2="51%" y2="100%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#4581FF" stop-opacity="1" /><stop offset="1" stop-color="#1C57FE" stop-opacity="1" /></linearGradient><linearGradient id="linear_2" x1="50%" y1="2.535076530612245%" x2="51%" y2="100%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#4581FF" stop-opacity="1" /><stop offset="1" stop-color="#1C57FE" stop-opacity="1" /></linearGradient><linearGradient id="linear_3" x1="50%" y1="0%" x2="51%" y2="100%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#29BFA8" stop-opacity="1" /><stop offset="1" stop-color="#34D1B6" stop-opacity="1" /></linearGradient><linearGradient id="linear_4" x1="50%" y1="2.535076530612245%" x2="51%" y2="100%" gradientUnits="objectBoundingBox"><stop offset="0" stop-color="#4581FF" stop-opacity="1" /><stop offset="1" stop-color="#1C57FE" stop-opacity="1" /></linearGradient></defs><g opacity="1" transform="translate(0 0) rotate(0 720 450)"><mask id="mask-0" fill="white"><use xlink:href="#path_0"></use></mask><g mask="url(#mask-0)"><path id="Mask" fill-rule="evenodd" fill="url(#linear_0)" transform="translate(0 0) rotate(0 720 450)" opacity="1" d="M0,900L1440,900L1440,0L0,0L0,900Z " /></g><g mask="url(#mask-0)"><path id="Oval" fill-rule="evenodd" fill="url(#linear_1)" transform="translate(51.66666666666667 412.5) rotate(0 37.5 37.5)" opacity="1" d="M75,37.5C75,16.79 58.21,0 37.5,0C16.79,0 0,16.79 0,37.5C0,58.21 16.79,75 37.5,75C58.21,75 75,58.21 75,37.5Z " /></g><g mask="url(#mask-0)"><path id="Oval Copy 2" fill-rule="evenodd" fill="url(#linear_2)" transform="translate(1049.166666666667 -3.333333333333333) rotate(0 30.833333333333336 30.833333333333336)" opacity="0.69" d="M61.67,30.83C61.67,13.81 47.86,0 30.83,0C13.81,0 0,13.81 0,30.83C0,47.86 13.81,61.67 30.83,61.67C47.86,61.67 61.67,47.86 61.67,30.83Z " /></g><g mask="url(#mask-0)"><g opacity="0.55" transform="translate(-64.16666666666667 547.4999999999999) rotate(0 50 226.5)"><path id="Rectangle 2" fill-rule="evenodd" style="fill:#5088FF" transform="translate(14.63769413070223 15.28431509376342) rotate(-45 35.20283757354478 34.876453649023716)" opacity="1" d="M8.17,61.88L70.41,69.75L47.22,22.97L0,0L8.17,61.88Z " /><path id="Rectangle 3" fill-rule="evenodd" fill="url(#linear_3)" transform="translate(0 50.20419426048581) rotate(0 26.487523940001577 201.14790286975716)" opacity="1" d="M0,402.3L51.51,402.3L52.98,23.25L0,0L0,402.3Z " /><path id="Rectangle 3 Copy" fill-rule="evenodd" fill="url(#linear_4)" transform="translate(48.48484848484848 50.20419426048581) rotate(0 25.75757575757576 201.14790286975716)" opacity="1" d="M0,402.3L51.52,402.3L51.52,0L0,21.68L0,402.3Z " /></g></g></g></svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
@@ -1,599 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="256px" height="256px" viewBox="0 0 256 256" enable-background="new 0 0 256 256" xml:space="preserve"> <image id="image0" width="256" height="256" x="0" y="0"
|
||||
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAYAAABccqhmAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
|
||||
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA
|
||||
CXBIWXMAAA7DAAAOwwHHb6hkAACAAElEQVR42uz9eZxlW1Lfh34j1t7nnJxqvHXrzmOP3GboBpoW
|
||||
IAksSwg0gWQag/jIICMQmp6EbRnZD/ftp8mynzVYlhCyZGHJ1kM0NgaMhEC4EUMzddNAD7f73r7z
|
||||
UHNl5XCmvfeKeH+stU+erCEzqzKzMqvu+X0+p4Yc9rD2XrFiRfziFzDDDDPMMMMMM8wwwwwzzDDD
|
||||
DDPMMMMMM8wwwwwzzDDDDDPMMMMMM8wwwwwz3PGQg76AGfYH7r5nz1ZE/KDvZ4b9wcwA3KG4aoIH
|
||||
dw9nzkhompVusdRZKiSckDoe7Te2oBoLEMGlC2BCIfnZB4JEMVF3w4kO0dxj0GCh0H5QPRdic7Eo
|
||||
qkFVVY2Z+aVLl+qnnnqqbk8+MxB3LmYG4JBjaqLrSy9RLi56KfMcqYfNg82wOmmhvNfxRwV9LHq8
|
||||
t1A9au5HBFkys0UX5lDUHRFBzJx28qc/ZOodcBA1BBPDRBmqs2ZmAxHpOz5UZM3hMy76WRG/SKwu
|
||||
H5lfetV9efnYsWOViNRAbI84Mw6HGzMDcIhw1aperqysLNR17/TIecKdp8R4yoyHED2Fy0mMpRjo
|
||||
CAQzggi4I9NPVWT6mNd73FfPT5l8zd2vN3ldwBEanEZNB4ifF/GLAudF+TQSP4fLGx3lZdXu+Xvu
|
||||
kQFg6XpmBuEwYWYADgjuLiLiedKru/cuDzle9UdPYvKOJsb3uMvbTYpHcE4gzLlLgasgkhZrEVyR
|
||||
dsJuWsz3DHa9a8//EjDx1oaIuCNujtXAUEUuYPUrQfgVDeE3CpEXO53Oy8eOsQbYzBgcPGYG4IDw
|
||||
4Q978Z63rh5d7Xa+UFy+omnsS915Atf7BVlwlxJETAEEEblqfu/00dkOf+5Wce11uLfegyMOghvu
|
||||
IxG/4Bqfc/yXQgi/3OnwbL3WPffwwzKaGYODwcwA3Ca4u549e3ZO9dj9IF/QVP7lLvKVdfC3gi65
|
||||
e4Er7oJImDwXUQecdn5c65XrlueVXRqAm52VIkK6RCFNfQV3kjWICI6qN+a+6uYvd9R+U8x/MfTk
|
||||
U3TtpfsWF5dzHGGG24CZAdhHuLu6+9wbK/XbLNpXxobfh8k73fU0rnOCqEmkXds3lvjpx3KnL4zX
|
||||
uxfHrDUTYriPRf2S07wSSvkNtebfd492fvtUt/uqiIwO+g7uZswMwD7A3cvlZe4fVeu/ayz6h6LF
|
||||
9+FyWqXouAkiAVLMDmS/XfTDjRQCcXc3ICJqBraO+ssKP1tK8aNd7f3WyZOyLvImH6x9wMwA7BHc
|
||||
Xc7DApeHX9A08jVNzdcavN3EF1FEkque/xZmQ9+i3cKkue1ERMTdDNyiuFwAPtIt/ceI/Pzlyy+c
|
||||
eeqpp+pZzGBvMHsLdwF3l5/7uZ8Ln//e9943Htjvahr5ejP9CkfvwUPhIIiLarsvts2RegFcb/Hs
|
||||
dyMU8DxWOeZh7iKYeBxI8M+6Nf+mUPvJzn1HPvUPn2bw9NP4zBjcOmYG4Bbg7vLSS3S7S2tPGMU3
|
||||
xib+kabhraLlvLuIS0BEBQSd7Htt89/tO+vhoG/nEEETy2AKJinwKZiLRxf1xqy+UAT55bKjP9bt
|
||||
8e9PzM2dnQUObw0zA3CTOOe+KMv1u0d18w1NY39QRB5zl8IloDl6b5JXdZ82AJAmf0u0mcqlz5Bx
|
||||
rTdkQjIK4qgn42nWuIgbbgOwTxWF/GhZlD9534nOcyJSHfRd3EmYvX07xLlz5xabcund9ZhvcdOv
|
||||
MdEHcS0FR7Nfb+6ISnppARB027TdLK51LTbGzKSNlzjq4OaoCO6OO+6K43EoYs+J2o/0Sv+x+04s
|
||||
PjszBDvDzABsAzObO788+qKqab7JjD/gdB6pTUsIBFUp8mLu4oiAYYBNjIBO3mW96u926OMOr+Ru
|
||||
hXLt9ghaI2B5nNI4KkrIW4L0g7WAWXSh8SBxqNI8WwT/P0MIP3rpzOJz73rXzBBshZkBuAHcvTh7
|
||||
uXpHE/VPx+hf6+4PRfNSVSf7+/yTTPPnZ9hLtGN7I0w/AzA3x8xVZaQqz6nov1rqhn919Cgvi8ib
|
||||
3dJeFzMDcBXcPSwvDx8aNvHr69r+JDr3DnMpAWR/yPYz7DFyEZMLPiys+o3Q03+y2Jn710tLXJpl
|
||||
DDZj9kJnuLssLy8fGTa9r2sa/85ofLEji6JFXvFbmuvs/TnMmH5GZuaCmdOsFfCznU74h/fd0/vI
|
||||
jF24gZkBAM6csYWiGH9pv6q/zQl/0AnH3YO4ImG26N+xcITouUrR6hjE3nBr/uXRo73/7cRi59lZ
|
||||
6vBNbgDcPays+OOj0fhPjevmG53wsEkIaBAk4IBizPb3dyZchJhTsmIRMTNoKrHmmblu5wfVmx++
|
||||
996Fc2/mbcGb1gCY2dz5S/Frxk38i27+XjN6yd0XYZK9l8zVf9O+H3c82jSiuCTulUc3q13F10OQ
|
||||
f6sd/zsPnpj76JvVG3jTGQB3l4sDv3+4Ov4z0cO3N+73iahojvC1a0GbZrI37+JwV2BSDu0F01kD
|
||||
88Yh1iJ8NgT7R515+z9OLy6ef7N5A28qA/DKKzZXzvXfVzX85411/gM37VpQQlAhCVegZsgk+5xY
|
||||
fW+qN+IugmTlMvGAE8B1wjQWcWJsHMFE4xWofm5+rvOP7z3a+/k3U5DwTWEA3F0GA79/ea36jjrK
|
||||
nzTkYRdEVERoXcTN+fzNGeYZ7lRI5hJsfqow4Q5IxA0LeCPoC6XEf7g43/2XR47I5TeDN3DXGwB3
|
||||
Ly9dWnn3sJK/FK38uujlEkFAETB0Vo33JoZjaqnWIOLi7kHsfJD4oe5i8Q/vWeo+e7drENzVBsDd
|
||||
e2cuDf5gUzf/pXjnCxsrCkQFTbrXMwPwZodjGsE1vQcmYNEKtaF59fNlh791+dTSL7/rLq4ruCsN
|
||||
gLvL+vr6qcHI/sS47vx5cx7CCxEN4gguTuLrzwzAmxvJA1ATQFOswA3MXDTWQeyzIvXf6RZLP3Lq
|
||||
lK4d9NXuB+46A+Ducm5l9Hhd1d9njXxDtPKISDHh7ychumQA0mdmAN688JTmTcrsJCOQpkRiEUYT
|
||||
HZ8Lhf1vi2Xn+48d6718t8UF7ioD4O7FpdX6i9f64+9TCf9hE6UjWorI1ZN8uh5/hjc1xPKroFxd
|
||||
qenuuI0sBB/gzc/0lnpPn17sfPJuigvcNQbgox/18pHHx7+3P27+azx8aWNSEIKobtyizub8DNdg
|
||||
ei6njNCGBgGYRYjRykDlNL8w39UP3nti7tfuFuLQXWEA3L3z+oX1P1LX8a8i5VuMUl2KlOKThunV
|
||||
XifWvv37rjHmM9wyNt4Bm3RNzJ+kOIJ6dJW6EppPdUr9+xr7P3L69On1g77y3eKONwBXrtiJ9dq+
|
||||
eTSu/7IID4vIVfX6d/wtznCg2NApNI8Otak2bxQ9/du9Zu6f3unBweKgL2A3WHe/79L55s82dfOd
|
||||
InIqTf62fG+muTfDXsAgbwlUVKAIZvHBatT8l3QGXTP7flVdPeirvFXckbPD3aXf9/uWr6z9xVq7
|
||||
/6mInogxUhSF3GzrrBlm2BqtkOsUN1SMGGsLQS72JPztMnS+/5577kwjcEd6AOvu915ZH/2VKOW3
|
||||
unPM3W4w+WeYYZdIcq9TcuWKEBBEPfo9lev3OE085/6PTovccTGBO84DOHt27XQt3b/RmH+zR++h
|
||||
so1U18wDmGE3uF7KOKcMHSyaidr5Upv/8ch8/Y+PHDlyR9UQ3FGzY23N7q0o/9uqjt9qLj2KUmY6
|
||||
fTPsL1p+wPVeM0EKVcPuraL9xeVB8T3r636vu98x7+QdsQVwdznf75++sjr6q9HDtyBaipbiYpm5
|
||||
dccY3BnuKMhG6zZJzUsRh3arKY5plRo+xvIkJn9qZa0a13X37wErB331O8Ed4QH0+35fvc5/Hd2/
|
||||
FaTUUIjhIMKdY2tnuPOxORjoYqCWCo61CE440UT5s/3x8LvNbOGgr3and3Sosbpqp65U8Xuaqv7T
|
||||
bnJUQyGtS5Y6Rs2IPDPsJ7ZShkiSIzLRkTDcGkP8Qqcb/vvyRPkDhz0weKg9gFfM5q6M7dvqqv4O
|
||||
0XCUqTZRsCHfNcMM+4et6kY8bUF9008rIqfG4/o/H18cf9dh9wQOrQH48Ie9CJdG31CNx98DcjI2
|
||||
RghhymNpq/lmmOGAkVciESiKAkBV5FRdVX/p7OXBf2Rm3YO+xBvhUBoAdy/f+s7B11V18zdVw2lc
|
||||
KYqQ8/yzST/DIcLEDTXcIcaIqhJNgmp5uqrsz5y5OHqv++EUnjh0F+Xuema5/vI6xv8PFA+Dohpk
|
||||
8/gZMw9ghsOBze+hiOAGQQPuEszDF1WNfd/Zy9XnHUYjcKguyN3lwur4yfFo9N+4lE+ZB0Sm3f6p
|
||||
yxWfBQFmOAQwrl2QstCsBHEpSyH8zqqq/uqF1fFbDhtH4NAYgKTcO7h/OKz+ChS/0z0ECZ1c1XfV
|
||||
Zc4m/gyHGhvlxC6FNFG6SPEfVlXz3cDRg766aRwmA7C0OrDv8sgfdZfCRWVn1P6ZMZjhMGF6Sgm4
|
||||
IEUhMcp8XcU/fvb8+h9/9tlnD01Q8FAYgE+6d85f6v/haqzfad494hSIksU8rt7rK3jInxtRNGeY
|
||||
4XZBr/pMwxE1EEWko+69k1UT/vzC0Qd+92GJBxz4Rbi7nlpee++4qv8zF71XJKAarqrpvxFmk3+G
|
||||
w44NXQrVUp3wRGzsey+ujt960FcGh8AADIf+YDXiL4vMvcspJKn5zDDD3YKrgoMeCpXO+4aD+i9e
|
||||
uWInDvrqDtQAnDljC8tr9XfVMfyeaEUQKSZSXjMBzxnuFqizEbhWldq01zTFN66Pm28+6HjAgRkA
|
||||
dw/SG/6+cfT/FOnMkVf+6Xk/MwIz3OlI73B6kVNDmpQeRPR4bf5nFu+5730HmRo8MANweb16x2hg
|
||||
3+uup10FNHfskWnu9YHvUGaYYQ+w0YjGJeLqoKru/tamDn/mQt/vO6grO5AZdvGiHVlfi9+FdN6d
|
||||
m7JI26svfWZL/wx3GzbebxPD1TEoYpSvGawNvvWg6gVuuwFwdx1Z/bVm4ZujF4WKyPTAXJPy22eI
|
||||
a/qQPps04fcky+Dc3k5EzvXPeaOv387rmcbejO/G82vLcq9+dsLeP9ObQSso4llAxCf/VlVxC0tm
|
||||
fMfrl8ZffhBbgduuCHR+xZ+I0f6LiJ5Mw6PcmPGzv1x/QVBLr43JxtdS/8D2p3YxYcSJodloPeUy
|
||||
iWtsVJnvzsilbWUaJxfP92G5alpQ6+Sf2dwgZcJU2+WEEOTGw3Pd+08TdtJ+S27d49v8/NLxRMA3
|
||||
ScJf7/6ySy626/HfGXRyi+qbn4Gpqpg/Tu1/od/3zwBnbsMFTXBbDcCzZt14of52M75ARCGIcIBK
|
||||
vo4Ry1H+d2ZtITian1cmHe1ikmhsH75MJqrsZSGTxPYfuc21AGV7gxhtYqXYfBverpe72XIJEd1y
|
||||
eDROTzBnQ8/Bp752a0jPb5j/nQ2AKy5ZqMMFtbAxPtccQA+ASnLVCVXAtHBrfvdaf/zH3P0Hbmfb
|
||||
sdtmANxdLl+uv2S1rv64URQa2qX24OACUdsJkNpDJ40xSdsBB9dbbw0vCNKUkwyQqzKZBKIp6Lmr
|
||||
MfCNyLKT9RHDRhxVwIqIE9MXxCf3l5ZK3WVZhYNWN3YApu9fwGVj8vukv+atr8Abzy8dJ3kWuctv
|
||||
voJkINvzysb9T857sBWlAoiKxMhRjfanlperX3D3375dysK30wDcsz4e/RkoHlIJuOeGKwdoBcQV
|
||||
jQuTFVpyyqbdTQK4hKts9oZ76RvrznW/D6A4Ij5xS72dhB7Y/SooQAGejp7GM06+JYCaA4Hruf+S
|
||||
72E3z0A9t86aCDVt3L/gqDR54m8M08S72iU2nl++n6ntVd5gZAM5lV2SVuhzOiZwcO+g4pg7qqVG
|
||||
b96x1h9/x/hY+b1A/3ac/7YYAHcPZy+N/jBW/AEIKqJ5LTj4en5t8kQVTwsEltxiSQIPah1u5Cdu
|
||||
7z06rhUSHLeYdzsBpEwuuAmuuxkDwVwnRgYBswpRS0bHhWBzMLVPd3ckj757tkM3O2YqmCXvRS0F
|
||||
4JJBv9qpcywMQRx3zS53+ts9aTpq/rlbf346eRaiZGMYQWpEwKyDqOCevKBNi067IzlAuBuiuceA
|
||||
aYmGP8aV6qfd/SdvRxvy22IAlpeHDza1/0mjWBICG115jYPM9QuOSJNfAsc8IkEwiWllFEG8nno/
|
||||
rycQOb2CXP39tEf2aIQQwC276nu34gSgtvblNySUmDPJqBSh3vBSPL1wSd46oqGApuRmZ0GMhqqm
|
||||
IB8RkbTeR7erfCGhJiCiySkXRwjpd91Jtu/W33HBCUWNtwbFPccaI6hjJCOIJMPjNFMBwoSDZpoI
|
||||
KRDporiKuNm9dWXffXHgHwPe2O/z77sB+KR7Z3B+9ZvqGN4trsJE108O2PnKC0CA6Gl/6tLBEKKl
|
||||
0JhoWjFvFTmSADhmEDR5F4ojNBsZh13cgREpSqVu0lHFhMbBCIhC5UnHXvIERAKoUBSKRaMjN8e4
|
||||
dHdUNK2uOJUE6iY/1ux1bP55sBqCQKFQBKiqhhCcIL6ris601nua7C40MY1BtLzFVOh4jr3qQaQA
|
||||
dw5r4zIUIdbjr4hrwz/k7v9EZBLl3RfsuwE4Pag/f63x/0Qk9ET3s9Dn2j3uZF842YN72o/mSkx3
|
||||
GERY7xsXLg24eGmV1b4xHCnjKmAW2E0sRhwCNUtLDadOzfHk4yc5ulhQiBGkITU2KZjuPON4ljtv
|
||||
HZPkKrt4/lqOJeRMhWPUtbHWN55/6TznL4wZVkLdBJACZzoK3m6Sa3rzwlsev4d3PKKU0mYE4nTk
|
||||
gsRcywHGlsmmJbVFvFGef2GNT79csbrqmCvuhspVPoA3iNQszAvHjsLDD57ikYfmCBqJFgnSBuau
|
||||
usZJmjAp7+YG3bgYjuBe4AJVVC4vR15//RLnL66zPugxbhxH6ZRwqrfGqXuOcP9DJzhxskAlNfsU
|
||||
QCRmb6xNh05nKDz/7/YaDQ0KFhbHcfzt51dG/w54fj/Pt69397r7vF2w/7Zumj9tRpFUfbfSWb95
|
||||
mKTthBIRt7yqFrgHEOiYU8eIlFCr03jBaGy8+NKAF17q8+L5DpevrCFSEGPakkxeht12HXMoPDl5
|
||||
hIZOGPHWJ+b5ivee5P6THQIjSnGkKVAriSLEwnCMYFBaIERhVEAdHKWm00QKlFq6jMR55YzxC798
|
||||
ltfPjRg2BUaRfQwmf15zUfkTpOHJR5yv+h0P8/DpQIc+wSMel5InVEQMpYxCIWtEMcYscWHN+emf
|
||||
fYNXXoShFhtBvmvu3wk0OAHzAtQodcB9J50vefdJPu+tR+lpRSkBt+QtubQ5fc2reEypvMaQUBHD
|
||||
iFp6XF4r+MSnV/nUc8qly2u4C9FARCeTVt3pNE4IgmvFqVNd3v6Wgi945wlOLCrBK1Qa6kYJxRyx
|
||||
tY9SE7zOo9W5TUZgY16YGUEYl93w399/XP6aqo73+6z7grMX++8b1eUPReMREZEQAmZ7F9fYkGRP
|
||||
+W/xtC6aGB4aGqtJQeoeVRU4c67ik89c5rnn1xiMSupY0GgXDQVmloJFtpebEid4Wo1MFKWh0D5z
|
||||
usxXf+UTvPvzj9EJEW2cUgqiC02ImDhFFEpLEfY6QB0aCouU0THrMcT5+Y+e5Vc/doXoPSrr0FDm
|
||||
VT+dW2hTYNeHSAS7wEP3zPMf/cHHuOdIRUdqiEvpt0ODCxRNQdABjSjLw5If+vHnOHvBsPo0dfBr
|
||||
9tWb7p8Go8C9k8dgTOF9Cl/lbU8c5et+z0MsLQSKwrGqRiV5RCkxY7jXiekXSuroDGvj13/rIh/9
|
||||
+Dn6ox6VHEW0oGmaFFuYvj9S4xhz0CKAjwj0OTo35H3veYgveuoEvdIpCzCPScyTFBMRb4lCt9kD
|
||||
UMXMcHdX9eeX5pr/5MSRuV/er7TgLcSAd4YzZgv1+vjPmYXfg2jYlyaek21dIn2Ip6IiEadhjHSU
|
||||
fujx0hsjfupnX+cXf3WdV8/MM7KjVNqjykuOmaXI+D4MseYgoxNwCmJToLrI5567RIw9Hno0RekV
|
||||
STvaCXM03U9UwbRBqQkoQpdRdP71z73ORz5xAfMlIl2iBUTyywsEciZgmxdYipL+akU1GvP2tx1D
|
||||
BNSLdBxtQAy19P+Gkl/66DKf+twao1igxRFsm85MmuMrtCu7FOA98EWWl+GVV8/z+FuOogGKIoJp
|
||||
ziw4IjWlCrU5MQRefKPhx/7NeT75jGN+gqoJuCjRcpD1mptL1FtTpTZopEOUHtEXeP6lVV56peKe
|
||||
0/MsHAnAmFJjulfX5I2pHgh5eHL1ZotYvXbl8vlf+Dt/5+80+3GSfQuCyuXh55vJHzD3SZh5L1f/
|
||||
zYigDR7SBBrHALLEhQtdfvJfX+CHPvQqL74yz6i+h0bnGaszlnW0HKMqhBAQEfar0XC7ozQKpJhn
|
||||
bPM04SQf+fhFPvbJi0TV5KnkVFVLFDKBRj1F7DHcApXBz/3aZT76zDpNuJ9G5qkt4FLi2RPa2MRs
|
||||
bdFcFJdFKO/hs59b5sqaEyk3iIvZi5BswKra+eSnVogcw3SOetsAactKzCxIqXGJRAlEXaDyo7x2
|
||||
vse//ncvUbtlVuEGs0IwrDG0KPmtZ9b50E++wssXSsbhKIO6BJ1PmRqZMuJXDzyCuyBSAB3cewzr
|
||||
HhXHeeWC8iP/92t86nN9TMqcpm1p1eAab7sAbTtHRAREOo3JH+gsHN83NeF9MQBmNlfVfGO04onU
|
||||
Kanlae/xPTi4C6qO6ZioI8bu1Dgf/611/vf/38s889slsbofi3NpRdM+woiA4DGtGu4++ewtJK/8
|
||||
+TzS0FDTSE2tRi3Kz//Ky1y8UlO7o4WmiLxv8OQNm0qzKS+dHfLLv3mBqKeo63miF6AlSMjCEzYh
|
||||
NG17Ny7UUWmakmgLnL80wERyCnFzZbYDawNjZV1obB7XDrZtCi8F61oiklCDDHEdEGVADA21HOWF
|
||||
V2p+85MXMSsQFHPPGYWSmpJPPtPnp376HGvDo9RBaMI6XlRsyG+nz7XPT1ErKS1QOBTeELxJ3hGO
|
||||
ecFy/wj/90+9ynMvjKh9LsVPxEArkDH74hZuNWJTc0REcdfHxyP5Q+yTt77nBsDd5fzy6IvMiz9q
|
||||
FMW+uP6TAUqrRIyGaIfGOwwq56c+fIaf+HdnWR4eT6suEZEhKgMCFYUpRbNEaI5stH/eJxhtlN9R
|
||||
UkS8XQlNA1cGi3z0Ny+kF8/aQjFN2QAsZa+igZdUDh/+lbM04TjRSgpy+jKfiRzVdjGiOHG7kRdP
|
||||
wVMAL1Ikn5xHJzEIxdLkdbFslwS8yBV4O5gc4lMxCUfdUGpER4iOaFRpOMKv/eoZRiMnevLmTISG
|
||||
gufPjPnJf/c6VTyFWQekQmQNdDhVB3GDUwNqgrpTeKSgJjBGZZyuQSKRDuPmOD/xb17h1bM1YwlY
|
||||
MILUFGa32wG45g7Miw6i77+wOn58P7yAPX/7X3311d648j/WGA8lNdR9nGDevsAFTVVy+bLyf/7Y
|
||||
S3zsk1eoO0cYBScWI0wrXB2XkF/efQt9XHuJkkQgWoVjdUc8IF5g1kPCfTzz3BUGwwia0oGTpJh4
|
||||
muSN415w4UrDK+cqRrGLmtMj0uonpBReIviYGFHbPfeNr03cKagIZhNy8Eb+saUrp/0/EnNvVkPc
|
||||
CQ7Bt6MRJ88MSWQq9UCwkmAFwTRX8VXUdUk1Ps7zzy2njEkZiRJZHzr/988uM/DjjK1GtKEwoYhd
|
||||
ggW2045wHNOYPzUuNUI7qZMfQOgzbpRBdYqf/Jmz9OtUURm8S9HMTT2Ng4AAhTQmbx+Nmm9gH+br
|
||||
nh7Q3WVh4fST7vwBXILu2ep/NW+7zek7LjWOc+GC8RM/8Tovvy5QnmDkFbEzJgpEKYk+lz50iGq4
|
||||
DvCwxv4Xg2yInCSXOiBWItZFrEdVl4yqLq+fWU8sPd+Ygy6OR6cIJYbzuZcuUXk3kXmIBCqCx0Qq
|
||||
khy1nqzUO3Bepd3jtynUzbz59Key4QGkMlrNhkx9uxCj49JA2t0jViDWmfoERCuckrpa4MWXRskA
|
||||
iFEb/Pwvn+f8co+xdaCIBG1Q66BxCbHe9h6IQKMNjabMiomk4B4FkQ4QcOkjBURf4NxF+MivXSC6
|
||||
gilFE/bdQ9wOLooQuh79W65cGT28117Ant7dhz6Ejsy/zpwnggrFnljPnMt2TZFxNUxrYog0QC1d
|
||||
zl0RfvSnzvLapR5jnaeiJohQ1opayBMqTxRidrPTRNzvGG9a7UP2OnI1oLRc9SGFrmPVEhcu19Rt
|
||||
XY0kpiBepoKj0qnFuXRREJvDvYLQUE0IRJqZECExAF0JrhSu2yzQghGIItSaMgZFVIomXWcMdTaw
|
||||
hng3cfitg+VAnm2bOJE0xp64CSZOVJt8kIaODxGZZ0CPi1c6lK5I0+GNi85Hn21w9ZSuzAxNF8e0
|
||||
wTQSt/PPHYIHgodsfJL3l5aSJqcZF8ELXNYxnec3PgFvLEMdhkm664BLVkVBQyFuxdurJnwte/zC
|
||||
7qkB+OqvHpyumvqb3KUUEUk59d0N4ESoIwe2LCYX1KPilKz1Az/645/l4hVlbN20524fuHenxutq
|
||||
ZZqDpIZueDAqhrsyHCU667R9T0FsofGImVCNYYMmuE2K7yaG3tnYKsiUGsrmSrr2B2Ry7p0d/upx
|
||||
nvLgEISSyBgUBoMxpkaMgd/+xHkG4+lnN8WUZCvuwfXG4XqKQOkONmIZjlMwHMKnPn2OxjrbbqFu
|
||||
BzJxEXO6Vd18wzIs7eXx98wAuLs2or/PzN+Z9v57NXgbpaSSHVKhRFBi4/zrn3mD81fmGDYdKFtW
|
||||
Wtpjp/z14YVATj05MabqvKvfa0FwSwzFprm7tBIdJTYlwoCgTarBKISVYcNnPrtG0LnbcBE+mWWG
|
||||
UpRzPPOZC4yrkIlmB2kBsmFyB1Vq8y8dXd5b6bA9MwBXrnBkVDXfINLpqhYS3XfNpJ0eiA2dHp24
|
||||
lL/66+f53EvG2I9gZYfaxrjUbASHDr7ceAe3BpCr6679dhtG0Yk3f3gLWm4J0iMUFdgYQ2lUeO6l
|
||||
VYbDhduy/95QRUpLS9U0DAZdXn1tfeJ9HujwpMJJNAQRDUeqqvl6JpJPu8eejXDl9bsgvM89cRZT
|
||||
tdheTcBciIKBBMZReP3siF/9jTcY+zymAadGipRiI0fdTW+bstIto81hW9yo6d+MtliFqwpt7gZk
|
||||
6S4speRcGJnwyc+tYDqfg537iElxVfazk/NI08zz2usD2mqAA4UlRmcEooiYy++7fLnas7Zie2IA
|
||||
3L1sqvhH3PQkkuiZE3HK3Y8A7WruItSuVDj/9t+/Tr85iqnm+u9xyrOTaLSpnv9qIczDigNXRzvA
|
||||
W08VkYrhBC5crnn59SE1jvntMOC56jGrIzViNN7j/EWlkTYOcrDjM7lOUQF9cBjjH3Pfm1z2nhiA
|
||||
y5eH99WN/35HNV1kdqz2cAuQgjQKKvzWM8u8fK5iJEdzrXudCCYe0NgDmwM6+O0XPZ7hpuCYRLBu
|
||||
jjMqz3xmDQvHsGKcOuveFtOYU55iiDouHS6vjBMV+MCxIfDookSXIkb7ff0+p/bi6Ls2AO6uY7f/
|
||||
AJEn5aoo616gVa5DUjZ5ddjwkV9/EYqjmPSS+4gnDrwV4F3EOuDFjvaQkyhwzqO3abUb3cMkV57/
|
||||
t/+429z+aSQegmdSTh3h2WedcS2Iei402uf791a0JYvUeY05jEZx20Kn2zE+m6GIBjHj84fD8Zft
|
||||
RTBw1wbgkvtijX59hC4qos6EJKLsNg0oqTIty7vUCJ94dshy/yS1Fahm3URP+W8TEn9bxwh1Lofd
|
||||
4uiuFLFMhBYZEqWhsYD7XJKukopWVVZdCESUKn0dcPafR5CqhMIN0nr7/4KKyETzb+8rJaAwwwMM
|
||||
ZI7lqmH5ckNpijRdxDv7f38wxQ4VRAyVCo9OPTgMRKD0t7oQDIIoLro4Vv9GYNfdhHZ9d4N+/9HY
|
||||
1O8RlRvQ/nczQVK+V0RoTGii8VufuAjSS2WlNrU/2sQS3Jnr6JLILlGhoYvTQYKm2IEDU2lEI6S6
|
||||
9kxKAvZU229rTOXgdz2mhwltks1BC1bX17E28Od6myvx0nszYUGbMBodPBFo01i1tAwNWjXVV51Z
|
||||
W9t1fcCuDIC7C1XxZTFyn8r1tN12+6Im0c6skcMrr425uNxPij8GKrvMhohRFSMaUdznUC/ohBFB
|
||||
LlGwRkcNJXH4XTSr7ZS4JCVenfUx3BXSvlswF8ZNZH04TgZWhN33LNr5NVwLpTFYH44P2NZeS1ZL
|
||||
FY/i1nCvxPJ9uz3Dbg1Axxr7PSplea1+1t4IbIjGtMsX55nnzmVBB0E9pGzf7s+AWqATA7045ETv
|
||||
Cl/6VMnveHfJI6cbOrqOyhhI8lhRwkQvT3LW4bbhIGzN/uikTA5uOI3DYFxRGa0oO7eNxzGRCZ/i
|
||||
NorSuDKq9kWD4+YwxcycumgRLctxY1/13HPP7WqftKsw+ZUrctqifHHSeW+vbQ9fF8lSTdJhVBkv
|
||||
vz4ksoihhKwxsSsHyKG0gmDOHH2++AsW+IrfcR9zPSEINCZ8+uU+P/Pvz3J5NSC6SOMBy5V36VXd
|
||||
31x1+/zdSHXyt3lJSr3/MgVpH5ixjuBBWOn3U65bhWC5qYg7dhu2AUl41CdbOvek47A2GOIsHp4N
|
||||
lzipY5UhBKxpvujI/fcfc/fztyoZtisPoKrG7xEP92+o2k63+N714QFHNQk9nL9gXF6xtFcXyWm/
|
||||
3b4cijQFwQY89baC3/MVRzjahS5DChtQes1TTyzw+3/3fXRkDZ2wDNt8x+3eIx6AC7DPb79oWmmH
|
||||
VYNLLhqa3Os+ewCyKck2pTAXGDdQNQedBYDNLczaj7TB4Yd06G/bi6PfNNy9bBr7KnedFwmyP+JC
|
||||
QrSkHf/6G6u4zOdAXKqoE3bporkQQoeiM+Q97z1K6DgqI8QcpCAUTscr3v7YPE8+Moc1/YmDOsPe
|
||||
ILqx3u9TNUZMEe78Hec2NMZJRJ/JNiAFAc0Fk0B/cFjjO4JIAJcjTeVfxi7M9C3P2gsX/B5EfwfI
|
||||
FqI/uzcKKgEU3jg7wqTHhmDGRt36LsaR2mu6C8rxexQpqqzBP0eULo0Hgg+RGHngvmIiJZXOfhCO
|
||||
4aFxRvfoToQ6CoNRDRomI4vIZFfe/uxGOCxXQgqk96vdgrXboxtzOK6Pdt+/we1wayiKwPpgamt7
|
||||
YLjxHBJCYehXXrx4cWHvj74NYhnfPsaedLna7Z/GLi24C1hg6HB+tSTSJTCiEwVxpdawy4louIzo
|
||||
cCTVFzYF7gVRHdMqVRz6ItJ1QhEI3iHkJhnuBSa3K1Y9GZDbeK49uuIpkRKXrOHoEEhfWLEOK1XK
|
||||
sKg5wQ01yxUCmvoHmlJGTZwBGRNDjeVnoLGHEnFGuAfcO0nTTxq2fb1bVSMriAScErWCohwRdcjq
|
||||
qDvxNq99l/ewxfuWuNG8MlCjUt49Lo48eavpwFsyAO6udRXfKyJH9lHyj43OOJHV9QHmU/s09mAV
|
||||
zh5EywaUiSrtNJcgVemlGMv0cB2EnsCd7QGIZ9WzUNAYuCrrwyGN51LovCnf6MizuUYiyYuHpJ0I
|
||||
Sc7ML9IrV+iVY9QbNtioO4whbIqy+9TvOqNRk0u02+8fvu2fIad93Lz3Vn//lgzApUu+aE383bhk
|
||||
wbj9guCu1JVTVfX+L4AH7+/ddZBW4izTat1T5xsPgcqc/np/kl243oukkJR7IHcYLsGgoGYuDPj9
|
||||
X3WCb/ljT3L/KShDk3pDuOS9/U4m7EaQLXVUTkE2J9BfH+VXYprjMrUwHHhrUUXQ0uB97rdGm7zp
|
||||
O3B3ca8ecHhnK8m8X2jr30cjCFpOzX9nX1hid1257WFAmijpT0utxQHXwPpoTNVEgoZtc4ypZZgi
|
||||
2qFA6fiI3/nee/iy9yzywL2B3/Xlj6BxlGtD2t+5OaJW6qPqmf6sjMeZEcr1SG6HAypBY7R3ra9z
|
||||
5Fa2AbdkwmrnCZHiHtnneu1WqTbGpJij2tJE25/YY5fs0HsAh/36rgfd1H3YHVClcmelP8xcD7vx
|
||||
2OfV3LMMmTVOEOP4kvGed81Tek1Xax68t6Dba8co+xO+k23a9BSwrM0AEIiNMB4JmGDmWeXKb/C7
|
||||
BwORAqF4MMb6wVv5/Vu5A7HGPk9ce6nn8m2wjBOZW7lqz3a7cSdOwMOBRLSxtrqDKkJ/VLPTCWp5
|
||||
G6CF4nHIU29fZL4rqFcUEgkFdDo62S6A3IT8e7vvn0bATRmNUsBBZepnDloj4Oprd47Wxi3xAW5l
|
||||
C1Ca+xe4e3Fb5sNkwt8Oa7ttJ43bcA13ISatzdPuOjqs9wfUOym3n+qS5Oo0TU2vA48/cpyCGvWS
|
||||
aAV1hHFT4WT58raKcrtnNu01S+7Mkgu+3APDwTgX4LSdh64uQDvod0JApNeM45dzC8zem55V6+uy
|
||||
ZO5vRQ5qXzQdjNnj8x8qy77Vve81pvfKeaWTjfFtOwRMrsIlE6J2uAWbGlbzFOFf7Y9AbzRBN/I7
|
||||
ShuUS70JAsbiXOC++3oU2iBZBdodYtx83bqT8ZIb/gd3GI7qSUVquxBtsN4PulqwpTKKNh7fu+p+
|
||||
03GAmzIA7i79ujqNlI9Fd9h3xZYs/uypc27qMFNmw1uz58GZ7Zvp7eO97skF3tIRPVQgNWL5JZcm
|
||||
tS4jZB1GUq8899y7sAQZZ12Era9JfYO6lWi+BcPaWR8ZFrqtnEsK8KWoNuqaUoaemJnRuzSqICM6
|
||||
MfLEfQt0C6goid7kmLxjdeoWJB6Q3JBk+zGbasjqIXsN6WrNYVBFotbgI9SKJF4iiYp7u1kg13t6
|
||||
ToMJmJSPD5frB272CDftATTRH3HnCHK9fdP+QSb7NNn01b09yWHfAuz1+RXxTuJBeDamLvn/BWoh
|
||||
qywViKVJ6ST3WrwA7+z4mlwk1XCEwMraOp6zAdv+urfbv+R1FNrwyEPd1KxENoxLXUOiF03zAHYz
|
||||
ZmnxGYwdUTDzTe/HQS8F09cpomL4UfPmpuMAN7+xtvg20dyI/hANw57g0GcB9h5q1/ZKbIVV1SC4
|
||||
opbSYkDq0iOpWSmbGq/cCCkol1iTyrgx1vuD1HJ8J+3FvaAlawWHIqzzyCNLBCWp92jqGFWNp69j
|
||||
rzxDYa3vqT2XyqSHw4StdODYkN4XpBMbefvNHuGmDMDHPvaxIsbwdjcJd2XK/K68qW1umYh4coPb
|
||||
/n+THoAO6hGdiGamZp6uWSpth9vNtsdglEB/NCJ6Pt4ONPeckIOIinjk3lNdjh4RaAyVCJrc8Kax
|
||||
LFu2l89Q6I+UxgOiBW6b+yEddARg6jLJijVv4Sbr02/KADz22GNzKvIk5M4/h+P29w6H3gPY6+tz
|
||||
0IbGK1xh1NSYkFt0J5HU2lPbLhdlWKfefi41ZL3EnUw3V4ieFBrXBiNqv6rd2A2RtgkiESx1P3z0
|
||||
kQJxoVRBzLCYXPMYZYO2O9k27DJzJEJ/mC6ziYnEJO6HqiK0bbAGijuPXrx48abaKd3UCKmePOYu
|
||||
D/l0mdabCofdQNwkxDFpIBRUseD5F4Y0DhLmUqCrcLwQGoHG4dnnLxHp5Z55bTn2NmOijrnjQRlH
|
||||
Y20wJIXsBA1bv0CpGYriXqEKBZFHHz5G0NQ12d0nW5O6rje/lHvwqBzoj2vihA3IpH5kYmcOCdwF
|
||||
PNw/N3dy8WZ+b8cGwN2lsvoBXO69e2e/bPbr/KrP3XbPnqTWo3dAT/LMZ/s8+9woyXJ5YGzOmMDY
|
||||
hDMXaj728UtEP457LwcCtz+FedtIVFgfjGgMUMXMiNZsO09dDPMRRVB63ZIHHljAbUzQAosb4b5x
|
||||
Nebavf9un5fQ76cti0pOKnq7DThsrecERE726/r0zaQCb4o4YGbH3cP8ZK88ZRllEiDhqvDg4V81
|
||||
Haij5BJVzampArFUulrHtA90mWKu7FaL4Jaw1wZIcBdEOpgV1PEI/+Znnmdt5RRPff4pyk6gQXnu
|
||||
s31+6ZdeZjhewmwONCJ0mLQ733JwPQXQRFntDzAtiICEIjU93fKWnEiDBGiqEQ8/dg9FEBTFGlDt
|
||||
TAxRrKcFImXS6We3GI1rzFoh6NbjaNPf+78gyDbfbe9QVQWP89Y0D0Pnt3Z6/JsyAONajrtQoq0J
|
||||
CKmxgud8r8tk8qfcJJmYcTiNgDgEgcuDin/yQ1fScLpvepGSICn0h06d68zbRiLG7b61vT9ZihiN
|
||||
0r0GYSXew09+pOJnP36eubke4/GY4bDG/ThIgep6uhJXom49xdL4KpVBv6rpN1BryqWrCaX7hOJ7
|
||||
3bsVqAtHY4d5qXjsASNkkl8MoNbBMzehGnVwWc/rctZqDGPEdsAGvAE0XQBVH2QppR3NOikAKjFz
|
||||
BvZTMnWabDQlCe9Tno62XKCGKLH0moe4Prf5urgpA6Aqj0RrT5k7qYQqDbdtaOS5QBRABI2Htz1X
|
||||
clrSfvT8hWHq0Dv1sjhAkCzG6YjqVOrq9gt07t/58nMjkXVEewzHSanHDFS7qUjGbJNM17ZvWJvq
|
||||
04K1wRqNJw0AJkxC3+7XKYwk2hoqHntwiSARlXVEO0APoyZqj3Ecgo5xb9rfzEHdWx+zVHqijMfA
|
||||
0vU8imkdgX16KlvI7W/oJrRipl4IflMtw25mdhZu9lYoJlfjkiy4kNRcU1PO5AW0fQEPA1v6xkgu
|
||||
cOOgWhInpaD5/oDYRFRDmgC+Wxniww+VtD83Tzn2EMKkhv9mS78daFCqaKytD5iW69qRe+5QNEpX
|
||||
I8eWCk4cV0THKQOB4FLQqNMAw2aAa43EBiiyyEsJ3Hp/Pyf1LBiMajwHLqdqjW/L87iu6pSkrZO4
|
||||
oxNvICaipnCKm5hyOzYA7l6APODuklbK5PIHKycuSVvw4bKRjNyJpT9YhEnb7TAp+GivHVSzp2M2
|
||||
qRW/m2G525KqTlb9EAIx3sJEEiGKMhjXjJuIhE56OdpI+rYeQHJ3oxkPPnYMK2FMB+VEIgh5Sv01
|
||||
wLgG87ZRzFTHoV0hyZINqwrk6uyaT93L/iH1nmjTmp4dT2PDsLVsTEFERYTTaa7uzPLdjAegIn7k
|
||||
mgnS7lF8yi3x3OseiId68qcrbm/pesy06UKYg5/8+z+W0/fYGrxbWf3T70MMBZdXr6BFl+ScS3bN
|
||||
28q7Gx/XAYqCKgqvnK/58X93BpUGdUGsAAuY1RSdHq+c6WFWJl0/T01HNRGGb30sAHNlOBxisoBK
|
||||
k8lGt4sJ6BRiuLVuvmIWCUFxk0RRzpoH5iQxVfeHLl+mC4x3coYdG4CXV1ZK8d4RzHFtxREAq1PE
|
||||
VYuUi8xyzuJVYnrJPId5E7B9C/PDvYk5zHARRhEGdaRpXdWUS2t/gu3G1tzRsserZwecuWBYjJm6
|
||||
nKL/pcC47iNlj7ZZq0wc9kjyRW/t+TkQXRlX6X8TecB2e+v7vxNoGiNomSseBSXQ1IYGMhciXWco
|
||||
ArExd5F7fY5FYHUnx9+xAViKRxfXqE6KbsiApf1zF4JSNdkjUigkItpFLW1KDjcOUy737sPqcEBt
|
||||
mQyk02nDTDnelkcUscYQ6VLXikz6QUZEItEC2unS9vCYKIt5CgTKLipWPG9B1gY+MSWty3973mol
|
||||
Fr0koJo3Apb01AiSYvGdkBwqi0mzAGNJjZPAGzs5w44MgLvLhQvVveK2EEKJSWrYUdfw4msjzpxd
|
||||
Z9wEhtWYbkeZn4MH7j/KQ/f3mAuSrbG1Q3rgRZSbsZ0BOHjZpw0cpnG7zqX55ri4Qwr+ScgrZcsT
|
||||
2VlcSHBUcubdFUwRDUAEbUDGuJQ07tAuTJuowLmM/JbhuAiDgSVF6qAQyYZrb5/FdO6p9V9MYBCF
|
||||
c+cHnDuzyvpaQ1U5qkpvTjhxvMuTD57gyFLKVCmIu/WqcTO/0/Pu2AMYjYanQtErx2YyRvnUsyM+
|
||||
+cwa/ZFik5BfFzdDg/KJ51Y5cbTmPe/o8OTjPTqqBKpM0Qi5C4yj2/vg+4zDNMG3w+GLp6gHojiG
|
||||
Tfo1CtCEwKBuGFRGzNLqEKdW5+mGHje4W2ljSImLocGZbG1dgG4WJ5lmcHoWD9mLuzMsVAzXl7La
|
||||
cJ2a0ppt6FLs9gxiqeIy1xhY3rjUCK+/UfErn6y4dHkAFPhVCkfyAnz8N/u85a017/7CJeYK6BZF
|
||||
xxgccXfZSb/AHRsAEa9rE6lM+eXfuMBnXlgnyiLOVcrgCtEc1Q6Xr4z5+V8+y2r/FO951zE0FEgW
|
||||
cBCXnOOcueA7x0Eby22uyA2VYqL6s9IfbOHt7SyH7jf83/6T8V3SlmI4jIkfdpUkRfrv7oyykHz4
|
||||
FFgUognSUT79yVU+/ttnWa9PIOU8Td3kjNT0aCijqDzz3DJXVi7xu9/3OGFONI5H83B0R+ff8fJX
|
||||
lX7RyyJ+4pk+n3l2jOuxZNmvviGRHDmOaNHBi1N8/BMX+NRzV4gKjSqWySRqswDb3YAJN17ImnzC
|
||||
qIms9Id7Qsc9SLgog/4wS4a3X2tJQrtPM4pptmW553RR8NzLI379N88zjEdwLbCYIv/X/rpTUTOK
|
||||
c7z6RslHfnWF2pUYwo4vbEcGQES8Ct2LZy/Wo9/+9IqbnKKKqSrsaiPcptKSERBGcY4oJ/ntzyxz
|
||||
/rKnFkw5MnPoJfhm2BapRqp9mKlCD1EGVaSKcEcbeAdBGY2rlGab0gPcK+iUUWlU6Y+NX//4eWqO
|
||||
M46LqITMUL1OilocDxHTBSKneelV+Nwr4+jaXdnx+Xf6g3Wci59+9nwcx3mid0FKZCfuWyhomGd1
|
||||
LfDCK6spLyuCWXNH7b4PBw6jxfTNfwvU7qwMRjRSJGN/p0KE6EpEGQwnbJAsjLL7HcgkLuop2GgI
|
||||
L722zlq/oIpzoF2ik0lo1ztCS6gKRLrUMs+nnrlkHnvDnV7DjufgC7/9anjtjUGIFCCOep0CF1u+
|
||||
kwZSES0SiiVeeGGFaJ745UEOv/7GDNuije5LriRwgapxBlVDLbeegz88UNxTlyCf5Bj36J4mFbQN
|
||||
jmMmvPZqTVWXiChOzVZGP8m2BVRq0AZHuXylKj7zuQtHd2p3d2QA3F1WRkUxGEgpRBHtExhR+NYJ
|
||||
PRFDdJ0iRLwpGA+V9X7iV4skVeHtvIgZ7gRsUG/dnf5wyKg2TG5P64j9RVqohsNxphhNEYJ2G8AW
|
||||
n2gsGonyfOnikCAdVBtUBlvODwFKU4KPQVfxMKaxEJ5/afnoThfXHXsAV1ZkUXUhuEQXGaI0mQa8
|
||||
FRziiKAxRTC9w9pKhWbNOVE78BdEpnRkhQ3Nt6vDkxs/Y1OSUDsws1vFOZ3cvy5OhDglu4STxLo3
|
||||
mySoZJMSz3R7dNnmZNthk/JJPuTVmge2UQoLJDaeT349ce+E/nCMt6/WQT/gPYAD43G9qUxcXJIy
|
||||
0i6Pm5wkww1i44wGMaccx2hotg2UiZNaqsuo5UWEK8vV0Z1St3fOA+j3e9GPaNSQ382AJmmHLS4u
|
||||
UPoRolZYqNEI9bBGYg8tINpGddhBQBCC5TRM1sBL7HFFMvUyBWkFdUOocamTxLX3iJSErdw0YZIp
|
||||
advKpfqJfNfS0OgIF0GaBTpNQUcrDKGWgElNl4omV2CLGsoIRXBZpGYRoZ+NiEwyVDejW6euIDWW
|
||||
J7VTJFEUaVCxnGPvAI5Kjek4ncuWkNgD6SPmuJZEDwwirFYNQQvKaNu+wIcZqTdBahC63jdqVzo6
|
||||
pIjdtFTs8t4coc5U5YLAcA1cOjRaYyJoM7/lORynLhokHkW9wjXi1iF67+hOC9d2bAAsNNK6PunA
|
||||
qdRimyFMii0w6SMzGDaoCHYI0v9OErlM/87kFClyhEcRVUxq1FOdfNvjliwIsq0H5KBT9fMbj6ON
|
||||
Jge06SJYErkQo7Y+QeaRuksZOmBdTC3x2aRA4hHENBeijXPdhWWq6M2vSKZtc4/UYQcrEFUKAniD
|
||||
W6DV/zfRPKFbT6AmlfcHmggeAmurazTR8Ukm6s4Wj23ly4et7HhbwDSpytulF9DyC4DROOX2Jy0w
|
||||
XbdlTZqAEhKfgJg0iwrdsS7gjg1AjLVsr+N+g5sk11ajrK3FXFe9C5L2XkGgznoGZEaZWCTbN8zb
|
||||
WrISJ2CUTGvB7UjUYpP0ddvockPsQVgkWk3lQlWSJmGjBMAboVZoCqNBGMuQqPPpvdD15IHFOabV
|
||||
Ynzy0alrvPGTcWmAEqyDWpnOGxuQKnHSxHEK3Eucbioy1SqrIo2waLgUiBZEh7XBIHlIZFrgHQ9N
|
||||
HYIGjnnKAGyWjNlttaGjmmIL64M6keNcU4zspj2MZGzLMizs9Dd2ZAAE+EBd72LCbuyw+2OlcaXQ
|
||||
gDUHXF/vqeGFupHU7yoKren2kvRXVVeM4zywgHsPlwCUQD1RtdluSDSbP0MnE6MVmogOjTUUFrg4
|
||||
Ml48X9HFmPMRJxfAYsPyWFinoiq6XGl6rJgADYVCoKSQkKLBJE8gWa+QDUzaq25JtyU1wVQPCEaQ
|
||||
ASJrdLs13VIYVg11M0e0RcznkjEwkhEQQ1Ro3HBV+oOKUeW5599dgvzMRuOW7lRk979doHerDJV8
|
||||
NxNP+oMoNhGlubUJpymysCPsfAsQRYKmHe9NjV9W0237vw1GFaJOjA2FdrLk8sGhiCFVL8ZVHjxd
|
||||
8jveez+PP9aj6MClZeNXf+Min/jkFaIG6ii4KkKYTLik2HIj5KBilsFyUarorA2HXLqyShUbmtKQ
|
||||
cZcXXx/wc7/wMr/jC4/yB/+DL4LOAmWAC+dW/Sf+n4/Lxz8zptZ3MrYFGl0niDIX5jl1JHJ0oUMh
|
||||
eZTdc0wgbPv6JFcz1dWrOUEHzHUv86VfepoveOoEC3MwqpzPfm6NX/qV11hdXyDakRwnKFNMBCeE
|
||||
gpEZa8MBUbJfdKdn/yDxVdxRLVhbG2Yq8AYPOMWLdmfsRIRohmugP6gnC4X4VGZlx0dLsnXgO66A
|
||||
2rEB0BCiN7c4W11xVZzAYDTG8OQyNhxoLY540jJUxjxwT+CP/oFHObakFIVjFnnguPJ1X3Wao3M9
|
||||
fvHXLmB6nFpC7qPnbCdoAbkbrkGUgio6r1+4xNqwgtChBhptKFTpWcHv/PL38B//oUfoulB0jLoZ
|
||||
8o63HZcHnvhq/sEPPsdHfruhLowmOBhUY2d0cZX+uMt9J5boimC52eVO5p+4oJIabXQ0UoYVvub3
|
||||
PMq7npqHKlK4MN+D97xzkfvvfZwf/tHnWRt0cF/Es0pyEKcyJ4qyOhhh0no6kLZKdzbdy7MAwHic
|
||||
xUBUmSgO71WAU5I3OKgEm1q8b6no0KFufMfr9M09nVuKAUhmOSkuyriKjEbckN54uyFFJBRDvvwr
|
||||
H+DYcaXbqQj0KbymNJgP8BVffJRTx4RCKjQH3LJO9Lb3TihxKXAtOHvpCuujiIUeYwk0oUfTdClC
|
||||
4J5j8Ed+70MsBZgXo2hgPpTMWcW8GP/RNzzKXPcSMEj8iXKId1ZpyjkurFVcuNKnIeAobSPVDf36
|
||||
G1ydpP1+EMNtnXe89RjvfNsCoRqzqEYvQmc45lhQ7jvR492ffxplmOvVctVd7h7cHwyo6pg7VO09
|
||||
ZfZgkHgNjjIYDpM4bJ6Rnj2A3UKdSd/B9UE92SLuBmY+2PH5d3xUMWt5f96KOWx7odMvYKrPNhfW
|
||||
+yl4dtBGwMVpfExnDh54uItoJNoIESEUXdyFEMf0SuHJx+dScCzflwu4b/+iuwkSCtYGQ/qjmqgF
|
||||
UQImBYQSpYc0xtufOMKxntCJq5Q+QmNEq5JuIyxK5IHjHR69/ziFzRHqI2jTBSLjaFjosNwfMWza
|
||||
mER+jbYdWkc1Aka3FB59pEdJdgurpOjcoQu10RPhycdO5smfyCsiEM2QULCytg6hyIZ+h+M/efqT
|
||||
qOh13pv235aDitMcjNskzIkwHttGnQsbW9u9QYqjVFXFzVY5Jin+3OI890homnpHcmCwUyYgsLQw
|
||||
NxLRVpUQ1wHuxZbWyjE8DFATihhSukqEtcGIqtme6rj/cEycXnGUhRLKRlDvEa1D7U2O1new0NCb
|
||||
LxBy/YPEFGXfQZRbSWISV/pDRii1BKKQcgr1mK6lfnydBaWjoDZPJV3qIo3zWAukKunFQK/XJYYx
|
||||
KuuEWGISEK1pJDI0WBtVWeIsGVjfZpK0vfRcCmpvWFjsoG6olzTaYVg6gwCNpBjGsSVQ6+bMALgX
|
||||
RO3RHxv9UUyycFMttLZ/uVK8IhFqUhoyuCFSI9IAMfUq1EgMDaYVrk1OwRao7bw9+S2+HqiAWUHj
|
||||
CwwHQnAneJNT27urdUjJplQ0FwXWBxXikqTQfScsWUVjF3SIaYXYHBKhq6zvNLi+89ZgoTeGaJIE
|
||||
ANlpCmRSLZbvpY7GcDTO+dUDZopPUrs6cbxaXqCL5Re9ZfBcdb87tFviKY9sWV3GM5dcfCNhN80v
|
||||
T/GFjVU0nUanztxq8+efl/SWGk4Tmw3Zvan72/Yapd3Tbpbsc/VJynLqCieCG4nJVrCyPkA0TBSF
|
||||
033sKAqxEU/BcG2ImRbrHnAvSc1nekhcQppjEI/g3sGkxsJg5w/ilpGeu7kwGrfvse+ZB5BEdIXB
|
||||
MIUU06twVYHVltC0IKUXjaBudTVc3em47Lgc+NjR3iDAgI2M+Q4uUCbEhtZNcQ+sr8U0pw4BFWAT
|
||||
9qM6ScDNuVUOxY5PgmC29Z5/P85bNc56fzAR3tq09fDtfpss8Om4VmlSixClJNLFKHOgVgmxh8b5
|
||||
5IF4wLXBpWJ/BWU8MThVcfMUpZcNr0r3aKgdZX1tjMWcYkzLBTvxoaDtVRHymEY7Mt/p7/TcO80C
|
||||
yOULywNYvBQ8nDKyNMm2LnCbk25pk454waCfGPWtsOGhwT5xEtzbYNLew8wnaffbPpQC6+OKKsZE
|
||||
XRW5SRl4QTzkdGqDacweR6LHCpGCYfJ4ZC15KpL6FbgJLl1uR5ZBSEo9w3HSINxwbnbHAWiLeSEw
|
||||
GtS4JZm81HaMqWP7NkeRvCw70AxP3X/8xZ2mKHacBhyEXh3EL4l7ctuKjUm99V1O3ZQJoh1WVkdZ
|
||||
OGK3JIo9xo32JLskLopKCnj6ds0wb+HYWadqo6PR/o/nRBUaYW1UMzQoioCbIQp427R7m8np0/Rl
|
||||
22AwekOhEfcR82GFB+5f4LHHu9S18/rZIS+/OqRpTmA+j0lLZd6neyUF/6II66MhxhH2qi+AkNSS
|
||||
CYH1foWT5b+1NQ3K1qKmPrUIh/xE6rWFbu/sTq9hpwbAn1p4rH5m9fUXxxVfoWhuSLD9wHvLURZL
|
||||
PHsPDAap5/oOD3GIsMuL3e1Lc51txEEQKd1TBqdujLX+MEf/IQTNNR47qwOQHLlO28OUWlUvkTii
|
||||
KAb05kb8/t/5KJ//1CJ1EwmFU8eCz7044qf+7Rn6w4I67O8rJC3rz5Xh2Ca09vydXA15aw9hssg7
|
||||
DIaCU2a5sdaP2kGMLS+i0noAUl+50lze8RZgx/7T+9+PmcUX1X1KB2xnW4C00qcYgHmgroV+f7/3
|
||||
xbeC7QZ8H2fbdl1y9mkLcSvw3A2qPxhQRQMNNG6bgoDpB7cer833ExDvUHhJLyiFr/E1X/0IX/SO
|
||||
JULlLEjNnNfMEXnrw3P8sT/yAHPdc7k0eh8hMqnOXluPudPQHqpYiGMOa2tGancGrTe0s+m5YWzd
|
||||
zYsinHlj6YurnZ5+51kAh1g1ryhibVunnSl6e3b1Qk73CqI91lZHqXPQYcIdXLq632iHJinVJOba
|
||||
Sn+AS8BcJr0EaWPZOyBKpdWuSXr/HlAXrEkaEk+9/R4+7y2LBIuUUlO6IpXQMWOugIfu6/FlX3oP
|
||||
QapJIfTG09uct9gN2loOEEZDn8iB7ZXfITgeYTiIUwSDlsa9k3P4pDQNoCjCb/JzO4+M3lQE5cTx
|
||||
8BISYgwDXBvUS7YeZAMdE6xDaOZSwLIQBo2wPqzQcMhah++AOHOoj7/H2KhYTJTpIkJAqSlY88Dl
|
||||
2iZhMPckBmKiqU+AGqbbvYdGLIao9SibDsEjEozQXeF9X3KS+Uji40ugIhBDSZSAutHD+Mp338vp
|
||||
IzWlVkSX3H+gyUbB4GrJ+puGEL0g+oggBeO1I6ineosglsvDd8MDMESdunaurAkWxiBDiqaHWI8Y
|
||||
hmz9TgjiJa5VqsnAkab/8gc/uPMXaccGQER8oVt+jlgPguAWDbedWahEm5ac+zdElNU1iIdNFnzb
|
||||
DfVeqEDeaJi2P/aBj5TkrENRsrI+oNkt5XeiJzhJZIIPeeKJ49xzsju1Dl6tdpTChWUBn//UUYQB
|
||||
Gkhtw7yY8j72wsMUVFPzzeEgotIaPM9p11uHk1LE6/1cldmyHT1Xce6wgxK0YjPeFEU8+4EP7PxV
|
||||
uQkPwOWNK/0rovUbZhENgRBu5pXMNE53XAOXlkdE013znvcUhy4msYHUjPX2j9VkVySpVVUEajNW
|
||||
++vsCR3XFct5byHSKfq8/ckjBDGitNJnN/pd4Z3vPE5ZDAgSU3GZd5IRmMjQ7HKSekQkYA794YjG
|
||||
ksu9FyQ2QYgeuLKSVKAmc+EmDpxDgKSt13B4+v6Fzzz99D54AACPHSmr+a6fcTeUksbjtgPc3pTk
|
||||
W0wPumBtvT7wUuBrcCdLWO8bbPJnlKSDN6oaRlWD77bu3/PLqxETR6RhoTfkrY9nQRu1LYthRZwj
|
||||
iwWPPbxEU/Upi04WLikyo273HoCZZU0ApaobmshEzUp3S0EQwQn0B0PMwy0shjkN6CFtTaQ6fyQu
|
||||
vbSTlmAtbuIWxF966QcrtPpUIcEteupGuv0lgkxkMDKZo2BtEJN4xMwDOLSQqX+5goljqiyvryKh
|
||||
zKng3RxfUFNcsuS2Rx483WUuKCWCbNPgRtwpMR5/ZIkg9UTBaHLle/A8Q9DU2ViUSEF/RJbbcGLc
|
||||
nYFxTxTjldUaM0HkKo3MHYxvUMWiIG6uOn5uefnVHRcCwU16AE8//bRb03wSN4Rih+WQGylDwXG3
|
||||
fLNdLl4e3mGR9zvpWneP6USUAyZC5cZwtNEpZ7fHTzXvTVLBEeORB7t0BNQ0x4i2ghO85rEHj9Mt
|
||||
I9GGIA0be/89YAlmI5LKnIXhqJ40t5FdGpgUZHUuLdeggY2QQluRsr0BqD0JsLpHunPFr3/nd37x
|
||||
TeVFb3qEFo92PyVOLaibbS08krUUpsQTssaeBsaNs7o+2tUA7j0OkAew4+PLNl/bHyPVJsP6gxHj
|
||||
uklCJ7L7GIBk7UAHVJT77z1CrlCeUIK3GongcHQpsLhYojIGqUBaPYzdGwCZSsiZC+uDftp3T9Ke
|
||||
uxlvoa6N9X4FEhIrcHOR9LZQFZQCzM1s9Lmnn376ph7ITeXhROD/+wOjZ0W655s6PiTdsE2cRa7a
|
||||
w0mSLIqJEHTuQiS+VQjX2UpMlISlNcIVSpVfCkWosxzThpb/zSIRWpoJuytK0gh0BPEilcpCiio7
|
||||
iFcTyW0RR6iQTZV617v/dANiNYWlB40kHUK1llaSSnDTKpsDox4w0aT62lbeeU3wOrenFoI1mV5c
|
||||
5zJez8U1Da08WCvecYMRoC0mkTxprC3gaq8/7/vbAuP19UsEityVxtGdq09d9xkHc4I1uDsFY44f
|
||||
7aLquKUx2CzCeZ3nZ1AG5d5Tc1xaM8zbF9JzB+pbvrw8QhuaFSbGoKrTiGaRG0W3jB1tzeIXLi5H
|
||||
qiYJq4Qi08U3/eIWN5AVi60xuoWMQ6nPNzwNfHDH93dTBsAd/vbfvtyfL3qfGzfzD1UaUGtueIni
|
||||
5AGKqfWFd1AD9yFazvHGhYY3LhidMiIaU4qJgtRwIgWGGi1ZH8K73nYk9RHIkkmu80wokLeqVIYj
|
||||
oaQIxuU1aMYVnSD55U4PPuKEjtItjvLU21cxCcS2hkm6FHbj8xtCrYGI8cSjSwxGdebst4o9aQJ4
|
||||
rHjLqWOcv2gUWWyjZYOZe9JdCCXvfmyBh49VyUh4IIoTi4gqWG0cme+w2OmgXqJ5XHybOI2T0rNi
|
||||
S6h1OH9ZUG8I5BJTTXp1dQwMKuHLvmCJWrpED8kY79IN1lwpqjhz4RhVJbxaNQTqTLXdIpfvglig
|
||||
6RhzcwpRgCOYDFAqlHqX6kSKe4HKKCkwu3HuQuDMPTU9bZAmIN7c+PLIpKHWFZaYGrs4pDLnks++
|
||||
MabSEqFCrUCsk0vQASu23CKnd7BELNLrrF545JR/9k98J/7Bnc//m/UAxN199Nf+7vO/UQb/qsra
|
||||
uvQtIrWbvrUhcxgNxiPntTM1S0tQhBRUCW29PIAYNTVIyee9835iw4Zm+vTKsE1K5kahxuTKJQN+
|
||||
8WJDEFBqxBW1ZGiiNkCHI0d6vH2xN0mHWc7KBdv6/FHbuufkC00vFg54TIUzJcbKquUGJElsAhIv
|
||||
PKgyqiJPvf3B7BVtsDANSZMos60DWWYqX1MMbL0MZQ9LBZraWb7ipHaYMRemApp6FzUW+Ir3vXPi
|
||||
UzgQZCfKQzd4LgLRZRJrUGB1BYJHFKGVn7nxu+VgkSpE5nrzqAzy8doB2e12qN265uIcF1ZW4MqK
|
||||
0aEmNJoj+Tf+/VTv0t6d4aRW3x6hifDGGzUuIV3xJC1m7Q1ue4XmTqnmQnxmrrG1m8kAwE0agMlt
|
||||
FaPfsKoflYXiZveAbccSdye6s7JWs3RkIdVZB8NMs+umQCSEiMUmTUpJlXVtXzYRTzTSqy5h86bj
|
||||
uo918t2WzKFCbmleoAhRMnVZG5qmQqVD0JDmcksFlVyFd4PzpxU+5bIlb398ii/vCFHT3jdgeIw4
|
||||
BeZp75tEKA1rsrCwpRZrQiTkKjHxLt4YheaX0XMVuexkCmSD7IZqjnYruJfELBbqrkhM91i0RCBJ
|
||||
knAChHjrTA4HmolASlaZcAFK3MusLuybB/Sqq1dxRI253hxB+8Qm4uo5T78XpcLpXs0VFaEaFbl5
|
||||
Coh0aLZ62Sa6CNlLlBLVQBONoCVN7QyHEaHMgfHpxXT7QGZbACSMkFD/0jd+41M3K9p9awZgaS58
|
||||
bC2O1qqmewwpb/r5p0mT+OKXVxvuezBZxFIStXJTxVWTXfJcZpqk71M/PXJqsXWxpi8kDeWEqHrd
|
||||
70OafGm4PW+/JOVkW60CKyhC6hArCFir4hMnx73R+QGCl+kdcMejo3LVkAfDrMY8CaVGv6rYJCvm
|
||||
hJAmd1J8tux6O8I4GRZvsuLQdI2GoK37ecOXKL9qDkWR5KmmiS6SbplWCSe0unyeWqhh5a4q4iXT
|
||||
WCE1xPBWP2LjJ254+W2zXkFZWAioRJIigWXPZi80J9vfT9uB8TgdN1qBRfBwYw+gXRjyq5trJAQ3
|
||||
xRQuXYk0teAUBFWaJqKtyoj4ji5dXRAZVvjg13IA8KZu+KZNpAiUo/i6Nv3nShFuJQA3EcgQ4Up/
|
||||
nZEZ6EbjSddMcBAj6fCVSVyT5N6qKeoB9SIJShCytU8fmfwdcpDu+t8n99zDLfXIQ4E8+VsD5B3c
|
||||
Er00qYQJ6pqvQbc8v5P0/yIpheaamj5Mf9QChXcR6WCE3HDC0o2G/JLnVmpiglCg1kVtDrU5UtRA
|
||||
s9Co4hKIEmg0ECXdj2zxgbSKqvuE4DIt6GMS8dCANmgKzSMxoLFAYqA1xbf2EcRKgpWohcQLIDVl
|
||||
8dDgIU7eg+t/PAfjnLKE+fkOIk0OPbeGdHdRQJd2LU7PdDzOnaMImZ3pN7w+z5/WIItETBsohFGE
|
||||
lf4alqnLZr6ZWOQ7qAb0lAVRGZ576LETv/X000/f9GS8BQ9A/MKFDwzKe77h16qxfanL1lHQ7W7A
|
||||
PHBlecjpU73kirbERsmVV2x2sScyTG3PwV0IdUD7iuhkFUxfk0ncZprqYEy28zkYeXUV2nVuUZsb
|
||||
rxAIIYZcMNm+rNnwZc1An+jES66zazMT+Topcj75qvPmBWS7NbDNYtjURJnErSaejkwmgl7FWLNQ
|
||||
33KTTHFBYzllcDzVwk8JzWzIz11nbFGigRapUcvSfMHKamteUj9HuPUsRXuW9GeakHVT5zhUA1JM
|
||||
GK43+s1pKoNjiQeDY2JcWhkD89d9KhufrfQUBBqj07WPvzYeLt9Kl61b2iR98OmnvRD7SKG7HV3B
|
||||
vGR5uSK4ohSohbQaWEjukhqmaR/m4vnfGwPssrtPSnFND3iO0Oeqr83f8syGMyxbdtvy+Bv53OlA
|
||||
18Yhc3pJN4KbnrdGmj0N2k+ejKYRU8cCxFaAl+wwePaQ8r+D7+D+0TxRpl84nxigVFyTPqk/IpP7
|
||||
tky1bTVT23PLDT7X+76JE2XDkKfMQuo8BNnDc73uJ3jaSoom63TkaAE5eJmM1m5jAH6VYRWqus6V
|
||||
C20MRrf85LDs5DmKFCCB9b4zHE1Hj9uAY36iHtJnGw9GzL0si198Ou3/b4cHkK7pxL868Sv9V5tl
|
||||
Idzjm0zPtNXajuqrxEZZW61omuQ8i7aPL+XiE03Urzpy9jr8qiV6cq4br7mbv78Rc5j+bhsVgJbs
|
||||
kttvi111dL1ulmP6+BqLrR+htC208yT0NrWpqSvxRDbRN5SK23uXdhuycWaZPr2kjsO+xfVNBC82
|
||||
3X9ObXgKN07n4j0TulwigqJW7ioLkDykJBa72SymLc9Wj9NJvHxvGkRKjh2bQ1lP/Rrk6ndjp5h+
|
||||
f2XyDqSeIJY8AGufm2XjLFseamN8AhYt7f8vD4BuS/DI493+0nTcZvO1bPI23FGNI1U+emtP4Faz
|
||||
AA5Pf2j99TmpPtqP4fcndzgTN1qKsNZJ7GFLzQAnFAWjUeTKqnHqRCBSIRJxL4AS9evkmn1zkOz6
|
||||
NKLtHvLGNVyNjT1f++1WcVWu+u0b7T82fsJlB2Y534NMBX6mV8X0MznO4NeefzraL1On96ljbz8+
|
||||
G1dpU45hdnyu+hlJY5Kfw67INhbyfW+88NMuv1+zCm++j5T8UCIVx44FgjS4HUUUGh+nPO8WaCXW
|
||||
3RPHxCyme9a0f1c0XaMLQoVbZDwQOvPd1ONym5JgyRuxpIJtiBoxCpcuj3FZBGnFezYFACZBZtMK
|
||||
tQ5inWwWGphUSRqdcu3Ve4/IJ291+G/JRxIR/+D7n6pFhz9t6m6uk/y0Sy7I2EkQY/K4lfPnB/n/
|
||||
Oum5Kzfy8Q8K11zLjn5pm89VxABu+N8dnX8zmfRmrm8n13/Vtezo/rb7cJ1nehN34bk7EU63DCwu
|
||||
dnGPKd28g98XUcxSl6OA0wlCoCF4RUcic4Wx0BUWutArnSLAeBRRVXwH1bDT329L4tb6FVVV0zTN
|
||||
tr+n3saAIk4ixxmCEcDxQoY/d7x8+/LN5v9b7EqS5/hR/aXVZR9EWBBNhFXxLPCYI7zbBYjcHNXA
|
||||
2vqQcbVIr9NG0bdz52eYIcefPW0fiyCcuqfHlZUhSDet/tu8PtFBtUDMcG/olMKRo3MsLfYoisS1
|
||||
l7bjkUVi7KAaMQsb1bBbnqPdRqSLjRa4fPkK7pr0NLa5PrGcRs4Lq+cIrbuAWgyh+n/e//5bVz7Z
|
||||
VZRkbMVnVJsXkSSWaCJETfvD5J5uLcmU8rip3rqqjQuXBzmEU0wN3Qwz3Ah5lVSdZDNOnughOkZ3
|
||||
ylLO6kFOw7Gj8zz64D3ce3yBha7T04aSMWrD9JGKTiGINDsWtG07JJkkY1M3xuXLI9zCDjwUQS3P
|
||||
IW0wbTILNKUfhebC/Q8c+ZUdUQZvgF0YAPHBq+/oLyz4L6gNJwUqLRllJ4dPXBbHUKIply6NiSaI
|
||||
FJjBDuQGZniToy0WE0tZjxPHS8pQ08QxsF0UPXmqZpEiKEcWuxQhCZOo1wRPjMuChoJIoEG8wWoj
|
||||
qGxrYCQzJ0PYoFQvr1SMx4mb4pPCJba5xnZRBaHAzVDGXpTxw/HS5Td2M3678gA++EE81Bf/dU/H
|
||||
VRHN1To5EJhSRO1Fb3d7nmmSK6sj1vsN0aAsCuzQSQbNcPgwrYlrLMwpS0slqkYbvN0SOUrvbpmm
|
||||
PVWIJW1WQje4CWop8OdC8LBlTCrVWCR33d2IDufPV0AXM0W3WbhlcoFtO3YFU0pzOjI0tZWf/q6b
|
||||
rP+/GrtMlIp3i/iLGtc/V6q6xALNe5aW1bedhVNRLBoiBa4dzl1YA4EmJsXU2T5ghi0xaYxBksVS
|
||||
4d7TizuWnE/R+eQF1M04L155OyuBSKqLMFLrc3GlqcGNtA/fBpp5iaEU+oPIysoQt24mFu0ggCg1
|
||||
LZlJLM2vYEbH+xcfO935RW4x+LdxfbvE8I2fWJtTflqsAdsgR5DZTtvB3QkhqaG4C8tXhgxHlkkT
|
||||
2+xu7ig1oRn2A07mw+ephhunTy8hO+SoBZXca9Cpm5gTLK0mgiZ6dv53SxWPkfy+bn980bQNcIdz
|
||||
F/oYYUI8227upiTYBiOSXIuiipeF/4Ksrr6y2/HbtQH44Ac/aEeOLvyEFdU4dq84ukZhAY3z7CSC
|
||||
n+xgjWskSsmomuPS5TqnuG/gQUiuG5howM3wpkTuOek5V69WoO4cX+xwfKFDaGyyNUjshjj1Sf+P
|
||||
JGJPofOM+jUBgTimUFBL3MdAg5CIdk5JVQllBzy0adwbfASQEbjSH8K5i5FGC0zrVMXYhG0c3LSI
|
||||
qncIsUB0RFOOabBGnA/drPzX9bA3rVW7/rGiGD8ngqsVmZkWd3T4DfJTspLuwrmz6zQRJq3Fr//0
|
||||
ackoM7y50dZGOIlMFQrj/vvnKEJNek+KTKvOtNxpKpUkLoB72nbGGFEN4JarQ6/mJKQS8mg7TVAr
|
||||
CJw9O6BuyNWNO2Vq5KB6K87iBQouMnjh0c87+rO3mvu/6up2j7/wrW9dC0X/Q6UJGruZslpPUiDb
|
||||
XoK3FTZOkEB/UHHx8iDXxbO5ygoyrzqwk/ZTM9ztmCqIEACjDMID9y8RtJ87+eTFgqvfm3aLmrsS
|
||||
RGdcNSkm4H5dF92BGI24kwC1g0vBuHYuXhpNNYf2qT+3OYQrrsn70DiHNpGOjv6vF37xweU9HL3d
|
||||
QUT8kftO/h+dWK2IqacyyGaH8btpCijEGClChzNnVqmjJ4rm9ES/ponmzAN40yLXTOR/ThYIM+f4
|
||||
0cA9J0toNQtT4QGQ2pcl3gqTuJVL6nswrOtJOXhxPa1KSb0CdkYDEKpGuXSlz3BYpzjFpDbAb8wk
|
||||
n/r9tgbFSDJ1XR+v33tP+aMf/OAeND1gr7YAgD1y/+fmO/W/Ualccq30TtTYfJMBSAo70QOr68bl
|
||||
K3XKELQ1re3AzdiBM7RwmZSIuyTl3qApIPj4o8coQgRPUuGqOqlzaMuv2zo2y/oNw3FSPE4iK7Z5
|
||||
qcnBwlAE6ubGQca2NM6Bxpw3zvRR7VyTNdiZB+AYgehOkJF3dP1Xjz0sv7VXw7dnBuC7vpim1x3+
|
||||
QJD1cWzcReYx306haENfL2nh5sYhBIySV99YTwahTt1nc/Ese9HxZYa7A9r20JOYNR3SllIMHrx/
|
||||
kfkFCFoTgmHe5tNlEntqa0/bfH8dPSsgXeumtxoLZr4lR8V9o2vQuYsDBgPDLQvTuEwovdsbACME
|
||||
x71DETqIrDRzOvjBb/uqx26q+ceW47dnT0IEPb7061Ks/LJLidWKSJ2ovlv/4qYbTpWoAQ1zrK83
|
||||
nD83JASwDX1wNnsBM29ghg313aABjxAk9e597NEjOKONfLq0E1uvCiArJrn9l6cy42sFNvLvmtE0
|
||||
kesJcGTKP2YpqHjm3Coi5aYmJzcTuhOJNHUHc/VoF1988LETP7UXwb+Nu947+Pe8/+FRt8O/LBVz
|
||||
C54qmLb6jcmQTT5pC5DYVk7gjbMr1I0TJ63I8uSfpf9mgKtCQFk6jTa6Dw89NM/CghKbepP4xsbK
|
||||
n3yC9LfSNIYZkwrBaaWFVrTUJx7ABplnUjYtWd06wNlzK4zHUDWOhrBR5rzTzJU4RkS0xJvaFo50
|
||||
/sULv/U/70nwr8WehtFF4NFT9/zkXFx9OWA0IekD5BKmKXYgOSATUI/JjfOC1Awj1Uwnty5wZay8
|
||||
fnGc64oclYaAZcWca96AGd5kMFJ57IZqUl4iPKkaHZ13nnj0JIV2id4hCrhWBG8oWrUVSTqEiGMW
|
||||
qMYGCo3XqSFqFqpTU0ovCHQgJhFZ16weYRCIqUdhEVkdOa+cbWhiL/VRzHqASdkqpyJ3QASqiXRo
|
||||
mIuj1xa1/t9vRfdvK+xxHk38pU/de743V/8vWoxMrOebhLB8agXPggabZJCuKgF2BNEur7y2TFUn
|
||||
aWZuqYvqDG8eTG0PBbxxnnhkiSNLRhGqrJhUJukx7DrrhzCuIkh6z1rCkEy8Bt/QiyR19GnPJQh1
|
||||
NEQDr7y+wrjaiC9sXNvNQBErKUNlwtr//ms/8+wre+n+pzPsMT74QbycG/wzZfklrTpTsk7TDKl2
|
||||
hd+arikIsXHMCl5+ZQVDiJQ5kttuA2ZbgRluABeCC93Seec7jqJ+heCOWA+nSKXrG4JruS5AGQ7H
|
||||
QNJAFJoUnHbLGpKpxX1L020l4h2IKNBhZTVy/vwqyNbl8NtBTOh6F4nLV44eiz/0wz/8jXse/d4H
|
||||
Jo344NUfOrvQqX+wQK7SA5HrbAe2jqam0uDAxUtDVlbqSbrGJr0BZpjhxkgy7pEH75/j8YcXKbye
|
||||
SMB7Kwe26R0UqrrBcgFQytu3CtVtoVAyBNOB6IlQqisvvLiM08sG4dahQKeJvtCt/82JL+l/Zq9X
|
||||
//Yce44PfvBpv+/exX8+Fwavuo2cnH7ZiJpObwW2QI6mIiXjWnnltXXqxkGTQxbZST31DG9uCCEI
|
||||
wWs+7+33cnTeUUYbb4+0P5U7OYgSG+Hych+TDiYlJh2idDHpgpaMqjgJ/WnuxkQ2EOcv1VxZiZh3
|
||||
uJXVv+2alf6OBFtfmZfq73/nF++e93897BOXVvw7v/GBV8vywg+Eztjcx45YbsPVegHTUtRbXKAm
|
||||
iqaGHpdXxpw5P6RuQENLE96fO5jh7kCNES2Jey52A1/87pP0ylWCjBDfTFVLNN9Ud3/h8hpnL66w
|
||||
vN6wMnBWBpHL6zWvnVvhtdfPbexAoyK5jdxwbLz0yirmPVzCRnzgJqGagpMqjXeL1X/+JU+d/9h+
|
||||
rP6wbwYg0YPveajzT6OPPydF7gMjTPH4d8LlT3xsV6gNNMzx6uurjEaRuk77tZkDMMMNIXkb7iXE
|
||||
EnU4daLDe959L4WMN/ouAGCpZ0HboEUDl68MeO3cCq+cW+W1s6u8dm6F1X6Nhi697lyOYwfchWjO
|
||||
q2+sMBo7aJdoIMFvumnKhpfs3sTq7PwR/sFXfdVX7dted1+rab77jz55YW4+/M8qZnVTu6hsjonu
|
||||
oHFDq8WvWmAm1BW89HKbCt2QfLpaTX0n3sUMdztyuE5SB+XUADby8ANzfOG7HqAXfNP74tLKnOdm
|
||||
MWWBhR61dKili2uP6EooSuYXMtFA06S9eGmN8xeugBYgRWpbYdt3Tp7eggiehHAIxKaSY0tzP/LI
|
||||
sXc+v1+rP+yzARARf/jU5X/R8/FnVRdoYoM6lAZKEhLdjhMx6ZFqSWik0C7LV8acuTCa9IBJraSN
|
||||
4NmKTyuxzozAmxcuhFyebpJCxkLqKPTOx7t82RfM0StrNDddi0ZSARKlUaOhJuqYFN/X3NWo4djx
|
||||
LhKE6A0GDEbGi6/1qVigVsFkjLpRxC2ahsAkq6AmlNFQGpwuTVWwoGvnTx09+wPvf/8OdPV2gX2v
|
||||
p/3uP/qFF+Z6w79bMGig56aWGiS2jQ5uxrZ5bj5iBa+8fJnVdUvulzto2KgVaNM06Zf2+xZnOMy4
|
||||
6vGnrtQQG+fhB5f4yi+/n5PHINgapTaoG+IBtS6BRdTmCd5DTQjUlKHi4QeWwKAskjrQCy9fYX3Y
|
||||
4FJMpL6u9UivRcowaGIPqhO9SwpaDuJcp/6f/uw3f94z+z08+24ARMTvvz/80Fx39BE3PGI0ajiB
|
||||
YDtZnVuyUGJQRRdUe4zHwgsvXKExR4MQHQgy6SE4owrPcD2kOn6nKNL0PLGo/K733cdTbz/OYmdE
|
||||
hxGlNxTuFA7aFKnnog3p6DqPPjTHA/f1KIJjTeT8hYpLFwcUOo/FjVZxO2ttkjwUl0hUMOmgUnuv
|
||||
c/k3Hn1o8R+K7H/V223zj//b//W5rzl/8dj/WVPMSVFLaLqolam77BbDlPL9qR03hMy3NtQboOb+
|
||||
Bzo8+dhRgiQVInXLLbVyq+6ZHXiT49qCHpn0Q3QkROpaKMrAyppx5tyAN871uby8RvSQ2pdLzdGj
|
||||
gccePc5DDy7SzQ09BusVn3hmjVHtRCkxSX0U1VOnokQeuvEaK66odYhhHVPB4zzBloenT65+8/d+
|
||||
+9t/fD/3/i121RnoZvAFp/znfn209mOX1499U4xOKAbC+Fhy6294n1e3kbIJj9ooEBHOXegzv9jj
|
||||
odNdLObATG6elNtG3K5bnOGOwGY9f7VIJyhmwpF5ZeHxRZ58ywJVc4rRKEkJzM1BpwO4EyQpAsfK
|
||||
ef6FFUZNwKTcOPrUwbev+fHMIUj6gSp96xXrP/GF9+meVvxthds2O772a99anTjiT3ek/5pbzMwL
|
||||
2yZNMgnnYeobRRu0zCylih1eeuUKl1YakM3qrTKTDJthG3jW9he31BBEaiSO6GrFscWGk8eM+bIh
|
||||
MKbQ1HMwAp97ZY0La0aUIgfzIC0809vPbRrjiCNFjVBCjN7TlbPHFtee/rqve1vFbcJtmyEi4n/u
|
||||
P37icyeOjP92EImx6nrUPtu1cJZJ1Z9hYqk1ksb8b0DmqaqCl15cZjTOQqSThg2zDMAMW0Emev+e
|
||||
NQMVodQOpZQEU4JDKUrhJTQFqsqrb/Q5c3mIFd3cqsvbiF52/ZlQg7c8u6Tuv2YBNbFOMfj+J44+
|
||||
/yy3MXJ9W5dIAf/Cdz3xz5Y64RfUupiPr6Puc3V14HQlVdu5pQ30QTTFpWRlfcTzL10kuufe8LKj
|
||||
7rAzvMmReoGnd8YV8QJigCYQYkFoAtIUSCxQlIsXx7z6xgoNSiOZpyJZdtzb9zPDp9Pc0xyYtKU1
|
||||
wCwSxL3Q+EtPPPjQ//T+97//tha43F4fWcS/9stk7Vjntf+yU5y7pPGEWy4OEhfEPfc/j8ky2xyt
|
||||
mqt6yB9FXVJk1o0gdaJwhgXOrsCzrw6oARUn0ODqmG50e0m9C9ubn0mL3f3wG34Ep4wQcqKpdeVN
|
||||
HQ+Ga8SLEY3WNAVc7EeefWmdOvbwGCjQ9D6aTgqM2imVWIVJ198RxNqfa0Dq3OhTkXgEtTPL9x4/
|
||||
819929cfW7ndo3PbN8ki4uvf+e6PzZWjv9nVtUY8uklywVIfgJAH0PIE3SaR0gq1EXAPnDm7zBtv
|
||||
9IkumGsyKm1Ulg0XDZgIRM7w5kVb5TcREpEUQFZPGpVuBWjBYBj53PMXGVcRRwihQEW2zDJNUoLi
|
||||
Od5lmSGguJfgSsl6nOvWf+/XF577ldsV+JvGgcyAD4rYk0erH+iW5/6tSoUYacWXDuZFVgprEKnY
|
||||
vmLQJ+Y7iS52ePW1y1y8OMYI2VsQwoQpuKH0Ousp8uaGQ3bjM3VMYvZC2+2mEr1kOHI++7mLDIZJ
|
||||
KETyIuXNDprfTtqPxxy7EpwC8YIQo/d0+ReeeGjuf/zQbXb9WxzYEvgn/sQXDh64r/NfFTJ8Q33s
|
||||
YJhrrqLS9DDYTlUYwDa01l1xKzHr8tzzl1m+0kz6Cohr3maQjQbMgoQztG7/hriH5Q1CwFDGDTz3
|
||||
/AqrqxHzgui5XNf8uqKgVyO5/Z5dfksdh11Rq71gePnksfB93/b1j912139yfQd1YhD/rve/45Mn
|
||||
jvDXS1mpJfZdAxuNE1uZ8B32F2y9gFSZVVJbh09/9jLLqxWWj6hXZQZmIcIZABDL+XtHJaWQXZQq
|
||||
Ci++POTi8hjXHqYF0y3Ht3fYZSIDDuRAo9BRQ+Pl5uTR+DeXX3niIwfh+rc40E2wiPh9Gv7ZQrn2
|
||||
gx1dNYlDb8t7cN1QUd3qGNmPV297C6R4QpSCygueef4iq8OGBogTAzCb+jO08NQ+LAei3ZU6ClWE
|
||||
519e4Y3za6A9atfUwp6Nd+6mYUqB4ONlX5pb/fEHH7n4j/aqw8+t4sCjYN/+7Y+P3vLEye/tFMOf
|
||||
Vh+lhbzN5bN1NVWCMJWGnfwjIkRRBk3BJz97iZV+QyJstUbAdmLCZ7jLIa0OgHver6cs0fMvr/H6
|
||||
+TVcy7QRzXL16Zd8RzyTjeUm9SYUCmgivVB/4tFTi3/pT3zNF/UP+v4P3AAA/PE/+OiVxaXyryjD
|
||||
N/A6lwZoVgGelhG7HjegRcrBptRLyxoQopQMa+FTnz3H8kqVu8dkDYGdNXib4S5GWv0te45CU8OL
|
||||
L61y5twqpl0aT+pTTmoX1qLdqN44ktxS15NngRVoxAtpLnV7xZ//k9/81tcO+t7hkBgAwEd/8m2f
|
||||
uOfY4C9143ClMPdIQxNiCpi4oiaoFYh1wYsUUNEqV/8lcREXxTNzMGRuF1Fx71HFBT7x7CoXrzSp
|
||||
TryBrjVTMYZWEEI2cQZmuLOR+kdMx39aLkhquikyxtwxD1SN8NyLQ15/YwS6AF5SiCJmiY1iiWie
|
||||
HADPLMCQAnvYxItQ1ywlPsSkRqWk03TpWjVa7Fz4y82Fx3+RQ7IPPVRv+Ic/7MUvfOr5v7Q6XPxr
|
||||
NWVJmUICky4urZQYiknMVYFb30LiFSRrHLymGxre+sRxTp/sph7wmh2OSZfZzZpCO2wDO8MhxdXv
|
||||
h2U9/xQ4bpWlCwYjeO75K1xeqXDtUecGoWpb16oYBUiNUpPe0ZTfRxrQhsag9HlC3Y+Lc2v/4PPu
|
||||
H/4X73//u24b1387HCoDAPBv/+2ZhV95Zu37V8dL39IEVS9FnDbPD3hAvEA8y4Hl4qAb3mBm/pmB
|
||||
01BITTdUPPbwPTx4/1ye4FdXbqfobY4UzHDHw6c6VWeKeI411QLDkfHsCxdZX3MaL4mETApKO/cb
|
||||
h4oErAM6wjTNafcOeDd/uwGNlHXj8+XKTz963+hb/tQ3PbV8mIJPh2ULMMHXfM39/bc8sfA9vWLt
|
||||
5zqiEAuwOfAeRplW7Dzpd1TtZxFaKy6KSZdR7PDsS5d4/pVhyuvSVhHmPaFbaiDhh9BCznBzyFx9
|
||||
y3x9wfK+PfXqWx0Yn3r2EiurkcYDjQMh1QZM7/lvePi2+k8My9WtyelQ8AKxiMiFF+875f/Zd7z/
|
||||
cE3+fJWHD3/8Dz9w6bFH5r6njMOXClOXpoP4Ah57qXxTYmIK3sz6LA6SdmaRDlHmeOWNVZ594TLj
|
||||
xjFvew0IE/Vym63/dwM8R+9NwFVpXHGBS8tjnvnsMv0RNF5iWiBaJDFP2Fg4tsDGO5jaf6eYlYGN
|
||||
KHxI2axffPj+7p/+s9/8lk8fZL7/xtd/aOHyD//l2a9+6fXBv0BO3l/ZolgA0z4qI4IHJHbyHn6L
|
||||
LUCuDmwzA5752ynvG1EZc3Spy5NPHGO+pxRKYnmZtz7g4YjWzHBrEENVaWLbBUjB4PU3Rrz22jJD
|
||||
6aTmnxLSdtFsk0jNllz//P2ohucCtkCApqYTKmhW1+85Gr7zL/+pJ//V7ZD3uhUcSg8gQfy7v/m+
|
||||
D993uvrTbq9dDKy6eHMrvVauOmp2+E0QL4l2hOU14ROfPs/y2pjGyPqCyqztwJ2PJLHtyZ0Pyjg6
|
||||
n31xlRdeXadiASgTt98Tt19y0FlM0J1qVuLgJWIdiIGCBqpLw3tPyH/z3rc++aHDOvnhUBuAxBRc
|
||||
ef4dP3nypP051eXLytCT1Jdu6K66tJ3buVaHdTNPQNqPt9ZbiASMLuM68JnPnuW1N1ZQTbJRpq1o
|
||||
ew4SXiM2eogdqDcTpplg4kkVrk35ObgLIsLKauSZz5znzPkBUbtUscDcJ63ERTZIZYkSdDX35Or3
|
||||
q61WTZ6FoIg5wcfje050/7tHl976D776q2VfWnrt2dAd9AXsBD/8wx4+c+ET37wyXPwHtRxZInQF
|
||||
NWgaCptLhB5Jqu/uiqvhWmESUSu3vM1aE31Y3Ck8UkrNiWMdnnjiKJ1CKdRTDwOPufhDNrobkfrD
|
||||
T7Ygfj3m4syH2B22SfNqhKmy8SCKRwFT0BTPsQjnLla89Moq46g5d59+I2z1eFwwSdkmNc3p6IhI
|
||||
e05wOkSJ6V0TodMMx4vFyt9679vC3/i6r3vb+KBHb3eje4jw4Q978ZHnP/2Xl1eOfqCxpTIWLhLG
|
||||
aNPND6ahjbxOOr5Klgi7AVIlmOXAjeR6gpqgY4qy4cnHT3PqRJf25dJJFDk1mMAliUfAVIup6w3p
|
||||
zAjcOnZQDwJ47jRtZqgWgKICawPjldfWuHCxD/RovNXwc1yMYFs7wYnkk+oFNnl/raaEp/Jgt5qC
|
||||
tfFir//3njq18PQ3fdMjw4Meub0Z3UOEH//x1+c/+0bzdy+sdr99LBq8Y4IV+QVopZg178dS5Zbr
|
||||
1poCLpZ/py09MkRqRGuwmgdOH+fBB5eY62X3MOUJUI8IJFFID1NHnHkAewvZ8js6pcOfhGMTtcMc
|
||||
Ll1e54VX11kfNii9lKNHspZkIofptqlkSwpVOZ3ouVANLyGXrWsUQtMfH5nr//13nu79N3fK5N96
|
||||
dA8p/q9fvLD02U/0/9bFvv3JRuc65ovS0jqROvcGENR6YB1Mr6c7ODUAnoQfWtc+qRRHnBpVINYs
|
||||
LHR57NFjnDgaCJramiXml+HewzcN48wA7C22NgDB09bP0CTnRSL2vPLGFS5cXKViHiMzSC3kbVwq
|
||||
BNPJs9/i7O64Jhff1CaTX6xDUtXv07H+eL4z/LvvOj33wTtp8m89uocYP/7R1+c/+ev9v3Jlfe57
|
||||
opyYa6wrhNSTDe0nOTHroN7BtNkmTbhhAFoyULL2bTTYUDWUmnvvmefhh5eY70IQx4lgacshwqTZ
|
||||
xAx7iauyOALujmfNvSA17oJLSWNw/mLNy6+uMRw7TqAJKWAsucBsUvc/pfqzFdQ1c/4NU7LtEArp
|
||||
QBM9yGo111n/u+/6krkPftOX31mT/9rRvYPw4Q9772OfefkvnF+T73M7ttDoglgJJqsoFWoBtV5i
|
||||
Z+14UkoWD9mA42BGJwgwpiyMRx4+xql75ihCFn9sfzu/nBuHsx20QJ9ha2x+RdvxDSFF+Gsbo6Fg
|
||||
dS3y0iurrKxEzHsYHRzNFF3f3IdStu/a255ZTIkqSSFIkuEPXuP1kI7U1Vw5+O8e/cLuX//2r358
|
||||
dNAjtfvRvcPwgQ97cfSVZ//4uXP2t03uO15RihcVImPUih0ZgOulenV6DpPSSG5GCEKhTowjjhzp
|
||||
8NBDR7jnSEFQsIlEVEs7ztuOmQHYJa59QKqpx58I9Bvn1ddWOXd+jegdzEvQMvcATBP2ei95+9zV
|
||||
tzpzIotFCThdHEWp6NAn+JXR8aXiv7+3fO1vfPu3f/UdOfmvP7p3GNxd/+4/f/7rz5wP/yjKkXui
|
||||
upg22QB0c2xgulfwhr5AKv31qa+mSdu+FOKACh4ToSQxgyJIxL2mCJH7ThgPPniKhfnOZBsgknQJ
|
||||
POsUXleDaGM5mrqZgx7N24iJpINzvddQ8qgl1fj8M1OVmmbG62dWefVczXBkIGHSndcxRB03o7Cw
|
||||
ST2i5elbihwj13gD09WgBjLMzUN64IHSR5R+af3kMfnAY+97y//0/nfJoans281juKPh7vr9/+uZ
|
||||
r3njYvP9Y7qP1CISVVCUYCE79m3bcMUpMU8uougoa8LdYIAme/t2uDZ+MB13RBHg1D2L3H96nqWF
|
||||
QMBxi5RBMAtIihag4ljb1GRikMLkMbRVahvNI7jzPYipgfU8oJuoVK3KTluBmSe5mKMqRB8SVGko
|
||||
iaZU0bm0POb1MysMBg3m81xL0Mkinw5bveKTNDDkRp06kftqdSZNa1whxiQ832n6F04fj39h7S0v
|
||||
/x8f/OqvPtQkn53grjAAAO4u//RHXv+iV14Z/r2BLX1F5YUQggQKIOYCouk0ThJyUHapxuykZiZW
|
||||
0+3CyeNz3H96kSNLiV4qEnE3Qigwm4oJtCKm0/oDfoMT3NG4emJe9R3fbFa93a9rG+wTzJw6CpeW
|
||||
B7x+Zo1BP6JFl2iaIvy7gE95Guo25ZlILhwOeHSCjF314mceOKXftfK5t/3SQWv57RXuGgMAyQj8
|
||||
4IdeOv3Sa9X/OIhHv6H2hRALlTbnK9kLEDZ6A+C7eYEktZJyQwNYHKPSUBTCsWNz3HffIkeXoFSI
|
||||
0VBN7c2nA4dXT+/r08/vVCMg1/9Kbog78XamuvKkdm+OFmDRGFbKxQsjzpzrU1VG2wDGLStA6W4M
|
||||
uOSS8lzMo2lBb5t3iBeEuksp/VjohV+47z6++89/y9s/exir+m59BO46uPzoj7509NPn7IPLq93v
|
||||
GIfFOaRMXAGmqwAbxCNOcevD4O0LJBgRDZJjBEZ0J2jk5BHnvnuPceJ4hyAykZTSvFudDlH5pGLR
|
||||
4VaVZw8b2uVdPMdWfJOqbiuaaVmM0ySRePrDyLlz65y9GKlqQ6XALY95pucKkiftrc3H1KBacbFJ
|
||||
nn8i4JnbfWk1HM3Pr/wvj769+33f8TUPL99Nk78dg7sSP/BRLy9//NPftLy+9D/UsTzlOi+RLqlu
|
||||
O6KeSEN7p/vnE7mp9v0WoGOGeEOvp5w+PcfJ4/PM9YSgNhEi0qC5Zt0xbzkI+QheHPRQ3jrEca/T
|
||||
5BdNAVLArRXYTEG4VKmbtkgXLldcuFCzfGWAuVLrRi3HRnB22mje+nxMTMJmSgcySdEHB4nm4tX5
|
||||
pSOXnz72SPhn/687gNd/q2Nw18Ld5e/98xe+4sLl/v9QxfkviXJcInOSyn9iNgC7NOiy4YJuHClF
|
||||
mcWF0BSoOmZjQqhQrTh+rMfJk0scP9qj29EkV+aO5kC3iuVZ4rgXd643II77iFAELCZ9Rs/NW1QV
|
||||
80g0pT+ouHSpz4WLA5qmoK4LQpjDXIhaM2nmeXUe3wWX3QRJHaQm+WNFytjEsXdl6BrXP3Xy2Mk/
|
||||
vfbGvb9yt+z3r4c79M26Gbj8yx/7xL2fe7X+66ujxW+JHOuZ9mQS9NnlEEzv2a/JKbuQ6KKOW4OI
|
||||
URRCY2PcI91uwbGlLidPznNkqaBXCmHCVDVUmY5W3JEQb1JJriiW23BHd9YHkUuXhly6PGZcNalk
|
||||
l4LYQAhdmmiI6CRukwc0D+vVLeRvFalll3uJeIFa4wVX6qVy5V88el/vA9/2TW9//aDHb79xZ79d
|
||||
N4EPf/jF3q+/7O+/cLn+640vPGh0QQtRLPcPDJPUj09etO0V3GzqJdwI7slEbjx1hHVElMbATQhF
|
||||
mWrQBfA1xCPdTuDoYpdjR0pOHO2xMKdpz5vsRz7qRpScTHBJte7TqcqrhAyn01rsJpw4dRHX+/pE
|
||||
I3/zD6hA06TqiiurkeXVPpeWxwxGdWqSqUeI0VEF95hSpbFBpOX6F5vO0sZJJtjmAW08w9ymi1QF
|
||||
mP4WogTEBbXGSx+eP340/q3PP60/8If/8IODWx6qOwhvGgMA8IEPfEDv/7w/+tQbr/M3Kr//9zZx
|
||||
oRPLvuAlWAf1ANIQcyPH5CVs947drAu6keVP/4o5JZi+GjRFpefnehw5UrK4YBxZ6tDrpj10J3ia
|
||||
7R7zJCkzPVbQkFxld8sfp5Dihsrm12tuaWbp67JBjWrjXiIQY9JFkFZe21PAU6RAQqBpkqGra6dq
|
||||
nMsrNaurkfX1IXWT277lKHs+wtWJwk1/y9R43SzaPL94IFiBmmIW0U6ksWHSC2iOUepa1ZVz/88D
|
||||
J/X7Ts994uPvP6BOvQeBN5UBaO/5n/xfzyyeeUP+xFq/+H/XPHi6kbGEcoiIQtMBKxBpQKqk+77l
|
||||
MO2WqHPt9rJd0c0incJwi8zNFSwtlCwulCzMdViYLygLJpPRaYNrybMQTUbFLB1PJOvbyMTWpN/x
|
||||
PAXbOe85/55/RkQ3TT7PyjkTo2JgbgxHxlq/YjCo6Q+N/mDMuIq4dieZDpWCic7qJFK6v0F1NUn8
|
||||
D4m5EYgSowAdkmk8//piJ/53954+9s/+3Pvv7R821d79xpvRAACZPfgjz33hy68d+Wuj6L/XNBQu
|
||||
iOZVv7DEDKu3FQXdWwOQJpdPKt5UQlqB3fJ+OhLEKYLSKQPduUCvK/TmCjqdkvmFTipZDkKSwZtO
|
||||
ubWU2pbplmoY0j+lHZfJ2uueDInFlJt3g/HYGI0ahsMx43GkHinDYUVVN0lRVwqib+TSjbpV7AA0
|
||||
GdnbBMEpYySqE5UUg8AhNl6gTZD4MyePvfa9o5e/5FN3c6Bv6zF6E8Pd5Z/+2MXFS5cG33FhRf+z
|
||||
hsX7Y1r0JFgSF5lQRfPEvBZ77wFMHztmoRIFNLsGqbLNMI+EwidyZSIQrSGoUhQFRQFl6YSgFIWi
|
||||
mrnvKqhk2m32Ntxy7MNTWq5pHItOVRtNjDR1JDbgrjk4FxBRrAmpd55DNCM6qIYkzgSo1BMjk7QW
|
||||
223AbXnCKBVGSaSX/z+wLlfOdsPwf3j00fv/5//0j9yzfrfl9m8Gb2oD0OIDH3C9793PveP11+2/
|
||||
6o9OfP246c2HQkW0IeTcvCA3MAL7aQBaSarNeXCmutU41wtStGs4QLy6on7y/RuV4Ux/37PWYuJP
|
||||
SFI/8g3JTCYCrTn+IJtrL3XT/V3vXvfWGLTeU1EkXoFJ1vmXxtXWh3Pl6CfvO+FPX/7cWz/zZl31
|
||||
pzEzABnuLh/6FOXLv/7s772yHr5vVB/94uhzwX1MKILARgBsM/bXAGyoGQmb+QBtcEy33KJMG40t
|
||||
7v4G33dc6w0FZnQq0t9+NlpmC9caIrmGw5DTejLV73EPMb2FaolUQfpNkIu/cs/J4m8+/sX1v3v/
|
||||
uw5Pb76DxswAXAV3l3/5i68ce+FTK986WJ//C31beEJDR9xdQlli8eoA8f4aALkOCWiavGTTe+rr
|
||||
/Kxe0/fwJq9OtnLZN1dHXre2/ppgn22WaPONasi9gJkRVBFVrBnavK68NteNf/+xI+Eff+u3vnXt
|
||||
zezuXw8zA3ADuLv805/5zP2vvnzqO1bW+t8Jnfs9BlHtikkuN52wABK7LWGqjp1p7/zqTPzVf18P
|
||||
grrmLKFcxVpsz2Gbfv5qPSPZZbXjRrny1HmmKnhaAzSZ/DfiHWwyAFP3PtlO5GuflEFMj8/msYWU
|
||||
mky0acmVe5oVfCJQuVl94cjRxX8813npn37vt33Ry7OJf33MDMA2+OEf9nCleObJc+f8O9fXjr9/
|
||||
7EsPxqLUWivQEWWsCVIglIiUNJaVafGsM5A05Sf7dkly5a2MdStjvn/Y7Xu/n9eWhVxdCdZBPOCu
|
||||
mBqWhTgTEzBMtiHJNkREUwHPGKeQHqEJlHXlXdbPLc2t/9DCUviBS9/29mc/eIi78hwGzAzADuDu
|
||||
8qEPoef91ccvX17/T9b6/q3O0YdNFjWyIIahOibakP9/e+fzW8dVxfHvOffOzHtjx46fm6SxcapQ
|
||||
qla0RUipKiEEuOoGQVElKqdLNkiV4I/IZN911a5AILqwBSyiCgmQQhaIChWVLJw0qjCGEMeuWztx
|
||||
3495b+ae08WdeS+pakrTJHbx/ayeLet57Df3zNw53/P9svGRY1TlxIvp+wY9quvc0Jyyeu+D/gmQ
|
||||
8zFcWj1kJIGQwlVjvtZFAByUyyp/z4C5gbJMoGpgqQfSrkTobKSR+/lUxD+bmX545fRpulVDHNiF
|
||||
g376fSZ8IVjijnty7r0tfXGnbX/U5WNfEbbW581W+9tbJLE+OFIA+Cs+gcBiQeJ95XU47HJA0VHi
|
||||
jjdtUTga9TEiN9Jj+/9w3XJktaSSYmszMYPXm4m8enJ6eWVhYUGo1koHPpVQAO4A9Rt+Wly8evjy
|
||||
VvuFXq/8MVzrCSfjTaEGhIXEeKsxuHE/D0CFv9pBYMSA1U+fCRd7/efsKUNDDnbwEwOAUgTVyAuh
|
||||
uOPvqFwCFqOkPVi7U4B23pmYjH/R4u6vp8e+fnVhARL2+Z+dUAA+J2fOnOH5+Z+kf39365s7veTF
|
||||
Tt9+30XN6RyOiQyi/iSBCSUVIOOgcF7UIyOB3ME+a0fBq34200Kd8VsoIpSm4wPfBBpr/2aTuucb
|
||||
jc6vHpu1f3j++cfaABAW/p0TCsBdQ2lRwdvnVh+5drX9Ql42f6AufdyWNOZgqYBRsREJAayu8iMQ
|
||||
KCz0QH8MftkLVc9FRBAzg6SEc4WqNX3m3uWJpvy2NUG/2Tx+4ko2DxcW/d3hIJ959wxVpXPn1poX
|
||||
/7H+VBTxD292i+8has3lbixxlBIANXBEVEIRHegCIESVSStVhbGrRndcbPONJOI/Mpmlw1+dvvDT
|
||||
+aOdsOjvPgf3zLsvKKmCXn/j35OXV29+g2jquV5uvivKMwSN/ZUvoaHSrt4OjBxLh4I57Kro+3j5
|
||||
oPrbo3bkHfJp2sHd1IO3vaLRu9XLdyRuqkcPHUA6MOi/nzblgjXtN07Mjl1In5tbP03haf69JBSA
|
||||
+4UqLS6Bt4u1qW5/89Qgj77T7iy6KgYAAAMVSURBVPKzOSYfJhMdHjhlZUMOBgURwF4im2gJqEJE
|
||||
YYk/Jpzxseh+OKjqkytjNHOPYTTW7ux+Cvg05Fvb6DwsNz5Yo/o9Q/2/1z4I6dBTQKr5Yy0FFgRW
|
||||
AsTBMIuWZSc12ytRUpw3pv27Yydn3/5y8/j2M8/UIonAvSYUgD2g6iLg5V9eTBMzObf5/sa3jW08
|
||||
m/fpVKnpA9CxcVDK3vde4O2EBSKln/NH3VoksKuDMXRkLHLb/ID5RDlxdST/g6OO3P7zYIzUeQLl
|
||||
vPqq0vWrAal3MyIw4ASRVSXtgbnXVe1cTWL6a1G4P7daE2+m6fjK5vIr3SzLNNzi339CAdhjVJWI
|
||||
gNde+5t1Lh53jebJm+3yayT2W4Xjp7s6frQUmoShSJwQMfuwCia/daDaWae++krVdqyeqbv/prWv
|
||||
+++7HR2hROxfDa3M62yF6um92KEymLVUFUEUWVUnjkk6MW68F1t6G1z8pZnizYlDvXfWlj/snM3m
|
||||
naI2HgoLf68IBWDfoORNOLyjz/nzMG+99fvkS088fWT1X+tPDpx91Jr40Z1O+Ti08aBqfFiVU6Ui
|
||||
AoEEPPTV93MDDAWI68H8OzkiUJWboGAVJZRgVRA5GBUv25e4AEnOyHfA/fXx1FwZDPKLNsGVh060
|
||||
Lv1z5dLGTHSo/9JLp0qtA0EAhEW/PwgFYJ+jqpRlGZ3NMl1cAl+//q4de2gqNuVg9trajZNSNmat
|
||||
jWZFda5XaEuEJpXMEVX7AJibSrCqSgolVWWu3fwIREoKrdqQPqVECSTei4gUcGK4LEmkC8gOA1uG
|
||||
5MPEmg0CrQ4Gvf/A3libebC1mkuxhi30t7auubPZvDsDUAaE2/p9TigAX1BUb9/YLy2Bl5f/RNdn
|
||||
DlGST/BTc+l4nPSn1z/Ip7p9seUgj8uitGBjVQpDQgSwgGJhZi1LBzbk4DCIk9iRiQZJ5LpHjvW3
|
||||
08ZE+/qlK/ly46gcXzulWeb3AVkGyrI68zMs9C8ioQD83/N5xo3Cog4EAoFAIBAIBAKBQCAQCAQC
|
||||
gUAgEAgEAoFAIBAIBAKBfc9HG7Ohfh+HwsgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjMtMDYtMTBU
|
||||
MDM6NTE6MjArMDA6MDBO5KctAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIzLTA2LTEwVDAzOjUxOjIx
|
||||
KzAwOjAwmc4UJQAAACh0RVh0ZGF0ZTp0aW1lc3RhbXAAMjAyMy0wNi0xMFQwMzo1MToyNSswMDow
|
||||
MDqUEekAAAAASUVORK5CYII=" />
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 38 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1689494925506" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1120" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M149.76 0C104.96 0 66.56 35.2 66.56 80V940.8c0 48 38.4 83.2 83.2 83.2h732.8c44.8 0 80-35.2 80-80V323.2L658.56 0H149.76z" fill="#DD5154" p-id="1121"></path><path d="M962.56 326.4v16h-204.8s-99.2-19.2-96-105.6c0 0 3.2 89.6 96 89.6h204.8z" fill="#6B0D12" p-id="1122"></path><path d="M329.91232 652.3904l2.31424 0.02048c21.02272 0.33792 36.81792 5.3504 47.29856 15.15008 10.9056 10.19904 16.29184 26.112 16.29184 47.60064 0 41.71776-21.63712 63.2832-64.01536 63.90272l-1.90976 0.01536h-36.43904v63.45216l-0.03072 1.2544c-0.19968 3.59424-1.23392 6.5536-3.15904 8.8064-2.2784 2.65216-5.85216 3.90144-10.5472 3.90144-4.92544 0-8.63232-1.37728-10.9056-4.28032-1.85344-2.37056-2.87744-5.2224-3.08736-8.4992l-0.03584-1.24928v-173.78816l0.02048-1.28512c0.15872-5.4784 1.34656-9.3696 3.83488-11.61728 2.44736-2.21696 6.91712-3.24608 13.58336-3.36896l1.46432-0.01536h45.32224z m407.21408 0l1.0752 0.02048c8.66304 0.33792 13.47584 4.8384 13.47584 12.86144 0 4.57216-1.30048 7.98208-4.08064 9.96864-2.26304 1.61792-5.40672 2.45248-9.43616 2.60096l-1.37216 0.0256H659.3536v59.38688l69.74464 0.00512 1.17248 0.0256c6.43072 0.26112 10.69056 2.75456 12.00128 7.20896 1.28 2.80576 1.152 5.9392-0.128 8.82688-1.37216 5.7088-5.60128 8.8064-12.0576 9.10336l-1.03936 0.0256H659.3536v81.23904l-0.03584 1.13664c-0.2048 3.31776-1.28 6.0672-3.24608 8.1408-2.29376 2.42688-6.00064 3.52768-11.0336 3.52768-4.88448 0-8.448-1.1264-10.55744-3.6352-1.7408-2.06336-2.67776-4.75136-2.8672-8.00256l-0.03072-1.24416v-176.37888l0.02048-1.20832c0.16896-4.77184 1.3312-8.2688 3.69664-10.3936 2.28864-2.06848 5.88288-3.07712 10.78272-3.2256l1.24928-0.01536h89.79456z m-233.00096 0l2.65728 0.03072c13.3888 0.3072 25.0624 2.90816 35.00544 7.8336 10.57792 5.23776 19.34336 12.42112 26.27584 21.5296 6.89664 9.0624 12.0064 19.73248 15.33952 31.98976 3.31264 12.17024 4.9664 25.15456 4.9664 38.94784 0 13.98272-1.65376 27.06432-4.9664 39.23456-3.328 12.24704-8.38656 22.95296-15.17568 32.1024a72.28416 72.28416 0 0 1-25.85088 21.69344c-9.79968 4.95104-21.26336 7.55712-34.37056 7.84896l-2.47808 0.0256H451.59936l-1.14176-0.01024c-5.84704-0.11776-9.53856-1.09056-11.24352-3.51232-1.38752-1.96096-2.06336-4.92544-2.176-8.97536l-0.01536-1.24416v-173.78816l0.02048-1.25952c0.11264-4.01408 0.78336-6.9632 2.17088-8.92416 1.6896-2.39616 5.32992-3.38944 11.136-3.5072l1.27488-0.01536h52.50048z m-5.76512 24.33024h-33.85856v152.576h41.02656c17.3568 0 30.73536-6.5024 40.3712-19.59936 9.76896-13.27104 14.69952-32.53248 14.69952-57.83552 0-24.51456-5.06368-43.18208-15.08864-56.05888-9.56928-12.288-24.51968-18.6624-45.07648-19.06176l-2.0736-0.02048z m-168.46848 0.86016h-36.43904v76.88192h36.43904c14.08 0 23.92576-3.13344 29.67552-9.23136 5.79584-6.144 8.76544-16.04096 8.76544-29.78304 0-13.6704-3.29728-23.296-9.7536-29.056-6.22592-5.5552-15.13472-8.50944-26.81856-8.79104l-1.8688-0.02048zM658.56 0L962.56 326.4h-208c-80 0-96-64-96-92.8V0z" fill="#FFFFFF" p-id="1123"></path></svg>
|
||||
|
Before Width: | Height: | Size: 3.2 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1692418843591" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4084" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M511.5 82c-236.6 0-429 192.4-429 429 0 236.5 192.5 429 429 429 236.6 0 429-192.4 429-429 0-236.5-192.4-429-429-429z m377.6 403.8H734.3c-4-139.9-41.4-259.9-97.5-331.9C776.5 203 879 332 889.1 485.8z m-402.8-349v349h-147c5.5-175.5 68.6-322.6 147-349z m0 399.4v349c-78.4-26.4-141.4-173.5-147-349h147z m50.5 349v-349h147c-5.6 175.5-68.6 322.6-147 349z m0-399.4v-349c78.4 26.4 141.4 173.5 147 349h-147zM386.3 153.9c-56.1 72-93.5 192-97.5 331.9H133.9C144.1 332 246.5 203 386.3 153.9zM133.9 536.2h154.8c4 139.9 41.4 259.9 97.5 331.9C246.5 819 144.1 690 133.9 536.2z m502.8 331.9c56.1-72 93.5-192 97.5-331.9H889C879 690 776.5 819 636.7 868.1z" fill="#5F9BEB" p-id="4085"></path></svg>
|
||||
|
Before Width: | Height: | Size: 1006 B |
|
Before Width: | Height: | Size: 572 B |
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,89 +0,0 @@
|
||||
async function embedChatbot() {
|
||||
const chatBtnId = 'fastgpt-chatbot-button';
|
||||
const chatWindowId = 'fastgpt-chatbot-window';
|
||||
const script = document.getElementById('fastgpt-iframe');
|
||||
const botSrc = script?.getAttribute('data-src');
|
||||
const primaryColor = script?.getAttribute('data-color') || '#4e83fd';
|
||||
|
||||
if (!botSrc) {
|
||||
console.error(`Can't find appid`);
|
||||
return;
|
||||
}
|
||||
if (document.getElementById(chatBtnId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const MessageIcon = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1690532785664" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4132" xmlns:xlink="http://www.w3.org/1999/xlink" ><path d="M512 32C247.04 32 32 224 32 464A410.24 410.24 0 0 0 172.48 768L160 965.12a25.28 25.28 0 0 0 39.04 22.4l168-112A528.64 528.64 0 0 0 512 896c264.96 0 480-192 480-432S776.96 32 512 32z m244.8 416l-361.6 301.76a12.48 12.48 0 0 1-19.84-12.48l59.2-233.92h-160a12.48 12.48 0 0 1-7.36-23.36l361.6-301.76a12.48 12.48 0 0 1 19.84 12.48l-59.2 233.92h160a12.48 12.48 0 0 1 8 22.08z" fill=${primaryColor} p-id="4133"></path></svg>`;
|
||||
|
||||
const CloseIcon = `<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1690535441526" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6367" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M512 1024A512 512 0 1 1 512 0a512 512 0 0 1 0 1024zM305.956571 370.395429L447.488 512 305.956571 653.604571a45.568 45.568 0 1 0 64.438858 64.438858L512 576.512l141.604571 141.531429a45.568 45.568 0 0 0 64.438858-64.438858L576.512 512l141.531429-141.604571a45.568 45.568 0 1 0-64.438858-64.438858L512 447.488 370.395429 305.956571a45.568 45.568 0 0 0-64.438858 64.438858z" fill=${primaryColor} p-id="6368"></path></svg>`;
|
||||
|
||||
const ChatBtn = document.createElement('div');
|
||||
ChatBtn.id = chatBtnId;
|
||||
ChatBtn.style.cssText =
|
||||
'position: fixed; bottom: 1rem; right: 1rem; width: 40px; height: 40px; cursor: pointer; z-index: 2147483647; transition: 0;';
|
||||
|
||||
const ChatBtnDiv = document.createElement('div');
|
||||
ChatBtnDiv.innerHTML = MessageIcon;
|
||||
|
||||
const iframe = document.createElement('iframe');
|
||||
iframe.allow = 'fullscreen;microphone';
|
||||
iframe.title = 'FastGpt Chat Window';
|
||||
iframe.id = chatWindowId;
|
||||
iframe.src = botSrc;
|
||||
|
||||
iframe.style.cssText =
|
||||
'visibility: hidden; border: none; position: fixed; flex-direction: column; justify-content: space-between; box-shadow: rgba(150, 150, 150, 0.2) 0px 10px 30px 0px, rgba(150, 150, 150, 0.2) 0px 0px 0px 1px; bottom: 4rem; right: 1rem; width: 24rem; height: 40rem; max-width: 90vw; max-height: 85vh; border-radius: 0.75rem; display: flex; z-index: 2147483647; overflow: hidden; left: unset; background-color: #F3F4F6;';
|
||||
|
||||
document.body.appendChild(iframe);
|
||||
|
||||
let chatBtnDragged = false;
|
||||
let chatBtnDown = false;
|
||||
let chatBtnMouseX;
|
||||
let chatBtnMouseY;
|
||||
ChatBtn.addEventListener('click', function () {
|
||||
if (chatBtnDragged) {
|
||||
chatBtnDragged = false;
|
||||
return;
|
||||
}
|
||||
const chatWindow = document.getElementById(chatWindowId);
|
||||
|
||||
if (!chatWindow) return;
|
||||
const visibilityVal = chatWindow.style.visibility;
|
||||
if (visibilityVal === 'hidden') {
|
||||
chatWindow.style.visibility = 'unset';
|
||||
ChatBtnDiv.innerHTML = CloseIcon;
|
||||
} else {
|
||||
chatWindow.style.visibility = 'hidden';
|
||||
ChatBtnDiv.innerHTML = MessageIcon;
|
||||
}
|
||||
});
|
||||
|
||||
ChatBtn.addEventListener('mousedown', (e) => {
|
||||
if (!chatBtnMouseX && !chatBtnMouseY) {
|
||||
chatBtnMouseX = e.clientX;
|
||||
chatBtnMouseY = e.clientY;
|
||||
}
|
||||
|
||||
chatBtnDown = true;
|
||||
});
|
||||
ChatBtn.addEventListener('mousemove', (e) => {
|
||||
if (!chatBtnDown) return;
|
||||
chatBtnDragged = true;
|
||||
const transformX = e.clientX - chatBtnMouseX;
|
||||
const transformY = e.clientY - chatBtnMouseY;
|
||||
|
||||
ChatBtn.style.transform = `translate3d(${transformX}px, ${transformY}px, 0)`;
|
||||
|
||||
e.stopPropagation();
|
||||
});
|
||||
ChatBtn.addEventListener('mouseup', (e) => {
|
||||
chatBtnDown = false;
|
||||
});
|
||||
ChatBtn.addEventListener('mouseleave', (e) => {
|
||||
chatBtnDown = false;
|
||||
});
|
||||
|
||||
ChatBtn.appendChild(ChatBtnDiv);
|
||||
document.body.appendChild(ChatBtn);
|
||||
}
|
||||
document.body.onload = embedChatbot;
|
||||
15792
client/public/js/pdf.js
64521
client/public/js/pdf.worker.js
vendored
1
client/public/js/qrcode.min.js
vendored
@@ -1,172 +0,0 @@
|
||||
{
|
||||
"App": "App",
|
||||
"Cancel": "No",
|
||||
"Confirm": "Yes",
|
||||
"Running": "Running",
|
||||
"Warning": "Warning",
|
||||
"UnKnow": "UnKnow",
|
||||
"app": {
|
||||
"Advance App TestTip": "The current application is advanced editing mode \n. If you need to switch to [simple mode], please click the save button on the left",
|
||||
"App Detail": "App Detail",
|
||||
"Chat Logs Tips": "Logs record the app's online, shared, and API conversations",
|
||||
"Chat logs": "Chat Logs",
|
||||
"Confirm Del App Tip": "Confirm to delete the app and all its chats",
|
||||
"Confirm Save App Tip": "The application may be in advanced orchestration mode, and the advanced orchestration configuration will be overwritten after saving, please confirm!",
|
||||
"Connection is invalid": "Connecting is invalid",
|
||||
"Connection type is different": "Connection type is different",
|
||||
"Copy Module Config": "Copy config",
|
||||
"Export Config Successful": "The configuration has been copied. Please check for important data",
|
||||
"Export Configs": "Export Configs",
|
||||
"Import Config": "Import Config",
|
||||
"Import Config Failed": "Failed to import the configuration, please ensure that the configuration is normal!",
|
||||
"Import Configs": "Import Configs",
|
||||
"Input Field Settings": "Input Field Settings",
|
||||
"Logs Empty": "Logs is empty",
|
||||
"Logs Message Total": "Message Count",
|
||||
"Logs Source": "Source",
|
||||
"Logs Time": "Time",
|
||||
"Logs Title": "Title",
|
||||
"My Apps": "My Apps",
|
||||
"Output Field Settings": "Output Field Settings",
|
||||
"Paste Config": "Paste Config"
|
||||
},
|
||||
"chat": {
|
||||
"Complete Response": "Complete Response",
|
||||
"Confirm to clear history": "Confirm to clear history?",
|
||||
"Exit Chat": "Exit",
|
||||
"History": "History",
|
||||
"New Chat": "New Chat",
|
||||
"You need to a chat app": "You need to a chat app",
|
||||
"logs": {
|
||||
"api": "API",
|
||||
"online": "Online Chat",
|
||||
"share": "Share",
|
||||
"test": "Test Chat "
|
||||
}
|
||||
},
|
||||
"commom": {
|
||||
"Password inconsistency": "Password inconsistency"
|
||||
},
|
||||
"common": {
|
||||
"Add": "Add",
|
||||
"Cancel": "Cancel",
|
||||
"Collect": "Collect",
|
||||
"Copy": "Copy",
|
||||
"Copy Successful": "Copy Successful",
|
||||
"Course": "",
|
||||
"Delete": "Delete",
|
||||
"Filed is repeat": "Filed is repeated",
|
||||
"Filed is repeated": "",
|
||||
"Input": "Input",
|
||||
"Output": "Output",
|
||||
"export": ""
|
||||
},
|
||||
"dataset": {
|
||||
"Confirm to delete the data": "Confirm to delete the data?",
|
||||
"Queue Desc": "This data refers to the current amount of training for the entire system. FastGPT uses queued training, and if you have too much data to train, you may need to wait for a while",
|
||||
"System Data Queue": "Data Queue"
|
||||
},
|
||||
"file": {
|
||||
"Click to download CSV template": "Click to download CSV template",
|
||||
"Create File": "Create File",
|
||||
"Create file": "Create file",
|
||||
"Drag and drop": "Drag and drop files here",
|
||||
"Fetch Url": "Fetch Url",
|
||||
"If the imported file is garbled, please convert CSV to UTF-8 encoding format": "If the imported file is garbled, please convert CSV to UTF-8 encoding format",
|
||||
"Release the mouse to upload the file": "Release the mouse to upload the file",
|
||||
"Select a maximum of 10 files": "Select a maximum of 10 files",
|
||||
"max 10": "Max 10 files",
|
||||
"select a document": "select a document",
|
||||
"support": "support {{fileExtension}} file",
|
||||
"upload error description": "Only upload multiple files or one folder at a time"
|
||||
},
|
||||
"home": {
|
||||
"AI Assistant": "AI Assistant",
|
||||
"AI Assistant Desc": "",
|
||||
"Advanced Settings": "",
|
||||
"Advanced Settings Desc": "",
|
||||
"Choice Debug": "Convenient Debugging",
|
||||
"Choice Debug Desc": "Search testing, reference modification, full conversation preview and many other debugging ways",
|
||||
"Choice Desc": "FastGPT follows the Apache License 2.0 open source protocol",
|
||||
"Choice Extension": "Infinite Extension",
|
||||
"Choice Extension Desc": "HTTP based extension, easy to achieve custom functions",
|
||||
"Choice Models": "Multiple Models",
|
||||
"Choice Models Desc": "",
|
||||
"Choice Open": "Open",
|
||||
"Choice Open Desc": "",
|
||||
"Choice QA": "QA Struceture",
|
||||
"Choice QA Desc": "The index is constructed with the structure of QA pairs, and ADAPTS to various scenarios such as Q&A and reading",
|
||||
"Choice Visual": "Visual workflow",
|
||||
"Choice Visual Desc": "Visualize modular operations, easily implement complex workflows, and make your AI no longer monolithic",
|
||||
"Community": "Community",
|
||||
"Dateset": "",
|
||||
"Dateset Desc": "",
|
||||
"Docs": "Docs",
|
||||
"FastGPT Ability": "FastGPT Ability",
|
||||
"FastGPT Desc": "FastGPT is a knowledgebase question answering system based on LLM large language model, which provides out-of-the-box data processing, model invocation and other capabilities. At the same time, workflow orchestration can be performed through Flow visualization to achieve complex Q&A scenarios!",
|
||||
"Features": "Features",
|
||||
"Footer Developer": "Developer",
|
||||
"Footer Docs": "Docs",
|
||||
"Footer FastGPT Cloud": "FastGPT Cloud",
|
||||
"Footer Feedback": "Feedback",
|
||||
"Footer Git": "Code",
|
||||
"Footer Product": "Product",
|
||||
"Footer Support": "Support",
|
||||
"Login": "Login",
|
||||
"Open": "",
|
||||
"OpenAPI": "OpenAPI",
|
||||
"OpenAPI Desc": "",
|
||||
"Quickly build AI question and answer library": "Quickly build AI question and answer library",
|
||||
"Start Now": "Start Now",
|
||||
"Visual AI orchestration": "Visual AI orchestration",
|
||||
"Why FastGPT": "",
|
||||
"desc": "",
|
||||
"slogan": ""
|
||||
},
|
||||
"navbar": {
|
||||
"Account": "Account",
|
||||
"Apps": "Apps",
|
||||
"Chat": "Chat",
|
||||
"Datasets": "DataSets",
|
||||
"Store": "Store",
|
||||
"Tools": "Tools"
|
||||
},
|
||||
"user": {
|
||||
"Account": "Account",
|
||||
"Amount of earnings": "Earnings",
|
||||
"Amount of inviter": "Inviter",
|
||||
"Application Name": "Application Name",
|
||||
"Avatar": "Avatar",
|
||||
"Balance": "Balance",
|
||||
"Bill Detail": "Bill Detail",
|
||||
"Change": "Change",
|
||||
"Copy invite url": "Copy invitation link",
|
||||
"Invite Url": "Invite Url",
|
||||
"Invite url tip": "Friends who register through this link will be permanently bound to you, and you will get a certain balance reward when they recharge. In addition, when friends register with their mobile phone number, you will get 5 yuan reward immediately.",
|
||||
"Notice": "Notice",
|
||||
"Old password is error": "Old password is error",
|
||||
"OpenAI Account Setting": "OpenAI Account Setting",
|
||||
"Password": "Password",
|
||||
"Pay": "Pay",
|
||||
"Personal Information": "Personal",
|
||||
"Promotion": "Promotion",
|
||||
"Promotion Rate": "Promotion Rate",
|
||||
"Promotion Record": "Promotion",
|
||||
"Promotion rate tip": "You will be rewarded with a percentage of the balance when your friends top up",
|
||||
"Recharge Record": "Recharge",
|
||||
"Replace": "Replace",
|
||||
"Set OpenAI Account Failed": "Set OpenAI account failed",
|
||||
"Sign Out": "Sign Out",
|
||||
"Source": "Source",
|
||||
"Time": "Time",
|
||||
"Total Amount": "Total Amount",
|
||||
"Update Password": "Update Password",
|
||||
"Update password failed": "Update password failed",
|
||||
"Update password succseful": "Update password succseful",
|
||||
"Usage Record": "Usage",
|
||||
"promotion": {
|
||||
"pay": "",
|
||||
"register": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,172 +0,0 @@
|
||||
{
|
||||
"App": "应用",
|
||||
"Cancel": "取消",
|
||||
"Confirm": "确认",
|
||||
"Running": "运行中",
|
||||
"Warning": "提示",
|
||||
"UnKnow": "未知",
|
||||
"app": {
|
||||
"Advance App TestTip": "当前应用为高级编排模式\n如需切换为【简易模式】请点击左侧保存按键",
|
||||
"App Detail": "应用详情",
|
||||
"Chat Logs Tips": "日志会记录该应用的在线、分享和 API 对话记录",
|
||||
"Chat logs": "对话日志",
|
||||
"Confirm Del App Tip": "确认删除该应用及其所有聊天记录?",
|
||||
"Confirm Save App Tip": "该应用可能为高级编排模式,保存后将会覆盖高级编排配置,请确认!",
|
||||
"Connection is invalid": "连接无效",
|
||||
"Connection type is different": "连接的类型不一致",
|
||||
"Copy Module Config": "复制配置",
|
||||
"Export Config Successful": "已复制配置,请注意检查是否有重要数据",
|
||||
"Export Configs": "导出配置",
|
||||
"Import Config": "导入配置",
|
||||
"Import Config Failed": "导入配置失败,请确保配置正常!",
|
||||
"Import Configs": "导入配置",
|
||||
"Input Field Settings": "输入字段编辑",
|
||||
"Logs Empty": "还没有日志噢~",
|
||||
"Logs Message Total": "消息总数",
|
||||
"Logs Source": "来源",
|
||||
"Logs Time": "时间",
|
||||
"Logs Title": "标题",
|
||||
"My Apps": "我的应用",
|
||||
"Output Field Settings": "输出字段编辑",
|
||||
"Paste Config": "粘贴配置"
|
||||
},
|
||||
"chat": {
|
||||
"Complete Response": "完整响应",
|
||||
"Confirm to clear history": "确认清空该应用的聊天记录?",
|
||||
"Exit Chat": "退出聊天",
|
||||
"History": "记录",
|
||||
"New Chat": "新对话",
|
||||
"You need to a chat app": "你需要创建一个应用",
|
||||
"logs": {
|
||||
"api": "API 调用",
|
||||
"online": "在线使用",
|
||||
"share": "外部链接调用",
|
||||
"test": "测试"
|
||||
}
|
||||
},
|
||||
"commom": {
|
||||
"Password inconsistency": "两次密码不一致"
|
||||
},
|
||||
"common": {
|
||||
"Add": "添加",
|
||||
"Cancel": "取消",
|
||||
"Collect": "收藏",
|
||||
"Copy": "复制",
|
||||
"Copy Successful": "复制成功",
|
||||
"Course": "",
|
||||
"Delete": "删除",
|
||||
"Filed is repeat": "",
|
||||
"Filed is repeated": "字段重复了",
|
||||
"Input": "输入",
|
||||
"Output": "输出",
|
||||
"export": ""
|
||||
},
|
||||
"dataset": {
|
||||
"Confirm to delete the data": "确认删除该数据?",
|
||||
"Queue Desc": "该数据是指整个系统当前待训练的数量。FastGPT 采用排队训练的方式,如果待训练的数据过多,可能需要等待一段时间",
|
||||
"System Data Queue": "排队长度"
|
||||
},
|
||||
"file": {
|
||||
"Click to download CSV template": "点击下载 CSV 模板",
|
||||
"Create File": "创建新文件",
|
||||
"Create file": "创建文件",
|
||||
"Drag and drop": "拖拽文件至此",
|
||||
"Fetch Url": "链接读取",
|
||||
"If the imported file is garbled, please convert CSV to UTF-8 encoding format": "如果导入文件乱码,请将 CSV 转成 UTF-8 编码格式",
|
||||
"Release the mouse to upload the file": "松开鼠标上传文件",
|
||||
"Select a maximum of 10 files": "最多选择10个文件",
|
||||
"max 10": "最多选择 10 个文件",
|
||||
"select a document": "选择文件",
|
||||
"support": "支持 {{fileExtension}} 文件",
|
||||
"upload error description": "单次只支持上传多个文件或者一个文件夹"
|
||||
},
|
||||
"home": {
|
||||
"AI Assistant": "AI 客服",
|
||||
"AI Assistant Desc": "无论对内还是对外,AI 将 24 小时为您的用户提供服务",
|
||||
"Advanced Settings": "高级编排",
|
||||
"Advanced Settings Desc": "基于 Flow 的流程编排模式,让你的 AI 轻松实现数据库查询、IO 操作、联网通信等扩展能力",
|
||||
"Choice Debug": "调试便捷",
|
||||
"Choice Debug Desc": "拥有搜索测试、引用修改、完整对话预览等多种调试途径",
|
||||
"Choice Desc": "",
|
||||
"Choice Extension": "无限扩展",
|
||||
"Choice Extension Desc": "基于 HTTP 实现扩展,轻松实现定制功能",
|
||||
"Choice Models": "支持多种模型",
|
||||
"Choice Models Desc": "支持 GPT、Claude、文心一言等多模型",
|
||||
"Choice Open": "更开放",
|
||||
"Choice Open Desc": "FastGPT 遵循 Apache License 2.0 开源协议",
|
||||
"Choice QA": "独特的 QA 结构",
|
||||
"Choice QA Desc": "采用 QA 对的结构构建索引,适应问答、阅读等多种场景",
|
||||
"Choice Visual": "可视化工作流",
|
||||
"Choice Visual Desc": "可视化模块操作,轻松实现复杂工作流,让你的 AI 不再单一",
|
||||
"Community": "社区",
|
||||
"Dateset": "自动数据预处理",
|
||||
"Dateset Desc": "提供手动输入、直接分段、LLM 自动处理和 CSV 等多种数据导入途径",
|
||||
"Docs": "文档",
|
||||
"FastGPT Ability": "FastGPT 能力",
|
||||
"FastGPT Desc": "FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!",
|
||||
"Features": "特点",
|
||||
"Footer Developer": "开发者",
|
||||
"Footer Docs": "文档",
|
||||
"Footer FastGPT Cloud": "FastGPT 线上服务",
|
||||
"Footer Feedback": "反馈",
|
||||
"Footer Git": "源码",
|
||||
"Footer Product": "产品",
|
||||
"Footer Support": "支持",
|
||||
"Login": "登录",
|
||||
"Open": "",
|
||||
"OpenAPI": "OpenAPI",
|
||||
"OpenAPI Desc": "与 GPT API 一致的对外接口,助你轻松接入已有应用",
|
||||
"Quickly build AI question and answer library": "快速搭建 AI 问答系统",
|
||||
"Start Now": "立即开始",
|
||||
"Visual AI orchestration": "可视化 AI 编排",
|
||||
"Why FastGPT": "为什么选择 FastGPT",
|
||||
"desc": "基于 LLM 大模型的 AI 知识库问答平台",
|
||||
"slogan": "让 AI 更懂你的知识"
|
||||
},
|
||||
"navbar": {
|
||||
"Account": "账号",
|
||||
"Apps": "应用",
|
||||
"Chat": "聊天",
|
||||
"Datasets": "知识库",
|
||||
"Store": "应用市场",
|
||||
"Tools": "工具"
|
||||
},
|
||||
"user": {
|
||||
"Account": "账号",
|
||||
"Amount of earnings": "收益(¥)",
|
||||
"Amount of inviter": "累计邀请人数",
|
||||
"Application Name": "应用名",
|
||||
"Avatar": "头像",
|
||||
"Balance": "余额",
|
||||
"Bill Detail": "账单详情",
|
||||
"Change": "变更",
|
||||
"Copy invite url": "复制邀请链接",
|
||||
"Invite Url": "邀请链接",
|
||||
"Invite url tip": "通过该链接注册的好友将永久与你绑定,其充值时你会获得一定余额奖励。\n此外,好友使用手机号注册时,你将立即获得 5 元奖励。",
|
||||
"Notice": "通知",
|
||||
"Old password is error": "旧密码错误",
|
||||
"OpenAI Account Setting": "OpenAI 账号配置",
|
||||
"Password": "密码",
|
||||
"Pay": "充值",
|
||||
"Personal Information": "个人信息",
|
||||
"Promotion": "",
|
||||
"Promotion Rate": "返现比例",
|
||||
"Promotion Record": "推广记录",
|
||||
"Promotion rate tip": "好友充值时你将获得一定比例的余额奖励",
|
||||
"Recharge Record": "充值记录",
|
||||
"Replace": "更换",
|
||||
"Set OpenAI Account Failed": "设置 OpenAI 账号异常",
|
||||
"Sign Out": "登出",
|
||||
"Source": "来源",
|
||||
"Time": "时间",
|
||||
"Total Amount": "总金额",
|
||||
"Update Password": "修改密码",
|
||||
"Update password failed": "修改密码异常",
|
||||
"Update password succseful": "修改密码成功",
|
||||
"Usage Record": "使用记录",
|
||||
"promotion": {
|
||||
"pay": "好友充值",
|
||||
"register": "好友注册"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
import { GET, POST, DELETE, PUT } from './request';
|
||||
import type { AppSchema } from '@/types/mongoSchema';
|
||||
import type { AppListItemType, AppUpdateParams } from '@/types/app';
|
||||
import { RequestPaging } from '../types/index';
|
||||
import type { Props as CreateAppProps } from '@/pages/api/app/create';
|
||||
import { addDays } from 'date-fns';
|
||||
|
||||
/**
|
||||
* 获取模型列表
|
||||
*/
|
||||
export const getMyModels = () => GET<AppListItemType[]>('/app/myApps');
|
||||
|
||||
/**
|
||||
* 创建一个模型
|
||||
*/
|
||||
export const postCreateApp = (data: CreateAppProps) => POST<string>('/app/create', data);
|
||||
|
||||
/**
|
||||
* 根据 ID 删除模型
|
||||
*/
|
||||
export const delModelById = (id: string) => DELETE(`/app/del?appId=${id}`);
|
||||
|
||||
/**
|
||||
* 根据 ID 获取模型
|
||||
*/
|
||||
export const getModelById = (id: string) => GET<AppSchema>(`/app/detail?appId=${id}`);
|
||||
|
||||
/**
|
||||
* 根据 ID 更新模型
|
||||
*/
|
||||
export const putAppById = (id: string, data: AppUpdateParams) =>
|
||||
PUT(`/app/update?appId=${id}`, data);
|
||||
|
||||
/* 共享市场 */
|
||||
/**
|
||||
* 获取共享市场模型
|
||||
*/
|
||||
export const getShareModelList = (data: { searchText?: string } & RequestPaging) =>
|
||||
POST(`/app/share/getModels`, data);
|
||||
|
||||
/**
|
||||
* 收藏/取消收藏模型
|
||||
*/
|
||||
export const triggerModelCollection = (appId: string) =>
|
||||
POST<number>(`/app/share/collection?appId=${appId}`);
|
||||
|
||||
// ====================== data
|
||||
export const getAppTotalUsage = (data: { appId: string }) =>
|
||||
POST<{ date: String; total: number }[]>(`/app/data/totalUsage`, {
|
||||
...data,
|
||||
start: addDays(new Date(), -13),
|
||||
end: addDays(new Date(), 1)
|
||||
}).then((res) => (res.length === 0 ? [{ date: new Date(), total: 0 }] : res));
|
||||
|
||||
export const getAppChatLogs = (data: RequestPaging & { appId: string }) =>
|
||||
POST(`/chat/getChatLogs`, data);
|
||||
@@ -1,66 +0,0 @@
|
||||
import { GET, POST, DELETE, PUT } from './request';
|
||||
import type { ChatHistoryItemType } from '@/types/chat';
|
||||
import type { InitChatResponse, InitShareChatResponse } from './response/chat';
|
||||
import { RequestPaging } from '../types/index';
|
||||
import type { OutLinkSchema } from '@/types/mongoSchema';
|
||||
import type { ShareChatEditType } from '@/types/app';
|
||||
import type { Props as UpdateHistoryProps } from '@/pages/api/chat/history/updateChatHistory';
|
||||
|
||||
/**
|
||||
* 获取初始化聊天内容
|
||||
*/
|
||||
export const getInitChatSiteInfo = (data: { appId: string; chatId?: string }) =>
|
||||
GET<InitChatResponse>(`/chat/init`, data);
|
||||
|
||||
/**
|
||||
* 获取历史记录
|
||||
*/
|
||||
export const getChatHistory = (data: RequestPaging & { appId?: string }) =>
|
||||
POST<ChatHistoryItemType[]>('/chat/history/getHistory', data);
|
||||
|
||||
/**
|
||||
* 删除一条历史记录
|
||||
*/
|
||||
export const delChatHistoryById = (chatId: string) => DELETE(`/chat/removeHistory`, { chatId });
|
||||
/**
|
||||
* clear all history by appid
|
||||
*/
|
||||
export const clearChatHistoryByAppId = (appId: string) => DELETE(`/chat/removeHistory`, { appId });
|
||||
|
||||
/**
|
||||
* 删除一句对话
|
||||
*/
|
||||
export const delChatRecordById = (data: { chatId: string; contentId: string }) =>
|
||||
DELETE(`/chat/delChatRecordByContentId`, data);
|
||||
|
||||
/**
|
||||
* 修改历史记录: 标题/置顶
|
||||
*/
|
||||
export const putChatHistory = (data: UpdateHistoryProps) =>
|
||||
PUT('/chat/history/updateChatHistory', data);
|
||||
|
||||
/**
|
||||
* 初始化分享聊天
|
||||
*/
|
||||
export const initShareChatInfo = (data: { shareId: string }) =>
|
||||
GET<InitShareChatResponse>(`/chat/shareChat/init`, data);
|
||||
|
||||
/**
|
||||
* create a shareChat
|
||||
*/
|
||||
export const createShareChat = (
|
||||
data: ShareChatEditType & {
|
||||
appId: string;
|
||||
}
|
||||
) => POST<string>(`/chat/shareChat/create`, data);
|
||||
|
||||
/**
|
||||
* get shareChat
|
||||
*/
|
||||
export const getShareChatList = (appId: string) =>
|
||||
GET<OutLinkSchema[]>(`/chat/shareChat/list`, { appId });
|
||||
|
||||
/**
|
||||
* delete a shareChat
|
||||
*/
|
||||
export const delShareChatById = (id: string) => DELETE(`/chat/shareChat/delete?id=${id}`);
|
||||
@@ -1,115 +0,0 @@
|
||||
import { sseResponseEventEnum, TaskResponseKeyEnum } from '@/constants/chat';
|
||||
import { getErrText } from '@/utils/tools';
|
||||
import { parseStreamChunk, SSEParseData } from '@/utils/sse';
|
||||
import type { ChatHistoryItemResType } from '@/types/chat';
|
||||
import { StartChatFnProps } from '@/components/ChatBox';
|
||||
import { getToken } from '@/utils/user';
|
||||
|
||||
interface StreamFetchProps {
|
||||
url?: string;
|
||||
data: Record<string, any>;
|
||||
onMessage: StartChatFnProps['generatingMessage'];
|
||||
abortSignal: AbortController;
|
||||
}
|
||||
export const streamFetch = ({
|
||||
url = '/api/openapi/v1/chat/completions',
|
||||
data,
|
||||
onMessage,
|
||||
abortSignal
|
||||
}: StreamFetchProps) =>
|
||||
new Promise<{
|
||||
responseText: string;
|
||||
[TaskResponseKeyEnum.responseData]: ChatHistoryItemResType[];
|
||||
}>(async (resolve, reject) => {
|
||||
try {
|
||||
const response = await window.fetch(url, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
token: getToken()
|
||||
},
|
||||
signal: abortSignal.signal,
|
||||
body: JSON.stringify({
|
||||
...data,
|
||||
detail: true,
|
||||
stream: true
|
||||
})
|
||||
});
|
||||
|
||||
if (!response?.body) {
|
||||
throw new Error('Request Error');
|
||||
}
|
||||
|
||||
const reader = response.body?.getReader();
|
||||
|
||||
// response data
|
||||
let responseText = '';
|
||||
let errMsg = '';
|
||||
let responseData: ChatHistoryItemResType[] = [];
|
||||
|
||||
const parseData = new SSEParseData();
|
||||
|
||||
const read = async () => {
|
||||
try {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) {
|
||||
if (response.status === 200 && !errMsg) {
|
||||
return resolve({
|
||||
responseText,
|
||||
responseData
|
||||
});
|
||||
} else {
|
||||
return reject({
|
||||
message: errMsg || '响应过程出现异常~',
|
||||
responseText
|
||||
});
|
||||
}
|
||||
}
|
||||
const chunkResponse = parseStreamChunk(value);
|
||||
|
||||
chunkResponse.forEach((item) => {
|
||||
// parse json data
|
||||
const { eventName, data } = parseData.parse(item);
|
||||
|
||||
if (!eventName || !data) return;
|
||||
|
||||
if (eventName === sseResponseEventEnum.answer && data !== '[DONE]') {
|
||||
const answer: string = data?.choices?.[0]?.delta?.content || '';
|
||||
onMessage({ text: answer });
|
||||
responseText += answer;
|
||||
} else if (
|
||||
eventName === sseResponseEventEnum.moduleStatus &&
|
||||
data?.name &&
|
||||
data?.status
|
||||
) {
|
||||
onMessage(data);
|
||||
} else if (
|
||||
eventName === sseResponseEventEnum.appStreamResponse &&
|
||||
Array.isArray(data)
|
||||
) {
|
||||
responseData = data;
|
||||
} else if (eventName === sseResponseEventEnum.error) {
|
||||
errMsg = getErrText(data, '流响应错误');
|
||||
}
|
||||
});
|
||||
read();
|
||||
} catch (err: any) {
|
||||
if (err?.message === 'The user aborted a request.') {
|
||||
return resolve({
|
||||
responseText,
|
||||
responseData
|
||||
});
|
||||
}
|
||||
reject({
|
||||
responseText,
|
||||
message: getErrText(err, '请求异常')
|
||||
});
|
||||
}
|
||||
};
|
||||
read();
|
||||
} catch (err: any) {
|
||||
console.log(err, 'fetch error');
|
||||
|
||||
reject(getErrText(err, '请求异常'));
|
||||
}
|
||||
});
|
||||
@@ -1,16 +0,0 @@
|
||||
import { GET, POST, DELETE } from './request';
|
||||
import { UserOpenApiKey } from '@/types/openapi';
|
||||
/**
|
||||
* crete a api key
|
||||
*/
|
||||
export const createAOpenApiKey = () => POST<string>('/openapi/postKey');
|
||||
|
||||
/**
|
||||
* get api keys
|
||||
*/
|
||||
export const getOpenApiKeys = () => GET<UserOpenApiKey[]>('/openapi/getKeys');
|
||||
|
||||
/**
|
||||
* delete api by id
|
||||
*/
|
||||
export const delOpenApiById = (id: string) => DELETE(`/openapi/delKey?id=${id}`);
|
||||
@@ -1,6 +0,0 @@
|
||||
import { GET, POST, PUT, DELETE } from '../request';
|
||||
|
||||
import type { FetchResultItem } from '@/types/plugin';
|
||||
|
||||
export const fetchUrls = (urlList: string[]) =>
|
||||
POST<FetchResultItem[]>(`/plugins/urlFetch`, { urlList });
|
||||
@@ -1,96 +0,0 @@
|
||||
import { GET, POST, PUT, DELETE } from '../request';
|
||||
import type { KbItemType, KbListItemType } from '@/types/plugin';
|
||||
import { RequestPaging } from '@/types/index';
|
||||
import { TrainingModeEnum } from '@/constants/plugin';
|
||||
import {
|
||||
Props as PushDataProps,
|
||||
Response as PushDateResponse
|
||||
} from '@/pages/api/openapi/kb/pushData';
|
||||
import {
|
||||
Props as SearchTestProps,
|
||||
Response as SearchTestResponse
|
||||
} from '@/pages/api/openapi/kb/searchTest';
|
||||
import { Response as KbDataItemType } from '@/pages/api/plugins/kb/data/getDataById';
|
||||
import { Props as UpdateDataProps } from '@/pages/api/openapi/kb/updateData';
|
||||
|
||||
export type KbUpdateParams = {
|
||||
id: string;
|
||||
name: string;
|
||||
tags: string;
|
||||
avatar: string;
|
||||
};
|
||||
|
||||
/* knowledge base */
|
||||
export const getKbList = () => GET<KbListItemType[]>(`/plugins/kb/list`);
|
||||
|
||||
export const getKbById = (id: string) => GET<KbItemType>(`/plugins/kb/detail?id=${id}`);
|
||||
|
||||
export const postCreateKb = (data: { name: string }) => POST<string>(`/plugins/kb/create`, data);
|
||||
|
||||
export const putKbById = (data: KbUpdateParams) => PUT(`/plugins/kb/update`, data);
|
||||
|
||||
export const delKbById = (id: string) => DELETE(`/plugins/kb/delete?id=${id}`);
|
||||
|
||||
/* kb data */
|
||||
type GetKbDataListProps = RequestPaging & {
|
||||
kbId: string;
|
||||
searchText: string;
|
||||
};
|
||||
export const getKbDataList = (data: GetKbDataListProps) =>
|
||||
POST(`/plugins/kb/data/getDataList`, data);
|
||||
|
||||
/**
|
||||
* 获取导出数据(不分页)
|
||||
*/
|
||||
export const getExportDataList = (kbId: string) =>
|
||||
GET<[string, string, string][]>(
|
||||
`/plugins/kb/data/exportModelData`,
|
||||
{ kbId },
|
||||
{
|
||||
timeout: 600000
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* 获取模型正在拆分数据的数量
|
||||
*/
|
||||
export const getTrainingData = (data: { kbId: string; init: boolean }) =>
|
||||
POST<{
|
||||
qaListLen: number;
|
||||
vectorListLen: number;
|
||||
}>(`/plugins/kb/data/getTrainingData`, data);
|
||||
|
||||
/* get length of system training queue */
|
||||
export const getTrainingQueueLen = () => GET<number>(`/plugins/kb/data/getQueueLen`);
|
||||
|
||||
export const getKbDataItemById = (dataId: string) =>
|
||||
GET<KbDataItemType>(`/plugins/kb/data/getDataById`, { dataId });
|
||||
|
||||
/**
|
||||
* 直接push数据
|
||||
*/
|
||||
export const postKbDataFromList = (data: PushDataProps) =>
|
||||
POST<PushDateResponse>(`/openapi/kb/pushData`, data);
|
||||
|
||||
/**
|
||||
* 更新一条数据
|
||||
*/
|
||||
export const putKbDataById = (data: UpdateDataProps) => PUT('/openapi/kb/updateData', data);
|
||||
/**
|
||||
* 删除一条知识库数据
|
||||
*/
|
||||
export const delOneKbDataByDataId = (dataId: string) =>
|
||||
DELETE(`/openapi/kb/delDataById?dataId=${dataId}`);
|
||||
|
||||
/**
|
||||
* 拆分数据
|
||||
*/
|
||||
export const postSplitData = (data: {
|
||||
kbId: string;
|
||||
chunks: string[];
|
||||
prompt: string;
|
||||
mode: `${TrainingModeEnum}`;
|
||||
}) => POST(`/openapi/text/pushData`, data);
|
||||
|
||||
export const searchText = (data: SearchTestProps) =>
|
||||
POST<SearchTestResponse>(`/openapi/kb/searchTest`, data);
|
||||
@@ -1,127 +0,0 @@
|
||||
import axios, { Method, InternalAxiosRequestConfig, AxiosResponse } from 'axios';
|
||||
import { clearToken, getToken } from '@/utils/user';
|
||||
import { TOKEN_ERROR_CODE } from '@/service/errorCode';
|
||||
|
||||
interface ConfigType {
|
||||
headers?: { [key: string]: string };
|
||||
hold?: boolean;
|
||||
timeout?: number;
|
||||
}
|
||||
interface ResponseDataType {
|
||||
code: number;
|
||||
message: string;
|
||||
data: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求开始
|
||||
*/
|
||||
function requestStart(config: InternalAxiosRequestConfig): InternalAxiosRequestConfig {
|
||||
if (config.headers) {
|
||||
config.headers.token = getToken();
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求成功,检查请求头
|
||||
*/
|
||||
function responseSuccess(response: AxiosResponse<ResponseDataType>) {
|
||||
return response;
|
||||
}
|
||||
/**
|
||||
* 响应数据检查
|
||||
*/
|
||||
function checkRes(data: ResponseDataType) {
|
||||
if (data === undefined) {
|
||||
console.log('error->', data, 'data is empty');
|
||||
return Promise.reject('服务器异常');
|
||||
} else if (data.code < 200 || data.code >= 400) {
|
||||
return Promise.reject(data);
|
||||
}
|
||||
return data.data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 响应错误
|
||||
*/
|
||||
function responseError(err: any) {
|
||||
console.log('error->', '请求错误', err);
|
||||
|
||||
if (!err) {
|
||||
return Promise.reject({ message: '未知错误' });
|
||||
}
|
||||
if (typeof err === 'string') {
|
||||
return Promise.reject({ message: err });
|
||||
}
|
||||
// 有报错响应
|
||||
if (err?.code in TOKEN_ERROR_CODE) {
|
||||
clearToken();
|
||||
window.location.replace(
|
||||
`/login?lastRoute=${encodeURIComponent(location.pathname + location.search)}`
|
||||
);
|
||||
return Promise.reject({ message: 'token过期,重新登录' });
|
||||
}
|
||||
if (err?.response?.data) {
|
||||
return Promise.reject(err?.response?.data);
|
||||
}
|
||||
return Promise.reject(err);
|
||||
}
|
||||
|
||||
/* 创建请求实例 */
|
||||
const instance = axios.create({
|
||||
timeout: 60000, // 超时时间
|
||||
headers: {
|
||||
'content-type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
/* 请求拦截 */
|
||||
instance.interceptors.request.use(requestStart, (err) => Promise.reject(err));
|
||||
/* 响应拦截 */
|
||||
instance.interceptors.response.use(responseSuccess, (err) => Promise.reject(err));
|
||||
|
||||
function request(url: string, data: any, config: ConfigType, method: Method): any {
|
||||
/* 去空 */
|
||||
for (const key in data) {
|
||||
if (data[key] === null || data[key] === undefined) {
|
||||
delete data[key];
|
||||
}
|
||||
}
|
||||
|
||||
return instance
|
||||
.request({
|
||||
baseURL: '/api',
|
||||
url,
|
||||
method,
|
||||
data: ['POST', 'PUT'].includes(method) ? data : null,
|
||||
params: !['POST', 'PUT'].includes(method) ? data : null,
|
||||
...config // 用户自定义配置,可以覆盖前面的配置
|
||||
})
|
||||
.then((res) => checkRes(res.data))
|
||||
.catch((err) => responseError(err));
|
||||
}
|
||||
|
||||
/**
|
||||
* api请求方式
|
||||
* @param {String} url
|
||||
* @param {Any} params
|
||||
* @param {Object} config
|
||||
* @returns
|
||||
*/
|
||||
export function GET<T>(url: string, params = {}, config: ConfigType = {}): Promise<T> {
|
||||
return request(url, params, config, 'GET');
|
||||
}
|
||||
|
||||
export function POST<T>(url: string, data = {}, config: ConfigType = {}): Promise<T> {
|
||||
return request(url, data, config, 'POST');
|
||||
}
|
||||
|
||||
export function PUT<T>(url: string, data = {}, config: ConfigType = {}): Promise<T> {
|
||||
return request(url, data, config, 'PUT');
|
||||
}
|
||||
|
||||
export function DELETE<T>(url: string, data = {}, config: ConfigType = {}): Promise<T> {
|
||||
return request(url, data, config, 'DELETE');
|
||||
}
|
||||
6
client/src/api/response/app.d.ts
vendored
@@ -1,6 +0,0 @@
|
||||
import { AppListItemType } from '@/types/app';
|
||||
|
||||
export type AppListResponse = {
|
||||
myApps: AppListItemType[];
|
||||
myCollectionApps: AppListItemType[];
|
||||
};
|
||||
25
client/src/api/response/chat.d.ts
vendored
@@ -1,25 +0,0 @@
|
||||
import type { AppSchema } from '@/types/mongoSchema';
|
||||
import type { ChatItemType } from '@/types/chat';
|
||||
import { VariableItemType } from '@/types/app';
|
||||
|
||||
export interface InitChatResponse {
|
||||
chatId: string;
|
||||
appId: string;
|
||||
app: {
|
||||
variableModules?: VariableItemType[];
|
||||
welcomeText?: string;
|
||||
chatModels?: string[];
|
||||
name: string;
|
||||
avatar: string;
|
||||
intro: string;
|
||||
canUse?: boolean;
|
||||
};
|
||||
title: string;
|
||||
variables: Record<string, any>;
|
||||
history: ChatItemType[];
|
||||
}
|
||||
|
||||
export interface InitShareChatResponse {
|
||||
userAvatar: string;
|
||||
app: InitChatResponse['app'];
|
||||
}
|
||||
13
client/src/api/response/user.d.ts
vendored
@@ -1,13 +0,0 @@
|
||||
import type { UserType } from '@/types/user';
|
||||
import type { PromotionRecordSchema } from '@/types/mongoSchema';
|
||||
export interface ResLogin {
|
||||
user: UserType;
|
||||
token: string;
|
||||
}
|
||||
|
||||
export interface PromotionRecordType {
|
||||
_id: PromotionRecordSchema['_id'];
|
||||
type: PromotionRecordSchema['type'];
|
||||
createTime: PromotionRecordSchema['createTime'];
|
||||
amount: PromotionRecordSchema['amount'];
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
import { GET, POST } from './request';
|
||||
|
||||
export const textCensor = (data: { text: string }) =>
|
||||
POST<{ code?: number; message: string }>('/plugins/censor/text_baidu', data).then((res) => {
|
||||
if (res?.code === 5000) {
|
||||
return Promise.reject(res.message);
|
||||
}
|
||||
});
|
||||
@@ -1,121 +0,0 @@
|
||||
import axios, { Method, InternalAxiosRequestConfig, AxiosResponse } from 'axios';
|
||||
import { baseUrl } from '../../service/ai/openai';
|
||||
|
||||
interface ConfigType {
|
||||
headers?: { [key: string]: string };
|
||||
hold?: boolean;
|
||||
timeout?: number;
|
||||
}
|
||||
interface ResponseDataType {
|
||||
code: number;
|
||||
message: string;
|
||||
data: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求开始
|
||||
*/
|
||||
function requestStart(config: InternalAxiosRequestConfig): InternalAxiosRequestConfig {
|
||||
if (config.headers) {
|
||||
config.headers.rootkey = process.env.ROOT_KEY;
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求成功,检查请求头
|
||||
*/
|
||||
function responseSuccess(response: AxiosResponse<ResponseDataType>) {
|
||||
return response;
|
||||
}
|
||||
/**
|
||||
* 响应数据检查
|
||||
*/
|
||||
function checkRes(data: ResponseDataType) {
|
||||
if (data === undefined) {
|
||||
console.log('error->', data, 'data is empty');
|
||||
return Promise.reject('服务器异常');
|
||||
} else if (data?.code && (data.code < 200 || data.code >= 400)) {
|
||||
return Promise.reject(data);
|
||||
}
|
||||
return data.data;
|
||||
}
|
||||
|
||||
/**
|
||||
* 响应错误
|
||||
*/
|
||||
function responseError(err: any) {
|
||||
if (!err) {
|
||||
return Promise.reject({ message: '未知错误' });
|
||||
}
|
||||
if (typeof err === 'string') {
|
||||
return Promise.reject({ message: err });
|
||||
}
|
||||
|
||||
if (err?.response?.data) {
|
||||
return Promise.reject(err?.response?.data);
|
||||
}
|
||||
return Promise.reject(err);
|
||||
}
|
||||
|
||||
/* 创建请求实例 */
|
||||
const instance = axios.create({
|
||||
timeout: 60000, // 超时时间
|
||||
headers: {
|
||||
'content-type': 'application/json'
|
||||
}
|
||||
});
|
||||
|
||||
/* 请求拦截 */
|
||||
instance.interceptors.request.use(requestStart, (err) => Promise.reject(err));
|
||||
/* 响应拦截 */
|
||||
instance.interceptors.response.use(responseSuccess, (err) => Promise.reject(err));
|
||||
|
||||
export function request(url: string, data: any, config: ConfigType, method: Method): any {
|
||||
if (!global.systemEnv?.pluginBaseUrl) {
|
||||
return Promise.reject('商业版插件加载中...');
|
||||
}
|
||||
|
||||
/* 去空 */
|
||||
for (const key in data) {
|
||||
if (data[key] === null || data[key] === undefined) {
|
||||
delete data[key];
|
||||
}
|
||||
}
|
||||
|
||||
return instance
|
||||
.request({
|
||||
baseURL: global.systemEnv.pluginBaseUrl,
|
||||
url,
|
||||
method,
|
||||
data: ['POST', 'PUT'].includes(method) ? data : null,
|
||||
params: !['POST', 'PUT'].includes(method) ? data : null,
|
||||
...config // 用户自定义配置,可以覆盖前面的配置
|
||||
})
|
||||
.then((res) => checkRes(res.data))
|
||||
.catch((err) => responseError(err));
|
||||
}
|
||||
|
||||
/**
|
||||
* api请求方式
|
||||
* @param {String} url
|
||||
* @param {Any} params
|
||||
* @param {Object} config
|
||||
* @returns
|
||||
*/
|
||||
export function GET<T>(url: string, params = {}, config: ConfigType = {}): Promise<T> {
|
||||
return request(url, params, config, 'GET');
|
||||
}
|
||||
|
||||
export function POST<T>(url: string, data = {}, config: ConfigType = {}): Promise<T> {
|
||||
return request(url, data, config, 'POST');
|
||||
}
|
||||
|
||||
export function PUT<T>(url: string, data = {}, config: ConfigType = {}): Promise<T> {
|
||||
return request(url, data, config, 'PUT');
|
||||
}
|
||||
|
||||
export function DELETE<T>(url: string, data = {}, config: ConfigType = {}): Promise<T> {
|
||||
return request(url, data, config, 'DELETE');
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
import { GET, POST, PUT } from './request';
|
||||
import type { InitDateResponse } from '@/pages/api/system/getInitData';
|
||||
|
||||
export const getInitData = () => GET<InitDateResponse>('/system/getInitData');
|
||||
|
||||
export const uploadImg = (base64Img: string) => POST<string>('/system/uploadImage', { base64Img });
|
||||
@@ -1,102 +0,0 @@
|
||||
import { GET, POST, PUT } from './request';
|
||||
import { createHashPassword } from '@/utils/tools';
|
||||
import type { ResLogin, PromotionRecordType } from './response/user';
|
||||
import { UserAuthTypeEnum } from '@/constants/common';
|
||||
import { UserBillType, UserType, UserUpdateParams } from '@/types/user';
|
||||
import type { PagingData, RequestPaging } from '@/types';
|
||||
import { informSchema, PaySchema } from '@/types/mongoSchema';
|
||||
|
||||
export const sendAuthCode = (data: {
|
||||
username: string;
|
||||
type: `${UserAuthTypeEnum}`;
|
||||
googleToken: string;
|
||||
}) => POST(`/plusApi/user/account/sendCode`, data);
|
||||
|
||||
export const getTokenLogin = () => GET<UserType>('/user/account/tokenLogin');
|
||||
export const gitLogin = (params: { code: string; inviterId?: string }) =>
|
||||
GET<ResLogin>('/user/account/gitLogin', params);
|
||||
|
||||
export const postRegister = ({
|
||||
username,
|
||||
password,
|
||||
code,
|
||||
inviterId
|
||||
}: {
|
||||
username: string;
|
||||
code: string;
|
||||
password: string;
|
||||
inviterId: string;
|
||||
}) =>
|
||||
POST<ResLogin>(`/plusApi/user/account/register`, {
|
||||
username,
|
||||
code,
|
||||
inviterId,
|
||||
password: createHashPassword(password)
|
||||
});
|
||||
|
||||
export const postFindPassword = ({
|
||||
username,
|
||||
code,
|
||||
password
|
||||
}: {
|
||||
username: string;
|
||||
code: string;
|
||||
password: string;
|
||||
}) =>
|
||||
POST<ResLogin>(`/plusApi/user/account/updatePasswordByCode`, {
|
||||
username,
|
||||
code,
|
||||
password: createHashPassword(password)
|
||||
});
|
||||
|
||||
export const updatePasswordByOld = ({ oldPsw, newPsw }: { oldPsw: string; newPsw: string }) =>
|
||||
POST('/user/account/updatePasswordByOld', {
|
||||
oldPsw: createHashPassword(oldPsw),
|
||||
newPsw: createHashPassword(newPsw)
|
||||
});
|
||||
|
||||
export const postLogin = ({ username, password }: { username: string; password: string }) =>
|
||||
POST<ResLogin>('/user/account/loginByPassword', {
|
||||
username,
|
||||
password: createHashPassword(password)
|
||||
});
|
||||
|
||||
export const loginOut = () => GET('/user/account/loginout');
|
||||
|
||||
export const putUserInfo = (data: UserUpdateParams) => PUT('/user/account/update', data);
|
||||
|
||||
export const getUserBills = (data: RequestPaging) =>
|
||||
POST<PagingData<UserBillType>>(`/user/getBill`, data);
|
||||
|
||||
export const getPayOrders = () => GET<PaySchema[]>(`/user/getPayOrders`);
|
||||
|
||||
export const getPayCode = (amount: number) =>
|
||||
GET<{
|
||||
codeUrl: string;
|
||||
payId: string;
|
||||
}>(`/plusApi/user/pay/getPayCode`, { amount });
|
||||
|
||||
export const checkPayResult = (payId: string) =>
|
||||
GET<number>(`/plusApi/user/pay/checkPayResult`, { payId }).then(() => {
|
||||
try {
|
||||
GET('/user/account/paySuccess');
|
||||
} catch (error) {}
|
||||
return 'success';
|
||||
});
|
||||
|
||||
export const getInforms = (data: RequestPaging) =>
|
||||
POST<PagingData<informSchema>>(`/user/inform/list`, data);
|
||||
|
||||
export const getUnreadCount = () => GET<number>(`/user/inform/countUnread`);
|
||||
export const readInform = (id: string) => GET(`/user/inform/read`, { id });
|
||||
|
||||
/* get promotion init data */
|
||||
export const getPromotionInitData = () =>
|
||||
GET<{
|
||||
invitedAmount: number;
|
||||
earningsAmount: number;
|
||||
}>('/user/promotion/getPromotionData');
|
||||
|
||||
/* promotion records */
|
||||
export const getPromotionRecords = (data: RequestPaging) =>
|
||||
POST<PromotionRecordType>(`/user/promotion/getPromotions`, data);
|
||||
@@ -1,143 +0,0 @@
|
||||
import React, { useState } from 'react';
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Flex,
|
||||
ModalFooter,
|
||||
ModalBody,
|
||||
Table,
|
||||
Thead,
|
||||
Tbody,
|
||||
Tr,
|
||||
Th,
|
||||
Td,
|
||||
TableContainer,
|
||||
IconButton
|
||||
} from '@chakra-ui/react';
|
||||
import { getOpenApiKeys, createAOpenApiKey, delOpenApiById } from '@/api/openapi';
|
||||
import { useQuery, useMutation } from '@tanstack/react-query';
|
||||
import { useLoading } from '@/hooks/useLoading';
|
||||
import dayjs from 'dayjs';
|
||||
import { AddIcon, DeleteIcon } from '@chakra-ui/icons';
|
||||
import { getErrText, useCopyData } from '@/utils/tools';
|
||||
import { useToast } from '@/hooks/useToast';
|
||||
import MyIcon from '../Icon';
|
||||
import MyModal from '../MyModal';
|
||||
|
||||
const APIKeyModal = ({ onClose }: { onClose: () => void }) => {
|
||||
const { Loading } = useLoading();
|
||||
const { toast } = useToast();
|
||||
const {
|
||||
data: apiKeys = [],
|
||||
isLoading: isGetting,
|
||||
refetch
|
||||
} = useQuery(['getOpenApiKeys'], getOpenApiKeys);
|
||||
const [apiKey, setApiKey] = useState('');
|
||||
const { copyData } = useCopyData();
|
||||
|
||||
const { mutate: onclickCreateApiKey, isLoading: isCreating } = useMutation({
|
||||
mutationFn: () => createAOpenApiKey(),
|
||||
onSuccess(res) {
|
||||
setApiKey(res);
|
||||
refetch();
|
||||
},
|
||||
onError(err) {
|
||||
toast({
|
||||
status: 'warning',
|
||||
title: getErrText(err)
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const { mutate: onclickRemove, isLoading: isDeleting } = useMutation({
|
||||
mutationFn: async (id: string) => delOpenApiById(id),
|
||||
onSuccess() {
|
||||
refetch();
|
||||
}
|
||||
});
|
||||
|
||||
return (
|
||||
<MyModal isOpen onClose={onClose} w={'600px'}>
|
||||
<Box py={3} px={5}>
|
||||
<Box fontWeight={'bold'} fontSize={'2xl'}>
|
||||
API 秘钥管理
|
||||
</Box>
|
||||
<Box fontSize={'sm'} color={'myGray.600'}>
|
||||
如果你不想 API 秘钥被滥用,请勿将秘钥直接放置在前端使用~
|
||||
</Box>
|
||||
</Box>
|
||||
<ModalBody minH={'300px'} maxH={['70vh', '500px']} overflow={'overlay'}>
|
||||
<TableContainer mt={2} position={'relative'}>
|
||||
<Table>
|
||||
<Thead>
|
||||
<Tr>
|
||||
<Th>Api Key</Th>
|
||||
<Th>创建时间</Th>
|
||||
<Th>最后一次使用时间</Th>
|
||||
<Th />
|
||||
</Tr>
|
||||
</Thead>
|
||||
<Tbody fontSize={'sm'}>
|
||||
{apiKeys.map(({ id, apiKey, createTime, lastUsedTime }) => (
|
||||
<Tr key={id}>
|
||||
<Td>{apiKey}</Td>
|
||||
<Td>{dayjs(createTime).format('YYYY/MM/DD HH:mm:ss')}</Td>
|
||||
<Td>
|
||||
{lastUsedTime
|
||||
? dayjs(lastUsedTime).format('YYYY/MM/DD HH:mm:ss')
|
||||
: '没有使用过'}
|
||||
</Td>
|
||||
<Td>
|
||||
<IconButton
|
||||
icon={<DeleteIcon />}
|
||||
size={'xs'}
|
||||
aria-label={'delete'}
|
||||
variant={'base'}
|
||||
colorScheme={'gray'}
|
||||
onClick={() => onclickRemove(id)}
|
||||
/>
|
||||
</Td>
|
||||
</Tr>
|
||||
))}
|
||||
</Tbody>
|
||||
</Table>
|
||||
</TableContainer>
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
<Button
|
||||
variant="base"
|
||||
leftIcon={<AddIcon color={'myGray.600'} fontSize={'sm'} />}
|
||||
onClick={() => onclickCreateApiKey()}
|
||||
>
|
||||
新建秘钥
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
|
||||
<Loading loading={isGetting || isCreating || isDeleting} fixed={false} />
|
||||
<MyModal isOpen={!!apiKey} w={'400px'} onClose={() => setApiKey('')}>
|
||||
<Box py={3} px={5}>
|
||||
<Box fontWeight={'bold'} fontSize={'2xl'}>
|
||||
新的 API 秘钥
|
||||
</Box>
|
||||
<Box fontSize={'sm'} color={'myGray.600'}>
|
||||
请保管好你的秘钥,秘钥不会再次展示~
|
||||
</Box>
|
||||
</Box>
|
||||
<ModalBody>
|
||||
<Flex bg={'myGray.100'} px={3} py={2} cursor={'pointer'} onClick={() => copyData(apiKey)}>
|
||||
<Box flex={1}>{apiKey}</Box>
|
||||
<MyIcon name={'copy'} w={'16px'}></MyIcon>
|
||||
</Flex>
|
||||
</ModalBody>
|
||||
<ModalFooter>
|
||||
<Button variant="base" onClick={() => setApiKey('')}>
|
||||
好的
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</MyModal>
|
||||
</MyModal>
|
||||
);
|
||||
};
|
||||
|
||||
export default APIKeyModal;
|
||||
@@ -1,22 +0,0 @@
|
||||
import React from 'react';
|
||||
import { Image } from '@chakra-ui/react';
|
||||
import type { ImageProps } from '@chakra-ui/react';
|
||||
import { LOGO_ICON } from '@/constants/chat';
|
||||
|
||||
const Avatar = ({ w = '30px', ...props }: ImageProps) => {
|
||||
return (
|
||||
<Image
|
||||
fallbackSrc={LOGO_ICON}
|
||||
fallbackStrategy={'onError'}
|
||||
borderRadius={'50%'}
|
||||
objectFit={'cover'}
|
||||
alt=""
|
||||
w={w}
|
||||
h={w}
|
||||
p={'1px'}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default Avatar;
|
||||
@@ -1,42 +0,0 @@
|
||||
import React from 'react';
|
||||
import { Box } from '@chakra-ui/react';
|
||||
|
||||
const Badge = ({
|
||||
children,
|
||||
isDot = false,
|
||||
max = 99,
|
||||
count = 0
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
isDot?: boolean;
|
||||
max?: number;
|
||||
count?: number;
|
||||
}) => {
|
||||
return (
|
||||
<Box position={'relative'}>
|
||||
{children}
|
||||
{count > 0 && (
|
||||
<Box position={'absolute'} right={0} top={0} transform={'translate(70%,-50%)'}>
|
||||
{isDot ? (
|
||||
<Box w={'5px'} h={'5px'} bg={'myRead.600'} borderRadius={'20px'}></Box>
|
||||
) : (
|
||||
<Box
|
||||
color={'white'}
|
||||
bg={'myRead.600'}
|
||||
lineHeight={0.9}
|
||||
borderRadius={'100px'}
|
||||
px={'4px'}
|
||||
py={'2px'}
|
||||
fontSize={'12px'}
|
||||
border={'1px solid white'}
|
||||
>
|
||||
{count > max ? `${max}+` : count}
|
||||
</Box>
|
||||
)}
|
||||
</Box>
|
||||
)}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
export default Badge;
|
||||
@@ -1,43 +0,0 @@
|
||||
import React from 'react';
|
||||
import { ModalBody, Box, useTheme } from '@chakra-ui/react';
|
||||
import { ChatItemType } from '@/types/chat';
|
||||
import MyModal from '../MyModal';
|
||||
|
||||
const ContextModal = ({
|
||||
context = [],
|
||||
onClose
|
||||
}: {
|
||||
context: ChatItemType[];
|
||||
onClose: () => void;
|
||||
}) => {
|
||||
const theme = useTheme();
|
||||
|
||||
return (
|
||||
<MyModal
|
||||
isOpen={true}
|
||||
onClose={onClose}
|
||||
title={`完整对话记录(${context.length}条)`}
|
||||
h={['90vh', '80vh']}
|
||||
minW={['90vw', '600px']}
|
||||
isCentered
|
||||
>
|
||||
<ModalBody pt={0} whiteSpace={'pre-wrap'} textAlign={'justify'} fontSize={'sm'}>
|
||||
{context.map((item, i) => (
|
||||
<Box
|
||||
key={i}
|
||||
p={2}
|
||||
borderRadius={'lg'}
|
||||
border={theme.borders.base}
|
||||
_notLast={{ mb: 2 }}
|
||||
position={'relative'}
|
||||
>
|
||||
<Box fontWeight={'bold'}>{item.obj}</Box>
|
||||
<Box>{item.value}</Box>
|
||||
</Box>
|
||||
))}
|
||||
</ModalBody>
|
||||
</MyModal>
|
||||
);
|
||||
};
|
||||
|
||||
export default ContextModal;
|
||||
@@ -1,149 +0,0 @@
|
||||
import React, { useCallback, useState } from 'react';
|
||||
import { ModalBody, Box, useTheme } from '@chakra-ui/react';
|
||||
import { getKbDataItemById } from '@/api/plugins/kb';
|
||||
import { useLoading } from '@/hooks/useLoading';
|
||||
import { useToast } from '@/hooks/useToast';
|
||||
import { getErrText } from '@/utils/tools';
|
||||
import { QuoteItemType } from '@/types/chat';
|
||||
import MyIcon from '@/components/Icon';
|
||||
import InputDataModal from '@/pages/kb/detail/components/InputDataModal';
|
||||
import MyModal from '../MyModal';
|
||||
|
||||
type SearchType = {
|
||||
kb_id?: string;
|
||||
id?: string;
|
||||
q: string;
|
||||
a?: string;
|
||||
source?: string | undefined;
|
||||
};
|
||||
|
||||
const QuoteModal = ({
|
||||
onUpdateQuote,
|
||||
rawSearch = [],
|
||||
onClose
|
||||
}: {
|
||||
onUpdateQuote: (quoteId: string, sourceText: string) => Promise<void>;
|
||||
rawSearch: SearchType[];
|
||||
onClose: () => void;
|
||||
}) => {
|
||||
const theme = useTheme();
|
||||
const { toast } = useToast();
|
||||
const { setIsLoading, Loading } = useLoading();
|
||||
const [editDataItem, setEditDataItem] = useState<{
|
||||
kbId: string;
|
||||
dataId: string;
|
||||
a: string;
|
||||
q: string;
|
||||
}>();
|
||||
|
||||
/**
|
||||
* click edit, get new kbDataItem
|
||||
*/
|
||||
const onclickEdit = useCallback(
|
||||
async (item: SearchType) => {
|
||||
if (!item.id) return;
|
||||
try {
|
||||
setIsLoading(true);
|
||||
const data = (await getKbDataItemById(item.id)) as QuoteItemType;
|
||||
|
||||
if (!data) {
|
||||
onUpdateQuote(item.id, '已删除');
|
||||
throw new Error('该数据已被删除');
|
||||
}
|
||||
|
||||
setEditDataItem({
|
||||
kbId: data.kb_id,
|
||||
dataId: data.id,
|
||||
q: data.q,
|
||||
a: data.a
|
||||
});
|
||||
} catch (err) {
|
||||
toast({
|
||||
status: 'warning',
|
||||
title: getErrText(err)
|
||||
});
|
||||
}
|
||||
setIsLoading(false);
|
||||
},
|
||||
[setIsLoading, toast, onUpdateQuote]
|
||||
);
|
||||
|
||||
return (
|
||||
<>
|
||||
<MyModal
|
||||
isOpen={true}
|
||||
onClose={onClose}
|
||||
h={['90vh', '80vh']}
|
||||
isCentered
|
||||
minW={['90vw', '600px']}
|
||||
title={
|
||||
<>
|
||||
知识库引用({rawSearch.length}条)
|
||||
<Box fontSize={['xs', 'sm']} fontWeight={'normal'}>
|
||||
注意: 修改知识库内容成功后,此处不会显示变更情况。点击编辑后,会显示知识库最新的内容。
|
||||
</Box>
|
||||
</>
|
||||
}
|
||||
>
|
||||
<ModalBody pt={0} whiteSpace={'pre-wrap'} textAlign={'justify'} fontSize={'sm'}>
|
||||
{rawSearch.map((item, i) => (
|
||||
<Box
|
||||
key={i}
|
||||
flex={'1 0 0'}
|
||||
p={2}
|
||||
borderRadius={'lg'}
|
||||
border={theme.borders.base}
|
||||
_notLast={{ mb: 2 }}
|
||||
position={'relative'}
|
||||
_hover={{ '& .edit': { display: 'flex' } }}
|
||||
overflow={'hidden'}
|
||||
>
|
||||
{item.source && <Box color={'myGray.600'}>({item.source})</Box>}
|
||||
<Box>{item.q}</Box>
|
||||
<Box>{item.a}</Box>
|
||||
{item.id && (
|
||||
<Box
|
||||
className="edit"
|
||||
display={'none'}
|
||||
position={'absolute'}
|
||||
right={0}
|
||||
top={0}
|
||||
bottom={0}
|
||||
w={'40px'}
|
||||
bg={'rgba(255,255,255,0.9)'}
|
||||
alignItems={'center'}
|
||||
justifyContent={'center'}
|
||||
boxShadow={'-10px 0 10px rgba(255,255,255,1)'}
|
||||
>
|
||||
<MyIcon
|
||||
name={'edit'}
|
||||
w={'18px'}
|
||||
h={'18px'}
|
||||
cursor={'pointer'}
|
||||
color={'myGray.600'}
|
||||
_hover={{
|
||||
color: 'myBlue.700'
|
||||
}}
|
||||
onClick={() => onclickEdit(item)}
|
||||
/>
|
||||
</Box>
|
||||
)}
|
||||
</Box>
|
||||
))}
|
||||
</ModalBody>
|
||||
<Loading fixed={false} />
|
||||
</MyModal>
|
||||
{editDataItem && (
|
||||
<InputDataModal
|
||||
onClose={() => setEditDataItem(undefined)}
|
||||
onSuccess={() => onUpdateQuote(editDataItem.dataId, '手动修改')}
|
||||
onDelete={() => onUpdateQuote(editDataItem.dataId, '已删除')}
|
||||
kbId={editDataItem.kbId}
|
||||
defaultValues={editDataItem}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default QuoteModal;
|
||||
@@ -1,108 +0,0 @@
|
||||
import React, { useCallback, useMemo, useState } from 'react';
|
||||
import { ChatModuleEnum } from '@/constants/chat';
|
||||
import { ChatHistoryItemResType, ChatItemType, QuoteItemType } from '@/types/chat';
|
||||
import { Flex, BoxProps, useDisclosure } from '@chakra-ui/react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useGlobalStore } from '@/store/global';
|
||||
import dynamic from 'next/dynamic';
|
||||
import Tag from '../Tag';
|
||||
import MyTooltip from '../MyTooltip';
|
||||
const QuoteModal = dynamic(() => import('./QuoteModal'), { ssr: false });
|
||||
const ContextModal = dynamic(() => import('./ContextModal'), { ssr: false });
|
||||
const WholeResponseModal = dynamic(() => import('./WholeResponseModal'), { ssr: false });
|
||||
|
||||
const ResponseTags = ({
|
||||
chatId,
|
||||
contentId,
|
||||
responseData = []
|
||||
}: {
|
||||
chatId?: string;
|
||||
contentId?: string;
|
||||
responseData?: ChatHistoryItemResType[];
|
||||
}) => {
|
||||
const { isPc } = useGlobalStore();
|
||||
const { t } = useTranslation();
|
||||
const [quoteModalData, setQuoteModalData] = useState<QuoteItemType[]>();
|
||||
const [contextModalData, setContextModalData] = useState<ChatItemType[]>();
|
||||
const {
|
||||
isOpen: isOpenWholeModal,
|
||||
onOpen: onOpenWholeModal,
|
||||
onClose: onCloseWholeModal
|
||||
} = useDisclosure();
|
||||
|
||||
const {
|
||||
quoteList = [],
|
||||
completeMessages = [],
|
||||
tokens = 0
|
||||
} = useMemo(() => {
|
||||
const chatData = responseData.find((item) => item.moduleName === ChatModuleEnum.AIChat);
|
||||
if (!chatData) return {};
|
||||
return {
|
||||
quoteList: chatData.quoteList,
|
||||
completeMessages: chatData.completeMessages,
|
||||
tokens: responseData.reduce((sum, item) => sum + (item.tokens || 0), 0)
|
||||
};
|
||||
}, [responseData]);
|
||||
|
||||
const updateQuote = useCallback(async (quoteId: string, sourceText: string) => {}, []);
|
||||
|
||||
const TagStyles: BoxProps = {
|
||||
mr: 2,
|
||||
bg: 'transparent'
|
||||
};
|
||||
|
||||
return responseData.length === 0 ? null : (
|
||||
<Flex alignItems={'center'} mt={2} flexWrap={'wrap'}>
|
||||
{quoteList.length > 0 && (
|
||||
<MyTooltip label="查看引用">
|
||||
<Tag
|
||||
colorSchema="blue"
|
||||
cursor={'pointer'}
|
||||
{...TagStyles}
|
||||
onClick={() => setQuoteModalData(quoteList)}
|
||||
>
|
||||
{quoteList.length}条引用
|
||||
</Tag>
|
||||
</MyTooltip>
|
||||
)}
|
||||
{completeMessages.length > 0 && (
|
||||
<MyTooltip label={'点击查看完整对话记录'}>
|
||||
<Tag
|
||||
colorSchema="green"
|
||||
cursor={'pointer'}
|
||||
{...TagStyles}
|
||||
onClick={() => setContextModalData(completeMessages)}
|
||||
>
|
||||
{completeMessages.length}条上下文
|
||||
</Tag>
|
||||
</MyTooltip>
|
||||
)}
|
||||
{isPc && tokens > 0 && (
|
||||
<Tag colorSchema="purple" cursor={'default'} {...TagStyles}>
|
||||
{tokens}Tokens
|
||||
</Tag>
|
||||
)}
|
||||
<MyTooltip label={'点击查看完整响应值'}>
|
||||
<Tag colorSchema="gray" cursor={'pointer'} {...TagStyles} onClick={onOpenWholeModal}>
|
||||
{t('chat.Complete Response')}
|
||||
</Tag>
|
||||
</MyTooltip>
|
||||
|
||||
{!!quoteModalData && (
|
||||
<QuoteModal
|
||||
rawSearch={quoteModalData}
|
||||
onUpdateQuote={updateQuote}
|
||||
onClose={() => setQuoteModalData(undefined)}
|
||||
/>
|
||||
)}
|
||||
{!!contextModalData && (
|
||||
<ContextModal context={contextModalData} onClose={() => setContextModalData(undefined)} />
|
||||
)}
|
||||
{isOpenWholeModal && (
|
||||
<WholeResponseModal response={responseData} onClose={onCloseWholeModal} />
|
||||
)}
|
||||
</Flex>
|
||||
);
|
||||
};
|
||||
|
||||
export default ResponseTags;
|
||||
@@ -1,71 +0,0 @@
|
||||
import React, { useMemo } from 'react';
|
||||
import { Box, ModalBody, useTheme, ModalHeader, Flex } from '@chakra-ui/react';
|
||||
import type { ChatHistoryItemResType } from '@/types/chat';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import MyModal from '../MyModal';
|
||||
import MyTooltip from '../MyTooltip';
|
||||
import { QuestionOutlineIcon } from '@chakra-ui/icons';
|
||||
|
||||
const ResponseModal = ({
|
||||
response,
|
||||
onClose
|
||||
}: {
|
||||
response: ChatHistoryItemResType[];
|
||||
onClose: () => void;
|
||||
}) => {
|
||||
const { t } = useTranslation();
|
||||
const theme = useTheme();
|
||||
|
||||
const formatResponse = useMemo(
|
||||
() =>
|
||||
response.map((item) => {
|
||||
const copy = { ...item };
|
||||
delete copy.completeMessages;
|
||||
delete copy.quoteList;
|
||||
return copy;
|
||||
}),
|
||||
[response]
|
||||
);
|
||||
|
||||
return (
|
||||
<MyModal
|
||||
isOpen={true}
|
||||
onClose={onClose}
|
||||
h={['90vh', '80vh']}
|
||||
minW={['90vw', '600px']}
|
||||
title={
|
||||
<Flex alignItems={'center'}>
|
||||
{t('chat.Complete Response')}
|
||||
<MyTooltip
|
||||
label={
|
||||
'moduleName: 模型名\nprice: 价格,倍率:100000\nmodel?: 模型名\ntokens?: token 消耗\n\nanswer?: 回答内容\nquestion?: 问题\ntemperature?: 温度\nmaxToken?: 最大 tokens\n\nsimilarity?: 相似度\nlimit?: 单次搜索结果\n\ncqList?: 问题分类列表\ncqResult?: 分类结果\n\nextractDescription?: 内容提取描述\nextractResult?: 提取结果'
|
||||
}
|
||||
>
|
||||
<QuestionOutlineIcon ml={2} />
|
||||
</MyTooltip>
|
||||
</Flex>
|
||||
}
|
||||
isCentered
|
||||
>
|
||||
<ModalBody>
|
||||
{formatResponse.map((item, i) => (
|
||||
<Box
|
||||
key={i}
|
||||
p={2}
|
||||
pt={[0, 2]}
|
||||
borderRadius={'lg'}
|
||||
border={theme.borders.base}
|
||||
_notLast={{ mb: 2 }}
|
||||
position={'relative'}
|
||||
whiteSpace={'pre-wrap'}
|
||||
>
|
||||
{JSON.stringify(item, null, 2)}
|
||||
</Box>
|
||||
))}
|
||||
</ModalBody>
|
||||
</MyModal>
|
||||
);
|
||||
};
|
||||
|
||||
export default ResponseModal;
|
||||
@@ -1,43 +0,0 @@
|
||||
.stopIcon {
|
||||
animation: zoomStopIcon 0.4s infinite alternate;
|
||||
}
|
||||
@keyframes zoomStopIcon {
|
||||
0% {
|
||||
transform: scale(0.8);
|
||||
}
|
||||
100% {
|
||||
transform: scale(1.2);
|
||||
}
|
||||
}
|
||||
|
||||
.newChat {
|
||||
.modelListContainer {
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
.modelList {
|
||||
border-radius: 6px;
|
||||
}
|
||||
&:hover {
|
||||
.modelListContainer {
|
||||
height: 60vh;
|
||||
}
|
||||
.modelList {
|
||||
box-shadow: 0 0 5px rgba($color: #000000, $alpha: 0.05);
|
||||
border: 1px solid #dee0e2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.statusAnimation {
|
||||
animation: statusBox 0.8s linear infinite alternate;
|
||||
}
|
||||
@keyframes statusBox {
|
||||
0% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
100% {
|
||||
opacity: 0.11;
|
||||
}
|
||||
}
|
||||
@@ -1,862 +0,0 @@
|
||||
import React, {
|
||||
useCallback,
|
||||
useRef,
|
||||
useState,
|
||||
useMemo,
|
||||
forwardRef,
|
||||
useImperativeHandle,
|
||||
ForwardedRef,
|
||||
useEffect
|
||||
} from 'react';
|
||||
import { throttle } from 'lodash';
|
||||
import {
|
||||
ChatHistoryItemResType,
|
||||
ChatItemType,
|
||||
ChatSiteItemType,
|
||||
ExportChatType
|
||||
} from '@/types/chat';
|
||||
import { useToast } from '@/hooks/useToast';
|
||||
import {
|
||||
useCopyData,
|
||||
voiceBroadcast,
|
||||
cancelBroadcast,
|
||||
hasVoiceApi,
|
||||
getErrText
|
||||
} from '@/utils/tools';
|
||||
import { Box, Card, Flex, Input, Textarea, Button, useTheme, BoxProps } from '@chakra-ui/react';
|
||||
import { feConfigs } from '@/store/static';
|
||||
import { Types } from 'mongoose';
|
||||
import { EventNameEnum } from '../Markdown/constant';
|
||||
|
||||
import { adaptChatItem_openAI } from '@/utils/plugin/openai';
|
||||
import { useMarkdown } from '@/hooks/useMarkdown';
|
||||
import { VariableItemType } from '@/types/app';
|
||||
import { VariableInputEnum } from '@/constants/app';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { MessageItemType } from '@/pages/api/openapi/v1/chat/completions';
|
||||
import { fileDownload } from '@/utils/file';
|
||||
import { htmlTemplate } from '@/constants/common';
|
||||
import { useRouter } from 'next/router';
|
||||
import { useGlobalStore } from '@/store/global';
|
||||
import { TaskResponseKeyEnum, getDefaultChatVariables } from '@/constants/chat';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { customAlphabet } from 'nanoid';
|
||||
|
||||
import MyIcon from '@/components/Icon';
|
||||
import Avatar from '@/components/Avatar';
|
||||
import Markdown from '@/components/Markdown';
|
||||
import MySelect from '@/components/Select';
|
||||
import MyTooltip from '../MyTooltip';
|
||||
import dynamic from 'next/dynamic';
|
||||
const ResponseTags = dynamic(() => import('./ResponseTags'));
|
||||
|
||||
import styles from './index.module.scss';
|
||||
|
||||
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz1234567890', 24);
|
||||
|
||||
const textareaMinH = '22px';
|
||||
type generatingMessageProps = { text?: string; name?: string; status?: 'running' | 'finish' };
|
||||
export type StartChatFnProps = {
|
||||
chatList: ChatSiteItemType[];
|
||||
messages: MessageItemType[];
|
||||
controller: AbortController;
|
||||
variables: Record<string, any>;
|
||||
generatingMessage: (e: generatingMessageProps) => void;
|
||||
};
|
||||
|
||||
export type ComponentRef = {
|
||||
getChatHistory: () => ChatSiteItemType[];
|
||||
resetVariables: (data?: Record<string, any>) => void;
|
||||
resetHistory: (chatId: ChatSiteItemType[]) => void;
|
||||
scrollToBottom: (behavior?: 'smooth' | 'auto') => void;
|
||||
};
|
||||
|
||||
const VariableLabel = ({
|
||||
required = false,
|
||||
children
|
||||
}: {
|
||||
required?: boolean;
|
||||
children: React.ReactNode | string;
|
||||
}) => (
|
||||
<Box as={'label'} display={'inline-block'} position={'relative'} mb={1}>
|
||||
{children}
|
||||
{required && (
|
||||
<Box position={'absolute'} top={'-2px'} right={'-10px'} color={'red.500'} fontWeight={'bold'}>
|
||||
*
|
||||
</Box>
|
||||
)}
|
||||
</Box>
|
||||
);
|
||||
|
||||
const Empty = () => {
|
||||
const { data: chatProblem } = useMarkdown({ url: '/chatProblem.md' });
|
||||
const { data: versionIntro } = useMarkdown({ url: '/versionIntro.md' });
|
||||
|
||||
return (
|
||||
<Box pt={6} w={'85%'} maxW={'600px'} m={'auto'} alignItems={'center'} justifyContent={'center'}>
|
||||
{/* version intro */}
|
||||
<Card p={4} mb={10} minH={'200px'}>
|
||||
<Markdown source={versionIntro} />
|
||||
</Card>
|
||||
<Card p={4} minH={'600px'}>
|
||||
<Markdown source={chatProblem} />
|
||||
</Card>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
const ChatAvatar = ({ src, type }: { src?: string; type: 'Human' | 'AI' }) => {
|
||||
const theme = useTheme();
|
||||
return (
|
||||
<Box
|
||||
w={['28px', '34px']}
|
||||
h={['28px', '34px']}
|
||||
p={'2px'}
|
||||
borderRadius={'lg'}
|
||||
border={theme.borders.base}
|
||||
boxShadow={'0 0 5px rgba(0,0,0,0.1)'}
|
||||
bg={type === 'Human' ? 'white' : 'myBlue.100'}
|
||||
>
|
||||
<Avatar src={src} w={'100%'} h={'100%'} />
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
const ChatBox = (
|
||||
{
|
||||
showEmptyIntro = false,
|
||||
chatId,
|
||||
appAvatar,
|
||||
userAvatar,
|
||||
variableModules,
|
||||
welcomeText,
|
||||
onUpdateVariable,
|
||||
onStartChat,
|
||||
onDelMessage
|
||||
}: {
|
||||
showEmptyIntro?: boolean;
|
||||
chatId?: string;
|
||||
appAvatar?: string;
|
||||
userAvatar?: string;
|
||||
variableModules?: VariableItemType[];
|
||||
welcomeText?: string;
|
||||
onUpdateVariable?: (e: Record<string, any>) => void;
|
||||
onStartChat?: (e: StartChatFnProps) => Promise<{
|
||||
responseText: string;
|
||||
[TaskResponseKeyEnum.responseData]: ChatHistoryItemResType[];
|
||||
}>;
|
||||
onDelMessage?: (e: { contentId?: string; index: number }) => void;
|
||||
},
|
||||
ref: ForwardedRef<ComponentRef>
|
||||
) => {
|
||||
const ChatBoxRef = useRef<HTMLDivElement>(null);
|
||||
const theme = useTheme();
|
||||
const router = useRouter();
|
||||
const { t } = useTranslation();
|
||||
const { copyData } = useCopyData();
|
||||
const { toast } = useToast();
|
||||
const { isPc } = useGlobalStore();
|
||||
const TextareaDom = useRef<HTMLTextAreaElement>(null);
|
||||
const controller = useRef(new AbortController());
|
||||
|
||||
const [refresh, setRefresh] = useState(false);
|
||||
const [variables, setVariables] = useState<Record<string, any>>({});
|
||||
const [chatHistory, setChatHistory] = useState<ChatSiteItemType[]>([]);
|
||||
|
||||
const isChatting = useMemo(
|
||||
() =>
|
||||
chatHistory[chatHistory.length - 1] &&
|
||||
chatHistory[chatHistory.length - 1]?.status !== 'finish',
|
||||
[chatHistory]
|
||||
);
|
||||
const variableIsFinish = useMemo(() => {
|
||||
if (!variableModules || chatHistory.length > 0) return true;
|
||||
|
||||
for (let i = 0; i < variableModules.length; i++) {
|
||||
const item = variableModules[i];
|
||||
if (item.required && !variables[item.key]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}, [chatHistory.length, variableModules, variables]);
|
||||
|
||||
const { register, reset, getValues, setValue, handleSubmit } = useForm<Record<string, any>>({
|
||||
defaultValues: variables
|
||||
});
|
||||
|
||||
// 滚动到底部
|
||||
const scrollToBottom = useCallback(
|
||||
(behavior: 'smooth' | 'auto' = 'smooth') => {
|
||||
if (!ChatBoxRef.current) return;
|
||||
ChatBoxRef.current.scrollTo({
|
||||
top: ChatBoxRef.current.scrollHeight,
|
||||
behavior
|
||||
});
|
||||
},
|
||||
[ChatBoxRef]
|
||||
);
|
||||
// 聊天信息生成中……获取当前滚动条位置,判断是否需要滚动到底部
|
||||
const generatingScroll = useCallback(
|
||||
throttle(() => {
|
||||
if (!ChatBoxRef.current) return;
|
||||
const isBottom =
|
||||
ChatBoxRef.current.scrollTop + ChatBoxRef.current.clientHeight + 150 >=
|
||||
ChatBoxRef.current.scrollHeight;
|
||||
|
||||
isBottom && scrollToBottom('auto');
|
||||
}, 100),
|
||||
[]
|
||||
);
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
const generatingMessage = useCallback(
|
||||
({ text = '', status, name }: generatingMessageProps) => {
|
||||
setChatHistory((state) =>
|
||||
state.map((item, index) => {
|
||||
if (index !== state.length - 1) return item;
|
||||
return {
|
||||
...item,
|
||||
...(text
|
||||
? {
|
||||
value: item.value + text
|
||||
}
|
||||
: {}),
|
||||
...(status && name
|
||||
? {
|
||||
status,
|
||||
moduleName: name
|
||||
}
|
||||
: {})
|
||||
};
|
||||
})
|
||||
);
|
||||
generatingScroll();
|
||||
},
|
||||
[generatingScroll, setChatHistory]
|
||||
);
|
||||
|
||||
// 复制内容
|
||||
const onclickCopy = useCallback(
|
||||
(value: string) => {
|
||||
copyData(value);
|
||||
},
|
||||
[copyData]
|
||||
);
|
||||
|
||||
// 重置输入内容
|
||||
const resetInputVal = useCallback((val: string) => {
|
||||
if (!TextareaDom.current) return;
|
||||
|
||||
setTimeout(() => {
|
||||
/* 回到最小高度 */
|
||||
if (TextareaDom.current) {
|
||||
TextareaDom.current.value = val;
|
||||
TextareaDom.current.style.height =
|
||||
val === '' ? textareaMinH : `${TextareaDom.current.scrollHeight}px`;
|
||||
}
|
||||
}, 100);
|
||||
}, []);
|
||||
|
||||
/**
|
||||
* user confirm send prompt
|
||||
*/
|
||||
const sendPrompt = useCallback(
|
||||
async (variables: Record<string, any> = {}, inputVal = '') => {
|
||||
if (!onStartChat) return;
|
||||
if (isChatting) {
|
||||
toast({
|
||||
title: '正在聊天中...请等待结束',
|
||||
status: 'warning'
|
||||
});
|
||||
return;
|
||||
}
|
||||
// get input value
|
||||
const val = inputVal.trim();
|
||||
|
||||
if (!val) {
|
||||
toast({
|
||||
title: '内容为空',
|
||||
status: 'warning'
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const newChatList: ChatSiteItemType[] = [
|
||||
...chatHistory,
|
||||
{
|
||||
dataId: nanoid(),
|
||||
obj: 'Human',
|
||||
value: val,
|
||||
status: 'finish'
|
||||
},
|
||||
{
|
||||
dataId: nanoid(),
|
||||
obj: 'AI',
|
||||
value: '',
|
||||
status: 'loading'
|
||||
}
|
||||
];
|
||||
|
||||
// 插入内容
|
||||
setChatHistory(newChatList);
|
||||
|
||||
// 清空输入内容
|
||||
resetInputVal('');
|
||||
setTimeout(() => {
|
||||
scrollToBottom();
|
||||
}, 100);
|
||||
|
||||
try {
|
||||
// create abort obj
|
||||
const abortSignal = new AbortController();
|
||||
controller.current = abortSignal;
|
||||
|
||||
const messages = adaptChatItem_openAI({ messages: newChatList, reserveId: true });
|
||||
|
||||
const { responseData } = await onStartChat({
|
||||
chatList: newChatList,
|
||||
messages,
|
||||
controller: abortSignal,
|
||||
generatingMessage,
|
||||
variables: {
|
||||
...getDefaultChatVariables(),
|
||||
...variables
|
||||
}
|
||||
});
|
||||
|
||||
// set finish status
|
||||
setChatHistory((state) =>
|
||||
state.map((item, index) => {
|
||||
if (index !== state.length - 1) return item;
|
||||
return {
|
||||
...item,
|
||||
status: 'finish',
|
||||
responseData
|
||||
};
|
||||
})
|
||||
);
|
||||
|
||||
setTimeout(() => {
|
||||
generatingScroll();
|
||||
isPc && TextareaDom.current?.focus();
|
||||
}, 100);
|
||||
} catch (err: any) {
|
||||
toast({
|
||||
title: getErrText(err, '聊天出错了~'),
|
||||
status: 'error',
|
||||
duration: 5000,
|
||||
isClosable: true
|
||||
});
|
||||
|
||||
if (!err?.responseText) {
|
||||
resetInputVal(inputVal);
|
||||
setChatHistory(newChatList.slice(0, newChatList.length - 2));
|
||||
}
|
||||
|
||||
// set finish status
|
||||
setChatHistory((state) =>
|
||||
state.map((item, index) => {
|
||||
if (index !== state.length - 1) return item;
|
||||
return {
|
||||
...item,
|
||||
status: 'finish'
|
||||
};
|
||||
})
|
||||
);
|
||||
}
|
||||
},
|
||||
[
|
||||
isChatting,
|
||||
chatHistory,
|
||||
resetInputVal,
|
||||
toast,
|
||||
scrollToBottom,
|
||||
onStartChat,
|
||||
generatingMessage,
|
||||
generatingScroll,
|
||||
isPc
|
||||
]
|
||||
);
|
||||
|
||||
useImperativeHandle(ref, () => ({
|
||||
getChatHistory: () => chatHistory,
|
||||
resetVariables(e) {
|
||||
const defaultVal: Record<string, any> = {};
|
||||
variableModules?.forEach((item) => {
|
||||
defaultVal[item.key] = '';
|
||||
});
|
||||
|
||||
reset(e || defaultVal);
|
||||
setVariables(e || defaultVal);
|
||||
},
|
||||
resetHistory(e) {
|
||||
setChatHistory(e);
|
||||
},
|
||||
scrollToBottom
|
||||
}));
|
||||
|
||||
const controlIconStyle = {
|
||||
w: '14px',
|
||||
cursor: 'pointer',
|
||||
p: 1,
|
||||
bg: 'white',
|
||||
borderRadius: 'lg',
|
||||
boxShadow: '0 0 5px rgba(0,0,0,0.1)',
|
||||
border: theme.borders.base,
|
||||
mr: 3
|
||||
};
|
||||
const controlContainerStyle = {
|
||||
className: 'control',
|
||||
color: 'myGray.400',
|
||||
display: ['flex', 'none'],
|
||||
pl: 1,
|
||||
mt: 2
|
||||
};
|
||||
const MessageCardStyle: BoxProps = {
|
||||
px: 4,
|
||||
py: 3,
|
||||
borderRadius: '0 8px 8px 8px',
|
||||
boxShadow: '0 0 8px rgba(0,0,0,0.15)'
|
||||
};
|
||||
|
||||
const messageCardMaxW = ['calc(100% - 25px)', 'calc(100% - 40px)'];
|
||||
|
||||
const showEmpty = useMemo(
|
||||
() =>
|
||||
feConfigs?.show_emptyChat &&
|
||||
showEmptyIntro &&
|
||||
chatHistory.length === 0 &&
|
||||
!variableModules?.length &&
|
||||
!welcomeText,
|
||||
[chatHistory.length, showEmptyIntro, variableModules, welcomeText]
|
||||
);
|
||||
const statusBoxData = useMemo(() => {
|
||||
const colorMap = {
|
||||
loading: '#67c13b',
|
||||
running: '#67c13b',
|
||||
finish: 'myBlue.600'
|
||||
};
|
||||
if (!isChatting) return;
|
||||
const chatContent = chatHistory[chatHistory.length - 1];
|
||||
if (!chatContent) return;
|
||||
|
||||
return {
|
||||
bg: colorMap[chatContent.status] || colorMap.loading,
|
||||
name: t(chatContent.moduleName || 'Running')
|
||||
};
|
||||
}, [chatHistory, isChatting, t]);
|
||||
|
||||
useEffect(() => {
|
||||
return () => {
|
||||
controller.current?.abort('leave');
|
||||
// close voice
|
||||
cancelBroadcast();
|
||||
};
|
||||
}, [router.query]);
|
||||
|
||||
useEffect(() => {
|
||||
const listen = () => {
|
||||
cancelBroadcast();
|
||||
};
|
||||
window.addEventListener('beforeunload', listen);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('beforeunload', listen);
|
||||
};
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Flex flexDirection={'column'} h={'100%'}>
|
||||
<Box ref={ChatBoxRef} flex={'1 0 0'} h={0} w={'100%'} overflow={'overlay'} px={[4, 0]} pb={3}>
|
||||
<Box maxW={['100%', '92%']} h={'100%'} mx={'auto'}>
|
||||
{showEmpty && <Empty />}
|
||||
|
||||
{!!welcomeText && (
|
||||
<Flex flexDirection={'column'} alignItems={'flex-start'} py={2}>
|
||||
{/* avatar */}
|
||||
<ChatAvatar src={appAvatar} type={'AI'} />
|
||||
{/* message */}
|
||||
<Card order={2} mt={2} {...MessageCardStyle} bg={'white'} maxW={messageCardMaxW}>
|
||||
<Markdown
|
||||
source={`~~~guide \n${welcomeText}`}
|
||||
isChatting={false}
|
||||
onClick={(e) => {
|
||||
const val = e?.data;
|
||||
if (e?.event !== EventNameEnum.guideClick || !val) return;
|
||||
handleSubmit((data) => sendPrompt(data, val))();
|
||||
}}
|
||||
/>
|
||||
</Card>
|
||||
</Flex>
|
||||
)}
|
||||
{/* variable input */}
|
||||
{!!variableModules?.length && (
|
||||
<Flex flexDirection={'column'} alignItems={'flex-start'} py={2}>
|
||||
{/* avatar */}
|
||||
<ChatAvatar src={appAvatar} type={'AI'} />
|
||||
{/* message */}
|
||||
<Card
|
||||
order={2}
|
||||
mt={2}
|
||||
bg={'white'}
|
||||
w={'400px'}
|
||||
maxW={messageCardMaxW}
|
||||
{...MessageCardStyle}
|
||||
>
|
||||
{variableModules.map((item) => (
|
||||
<Box key={item.id} mb={4}>
|
||||
<VariableLabel required={item.required}>{item.label}</VariableLabel>
|
||||
{item.type === VariableInputEnum.input && (
|
||||
<Input
|
||||
isDisabled={variableIsFinish}
|
||||
{...register(item.key, {
|
||||
required: item.required
|
||||
})}
|
||||
/>
|
||||
)}
|
||||
{item.type === VariableInputEnum.select && (
|
||||
<MySelect
|
||||
width={'100%'}
|
||||
isDisabled={variableIsFinish}
|
||||
list={(item.enums || []).map((item) => ({
|
||||
label: item.value,
|
||||
value: item.value
|
||||
}))}
|
||||
value={getValues(item.key)}
|
||||
onchange={(e) => {
|
||||
setValue(item.key, e);
|
||||
setRefresh(!refresh);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Box>
|
||||
))}
|
||||
{!variableIsFinish && (
|
||||
<Button
|
||||
leftIcon={<MyIcon name={'chatFill'} w={'16px'} />}
|
||||
size={'sm'}
|
||||
maxW={'100px'}
|
||||
borderRadius={'lg'}
|
||||
onClick={handleSubmit((data) => {
|
||||
onUpdateVariable?.(data);
|
||||
setVariables(data);
|
||||
})}
|
||||
>
|
||||
{'开始对话'}
|
||||
</Button>
|
||||
)}
|
||||
</Card>
|
||||
</Flex>
|
||||
)}
|
||||
|
||||
{/* chat history */}
|
||||
<Box id={'history'}>
|
||||
{chatHistory.map((item, index) => (
|
||||
<Flex
|
||||
position={'relative'}
|
||||
key={item.dataId}
|
||||
flexDirection={'column'}
|
||||
alignItems={item.obj === 'Human' ? 'flex-end' : 'flex-start'}
|
||||
py={5}
|
||||
_hover={{
|
||||
'& .control': {
|
||||
display: item.status === 'finish' ? 'flex' : 'none'
|
||||
}
|
||||
}}
|
||||
>
|
||||
{item.obj === 'Human' && (
|
||||
<>
|
||||
<Flex w={'100%'} alignItems={'center'} justifyContent={'flex-end'}>
|
||||
<Flex {...controlContainerStyle} justifyContent={'flex-end'} mr={3}>
|
||||
<MyTooltip label={'复制'}>
|
||||
<MyIcon
|
||||
{...controlIconStyle}
|
||||
name={'copy'}
|
||||
_hover={{ color: 'myBlue.700' }}
|
||||
onClick={() => onclickCopy(item.value)}
|
||||
/>
|
||||
</MyTooltip>
|
||||
{onDelMessage && (
|
||||
<MyTooltip label={'删除'}>
|
||||
<MyIcon
|
||||
{...controlIconStyle}
|
||||
mr={0}
|
||||
name={'delete'}
|
||||
_hover={{ color: 'red.600' }}
|
||||
onClick={() => {
|
||||
setChatHistory((state) =>
|
||||
state.filter((chat) => chat.dataId !== item.dataId)
|
||||
);
|
||||
onDelMessage({
|
||||
contentId: item.dataId,
|
||||
index
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</MyTooltip>
|
||||
)}
|
||||
</Flex>
|
||||
<ChatAvatar src={userAvatar} type={'Human'} />
|
||||
</Flex>
|
||||
<Box position={'relative'} maxW={messageCardMaxW} mt={['6px', 2]}>
|
||||
<Card
|
||||
className="markdown"
|
||||
whiteSpace={'pre-wrap'}
|
||||
{...MessageCardStyle}
|
||||
bg={'myBlue.300'}
|
||||
borderRadius={'8px 0 8px 8px'}
|
||||
>
|
||||
<Box as={'p'}>{item.value}</Box>
|
||||
</Card>
|
||||
</Box>
|
||||
</>
|
||||
)}
|
||||
{item.obj === 'AI' && (
|
||||
<>
|
||||
<Flex w={'100%'} alignItems={'flex-end'}>
|
||||
<ChatAvatar src={appAvatar} type={'AI'} />
|
||||
<Flex {...controlContainerStyle} ml={3}>
|
||||
<MyTooltip label={'复制'}>
|
||||
<MyIcon
|
||||
{...controlIconStyle}
|
||||
name={'copy'}
|
||||
_hover={{ color: 'myBlue.700' }}
|
||||
onClick={() => onclickCopy(item.value)}
|
||||
/>
|
||||
</MyTooltip>
|
||||
{onDelMessage && (
|
||||
<MyTooltip label={'删除'}>
|
||||
<MyIcon
|
||||
{...controlIconStyle}
|
||||
name={'delete'}
|
||||
_hover={{ color: 'red.600' }}
|
||||
onClick={() => {
|
||||
setChatHistory((state) =>
|
||||
state.filter((chat) => chat.dataId !== item.dataId)
|
||||
);
|
||||
onDelMessage({
|
||||
contentId: item.dataId,
|
||||
index
|
||||
});
|
||||
}}
|
||||
/>
|
||||
</MyTooltip>
|
||||
)}
|
||||
{hasVoiceApi && (
|
||||
<MyTooltip label={'语音播报'}>
|
||||
<MyIcon
|
||||
{...controlIconStyle}
|
||||
name={'voice'}
|
||||
_hover={{ color: '#E74694' }}
|
||||
onClick={() => voiceBroadcast({ text: item.value })}
|
||||
/>
|
||||
</MyTooltip>
|
||||
)}
|
||||
</Flex>
|
||||
{statusBoxData && index === chatHistory.length - 1 && (
|
||||
<Flex
|
||||
ml={3}
|
||||
alignItems={'center'}
|
||||
px={3}
|
||||
py={'1px'}
|
||||
borderRadius="md"
|
||||
border={theme.borders.base}
|
||||
>
|
||||
<Box
|
||||
className={styles.statusAnimation}
|
||||
bg={statusBoxData.bg}
|
||||
w="8px"
|
||||
h="8px"
|
||||
borderRadius={'50%'}
|
||||
mt={'1px'}
|
||||
></Box>
|
||||
<Box ml={2} color={'myGray.600'}>
|
||||
{statusBoxData.name}
|
||||
</Box>
|
||||
</Flex>
|
||||
)}
|
||||
</Flex>
|
||||
<Box position={'relative'} maxW={messageCardMaxW} mt={['6px', 2]}>
|
||||
<Card bg={'white'} {...MessageCardStyle}>
|
||||
<Markdown
|
||||
source={item.value}
|
||||
isChatting={index === chatHistory.length - 1 && isChatting}
|
||||
/>
|
||||
<ResponseTags
|
||||
chatId={chatId}
|
||||
contentId={item.dataId}
|
||||
responseData={item.responseData}
|
||||
/>
|
||||
</Card>
|
||||
</Box>
|
||||
</>
|
||||
)}
|
||||
</Flex>
|
||||
))}
|
||||
</Box>
|
||||
</Box>
|
||||
</Box>
|
||||
{/* input */}
|
||||
{onStartChat && variableIsFinish ? (
|
||||
<Box m={['0 auto', '10px auto']} w={'100%'} maxW={['auto', 'min(750px, 100%)']} px={[0, 5]}>
|
||||
<Box
|
||||
py={'18px'}
|
||||
position={'relative'}
|
||||
boxShadow={`0 0 10px rgba(0,0,0,0.2)`}
|
||||
borderTop={['1px solid', 0]}
|
||||
borderTopColor={'myGray.200'}
|
||||
borderRadius={['none', 'md']}
|
||||
backgroundColor={'white'}
|
||||
>
|
||||
{/* 输入框 */}
|
||||
<Textarea
|
||||
ref={TextareaDom}
|
||||
py={0}
|
||||
pr={['45px', '55px']}
|
||||
border={'none'}
|
||||
_focusVisible={{
|
||||
border: 'none'
|
||||
}}
|
||||
placeholder="提问"
|
||||
resize={'none'}
|
||||
rows={1}
|
||||
height={'22px'}
|
||||
lineHeight={'22px'}
|
||||
maxHeight={'150px'}
|
||||
maxLength={-1}
|
||||
overflowY={'auto'}
|
||||
whiteSpace={'pre-wrap'}
|
||||
wordBreak={'break-all'}
|
||||
boxShadow={'none !important'}
|
||||
color={'myGray.900'}
|
||||
onChange={(e) => {
|
||||
const textarea = e.target;
|
||||
textarea.style.height = textareaMinH;
|
||||
textarea.style.height = `${textarea.scrollHeight}px`;
|
||||
}}
|
||||
onKeyDown={(e) => {
|
||||
// 触发快捷发送
|
||||
if (isPc && e.keyCode === 13 && !e.shiftKey) {
|
||||
handleSubmit((data) => sendPrompt(data, TextareaDom.current?.value))();
|
||||
e.preventDefault();
|
||||
}
|
||||
// 全选内容
|
||||
// @ts-ignore
|
||||
e.key === 'a' && e.ctrlKey && e.target?.select();
|
||||
}}
|
||||
/>
|
||||
{/* 发送和等待按键 */}
|
||||
<Flex
|
||||
alignItems={'center'}
|
||||
justifyContent={'center'}
|
||||
h={'25px'}
|
||||
w={'25px'}
|
||||
position={'absolute'}
|
||||
right={['12px', '20px']}
|
||||
bottom={'15px'}
|
||||
>
|
||||
{isChatting ? (
|
||||
<MyIcon
|
||||
className={styles.stopIcon}
|
||||
width={['22px', '25px']}
|
||||
height={['22px', '25px']}
|
||||
cursor={'pointer'}
|
||||
name={'stop'}
|
||||
color={'gray.500'}
|
||||
onClick={() => controller.current?.abort('stop')}
|
||||
/>
|
||||
) : (
|
||||
<MyIcon
|
||||
name={'chatSend'}
|
||||
width={['18px', '20px']}
|
||||
height={['18px', '20px']}
|
||||
cursor={'pointer'}
|
||||
color={'gray.500'}
|
||||
onClick={() => {
|
||||
handleSubmit((data) => sendPrompt(data, TextareaDom.current?.value))();
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</Flex>
|
||||
</Box>
|
||||
</Box>
|
||||
) : null}
|
||||
</Flex>
|
||||
);
|
||||
};
|
||||
|
||||
export default React.memo(forwardRef(ChatBox));
|
||||
|
||||
export const useChatBox = () => {
|
||||
const onExportChat = useCallback(
|
||||
({ type, history }: { type: ExportChatType; history: ChatItemType[] }) => {
|
||||
const getHistoryHtml = () => {
|
||||
const historyDom = document.getElementById('history');
|
||||
if (!historyDom) return;
|
||||
const dom = Array.from(historyDom.children).map((child, i) => {
|
||||
const avatar = `<img src="${
|
||||
child.querySelector<HTMLImageElement>('.avatar')?.src
|
||||
}" alt="" />`;
|
||||
|
||||
const chatContent = child.querySelector<HTMLDivElement>('.markdown');
|
||||
|
||||
if (!chatContent) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const chatContentClone = chatContent.cloneNode(true) as HTMLDivElement;
|
||||
|
||||
const codeHeader = chatContentClone.querySelectorAll('.code-header');
|
||||
codeHeader.forEach((childElement: any) => {
|
||||
childElement.remove();
|
||||
});
|
||||
|
||||
return `<div class="chat-item">
|
||||
${avatar}
|
||||
${chatContentClone.outerHTML}
|
||||
</div>`;
|
||||
});
|
||||
|
||||
const html = htmlTemplate.replace('{{CHAT_CONTENT}}', dom.join('\n'));
|
||||
return html;
|
||||
};
|
||||
|
||||
const map: Record<ExportChatType, () => void> = {
|
||||
md: () => {
|
||||
fileDownload({
|
||||
text: history.map((item) => item.value).join('\n\n'),
|
||||
type: 'text/markdown',
|
||||
filename: 'chat.md'
|
||||
});
|
||||
},
|
||||
html: () => {
|
||||
const html = getHistoryHtml();
|
||||
html &&
|
||||
fileDownload({
|
||||
text: html,
|
||||
type: 'text/html',
|
||||
filename: '聊天记录.html'
|
||||
});
|
||||
},
|
||||
pdf: () => {
|
||||
const html = getHistoryHtml();
|
||||
|
||||
html &&
|
||||
// @ts-ignore
|
||||
html2pdf(html, {
|
||||
margin: 0,
|
||||
filename: `聊天记录.pdf`
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
map[type]();
|
||||
},
|
||||
[]
|
||||
);
|
||||
|
||||
return {
|
||||
onExportChat
|
||||
};
|
||||
};
|
||||
@@ -1,29 +0,0 @@
|
||||
import { SystemInputEnum } from '@/constants/app';
|
||||
import { FlowModuleTypeEnum } from '@/constants/flow';
|
||||
import { getChatModel } from '@/service/utils/data';
|
||||
import { AppModuleItemType, VariableItemType } from '@/types/app';
|
||||
|
||||
export const getSpecialModule = (modules: AppModuleItemType[]) => {
|
||||
const welcomeText: string =
|
||||
modules
|
||||
.find((item) => item.flowType === FlowModuleTypeEnum.userGuide)
|
||||
?.inputs?.find((item) => item.key === SystemInputEnum.welcomeText)?.value || '';
|
||||
|
||||
const variableModules: VariableItemType[] =
|
||||
modules
|
||||
.find((item) => item.flowType === FlowModuleTypeEnum.variable)
|
||||
?.inputs.find((item) => item.key === SystemInputEnum.variables)?.value || [];
|
||||
|
||||
return {
|
||||
welcomeText,
|
||||
variableModules
|
||||
};
|
||||
};
|
||||
export const getChatModelNameList = (modules: AppModuleItemType[]): string[] => {
|
||||
const chatModules = modules.filter((item) => item.flowType === FlowModuleTypeEnum.chatNode);
|
||||
return chatModules
|
||||
.map(
|
||||
(item) => getChatModel(item.inputs.find((input) => input.key === 'model')?.value)?.name || ''
|
||||
)
|
||||
.filter((item) => item);
|
||||
};
|
||||
@@ -1,30 +0,0 @@
|
||||
import React from 'react';
|
||||
import { Button, ModalFooter, ModalBody } from '@chakra-ui/react';
|
||||
import MyModal from '../MyModal';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import Markdown from '../Markdown';
|
||||
|
||||
const md = `
|
||||
| 交流群 | 小助手 |
|
||||
| ----------------------- | -------------------- |
|
||||
|  |  |
|
||||
`;
|
||||
|
||||
const CommunityModal = ({ onClose }: { onClose: () => void }) => {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
<MyModal isOpen={true} onClose={onClose} title={t('home.Community')}>
|
||||
<ModalBody textAlign={'center'}>
|
||||
<Markdown source={md} />
|
||||
</ModalBody>
|
||||
|
||||
<ModalFooter>
|
||||
<Button variant={'base'} onClick={onClose}>
|
||||
关闭
|
||||
</Button>
|
||||
</ModalFooter>
|
||||
</MyModal>
|
||||
);
|
||||
};
|
||||
|
||||
export default CommunityModal;
|
||||
@@ -1,4 +0,0 @@
|
||||
.datePicker {
|
||||
--rdp-background-color: #d6e8ff;
|
||||
--rdp-accent-color: #0000ff;
|
||||
}
|
||||
@@ -1,121 +0,0 @@
|
||||
import React, { useState, useMemo, useRef } from 'react';
|
||||
import { Box, Card, Flex, useTheme, useOutsideClick, Button } from '@chakra-ui/react';
|
||||
import { addDays, format } from 'date-fns';
|
||||
import { type DateRange, DayPicker } from 'react-day-picker';
|
||||
import MyIcon from '../Icon';
|
||||
import 'react-day-picker/dist/style.css';
|
||||
import styles from './index.module.scss';
|
||||
import zhCN from 'date-fns/locale/zh-CN';
|
||||
|
||||
const DateRangePicker = ({
|
||||
onChange,
|
||||
onSuccess,
|
||||
position = 'bottom',
|
||||
defaultDate = {
|
||||
from: addDays(new Date(), -30),
|
||||
to: new Date()
|
||||
}
|
||||
}: {
|
||||
onChange?: (date: DateRange) => void;
|
||||
onSuccess?: (date: DateRange) => void;
|
||||
position?: 'bottom' | 'top';
|
||||
defaultDate?: DateRange;
|
||||
}) => {
|
||||
const theme = useTheme();
|
||||
const OutRangeRef = useRef(null);
|
||||
const [range, setRange] = useState<DateRange | undefined>(defaultDate);
|
||||
const [showSelected, setShowSelected] = useState(false);
|
||||
|
||||
const formatSelected = useMemo(() => {
|
||||
if (range?.from && range.to) {
|
||||
return `${format(range.from, 'y-MM-dd')} ~ ${format(range.to, 'y-MM-dd')}`;
|
||||
}
|
||||
return `${format(new Date(), 'y-MM-dd')} ~ ${format(new Date(), 'y-MM-dd')}`;
|
||||
}, [range]);
|
||||
|
||||
useOutsideClick({
|
||||
ref: OutRangeRef,
|
||||
handler: () => {
|
||||
setShowSelected(false);
|
||||
}
|
||||
});
|
||||
|
||||
return (
|
||||
<Box position={'relative'} ref={OutRangeRef}>
|
||||
<Flex
|
||||
border={theme.borders.base}
|
||||
px={3}
|
||||
py={1}
|
||||
borderRadius={'sm'}
|
||||
cursor={'pointer'}
|
||||
bg={'myWhite.600'}
|
||||
fontSize={'sm'}
|
||||
onClick={() => setShowSelected(true)}
|
||||
>
|
||||
<Box>{formatSelected}</Box>
|
||||
<MyIcon ml={2} name={'date'} w={'16px'} color={'myGray.600'} />
|
||||
</Flex>
|
||||
{showSelected && (
|
||||
<Card
|
||||
position={'absolute'}
|
||||
zIndex={1}
|
||||
{...(position === 'top'
|
||||
? {
|
||||
bottom: '40px'
|
||||
}
|
||||
: {})}
|
||||
>
|
||||
<DayPicker
|
||||
locale={zhCN}
|
||||
id="test"
|
||||
mode="range"
|
||||
className={styles.datePicker}
|
||||
defaultMonth={defaultDate.to}
|
||||
selected={range}
|
||||
disabled={[
|
||||
{ from: new Date(2022, 3, 1), to: addDays(new Date(), -90) },
|
||||
{ from: addDays(new Date(), 1), to: new Date(2099, 1, 1) }
|
||||
]}
|
||||
onSelect={(date) => {
|
||||
if (date?.from === undefined) {
|
||||
date = {
|
||||
from: range?.from,
|
||||
to: range?.from
|
||||
};
|
||||
}
|
||||
if (date?.to === undefined) {
|
||||
date.to = date.from;
|
||||
}
|
||||
setRange(date);
|
||||
onChange && onChange(date);
|
||||
}}
|
||||
footer={
|
||||
<Flex justifyContent={'flex-end'}>
|
||||
<Button
|
||||
variant={'outline'}
|
||||
size={'sm'}
|
||||
mr={2}
|
||||
onClick={() => setShowSelected(false)}
|
||||
>
|
||||
取消
|
||||
</Button>
|
||||
<Button
|
||||
size={'sm'}
|
||||
onClick={() => {
|
||||
onSuccess && onSuccess(range || defaultDate);
|
||||
setShowSelected(false);
|
||||
}}
|
||||
>
|
||||
确认
|
||||
</Button>
|
||||
</Flex>
|
||||
}
|
||||
/>
|
||||
</Card>
|
||||
)}
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
|
||||
export default DateRangePicker;
|
||||
export type DateRangeType = DateRange;
|
||||
@@ -1,22 +0,0 @@
|
||||
import React from 'react';
|
||||
import { Flex, type FlexProps } from '@chakra-ui/react';
|
||||
import MyIcon from '@/components/Icon';
|
||||
|
||||
const CloseIcon = (props: FlexProps) => {
|
||||
return (
|
||||
<Flex
|
||||
cursor={'pointer'}
|
||||
w={'22px'}
|
||||
h={'22px'}
|
||||
alignItems={'center'}
|
||||
justifyContent={'center'}
|
||||
borderRadius={'50%'}
|
||||
_hover={{ bg: 'myGray.200' }}
|
||||
{...props}
|
||||
>
|
||||
<MyIcon name={'closeLight'} w={'12px'} color={'myGray.500'} />
|
||||
</Flex>
|
||||
);
|
||||
};
|
||||
|
||||
export default CloseIcon;
|
||||
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1686969412308" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3481" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M517.864056 487.834624c-56.774051-54.213739-58.850339-144.187937-4.6366-200.960964 54.212716-56.773028 144.187937-58.849316 200.960964-4.6366 56.775074 54.213739 58.850339 144.186913 4.6366 200.960964C664.613328 539.972075 574.639131 542.048363 517.864056 487.834624zM687.194626 452.994118c37.533848-39.308261 36.09508-101.596909-3.210112-139.128711-39.304168-37.531801-101.593839-36.094056-139.127687 3.211135-37.532825 39.307238-36.093033 101.593839 3.212158 139.125641C587.374176 493.736031 649.660778 492.302379 687.194626 452.994118zM479.104287 670.917406l-101.495602 106.289792c26.206872 25.024953 27.167756 66.540486 2.14178 92.749404-25.028023 26.209942-66.543555 27.16571-92.750427 2.140757l-58.361199 53.027727c0 0-68.750827 11.100826-100.379175-19.101033-31.630395-30.205952-37.865399-112.721271-37.865399-112.721271l246.37427-258.302951c-63.173808-117.608581-47.24707-267.162736 49.939389-368.939747 36.517705-38.242999 80.346933-65.156976 127.165238-81.040734l1.084705 46.269813c-35.443233 14.07967-68.566632 35.596729-96.618525 64.973804-80.271208 84.064604-96.099708 205.865671-49.433876 305.083393l23.075555 39.163975L146.090774 798.015106c0 0 0.593518 49.77873 17.242709 65.677838 14.888082 14.216793 61.832254 9.828856 61.832254 9.828856l60.407812-63.260789 31.631418 30.203906c8.741082 8.346085 22.570042 8.030907 30.91715-0.711198 8.347109-8.742105 8.026814-22.571065-0.713244-30.91715l-31.632441-30.207999 156.456355-163.846672 39.009456 22.481014c101.259218 42.039465 222.201731 20.61041 302.474986-63.453171 104.251366-109.178585 100.260471-282.211477-8.91709-386.464889-33.591049-32.075533-73.260537-53.829999-115.093295-65.49262l-1.030469-45.153386c53.197596 12.471033 103.945397 38.547944 146.323577 79.015611 126.645398 120.931257 131.277906 321.649698 10.344602 448.296119C748.158093 705.787588 599.500355 728.598106 479.104287 670.917406z" p-id="3482"></path></svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1683254586102" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="940" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M512 34.13333333c263.91893333 0 477.86666667 213.94773333 477.86666667 477.86666667S775.91893333 989.86666667 512 989.86666667H79.6448A45.51146667 45.51146667 0 0 1 34.13333333 944.3552V512C34.13333333 248.08106667 248.08106667 34.13333333 512 34.13333333zM307.2 580.26666667a22.7552 22.7552 0 0 0-22.7552 22.7552V648.53333333A22.7552 22.7552 0 0 0 307.2 671.28853333h227.5552A22.7552 22.7552 0 0 0 557.51146667 648.53333333v-45.51146666A22.7552 22.7552 0 0 0 534.7552 580.26666667H307.2z m0-182.0448a22.7552 22.7552 0 0 0-22.7552 22.75626666v45.5104A22.7552 22.7552 0 0 0 307.2 489.2448h409.6a22.7552 22.7552 0 0 0 22.7552-22.75626667v-45.5104A22.7552 22.7552 0 0 0 716.8 398.22186667H307.2z" p-id="941"></path></svg>
|
||||
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1689057990782" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1770" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M878.5 255.1H770V146.7c0-43.6-35.5-79.1-79.1-79.1H145.2c-43.6 0-79.1 35.5-79.1 79.1v545.8c0 43.6 35.5 79.1 79.1 79.1h108.4V880c0 43.6 35.5 79.1 79.1 79.1h545.8c43.6 0 79.1-35.5 79.1-79.1V334.2c-0.1-43.6-35.6-79.1-79.1-79.1zM145.2 707.5c-8.3 0-15.1-6.8-15.1-15.1V146.7c0-8.3 6.8-15.1 15.1-15.1H691c8.3 0 15.1 6.8 15.1 15.1v545.8c0 8.3-6.8 15.1-15.1 15.1H145.2zM893.5 880c0 8.3-6.8 15.1-15.1 15.1H332.7c-8.3 0-15.1-6.8-15.1-15.1V771.5H691c43.6 0 79.1-35.5 79.1-79.1V319.1h108.4c8.3 0 15.1 6.8 15.1 15.1V880z" p-id="1771"></path></svg>
|
||||
|
Before Width: | Height: | Size: 840 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1681997838051" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4520" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M898 178.7H665.3c4.3-9.8 6.7-20.6 6.7-32 0-44-36-80-80-80H432c-44 0-80 36-80 80 0 11.4 2.4 22.2 6.7 32H126c-13.2 0-24 10.8-24 24s10.8 24 24 24h772c13.2 0 24-10.8 24-24s-10.8-24-24-24z m-466 0c-8.5 0-16.5-3.4-22.6-9.4-6.1-6.1-9.4-14.1-9.4-22.6s3.4-16.5 9.4-22.6c6.1-6.1 14.1-9.4 22.6-9.4h160c8.5 0 16.5 3.4 22.6 9.4 6.1 6.1 9.4 14.1 9.4 22.6 0 8.5-3.4 16.5-9.4 22.6-6.1 6.1-14.1 9.4-22.6 9.4H432zM513 774.7c18.1 0 33-14.8 33-33v-334c0-18.1-14.9-33-33-33h-2c-18.1 0-33 14.8-33 33v334c0 18.2 14.8 33 33 33h2zM363 774.7c18.1 0 33-14.8 33-33v-334c0-18.1-14.9-33-33-33h-2c-18.1 0-33 14.8-33 33v334c0 18.2 14.8 33 33 33h2zM663 774.7c18.1 0 33-14.8 33-33v-334c0-18.1-14.9-33-33-33h-2c-18.1 0-33 14.8-33 33v334c0 18.2 14.8 33 33 33h2z" p-id="4521"></path><path d="M812 280.7c-13.3 0-24 10.7-24 24v530c0 41.9-34.1 76-76 76H312c-41.9 0-76-34.1-76-76v-530c0-13.3-10.7-24-24-24s-24 10.7-24 24v530c0 68.4 55.6 124 124 124h400c68.4 0 124-55.6 124-124v-530c0-13.2-10.7-24-24-24z" p-id="4522"></path></svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1684826302600" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2244" xmlns:xlink="http://www.w3.org/1999/xlink" ><path d="M904 512h-56c-4.4 0-8 3.6-8 8v320H184V184h320c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V520c0-4.4-3.6-8-8-8z" p-id="2245"></path><path d="M355.9 534.9L354 653.8c-0.1 8.9 7.1 16.2 16 16.2h0.4l118-2.9c2-0.1 4-0.9 5.4-2.3l415.9-415c3.1-3.1 3.1-8.2 0-11.3L785.4 114.3c-1.6-1.6-3.6-2.3-5.7-2.3s-4.1 0.8-5.7 2.3l-415.8 415c-1.4 1.5-2.3 3.5-2.3 5.6z m63.5 23.6L779.7 199l45.2 45.1-360.5 359.7-45.7 1.1 0.7-46.4z" p-id="2246"></path></svg>
|
||||
|
Before Width: | Height: | Size: 810 B |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1686468581713" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2951" xmlns:xlink="http://www.w3.org/1999/xlink" ><path d="M512 640.64a42.666667 42.666667 0 0 0 42.666667-42.666667v-341.333333h130.986666a21.333333 21.333333 0 0 0 14.250667-5.461333l2.688-2.901334a21.333333 21.333333 0 0 0-4.010667-29.909333l-165.717333-126.464a32 32 0 0 0-38.912 0.042667L329.472 218.453333a21.333333 21.333333 0 0 0 12.970667 38.229334H469.333333v341.333333a42.666667 42.666667 0 0 0 42.666667 42.666667z m229.674667-298.368a42.666667 42.666667 0 0 0 4.992 85.034667H853.333333v426.666666H170.666667v-426.666666h106.666666a42.666667 42.666667 0 0 0 0-85.333334H170.666667a85.333333 85.333333 0 0 0-85.333334 85.333334v426.666666a85.333333 85.333333 0 0 0 85.333334 85.333334h682.666666a85.333333 85.333333 0 0 0 85.333334-85.333334v-426.666666a85.333333 85.333333 0 0 0-85.333334-85.333334h-106.666666z" fill="#000000" p-id="2952"></path></svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1689324655973" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3734" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M512 601.09184948l-213.36752354-331.89890023A41.3976083 41.3976083 0 0 0 222.02342717 291.06546788v428.06065559H208.2150185a41.42522469 41.42522469 0 0 0 0 82.85044936h110.46726671a41.42522469 41.42522469 0 0 0 0-82.85044936h-13.80840868V432.10455041l172.27370066 267.99358607a41.42522469 41.42522469 0 0 0 69.70484562 0l172.27370066-267.99358607V719.12612347H705.31771479a41.42522469 41.42522469 0 0 0 0 82.85044936h110.46726671a41.42522469 41.42522469 0 0 0 0-82.85044936h-13.80840867V291.06546788a41.42522469 41.42522469 0 0 0-76.69189974-21.76205051L512 601.09184948z" p-id="3735"></path><path d="M14.8973037 180.59820247a165.70089876 165.70089876 0 0 1 165.70089877-165.70089877h662.80359506a165.70089876 165.70089876 0 0 1 165.70089877 165.70089877v662.80359506a165.70089876 165.70089876 0 0 1-165.70089877 165.70089877H180.59820247a165.70089876 165.70089876 0 0 1-165.70089877-165.70089877V180.59820247z m165.70089877-82.85044938a82.85044939 82.85044939 0 0 0-82.85044938 82.85044938v662.80359506a82.85044939 82.85044939 0 0 0 82.85044938 82.85044938h662.80359506a82.85044939 82.85044939 0 0 0 82.85044938-82.85044938V180.59820247a82.85044939 82.85044939 0 0 0-82.85044938-82.85044938H180.59820247z" p-id="3736"></path></svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1689325086843" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1918" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M75.09333333 220.72888889h-36.40888888H75.09333333z m0 582.54222222h0z m194.18074112 194.18074112v-36.40888889 36.40888889z m485.4518511 0v0z m194.18074112-194.18074112h-36.40888889 36.40888889z m0-307.92211001h0zM480.10581333 26.54814777v-36.40888889V26.54814777zM269.27407445 26.54814777v0z m622.73763556 331.46652444l-25.72894891 25.72894891 25.72894891-25.72894891z m-274.57156779-274.57156664l25.72894777-25.72894891-25.72894777 25.72894891zM560.54518557 220.72888889h-36.4088889 36.4088889z m194.18073998 194.18074112v0zM38.68444445 220.72888889v582.54222222h72.81777777V220.72888889h-72.81777777zM269.27407445 1033.86074112h485.4518511v-72.81777778H269.27407445v72.81777778zM985.31555555 803.27111111v-307.92211001h-72.81777777V803.27111111h72.81777777zM480.10581333-9.86074112H269.27407445v72.81777778h210.83173888v-72.81777778z m437.68339001 342.14646557l-274.62011335-274.62011222-51.45789554 51.45789554 274.57156665 274.66865778 51.45789668-51.45789554zM480.10581333 62.95703666a157.77185223 157.77185223 0 0 1 111.55683556 46.21501667l51.45789668-51.45789667a230.58963001 230.58963001 0 0 0-163.01473224-67.57489778v72.81777778z m505.20974222 432.39196444c0-61.16693333-24.27259221-119.80951666-67.52635221-163.06327665l-51.45789667 51.45789667c29.56401778 29.61256334 46.16647111 69.75943111 46.16647111 111.60537998h72.81777777zM38.68444445 803.27111111A230.58963001 230.58963001 0 0 0 269.27407445 1033.86074112v-72.81777778A157.77185223 157.77185223 0 0 1 111.50222222 803.27111111h-72.81777777z m72.81777777-582.54222222A157.77185223 157.77185223 0 0 1 269.27407445 62.95703666v-72.81777778A230.58963001 230.58963001 0 0 0 38.68444445 220.72888889h72.81777777zM754.72592555 1033.86074112A230.58963001 230.58963001 0 0 0 985.31555555 803.27111111h-72.81777777A157.77185223 157.77185223 0 0 1 754.72592555 961.04296334v72.81777778zM524.13629667 26.54814777v194.18074112h72.81777778V26.54814777h-72.81777778zM754.72592555 451.3185189h194.18074112v-72.81777778h-194.18074112v72.81777778zM524.13629667 220.72888889A230.58963001 230.58963001 0 0 0 754.72592555 451.3185189v-72.81777778A157.77185223 157.77185223 0 0 1 596.95407445 220.72888889h-72.81777778z" p-id="1919"></path><path d="M241.94313443 594.76954112V803.27111111h42.08867556v-78.6432h27.42803001c19.07825778 0 33.64181333-0.97090333 43.69066667-3.0098011 7.37886777-1.60199111 14.61210112-4.8545189 21.74824334-9.80612779 7.18468779-5.00015445 13.1072-11.89356999 17.76753778-20.63170332 4.66033778-8.73813333 6.99050667-19.46661888 6.99050666-32.28254891 0-16.55390777-4.02924999-30.09801443-12.13629667-40.53522887a54.56478777 54.56478777 0 0 0-30.00092445-20.43752334c-7.76723001-2.08744334-24.46677333-3.15543666-50.00154112-3.15543666H241.89459001z m271.07631446 0h-76.9441189V803.27111111h79.1771978c15.53445888 0 28.01057223-1.45635555 37.28270222-4.36906666 12.42756779-4.02924999 22.28224-9.5634011 29.6125622-16.69954333 9.66049223-9.36922112 17.08790557-21.65115221 22.33078557-36.79725113 4.22343111-12.42756779 6.35941888-27.18530333 6.35941888-44.37029888 0-19.56371001-2.28162333-35.92343666-6.79632555-49.22481778a91.02222222 91.02222222 0 0 0-19.90352554-33.83599445 69.71088555 69.71088555 0 0 0-31.45728-19.22389333c-9.12649443-2.66998557-22.33078557-3.98070557-39.66141668-3.98070443z m133.98471111 0V803.27111111h42.04012999v-88.59496334h87.0415178v-35.29234887h-87.0415178v-49.32190891h100.87689558v-35.29234887H646.95561443zM283.98326557 689.18992555v-59.12803556h20.34043221q22.71914667 0 30.29219555 1.40781113a29.12711111 29.12711111 0 0 1 16.89372445 9.22358443c4.46615666 4.95160889 6.69923555 11.16539221 6.69923555 18.78698666a27.71930112 27.71930112 0 0 1-17.9617189 26.45712669c-5.53415111 2.18453333-16.6509989 3.25252779-33.25345109 3.25252665h-23.01041777z m194.13219555 78.93447111v-138.06250667h18.93262222c17.13644999 0 28.64165888 0.63108779 34.51562667 1.94180779q11.79648 2.57289443 19.51516444 9.85467221c5.09724445 4.8545189 9.07795001 11.55375445 11.94211556 20.1947978 2.81562112 8.64104334 4.27197667 20.97152 4.27197554 37.0885211s-1.45635555 28.88438557-4.27197554 38.30215111c-2.86416555 9.27212999-6.5536 15.97136555-11.11684779 20.0491611q-6.65068999 6.11669333-16.89372444 8.64104335a114.66372779 114.66372779 0 0 1-25.48622223 1.99035221h-31.40873443z" p-id="1920"></path></svg>
|
||||
|
Before Width: | Height: | Size: 4.5 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1689491332665" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5892" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M393.2 701.7c-8.2 0-16.4-3.1-22.6-9.4-12.5-12.5-12.5-32.8 0-45.3l115.3-115.3c14-14 36.9-14 50.9 0L652.1 647c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-95.5-95.5-95.5 95.5c-6.2 6.2-14.4 9.4-22.6 9.4z" fill="" p-id="5893"></path><path d="M511.3 921.1c-17.7 0-32-14.3-32-32v-276c0-17.7 14.3-32 32-32s32 14.3 32 32v276c0 17.6-14.3 32-32 32z" fill="" p-id="5894"></path><path d="M732.7 784.9c-17.7 0-32-14.3-32-32s14.3-32 32-32c90.6 0 164.3-73.7 164.3-164.3 0-82.9-61.9-153-144-163.1l-22.7-2.8-4.7-22.4c-20.8-99.9-110.1-172.4-212.4-172.4-102.2 0-191.5 72.5-212.4 172.4l-4.7 22.4-22.7 2.8c-82.1 10.1-144 80.2-144 163.1 0 90.6 73.7 164.3 164.3 164.3 17.7 0 32 14.3 32 32s-14.3 32-32 32c-61 0-118.3-23.8-161.5-66.9-43.1-43.1-66.9-100.5-66.9-161.5 0-107.6 75.2-199.7 178.2-222.8 15.8-53.8 47.7-102.2 91.3-138.1 50.1-41.2 113.4-63.9 178.3-63.9s128.3 22.7 178.3 63.9c43.6 35.9 75.5 84.3 91.3 138.1C885.9 356.8 961 448.9 961 556.5c0 61-23.8 118.3-66.9 161.5-43.1 43.1-100.4 66.9-161.4 66.9z" fill="" p-id="5895"></path></svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@@ -1 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1689598169213" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3429" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><path d="M254.80971969 32C131.70542094 32 32 131.82654219 32 254.83663531c0 123.11775656 99.81308438 222.83214938 222.80971969 222.83214938h222.92186906V254.83663531C477.72710281 131.71439281 377.91401844 32 254.80971969 32z m514.38056062 0c-122.99214938 0-222.92186906 99.82654219-222.92186906 222.83663531v222.83214938h222.92186906C892.18691562 477.66878469 992 377.95887875 992 254.83663531 992 131.71439281 892.18691562 32 769.19028031 32zM32 769.16336469C32 892.28560719 131.81308438 992 254.80971969 992c123.10429875 0 222.80971969-99.71439281 222.80971968-222.83663531v-222.83214938H254.80971969C131.81308438 546.33121531 32 646.04112125 32 769.16336469z m737.07813094-222.83214938h-222.91738313v222.83214938c0 123.12224344 99.81308438 222.83663531 222.91738313 222.83663531 123.10878469 0 222.80971969-99.82654219 222.80971968-222.83663531 0.11214937-123.11775656-99.700935-222.83214938-222.80971968-222.83214938z" p-id="3430"></path></svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |