mirror of
https://github.com/langgenius/dify.git
synced 2026-01-21 12:35:21 +08:00
Compare commits
7463 Commits
0.3.19
...
fix/codeow
| Author | SHA1 | Date | |
|---|---|---|---|
| 5874b920b2 | |||
| c51ab6ec37 | |||
| 1fc2255219 | |||
| 037389137d | |||
| 8cd3e84c06 | |||
| b3c6ac1430 | |||
| 68bb97919a | |||
| f268d7c7be | |||
| d695a79ba1 | |||
| cd5a745bd2 | |||
| 51e5f422c4 | |||
| ec3b2b40c2 | |||
| 67ae3e9253 | |||
| d38e3b7792 | |||
| 43d27edef2 | |||
| 94b87eac72 | |||
| fd31af6012 | |||
| 228deccec2 | |||
| 639f1d31f7 | |||
| ec786fe236 | |||
| fe3a6ef049 | |||
| 8b761319f6 | |||
| 002d8769b0 | |||
| 5aba111297 | |||
| dc9b3a7e03 | |||
| 5f2e0d6347 | |||
| 1f72571c06 | |||
| 820925a866 | |||
| 299bd351fd | |||
| 13bf6547ee | |||
| 1b733abe82 | |||
| 5782e26ab2 | |||
| 38d329e75a | |||
| 58f448a926 | |||
| 7a7fea40d9 | |||
| 0309545ff1 | |||
| 6deabfdad3 | |||
| f9b4c31344 | |||
| 8d8800e632 | |||
| 4ca4493084 | |||
| 7efa0df1fd | |||
| b786e101e5 | |||
| 09a8046b10 | |||
| 2f6b3f1c5f | |||
| 2551f6f279 | |||
| 01afa56166 | |||
| 5815950092 | |||
| 766e16b26f | |||
| 0fdb4e7c12 | |||
| 64babb35e2 | |||
| 38522e5dfa | |||
| 4ccc150fd1 | |||
| a4c57017d5 | |||
| b2a7cec644 | |||
| ddc5cbe865 | |||
| 1e23957657 | |||
| 2731b04ff9 | |||
| e8ca80a61a | |||
| e76129b5a4 | |||
| 6635ea62c2 | |||
| 6b8c649876 | |||
| af587f3869 | |||
| 1c1f124891 | |||
| b353a126d8 | |||
| ef0e1031b0 | |||
| d7010f582f | |||
| d696b9f35e | |||
| 665d49d375 | |||
| 26a1c84881 | |||
| dbecba710b | |||
| 591414307a | |||
| 1241cab113 | |||
| 490b7ac43c | |||
| 0f521b26ae | |||
| e4ec4e1470 | |||
| 203c2f0456 | |||
| b502d30e77 | |||
| a486c47b1e | |||
| f76a3f545c | |||
| b5650b579d | |||
| 83702762c8 | |||
| abc13ef762 | |||
| ce00388278 | |||
| 4a76318877 | |||
| e073e755f9 | |||
| 57b405c4c2 | |||
| 2181ffdc89 | |||
| 82dac2eba0 | |||
| 58be008676 | |||
| eed38c8b2a | |||
| 6bd114285c | |||
| 25698ccd54 | |||
| bb3aa0178d | |||
| 751ce4ec41 | |||
| da98a38b14 | |||
| 034e3e85e9 | |||
| aab95d0626 | |||
| 15ea27868e | |||
| bcbd3de336 | |||
| a0daab2711 | |||
| e1d11681c0 | |||
| 8a995d0c21 | |||
| 6241b87f90 | |||
| 2c9e435558 | |||
| b12057b7e5 | |||
| 2445d04d19 | |||
| a58986eb06 | |||
| a39b151d5f | |||
| 3841e8578f | |||
| e0824c2d93 | |||
| c75a4e6309 | |||
| 1dfde240cb | |||
| c6e6f3b7cb | |||
| ea320ce055 | |||
| 6d3ed468d8 | |||
| a6c6bcf95c | |||
| 63b8bbbab3 | |||
| 33ff01d04c | |||
| ae126fd56f | |||
| 9fed2dc065 | |||
| 2e0964e0b0 | |||
| 237bb4595b | |||
| 4486b54680 | |||
| 1a2f8dfcb4 | |||
| 3c30d0f41b | |||
| 5f61ca5e6f | |||
| 06466cb73a | |||
| c5b6219006 | |||
| ae5b5a6aa9 | |||
| a4c4d18f42 | |||
| 3cf19dc07f | |||
| 73c58e4cbb | |||
| c2043d0f6d | |||
| cad2991946 | |||
| e260815c5e | |||
| b4e7239ac7 | |||
| 4b6f4081d6 | |||
| d1c9183d3b | |||
| 2f9705eb6f | |||
| 0e3fab1f9f | |||
| 2431ddfde6 | |||
| 1e4e963d8c | |||
| 522508df28 | |||
| 859f73c19d | |||
| 82c11e36ea | |||
| a6cd2ad880 | |||
| b2a604b801 | |||
| 7c060fc35c | |||
| 48e39b60a8 | |||
| f038aa4746 | |||
| 4833d39ab3 | |||
| fa910be0f6 | |||
| bc274e7300 | |||
| 7b1fc4d2e6 | |||
| 204d5f1bb9 | |||
| 8fc1c7d994 | |||
| 879869d3e3 | |||
| 1d2cdf3489 | |||
| a5d0e68675 | |||
| 605e543372 | |||
| c432f601ab | |||
| e8d03a422d | |||
| 6be013e072 | |||
| 014cbaf387 | |||
| 1be38183e5 | |||
| 8bab42e224 | |||
| 99e9fc751b | |||
| a1b735a4c0 | |||
| c0b7ffd5d0 | |||
| 012877d8d4 | |||
| 41bb6f3109 | |||
| 88c9b18cb6 | |||
| 6efdc94661 | |||
| 68526c09fc | |||
| a78bc507c0 | |||
| e83c7438cb | |||
| 82068a6918 | |||
| 108bcbeb7c | |||
| c4b02be6d3 | |||
| 30eebf804f | |||
| ad7fdd18d0 | |||
| 5d2fbf5215 | |||
| 4a89403566 | |||
| e0c05b2123 | |||
| 85b99580ea | |||
| 15fbedfcad | |||
| 1e6d0de48b | |||
| cad751c00c | |||
| a47276ac24 | |||
| 20403c69b2 | |||
| ffc04f2a9b | |||
| d1580791e4 | |||
| c74eb4fcf3 | |||
| a798534337 | |||
| 470883858e | |||
| 4f4911686d | |||
| 6d479dcdbb | |||
| 24348c40a6 | |||
| a39b50adbb | |||
| 81832c14ee | |||
| b86022c64a | |||
| 45e816a9f6 | |||
| 667b1c37a3 | |||
| b75d533f9b | |||
| aece55d82f | |||
| c432b398f4 | |||
| 9cb2645793 | |||
| 6ac61bd585 | |||
| b02165ffe6 | |||
| 6c576e2c66 | |||
| b0e7e7752f | |||
| 2799b79e8c | |||
| 805a1479f9 | |||
| fe6538b08d | |||
| 1bbb9d6644 | |||
| 5c06e285ec | |||
| 19c92fd670 | |||
| 6026bd873b | |||
| 1369119a0c | |||
| b76e17b25d | |||
| ca7794305b | |||
| fd255e81e1 | |||
| 09d31d1263 | |||
| 47dc26f011 | |||
| 123bb3ec08 | |||
| 90f77282e3 | |||
| 5208867ccc | |||
| edc7ccc795 | |||
| c9798f6425 | |||
| 20ecf7f1d0 | |||
| 9dcb780fcb | |||
| 1cb7b09933 | |||
| 2c62a77cf4 | |||
| b9bc48d8dd | |||
| ed234e311b | |||
| 9843fec393 | |||
| aa4cabdeb5 | |||
| eea713b668 | |||
| fc62538a94 | |||
| 7994144df7 | |||
| e153c483b6 | |||
| 422bb4d4bb | |||
| 87a80d7613 | |||
| e91105ca87 | |||
| 37903722fe | |||
| f4c82d0010 | |||
| fe50093c18 | |||
| 4317af1e90 | |||
| 61a0fcc2ea | |||
| f627348b11 | |||
| 87fb9a6b69 | |||
| 97a2e2ec2e | |||
| 68d357d7f6 | |||
| a103ad3ee7 | |||
| f65d5a9761 | |||
| 6e0a5f5bbd | |||
| 22f858152f | |||
| 775d2e14fc | |||
| 744b287e67 | |||
| c0fc5d98f0 | |||
| 08ea79d730 | |||
| f31b821cc0 | |||
| 34be16874f | |||
| e9738b891f | |||
| 829796514a | |||
| ef1db35f80 | |||
| f9c67621ca | |||
| e29e8e3180 | |||
| 7a81e720d4 | |||
| 55600c0eb1 | |||
| 35e41d7d68 | |||
| b610cf9a11 | |||
| c8e9edc024 | |||
| 471cd760d7 | |||
| 7f48c57edf | |||
| 6569801162 | |||
| 9dd83f50a7 | |||
| 59c56b1b0d | |||
| 94cd2de940 | |||
| 3c23375607 | |||
| 56047f638f | |||
| 9c01d3e775 | |||
| c85c87f3da | |||
| eaa02e3d55 | |||
| 0219222a60 | |||
| dba659b220 | |||
| ee6458768e | |||
| ed3d02dc6d | |||
| 95471b1188 | |||
| 6190cfbfd8 | |||
| 11f2f95103 | |||
| 2abbc14703 | |||
| b2b2816ade | |||
| 4461df1bd9 | |||
| f7f6b4a8b0 | |||
| 41be581594 | |||
| 20ad5b7ac2 | |||
| a1c0bd7a1c | |||
| fd7c4e8a6d | |||
| 41e549af14 | |||
| b7360140ee | |||
| c71f7c7613 | |||
| c905c47775 | |||
| 4ca7ba000c | |||
| f260627660 | |||
| 1e9142c213 | |||
| 82890fe38e | |||
| 7dc7c8af98 | |||
| addebc465a | |||
| 5ab315aeaf | |||
| f092bc1912 | |||
| 23b49b8304 | |||
| 9e97248ede | |||
| d532b06310 | |||
| 07a2281730 | |||
| 42385f3ffa | |||
| c597234374 | |||
| 3de73f07c6 | |||
| 0caeaf6e5c | |||
| 3395297c3e | |||
| e60a7c7143 | |||
| 0e62a66cc2 | |||
| ff32dff163 | |||
| 543c5236e7 | |||
| 341b3ae7c9 | |||
| f01907aac2 | |||
| a7c855cab8 | |||
| 29afc0657d | |||
| d9860b8907 | |||
| dc1ae57dc6 | |||
| d6bd2a9bdb | |||
| c9eed67cf6 | |||
| 0ded6303c1 | |||
| b6e0abadab | |||
| 43bcf40f80 | |||
| f06025a342 | |||
| 24fb95b050 | |||
| 49fca63927 | |||
| ce5fe86430 | |||
| 666586b59c | |||
| 8a2851551a | |||
| a2fe4a28c3 | |||
| 417ebd160b | |||
| 82be305680 | |||
| 03002f4971 | |||
| 1e7e8a8988 | |||
| a715d5ac23 | |||
| 398c8117fe | |||
| f45c18ee35 | |||
| 15c1db42dd | |||
| a31c01f8d9 | |||
| 62753cdf13 | |||
| dc7ce125ad | |||
| eabdb09f8e | |||
| fa6d03c979 | |||
| 634fb192ef | |||
| a4b38e7521 | |||
| 8ff6de91b0 | |||
| 7fa0ad3161 | |||
| 53b21eea61 | |||
| 2f3a61b51b | |||
| 8bca7814f4 | |||
| 92c81b1833 | |||
| 44553d412c | |||
| 95ce224df0 | |||
| 8555635967 | |||
| e843fe8aa6 | |||
| b198c9474a | |||
| 4bb00b83d9 | |||
| c91cbf6b97 | |||
| f6ede6f1c1 | |||
| 65976b27fe | |||
| 2d73ee64a3 | |||
| c61c2b0abd | |||
| 40d3332690 | |||
| 8e45753c68 | |||
| 73e217ab0d | |||
| 26ff59172e | |||
| bebb4ffbaa | |||
| 523da66134 | |||
| e1ca7a9bdb | |||
| 9a8cf709ba | |||
| f909040567 | |||
| 845adb664a | |||
| 0c6cae2d59 | |||
| a893ee0ffc | |||
| 82b63cc6e2 | |||
| c327cfa86e | |||
| 82219c1162 | |||
| cfc3f1527a | |||
| caf1a5fbab | |||
| 4a6398fc1f | |||
| 2bcf96565a | |||
| 9a9d6a4a2b | |||
| 05f66fcf0d | |||
| ea8245a91b | |||
| 759a932bb7 | |||
| fb6f05c267 | |||
| ff9b74efeb | |||
| d6e7543ba6 | |||
| e45d5700ec | |||
| 4e6682bd85 | |||
| 32c715c4d0 | |||
| c11cdf7468 | |||
| 6217c96576 | |||
| 977690590e | |||
| fd845c8b6c | |||
| d7d9abb007 | |||
| 9f22b2726b | |||
| f28b519556 | |||
| 762cf91133 | |||
| 9dd3dcff2b | |||
| 34fbcc9457 | |||
| 9cc8ac981b | |||
| 1153dcef69 | |||
| f811471b18 | |||
| 2382229c7d | |||
| f0e739be43 | |||
| 4dccdf9478 | |||
| 4c37d650d3 | |||
| 1b334e6966 | |||
| d463bd6323 | |||
| 8c298b33cd | |||
| dc1a380888 | |||
| 7e9be4d3d9 | |||
| 5579521ffc | |||
| ab1059134d | |||
| fe2ac66a52 | |||
| f87db2652b | |||
| 3f9f02b9e7 | |||
| 578247ffbc | |||
| 9a5f214623 | |||
| 141ca8904a | |||
| 4488c090b2 | |||
| 59c1fde351 | |||
| cf7ff76165 | |||
| ac79691d69 | |||
| 1a37989769 | |||
| 830f891a74 | |||
| 5937a66e22 | |||
| 894e38f713 | |||
| e4b5b0e5fd | |||
| 598dd1f816 | |||
| 35e24d4d14 | |||
| fea2ffb3ba | |||
| 64f55d55a1 | |||
| bfda4ce7e6 | |||
| 4f7cb7cd2a | |||
| 6517323add | |||
| 531a0b755a | |||
| 91bb8ae4d2 | |||
| 8cafc20098 | |||
| 9d5300440c | |||
| 58524d6d2b | |||
| 19cc6ea993 | |||
| d7f0a31e24 | |||
| 312974aa20 | |||
| d19c100166 | |||
| a8ad80c405 | |||
| 650e38e17f | |||
| 24612adf2c | |||
| 06649f6c21 | |||
| 8b61f5e9c4 | |||
| 6432898e7a | |||
| cced33d068 | |||
| bd01af6415 | |||
| 35011b810d | |||
| f295c7532c | |||
| 7065b67d07 | |||
| c0b50ef61d | |||
| 1d8cca4fa2 | |||
| 3474c179e6 | |||
| 433dad7e1a | |||
| be7ee380bc | |||
| cff5de626b | |||
| 4d8b8f9210 | |||
| a16ef7e73c | |||
| c39dae06d4 | |||
| f906e70f6b | |||
| 5139119307 | |||
| 1b537f904a | |||
| 556b631c54 | |||
| 49df9ceaf3 | |||
| 92ec1ac27a | |||
| e74097afdf | |||
| 8ddc4f2292 | |||
| 7b51320346 | |||
| 9e39be0770 | |||
| 3e5e87930c | |||
| 15a5ba67f1 | |||
| 9e3b4dc90d | |||
| 48c42a9fba | |||
| 0b35bc1ede | |||
| 8e01bb40fe | |||
| 9d21772820 | |||
| b745839bdb | |||
| 59ad6e02ce | |||
| a3b33cbe28 | |||
| 7b8540281a | |||
| 0a6b78f883 | |||
| 56ee8f7d64 | |||
| 3cfcd32876 | |||
| 06dcb55a9d | |||
| ec6cafd7aa | |||
| 6e9858960d | |||
| 150a8276b9 | |||
| c6a90d4bb3 | |||
| c71fd7113c | |||
| 5fc104a992 | |||
| d1de3cfb94 | |||
| 44d36f2460 | |||
| 9088f151d9 | |||
| c692962650 | |||
| f0a60a9000 | |||
| 2f50f3fd4b | |||
| 24cd7bbc62 | |||
| d299e75e1b | |||
| f86b6658c9 | |||
| 0a56d65581 | |||
| dfc03bac9f | |||
| 81e1376e08 | |||
| f50c85d536 | |||
| 5830c69694 | |||
| 0173496a77 | |||
| 30c5b47699 | |||
| e3191d4e91 | |||
| a9b3539b90 | |||
| 5217017e69 | |||
| bd5df5cf1c | |||
| 456dbfe7d7 | |||
| 586f210d6e | |||
| 275a0f9ddd | |||
| cbf2ba6cec | |||
| 1bd621f819 | |||
| bb6a331490 | |||
| 3922ad876f | |||
| fdb53fdeb1 | |||
| 3fb5a7bff1 | |||
| 6157c67cfe | |||
| fbc745764a | |||
| 78f09801b5 | |||
| d0dd81cf84 | |||
| 65b832c46c | |||
| a90b60c36f | |||
| 94a07706ec | |||
| ab2eacb6c1 | |||
| aead192743 | |||
| c1e8584b97 | |||
| 8a2b208299 | |||
| 2b6882bd97 | |||
| aa51662d98 | |||
| 3068526797 | |||
| 298d8c2d88 | |||
| 294e01a8c1 | |||
| 3a5aa4587c | |||
| cf1778e696 | |||
| 54db4c176a | |||
| 5d3e8a31d0 | |||
| 885dff82e3 | |||
| 3c4aa24198 | |||
| 33b0814323 | |||
| 45ae511036 | |||
| 0fa063c640 | |||
| 40d35304ea | |||
| 89821d66bb | |||
| 09d84e900c | |||
| a8746bff30 | |||
| c4d8bf0ce9 | |||
| 9cca605bac | |||
| dbd23f91e5 | |||
| 9387cc088c | |||
| 11f7a89e25 | |||
| 654d522b31 | |||
| 31e6ef77a6 | |||
| e56c847210 | |||
| e00172199a | |||
| 04f47836d8 | |||
| faaca822e4 | |||
| dc0f053925 | |||
| 517726da3a | |||
| 1d6c03eddf | |||
| fdfccd1205 | |||
| b30e7ced0a | |||
| 11770439be | |||
| d89c5f7146 | |||
| 4a475bf1cd | |||
| 10be9cfbbf | |||
| c20e0ad90d | |||
| 22f64d60bb | |||
| 7b7d332239 | |||
| b1d189324a | |||
| 00fb468f2e | |||
| bbbb6e04cb | |||
| f5161d9add | |||
| 787251f00e | |||
| cfe21f0826 | |||
| 196f691865 | |||
| 7a5bb1cfac | |||
| b80d55b764 | |||
| dd71625f52 | |||
| 19936d23d1 | |||
| decf0f3da0 | |||
| 7242a67f84 | |||
| c4884eb669 | |||
| d49f3327e4 | |||
| 633e68a2f7 | |||
| 809f48f733 | |||
| 578b1b45ea | |||
| 86c3c58e64 | |||
| 8d803a26eb | |||
| aa3129c2a9 | |||
| 97c924fe29 | |||
| 591c463e4b | |||
| e1691fddaa | |||
| b4d4351203 | |||
| f7b1348623 | |||
| 2619c7553a | |||
| f79d8baf63 | |||
| bbdcbac544 | |||
| d552680e72 | |||
| df43c6ab8a | |||
| cd47a47c3b | |||
| e5d4235f1b | |||
| f60aa36fa0 | |||
| b2bcb6d21a | |||
| b6cea71023 | |||
| 6462328620 | |||
| fd86cadf67 | |||
| c43c72c1a3 | |||
| d77c2e4d17 | |||
| 1a7898dff1 | |||
| af662b100b | |||
| 595df172a8 | |||
| 70bc5ca7f4 | |||
| 30617feff8 | |||
| 756864c85b | |||
| c8c94ef870 | |||
| 10d51ada59 | |||
| 00f3a53f1c | |||
| d2f0551170 | |||
| cba2b9b2ad | |||
| 029d5d36ac | |||
| 8d897153a5 | |||
| 2e914808ea | |||
| d00a72a435 | |||
| 36580221aa | |||
| e686cc9eab | |||
| 66196459d5 | |||
| a5387b304e | |||
| beb1448441 | |||
| 272102c06d | |||
| 36406cd62f | |||
| 87c41c88a3 | |||
| 095c56a646 | |||
| 244c132656 | |||
| 043ec46c33 | |||
| 0e4f19eee0 | |||
| ff34969f21 | |||
| 9a7245e1df | |||
| 4906eeac18 | |||
| 4da93ba579 | |||
| 319ecdd312 | |||
| 0c1ec35244 | |||
| 46375aacdb | |||
| e6d4331994 | |||
| 2a0abc51b1 | |||
| 3bb67885ef | |||
| e682749d03 | |||
| 9b83b0aadd | |||
| 0cac330bc2 | |||
| fb8114792a | |||
| eab6f65409 | |||
| 915023b809 | |||
| f104839672 | |||
| 6841a09667 | |||
| e937c8c72e | |||
| 960bb8a9b4 | |||
| 9b36059292 | |||
| a4acc64afd | |||
| 25c69ac540 | |||
| 96a0b9991e | |||
| 2913d17fe2 | |||
| d9e45a1abe | |||
| 24b4289d6c | |||
| fb6ccccc3d | |||
| 8b74ae683a | |||
| dd08957381 | |||
| 407323f817 | |||
| 2e2c87c5a1 | |||
| f4522fd695 | |||
| 760a2c656c | |||
| 8940decd1b | |||
| 0c4193bd91 | |||
| cd40cde790 | |||
| c60c754ac9 | |||
| ef80d3b707 | |||
| 24e8d21b3f | |||
| d823da18db | |||
| 1e3df09fc6 | |||
| 75a10c276c | |||
| 50050527eb | |||
| a39b185627 | |||
| 15270f09af | |||
| f6a5ac0698 | |||
| 2b79da722b | |||
| 71d69e43cd | |||
| 5bc6e8a433 | |||
| 68076f2e22 | |||
| 8c38363038 | |||
| 345ac8333c | |||
| 2375047ef0 | |||
| 857a48012e | |||
| 208fe3d7de | |||
| 92cddbcc02 | |||
| 599b53c9cb | |||
| 062b173c66 | |||
| db690013fd | |||
| e93bfe3d41 | |||
| ab910c736c | |||
| 4047a6bb12 | |||
| df2478dc26 | |||
| 4cc3f6045b | |||
| 1550316b8d | |||
| 87394d2512 | |||
| bad59c95bc | |||
| 9f138ef246 | |||
| 6453fc4973 | |||
| f62f926537 | |||
| b3dafd913b | |||
| b2d8a7eaf1 | |||
| 3e54414191 | |||
| a173546c8d | |||
| aa69d90489 | |||
| 4ba1292455 | |||
| bb01c31f30 | |||
| cd90b2ca9e | |||
| 9a65350cf7 | |||
| 680eb7a9f6 | |||
| 878420463c | |||
| 4692e20daf | |||
| 13fe2ca8fe | |||
| 1264e7d4f6 | |||
| 4f45978cd9 | |||
| 5a0bf8e028 | |||
| ffa163a8a8 | |||
| 8f86f5749d | |||
| 00d3bf15f3 | |||
| 7196c09e9d | |||
| fadd9e0bf4 | |||
| d8b4bbe067 | |||
| 24611e375a | |||
| ccec582cea | |||
| b2e4107c17 | |||
| 87aa070486 | |||
| 21230a8eb2 | |||
| 85cda47c70 | |||
| 7dadb33003 | |||
| b5a7e64e19 | |||
| b283b10d3e | |||
| ecb22226d6 | |||
| 8635aacb46 | |||
| bdd85b36a4 | |||
| a0c7713494 | |||
| abf4955c26 | |||
| 74340e3c04 | |||
| b98b389baf | |||
| 877806c34d | |||
| 0bbf4fb66a | |||
| 169ce71e59 | |||
| bdbe078630 | |||
| 88d5e27fe8 | |||
| bb5b8d2902 | |||
| bab4975809 | |||
| 2e44ebe98d | |||
| a1961cc37a | |||
| 727e1d3743 | |||
| 4e3b16c5f4 | |||
| 6c36bf28d7 | |||
| 5548b22fe7 | |||
| 03664d6b51 | |||
| 07d383ffaa | |||
| 9bb7bcf52e | |||
| 67a686cf98 | |||
| a3f2c05632 | |||
| efcf052004 | |||
| 9234a2293d | |||
| 7a626747cf | |||
| db01cbb63d | |||
| 4f868275a9 | |||
| ed20d14d01 | |||
| 0add1af1c8 | |||
| 5c50c3aa70 | |||
| 9e7328abfb | |||
| 188eb838c5 | |||
| 36ab9974d2 | |||
| a825f0f2b2 | |||
| 1b0f92a331 | |||
| a13d7987e0 | |||
| 635e7d3e70 | |||
| c78ef79995 | |||
| c3f9a7ed9b | |||
| c91253d05d | |||
| 285291f545 | |||
| c0e1015c6e | |||
| 12d1bcc545 | |||
| ec808f3fe8 | |||
| 394b0ac9c0 | |||
| c2fcd2895b | |||
| bb1514be2d | |||
| 8ffb9b6aed | |||
| 33afa7c84a | |||
| 69aad38d03 | |||
| 17b5309e47 | |||
| 05af23f88f | |||
| 4511f4f537 | |||
| bdacc4da36 | |||
| 1a078657d8 | |||
| 77ba3e8f26 | |||
| 84e3571ec3 | |||
| de18b14372 | |||
| a1322ddb5d | |||
| c7868fb176 | |||
| 4b6687db6b | |||
| f1d5bc58b0 | |||
| 99f4cd1cfa | |||
| 874406d934 | |||
| 07d067d828 | |||
| af7f67dc9c | |||
| 34e55028ae | |||
| 70e4d6be34 | |||
| b690ac4e2a | |||
| cbc0e639e4 | |||
| b51c724a94 | |||
| 26a9abef64 | |||
| fecdb9554d | |||
| 45ef177809 | |||
| 6574e9f0b2 | |||
| cce13750ad | |||
| 928bef9d82 | |||
| 08dd3f7b50 | |||
| 2ac7a9c8fc | |||
| 240b65b980 | |||
| 7443c5a6fc | |||
| a1cf48f84e | |||
| e5122945fe | |||
| 22cd97e2e0 | |||
| 38057b1b0e | |||
| eb52216a9c | |||
| 4c92e63b0b | |||
| ac2aa967c4 | |||
| d2e50a508c | |||
| 37975319f2 | |||
| 4aba570fa8 | |||
| e180c19cca | |||
| c595c03452 | |||
| 64c9a2f678 | |||
| 566e0fd3e5 | |||
| 7dfb72e381 | |||
| 649242f82b | |||
| cf1ee3162f | |||
| bf6485fab4 | |||
| 720ecea737 | |||
| d5e86d9180 | |||
| cab1272bb1 | |||
| 563a5af9e7 | |||
| ec0800eb1a | |||
| ea61420441 | |||
| 598ec07c91 | |||
| a932413314 | |||
| aff2482436 | |||
| 860ee20c71 | |||
| 74be2087b5 | |||
| 57f1822213 | |||
| cdfdf324e8 | |||
| f891c67eca | |||
| 5d0a50042f | |||
| 4ee49f3550 | |||
| f6059ef389 | |||
| ce2281d31b | |||
| 3d16767fb3 | |||
| 593f7989b8 | |||
| 16a3e21410 | |||
| 98204d78fb | |||
| 27bf244b3b | |||
| 9b8a03b53b | |||
| e1f871fefe | |||
| beaa8de648 | |||
| 7e629fd783 | |||
| b623224d07 | |||
| 92a939c401 | |||
| afa7228076 | |||
| bbc43ca50d | |||
| 9964cc202d | |||
| b05245eab0 | |||
| e41e23481c | |||
| 30e5c197cb | |||
| 52b1ac5f54 | |||
| a78339a040 | |||
| 2b0695bdde | |||
| 917d60a1cb | |||
| edf4a1b652 | |||
| 05cd7e2d8a | |||
| a9da8edbde | |||
| d03d3518d7 | |||
| cd95237ae4 | |||
| 1ba69b8abf | |||
| 95eac7f7f0 | |||
| f84b9fd5ef | |||
| e78f1cdc6a | |||
| 432f89cf33 | |||
| f0561c0c3b | |||
| 64e338133c | |||
| 4966e4e1fb | |||
| 19e1cbd033 | |||
| f721c778ad | |||
| a2e0f80c01 | |||
| 334218a62c | |||
| de768af099 | |||
| d36ce782b7 | |||
| fb307ae128 | |||
| 8d5f788f2b | |||
| 804e599598 | |||
| cdf9b674dc | |||
| d5aaee614f | |||
| 865ba8bb4f | |||
| ebbb4a5d0b | |||
| 9040b534c8 | |||
| 0a0ae16bd6 | |||
| c22b325c31 | |||
| c0d82a412d | |||
| ac057a2d40 | |||
| 3427f19a01 | |||
| 8effbaf101 | |||
| 53c4a8787f | |||
| 017a75aa44 | |||
| 56afb3fd64 | |||
| a9c7669c16 | |||
| aae792a9dd | |||
| db53656a45 | |||
| ff7a0e3170 | |||
| c7700ac176 | |||
| d011ddfc64 | |||
| 67cc70ad61 | |||
| a384ae9140 | |||
| a7627882a7 | |||
| 8eae7a95be | |||
| dabf266048 | |||
| 462e764a3c | |||
| 0e8a37dca8 | |||
| bffbe54120 | |||
| b673560b92 | |||
| 9e125e2029 | |||
| b88146c443 | |||
| c40cb7fd59 | |||
| 9d5956cef8 | |||
| 1fff4620e6 | |||
| c3820f55f4 | |||
| 60c5bdd62f | |||
| 5092e5f631 | |||
| c0bd35594e | |||
| bc9efa7ea8 | |||
| f540d0b747 | |||
| 7bcaa513fa | |||
| d33dfee8a3 | |||
| b5216df4fe | |||
| 25a11bfafc | |||
| 8fcc864fb7 | |||
| ed5ed0306e | |||
| a418c43d32 | |||
| 5aa8c9c8df | |||
| 32972b45db | |||
| af351b1723 | |||
| af88266212 | |||
| b14119b531 | |||
| 68c75f221b | |||
| 7b379e2a61 | |||
| c373b734bc | |||
| 2ac8f8003f | |||
| d6b3df8f6f | |||
| deea07e905 | |||
| 0caa94bd1c | |||
| a32dde5428 | |||
| 067b0d07c4 | |||
| 044f96bd93 | |||
| ca96350707 | |||
| be3af1e234 | |||
| 2e89d29c87 | |||
| e4eb9f7c55 | |||
| dd6547de06 | |||
| 84d09b8b8a | |||
| 2c462154f7 | |||
| b810efdb3f | |||
| ae04ccc445 | |||
| f7ac1192ae | |||
| e048588a88 | |||
| 2042353526 | |||
| 9486715929 | |||
| 64319c0d56 | |||
| acd209a890 | |||
| bd482eb8ef | |||
| 5b3cc560d5 | |||
| d41d4deaac | |||
| 208ce4e774 | |||
| 414ee51975 | |||
| d5a521eef2 | |||
| 1b401063e8 | |||
| 60d9d0584a | |||
| ffba341258 | |||
| f11131f8b5 | |||
| 2e6e414a9e | |||
| c45d676477 | |||
| b8d8dddd5a | |||
| c45c22b1b2 | |||
| 3d57a9ccdc | |||
| cb04c21141 | |||
| f70272f638 | |||
| b4b71ded47 | |||
| 24e2b72b71 | |||
| 529791ce62 | |||
| b66945b9b8 | |||
| f3c5d77ad5 | |||
| e5e42bc483 | |||
| bdfbfa391f | |||
| 72acd9b483 | |||
| 9f528d23d4 | |||
| d937cc491d | |||
| 863f3aeb27 | |||
| 0fe078d25e | |||
| d9420c7224 | |||
| 9ff6baaf52 | |||
| 574d00bb13 | |||
| 8d60e5c342 | |||
| d9eb1a73af | |||
| 1a34ff8a67 | |||
| 14e7ba4818 | |||
| 52e9bcbfdb | |||
| 20ae3eae54 | |||
| 0fb145e667 | |||
| bcac43c812 | |||
| 929d9e0b3f | |||
| d5e560a987 | |||
| e4383d6167 | |||
| f32e176d6a | |||
| 3d5a4df9d0 | |||
| e47bfd2ca3 | |||
| f8f768873e | |||
| d043e1a05a | |||
| 837c0ddacc | |||
| 7c340695d6 | |||
| e87d4fbf69 | |||
| 39064197da | |||
| c4496e6cf2 | |||
| 27d09d1783 | |||
| a174ee419e | |||
| 79e6138ce2 | |||
| 5a64f69456 | |||
| 5c01dd97e8 | |||
| ecf74d91e2 | |||
| 62892ed8d7 | |||
| 7b399cc5e5 | |||
| fab5740778 | |||
| 30f2d756a7 | |||
| 0d745c64d8 | |||
| 56c51f0112 | |||
| 4adf85d7d4 | |||
| 7995ff1410 | |||
| d2f234757b | |||
| bf34437186 | |||
| 47f02eec96 | |||
| 06dd4d6e00 | |||
| fbceda7b66 | |||
| 9d6ce3065d | |||
| bb718acadf | |||
| 4cd00efe3b | |||
| 22b11e4b43 | |||
| 2a29c61041 | |||
| 34b041e9f0 | |||
| 917ed8cf84 | |||
| 85b0b8373b | |||
| f04844435f | |||
| 421a3284bc | |||
| d4883256f1 | |||
| 372074edba | |||
| 826f19e968 | |||
| c06cfcbb5a | |||
| ddf6192643 | |||
| 58189ed9a0 | |||
| 726c429772 | |||
| a159c13333 | |||
| 5df3a4eb98 | |||
| 244ed5e5e3 | |||
| 249e9a10a1 | |||
| d4dba373cb | |||
| 06f249a3b4 | |||
| 8809b3ba4d | |||
| 66e80f9dac | |||
| b486d72b8e | |||
| d9e26eba65 | |||
| a7419d0aba | |||
| d5e6e38c58 | |||
| a2598fd134 | |||
| 58165c3951 | |||
| dac72b078d | |||
| b5c2756261 | |||
| fa753239ad | |||
| 8af2ae973f | |||
| 23a8409e0c | |||
| 6e674b511a | |||
| 47f480c0dc | |||
| bfc4fe1a9a | |||
| 98473e9d4f | |||
| 13d3271ec0 | |||
| 6727ff6dbe | |||
| 04954918a5 | |||
| eb3a031964 | |||
| 243876e9b7 | |||
| 884fdc2fa8 | |||
| 410fe7293f | |||
| d7869a4d1e | |||
| aa71f88e1b | |||
| cfb8d224da | |||
| c14b498676 | |||
| ac5aed7a45 | |||
| abb86753c1 | |||
| f6cfe80bf5 | |||
| 2b91ba2411 | |||
| b4be132201 | |||
| 99fec40117 | |||
| 3df04c7e9a | |||
| e7833b42cd | |||
| c64b9c941a | |||
| 1d776c4cd0 | |||
| d1ba5fec89 | |||
| 9260aa3445 | |||
| 6010d5f24c | |||
| b08bfa203a | |||
| a06681913d | |||
| 424fdf4b52 | |||
| bcf42362e3 | |||
| a4d17cb585 | |||
| a9e106b17e | |||
| 044ad5100e | |||
| 3032e6fe59 | |||
| 4eba2ee92b | |||
| b78ce1689a | |||
| 3aedc139ac | |||
| f7416eb810 | |||
| fe06d266e9 | |||
| 9a18911eba | |||
| 8c6e655380 | |||
| 3075d415e1 | |||
| b7466f8b65 | |||
| 846b6bd14e | |||
| d8000251ff | |||
| b5159d8c8a | |||
| 23dcb2dc1b | |||
| f31ddc4b1c | |||
| 5ff3947312 | |||
| 18dce66443 | |||
| b84bb4164f | |||
| 1d09708eb7 | |||
| 8a348bea21 | |||
| e64ff77852 | |||
| 68576a5d63 | |||
| 2e47558f4b | |||
| 0a2111f33d | |||
| da9af7b547 | |||
| 295b47cbff | |||
| ad2c541163 | |||
| 77223e4df4 | |||
| ffe1685b54 | |||
| 51cc2bf429 | |||
| 2a43e634e8 | |||
| 805b698c2e | |||
| cfcfc3c1fd | |||
| 09b0dd5583 | |||
| 455f842785 | |||
| 6b01b0b165 | |||
| c5614d04d2 | |||
| 1459fded08 | |||
| 6b466a8469 | |||
| 21c56c3107 | |||
| 5ab6bc283c | |||
| 106ab7f2a8 | |||
| 0c595c4745 | |||
| 1abf1240b2 | |||
| ad8e82ee1d | |||
| 0e1dfb4161 | |||
| a183b2affb | |||
| 738aaee101 | |||
| 5867e6356d | |||
| ea066f891f | |||
| 34b9fbab48 | |||
| 1d7a8d94e0 | |||
| 1caeac56f2 | |||
| 6b1606f4f4 | |||
| f0684c1957 | |||
| d12255025c | |||
| 864872d24e | |||
| 5be2666938 | |||
| cfefe4f738 | |||
| ddf05ca059 | |||
| 870e3daa95 | |||
| 4c1ad40f8e | |||
| 52857eb6b3 | |||
| e6183074f3 | |||
| 6b5c2bea4d | |||
| 7c7618c083 | |||
| 5f0b52c017 | |||
| c2606f9062 | |||
| 70da81d0e5 | |||
| 75199442c1 | |||
| 60cc82aff1 | |||
| ebd2c8236d | |||
| a2537ba4fd | |||
| a3a041ef6f | |||
| c0702aacac | |||
| 670d479e32 | |||
| ae7de7d36b | |||
| ef5decc98a | |||
| 4445460eca | |||
| 8288b1dcab | |||
| 16d1289a0a | |||
| ba775a1c90 | |||
| b0e58f9da7 | |||
| 531e784a92 | |||
| 5e8fe30035 | |||
| f5033c5a0e | |||
| 26d7654851 | |||
| 790a6ec203 | |||
| de9c5f10b3 | |||
| a7fe0e3f87 | |||
| 218e247fd2 | |||
| 6b51530e21 | |||
| 9755564a05 | |||
| 052d0e059e | |||
| fa4d3bba86 | |||
| f8fc9f8c79 | |||
| 80f0594f4b | |||
| 97b24f48d5 | |||
| b475a6b257 | |||
| ff52a54fef | |||
| c69634085d | |||
| 0a9af45194 | |||
| d92ddc4dd4 | |||
| 32fa817eaa | |||
| af10b3c5fa | |||
| 8b601a983c | |||
| 4b9812ce6a | |||
| c9e18346ce | |||
| 462ba8f416 | |||
| 658157e9a1 | |||
| 4031a46572 | |||
| 821fe26b56 | |||
| 352776ba77 | |||
| f560116fb2 | |||
| e7a5268fdd | |||
| aa71173dbb | |||
| 11fdcb18c6 | |||
| 62c34c4bc2 | |||
| 01f2333381 | |||
| 8d47213529 | |||
| f40e2cf98a | |||
| 05e071bf2f | |||
| e340fccafb | |||
| 4a2e6af9b5 | |||
| acba135de1 | |||
| 2476511368 | |||
| c39dfad7b6 | |||
| 9e29309ffd | |||
| e0f0813b7c | |||
| caf50ea01e | |||
| d4756ba659 | |||
| cc4d82f932 | |||
| 7286b4ad06 | |||
| 02194db0c6 | |||
| b6bd145130 | |||
| 5dcbc9861b | |||
| 3ac4e122eb | |||
| e336a8666a | |||
| a36fdf6a7d | |||
| bf2f03f911 | |||
| 5aaa47e25d | |||
| f884886ef4 | |||
| 4da6ec787e | |||
| 2da00bb4ec | |||
| e0fe0e1a3e | |||
| e11a334c9b | |||
| 21e1b825fe | |||
| 1cf7c3430a | |||
| ad2bc7f8ac | |||
| e600070a61 | |||
| 854c1aa37d | |||
| 74ab057f56 | |||
| ccc6d5975f | |||
| b3399642c5 | |||
| 6e6389c930 | |||
| 973a390298 | |||
| a77dfb69b0 | |||
| 9769318875 | |||
| c7f36d1a5a | |||
| cb46726fa4 | |||
| 7820e31a92 | |||
| de0dae9d9b | |||
| a09935d9b9 | |||
| a62371940f | |||
| 02f7677d92 | |||
| 1ffe190557 | |||
| d3eff9b1a3 | |||
| 66232792a2 | |||
| dc2aaae414 | |||
| c0bb2ec851 | |||
| 7566d90dfe | |||
| b38f195a0d | |||
| a6c5b7414d | |||
| cdee5aab3a | |||
| 4240e2dd29 | |||
| e298eee822 | |||
| bc1cfd4373 | |||
| 2944a4fd43 | |||
| a44ca29717 | |||
| 332e8e68ee | |||
| 577062b93a | |||
| 223c1a8089 | |||
| 0baccb9e82 | |||
| 2c81db5a1c | |||
| 43411d7a9e | |||
| 2dbf20a3e9 | |||
| aaf9fc1562 | |||
| d30f898274 | |||
| 4a72fa6268 | |||
| 0c5e66bccb | |||
| ff791efe18 | |||
| 6083b1d618 | |||
| 69c3439c3a | |||
| 7ee170f0a7 | |||
| 36b221b170 | |||
| d1fc98200c | |||
| bb852ef6d2 | |||
| a17b7b3d89 | |||
| dc65a72d93 | |||
| ea502d36a9 | |||
| 79a3c1618f | |||
| 0be3b4e7a6 | |||
| 5f8967918e | |||
| 6900b08134 | |||
| dc641348f6 | |||
| 431e0105de | |||
| cbe0d9d053 | |||
| f9abcfd789 | |||
| 5a0a2b7e44 | |||
| 41345199d8 | |||
| 8362365eae | |||
| 14e1c16cf2 | |||
| b32b7712e2 | |||
| 5cf55fcbab | |||
| 57c4fc6bf8 | |||
| 92fcf0854b | |||
| f73ec60311 | |||
| 1c60b7f070 | |||
| 084dcd1a50 | |||
| fd536a943a | |||
| 6f80fb72cb | |||
| cb5e2ad9b2 | |||
| 62772e8871 | |||
| 4b0480c8b3 | |||
| c8c591d73c | |||
| 2edd32fdea | |||
| 5889059ce4 | |||
| 7230497bf4 | |||
| d98071a088 | |||
| ac02c12e49 | |||
| 11d29e8d3e | |||
| b44ecf9bf7 | |||
| e60f148824 | |||
| e9045a8838 | |||
| 55487ba0c6 | |||
| 305ea0a2d5 | |||
| a5ca76befb | |||
| e01510e2a6 | |||
| 2931c891a7 | |||
| ad1b1193fa | |||
| 85f33fb73d | |||
| f3c98a274b | |||
| f6c7175828 | |||
| d253ca192a | |||
| e072b7dafa | |||
| 3ff52f1809 | |||
| ad61b42494 | |||
| c95761f4e6 | |||
| 1f15cba9a0 | |||
| 3344aaabb6 | |||
| b8ef0c84e6 | |||
| 6b8b31ff64 | |||
| 823872d294 | |||
| 724ec12bf3 | |||
| 8aac402b24 | |||
| eb12fd9461 | |||
| ad622cea9e | |||
| 2575eaf1d6 | |||
| fc5ed9f316 | |||
| 40a11b6942 | |||
| 84543a591a | |||
| 2cd3fe0dce | |||
| 5eb061466f | |||
| 52050d3dff | |||
| 904af20023 | |||
| 4934dbd0e6 | |||
| d080bea20b | |||
| 607dfc8be7 | |||
| 3b5130b03d | |||
| 75f722a959 | |||
| b946378b38 | |||
| 0cee57acca | |||
| ab78e12089 | |||
| 7fe23a0ca6 | |||
| d8584dc03a | |||
| a724f35672 | |||
| 60c7663a80 | |||
| 8041808b53 | |||
| 146d870098 | |||
| 78d2f49e01 | |||
| 54c8bd29ee | |||
| 406c1952b8 | |||
| 0ebcee9a6b | |||
| 964fa132cb | |||
| dedd5f571c | |||
| 90373c7165 | |||
| d470120a60 | |||
| 0c925bd088 | |||
| 76d123fe19 | |||
| 20f0238aab | |||
| 6d5a7684b4 | |||
| 7831d44099 | |||
| fbf844efd5 | |||
| 99a4bd82b5 | |||
| 58608f51da | |||
| ff9fd0cdb2 | |||
| aac849d4f4 | |||
| 688d07e9c3 | |||
| f9b3cd1b68 | |||
| b2c8718f35 | |||
| 46ba0a8781 | |||
| bc18d4d1b9 | |||
| a4b14fc992 | |||
| be914438a5 | |||
| ec488a4c43 | |||
| f78b903a49 | |||
| fd086b06a6 | |||
| 759ded3e3a | |||
| 05b002a8b7 | |||
| f7016fd922 | |||
| da5c003f97 | |||
| c33741a5e9 | |||
| 872ff3f1d4 | |||
| 8ab3fda5a8 | |||
| 1821726d4f | |||
| 98aea05ad2 | |||
| 79ea94483e | |||
| a0a30bfdcc | |||
| caa5928ac4 | |||
| 9400832b2b | |||
| a82b55005b | |||
| a434f6240f | |||
| f5e177db89 | |||
| 5febd66808 | |||
| afac1fe590 | |||
| 4251515b4e | |||
| 1b2046da3f | |||
| 646900b00c | |||
| 142ab74784 | |||
| ffddabde43 | |||
| 8c6d87f08a | |||
| 270dd955d0 | |||
| 4e2129d74f | |||
| 07cff1ed2c | |||
| 070379a900 | |||
| bbdeb15501 | |||
| 28478cdc41 | |||
| 11ec62ca70 | |||
| 4499cda186 | |||
| c05c5953a8 | |||
| eee576355b | |||
| a3ef869db6 | |||
| a51998e4aa | |||
| 0b44edaca9 | |||
| ab163a5f75 | |||
| f17ca26b10 | |||
| 0ea010d7ee | |||
| 72a2c3decf | |||
| ab7c2cf000 | |||
| 6914c1c85e | |||
| ea542d42ca | |||
| cba5bd588c | |||
| 00cb1c26a1 | |||
| f4d4a32af2 | |||
| 1bf0df03b5 | |||
| ae28ca0b8d | |||
| 51a6b9dc57 | |||
| 4c65a8091a | |||
| 27f400e13f | |||
| 7721648867 | |||
| 47cc951841 | |||
| 63b6026e6e | |||
| 84aa38586f | |||
| a70d59d4a6 | |||
| 57e0a12ccd | |||
| f5e1fa4bd2 | |||
| a7ce1e5789 | |||
| 5f550126b3 | |||
| 572a2bbe53 | |||
| 537c04745d | |||
| 7f004e2f41 | |||
| 7c6415551d | |||
| 0d2d349ab3 | |||
| de28bb1075 | |||
| d409fb5f58 | |||
| 3248d728ac | |||
| beebcae0a1 | |||
| 15757110cf | |||
| fce126b206 | |||
| 5c5f61b2aa | |||
| 3f8fb18c89 | |||
| f72c03a174 | |||
| ee731c7810 | |||
| bd5b938571 | |||
| 7eb707f811 | |||
| 0546351d3e | |||
| 1c05491f1c | |||
| 177b0fb5e8 | |||
| 67a0751cf3 | |||
| 665fcad655 | |||
| d776a7cde7 | |||
| e0fe158f0b | |||
| 5411fd3757 | |||
| 3328addb58 | |||
| 1446f19709 | |||
| 773932b1e7 | |||
| faaf828dff | |||
| ee50a2bcd5 | |||
| 31985d94fa | |||
| 9c5b1e7012 | |||
| ad472d59e0 | |||
| 32df3b68c7 | |||
| a189d293f8 | |||
| 570aee5fe6 | |||
| 88952cbb7a | |||
| 89415ac453 | |||
| 8bbed5aeea | |||
| 8340d775bd | |||
| cff6a488f8 | |||
| d6b980a2dd | |||
| 206bc4b36d | |||
| 45cebf09b0 | |||
| bd43ca6275 | |||
| 9237976988 | |||
| 6ac06486e3 | |||
| 061d4c8ea0 | |||
| aca8b83669 | |||
| a8f09ad43f | |||
| de611ab344 | |||
| 371fe7a700 | |||
| c6d7328e15 | |||
| a327d024e9 | |||
| b8504ac7d0 | |||
| bb33335dd4 | |||
| 5a02e599e1 | |||
| d1572f47a0 | |||
| ef51678c73 | |||
| e64e7563f6 | |||
| 0731db8c22 | |||
| 8c3e390172 | |||
| 8278b39f85 | |||
| 1c3c40db69 | |||
| 7ec94eb83c | |||
| 79ab8b205f | |||
| 882f8bdd2c | |||
| a366de26c4 | |||
| cf07189bd2 | |||
| b4e152f775 | |||
| eaae79a581 | |||
| e6913744ae | |||
| 6b544aa0b9 | |||
| 60c37fe492 | |||
| 82cc37bf51 | |||
| ad67094e54 | |||
| 6d3e198c3c | |||
| 0f4809b9b8 | |||
| 5c7f0a533a | |||
| 095bae01b2 | |||
| 366d42d9c0 | |||
| a2048fd0f4 | |||
| ea069cc2d4 | |||
| 90c4df7919 | |||
| ce15ca8929 | |||
| 841e53dbbe | |||
| c987001a19 | |||
| e9c9c5d8f1 | |||
| c2c69ffb82 | |||
| 2d8eace34b | |||
| eb06de0921 | |||
| 58d92970a9 | |||
| db09e7386f | |||
| b5599b2945 | |||
| f70ff72a58 | |||
| e9893f1518 | |||
| 29f0a9ab94 | |||
| 308f1340dd | |||
| 5d5fa88857 | |||
| 659d51a2da | |||
| 8246f946c2 | |||
| 62b29b3d76 | |||
| 8fa3b3f931 | |||
| a83e4ed9a4 | |||
| ab012fe1a2 | |||
| c7382150b5 | |||
| 74981a65c6 | |||
| 9251a66a10 | |||
| 3b23fc5ad8 | |||
| bddeebd4c9 | |||
| d45e48eed7 | |||
| cbc3474bbb | |||
| 383a79772c | |||
| f8c7b28da7 | |||
| 74940ad3f2 | |||
| 17a8f1a0f1 | |||
| f9f46bfcbe | |||
| bd2014d13b | |||
| cb660e8104 | |||
| a4a67ef1ec | |||
| 09abc9951d | |||
| 19c09d6111 | |||
| 6248658c04 | |||
| 274142c4c2 | |||
| ce794335e9 | |||
| 5985055aef | |||
| ff8fc96ebb | |||
| c70b0cb730 | |||
| dba42567b1 | |||
| 71d96b671b | |||
| a93db6d797 | |||
| f2389771cf | |||
| ed263aed9f | |||
| d37b6716cd | |||
| b035f3f884 | |||
| 1f9cd99bc2 | |||
| ffee6f3288 | |||
| 460a825ef1 | |||
| 54c56f2d05 | |||
| 61a5741c05 | |||
| 0e235e5872 | |||
| d0bece1679 | |||
| 1715dd4320 | |||
| 14513b7677 | |||
| b88dd17fc1 | |||
| 3826b57424 | |||
| 62586719b3 | |||
| e7d80bf7bf | |||
| 7a69b57823 | |||
| 2423f97c72 | |||
| a4ef900916 | |||
| 965e952336 | |||
| 3cfba9e47b | |||
| 4b604bd79a | |||
| 74caebac32 | |||
| fafb1d5fd7 | |||
| 4b2baeea65 | |||
| 93c27b134d | |||
| 853c97a910 | |||
| 97f080fa03 | |||
| aeb68f99bd | |||
| 10e6b11ff6 | |||
| c3037c5491 | |||
| e4ae1e2b94 | |||
| a4f421028c | |||
| a324d3942e | |||
| a3ced1b5a6 | |||
| fb5c6dd644 | |||
| d2933c2bfe | |||
| 3587bd4040 | |||
| 3aecceff27 | |||
| f082452c9b | |||
| 30aa052a57 | |||
| bdb9f29948 | |||
| 66cc1b4308 | |||
| d52fb18457 | |||
| 4a2169bd5f | |||
| 2c9ee54a16 | |||
| aef67ed7ec | |||
| ddfd8c8525 | |||
| 2c1ab4879f | |||
| 229b4d621e | |||
| 0dee41c074 | |||
| bf542233a9 | |||
| 38106074b4 | |||
| 1f4b3591ae | |||
| 7bf3d2c8bf | |||
| da53bf511f | |||
| 7388fd1ec6 | |||
| b803eeb528 | |||
| 14f79ee652 | |||
| df89629e04 | |||
| d427088ab5 | |||
| 32c541a9ed | |||
| 7e666dc3b1 | |||
| 5247c19498 | |||
| 9823edd3a2 | |||
| 88537991d6 | |||
| 8e910d8c59 | |||
| a0b32b6027 | |||
| bf7b2c339b | |||
| a1dfe6d402 | |||
| d2a3e8b9b1 | |||
| ebb88bbe0b | |||
| b690a9d839 | |||
| 9d9423808e | |||
| 3e96c0c468 | |||
| 6eb155ae69 | |||
| b27c540379 | |||
| 8b1f428ead | |||
| 1d54ffcf89 | |||
| d9eb5554b3 | |||
| da94bdeb54 | |||
| 27e5e2745b | |||
| 1b26f9a4c6 | |||
| df886259bd | |||
| 016ff0feae | |||
| aa6cad5f1d | |||
| e7388779a1 | |||
| 6c233e05a9 | |||
| 9f013f7644 | |||
| 253d8e5a5f | |||
| 7f5087c6db | |||
| 817071e448 | |||
| f193e9764e | |||
| 5f9628e027 | |||
| 76d21743fd | |||
| 2d3c5b3b7c | |||
| 1d85979a74 | |||
| 2a85f28963 | |||
| fe4e2f7921 | |||
| 9a9ec0c99b | |||
| d5624ba671 | |||
| c805238471 | |||
| e576b989b8 | |||
| f929bfb94c | |||
| f4df80e093 | |||
| 390e4cc0bf | |||
| 11f9a897e8 | |||
| 0e793a660d | |||
| 7b2cab5767 | |||
| c51b4290dc | |||
| 94a13d7d62 | |||
| edf5fd28c9 | |||
| b834131f50 | |||
| 5375d9bb27 | |||
| 535fff62f3 | |||
| 18b58424ec | |||
| 10858ea1dc | |||
| 6f8c7a66c8 | |||
| a371390d6c | |||
| a316766ad7 | |||
| a9cc19f530 | |||
| 881a151d30 | |||
| 785c4caa67 | |||
| 4403bc67a1 | |||
| b237113311 | |||
| 4cb50f1809 | |||
| 1885426421 | |||
| 89b52471fb | |||
| 3643ed1014 | |||
| e39236186d | |||
| 521488f926 | |||
| d61ea5a2de | |||
| 816210d744 | |||
| f925869f61 | |||
| f62b59a805 | |||
| a4bdeba60d | |||
| 5c0cb7f912 | |||
| 2ffbf5435d | |||
| 71385d594d | |||
| 53c4912cbb | |||
| 1760179093 | |||
| aded30b664 | |||
| de54f8d0ef | |||
| 5b0b64c7e5 | |||
| b654c852a5 | |||
| c48b32c9e3 | |||
| 8f723697ef | |||
| de22648b9f | |||
| b9f56852dc | |||
| 108cc3486f | |||
| ac69b8b191 | |||
| 8288145ee4 | |||
| 51f6095be7 | |||
| a201e9faee | |||
| fec6bafcda | |||
| 2639f950cc | |||
| 6663187eca | |||
| 13990f31a1 | |||
| de39b737b6 | |||
| a66ed7157e | |||
| c9c49200e0 | |||
| 317d287458 | |||
| a79f37b686 | |||
| 1c7404099d | |||
| ed54bd5121 | |||
| 06c3deff11 | |||
| 47954aa284 | |||
| f3c8625fe2 | |||
| ebc4fdc4b2 | |||
| 1af3d40c1a | |||
| 31eb8548ef | |||
| a45aa1e505 | |||
| cb0d4a1e15 | |||
| 21e68b9cf1 | |||
| a3654c8fe9 | |||
| 980b0188d2 | |||
| daab648c78 | |||
| e17b33e004 | |||
| 4e7c9dd2ae | |||
| 5487463385 | |||
| 68f41bbaa8 | |||
| 3bfa9767c0 | |||
| 8978b9d38b | |||
| cc89d7b1a5 | |||
| bb955806e0 | |||
| 0c39490bb1 | |||
| 826bf25abf | |||
| 89250a36b7 | |||
| c2e599cd85 | |||
| 71d6cf1b1d | |||
| 86179beaa5 | |||
| f53b177e1f | |||
| 58dfe2ca03 | |||
| c4b960cc1a | |||
| 70035aa9a9 | |||
| a82943a83d | |||
| 9a4c1fe834 | |||
| b9ff716c18 | |||
| 8516d15a4e | |||
| 4198a533ad | |||
| a67441689a | |||
| 5c11c22302 | |||
| 1a7ad195f0 | |||
| cf2173644e | |||
| 1b99e44e99 | |||
| b8b9c3a783 | |||
| 25de39d9c6 | |||
| 2455135eaa | |||
| dffbdd140c | |||
| 69b6f6f5d2 | |||
| 6013d90426 | |||
| 9ded6f6a40 | |||
| 7c76458b18 | |||
| eb9edf4908 | |||
| 55a6b330ec | |||
| 96d27d7087 | |||
| 9588a64487 | |||
| 18757d07c9 | |||
| 0f23e3d9ab | |||
| 765adabb32 | |||
| 37e19de7ab | |||
| 28f5c37211 | |||
| 38a704743c | |||
| 87efe45240 | |||
| 7236c4895b | |||
| 0cb00d5fd2 | |||
| cdb9eecbaf | |||
| ae8653beb0 | |||
| 787ad5ab38 | |||
| 81fc49d78c | |||
| 7d9d670f90 | |||
| fd41645f95 | |||
| a06af88b26 | |||
| 33f0457a23 | |||
| cea6522122 | |||
| ae00ba44db | |||
| 79fa3c7519 | |||
| d2814650e6 | |||
| 17722f581b | |||
| ad9eebd02d | |||
| cefb8e4218 | |||
| 90aba77471 | |||
| 785d4b3de7 | |||
| 6bb82f8ee0 | |||
| 45dc0a43d3 | |||
| 1610f62a28 | |||
| d454f09e13 | |||
| 00f0b569cc | |||
| 3acaa59885 | |||
| 2d5cdbe79c | |||
| 9ad3553d7f | |||
| 8f15341f1e | |||
| 31b0cff709 | |||
| 1dd2607dfd | |||
| 164e5481c5 | |||
| a098825fcc | |||
| 0f5417ab84 | |||
| 268da31332 | |||
| 94f8e48647 | |||
| 819c02f1f5 | |||
| 449e16782e | |||
| 257809bb30 | |||
| 8a20134a5b | |||
| 27172b0898 | |||
| 5b33d086c6 | |||
| c7ee0f2a93 | |||
| 8ea27bc341 | |||
| c8ebad055c | |||
| 9de552cb42 | |||
| 501d3b6203 | |||
| f668d89621 | |||
| d60287621a | |||
| 197c018c1f | |||
| 45146edb31 | |||
| 973b3854b4 | |||
| 2467bd738a | |||
| 27baf383dd | |||
| 537b3b2b4a | |||
| e0de3b97ab | |||
| 4a59360ad3 | |||
| 1a1bfd4048 | |||
| 10b738a296 | |||
| 3113350e51 | |||
| 3537088135 | |||
| 43f5b21852 | |||
| e56d7547f7 | |||
| ea68c92bbb | |||
| b348455144 | |||
| f2f6e95880 | |||
| 725a221315 | |||
| a0a89b562c | |||
| 3e7f8bad56 | |||
| d333aac84a | |||
| 3fefb34d44 | |||
| 870e73c03b | |||
| ef20f694b2 | |||
| 57f7368a0e | |||
| fa70033438 | |||
| 77be115f09 | |||
| 3f9ced5374 | |||
| ba5eebf3a2 | |||
| 186ac74c1f | |||
| 223448af18 | |||
| d34795fc08 | |||
| 40e8ad419b | |||
| 6b1ad634f1 | |||
| 8f64327d57 | |||
| 1d41b642ca | |||
| cff039d123 | |||
| 0cfdb8c043 | |||
| db20f9bb71 | |||
| 2020a31785 | |||
| 2c04a16eaa | |||
| 6325129761 | |||
| 9a18a98b58 | |||
| 7b9e01aa07 | |||
| 2bb19f85c6 | |||
| 17fe62cf91 | |||
| e99861d4fe | |||
| a205ee16b9 | |||
| 9835730278 | |||
| 8331b63baa | |||
| 2df4699312 | |||
| 2eae7503e1 | |||
| dbae5b0564 | |||
| 30cfc9c172 | |||
| 420a34a546 | |||
| 918bb9a2f7 | |||
| 99acdcdef7 | |||
| 59fdfc3728 | |||
| 614c5e087e | |||
| 83719cab73 | |||
| 9e73e8b9e8 | |||
| d4be356ffb | |||
| 47e0f92c0f | |||
| 6d033d4064 | |||
| ab290ed968 | |||
| 879f839d75 | |||
| 15800c6108 | |||
| 787a556bd7 | |||
| ea44b895e2 | |||
| 37f26c412f | |||
| 1da8027445 | |||
| ce3e2e5eb8 | |||
| b69f952e3e | |||
| 0784c6295d | |||
| 45c89bd6de | |||
| 8ac3bd1768 | |||
| 945d1569ee | |||
| 61526c027d | |||
| 4689e8953e | |||
| 4e701b1efd | |||
| 21c2de2d7e | |||
| 72a6cde828 | |||
| 0476937f55 | |||
| fc187d6998 | |||
| 0dcacdf83d | |||
| 7a2a8a2ffd | |||
| 2ddc3658a0 | |||
| 6a5236b200 | |||
| 6c0a91a64f | |||
| df6451076b | |||
| 19339c3de1 | |||
| c5acffb034 | |||
| 110bb5e5a5 | |||
| d7663159e9 | |||
| 2440ac43b1 | |||
| 41cb39eb5d | |||
| 809a0ab6bf | |||
| 51b63b2398 | |||
| 59b89b9971 | |||
| ecd8f32cce | |||
| 909259da37 | |||
| 366ddb05ae | |||
| d587480a3e | |||
| 765189d4f5 | |||
| f6aa2498a3 | |||
| f6641c0f41 | |||
| f4df759ba6 | |||
| 3a628bc671 | |||
| 175571e740 | |||
| 8cb3ed5cc2 | |||
| c05e47ebc0 | |||
| b2ac11bc47 | |||
| af83120832 | |||
| 1e03c97663 | |||
| 41e3ecc837 | |||
| acb2488fc8 | |||
| d6d8cca053 | |||
| f601093ccc | |||
| 0f3d4d0b6e | |||
| 60777bc610 | |||
| 21a50e22d2 | |||
| fc6e2d14a5 | |||
| c439e82038 | |||
| a97ff587d2 | |||
| 91144207e0 | |||
| 0720bc7408 | |||
| ab62a9662c | |||
| d6a8af03b4 | |||
| 65c7c01d90 | |||
| e6e76852d5 | |||
| 930c4cb609 | |||
| 0c8447fd0e | |||
| 37c3283450 | |||
| 723b69cf8d | |||
| 85859b6723 | |||
| c1a13fa553 | |||
| 4f0c9fdf2b | |||
| 4271602cfc | |||
| 4f14d7c0ca | |||
| 38554c5f3e | |||
| 138ad6e8b3 | |||
| f76f70f0b6 | |||
| 7094680e23 | |||
| 59dc7c880e | |||
| 3fb9b41fe5 | |||
| 0ccf8cb23e | |||
| 837f769960 | |||
| 3367d4258d | |||
| d608be6e7f | |||
| de9c7f2ea4 | |||
| 1fbbbb735d | |||
| 9915a70d7f | |||
| 822298f69d | |||
| ad2f25875e | |||
| ad8e79c440 | |||
| f2dcfc976d | |||
| 5ccfb1f4ba | |||
| 92614765ff | |||
| 4f066454d0 | |||
| 7ae5819c67 | |||
| 2b0f3edcef | |||
| 244687c9a7 | |||
| d22c351221 | |||
| 006496f24e | |||
| 01d500db14 | |||
| 4ac3600f81 | |||
| 6aba223383 | |||
| f1c19cda74 | |||
| 275e86a26c | |||
| 077d627953 | |||
| ca0b268ae5 | |||
| 25be7c1ad5 | |||
| 888cd86afd | |||
| 157d916154 | |||
| e40e9db39a | |||
| 36f1b4b222 | |||
| 257bf13fef | |||
| 957f5b212e | |||
| 72fdafc180 | |||
| db83bfc53a | |||
| 744159a079 | |||
| d6b30efe2c | |||
| 3f7aa38d77 | |||
| a145c2a8fe | |||
| c29cb503be | |||
| 8025ad0661 | |||
| b4b59148dc | |||
| 23c9f1b444 | |||
| b33f8b47ca | |||
| c26e1929d6 | |||
| e01d975b80 | |||
| 92528360f9 | |||
| 1d9c90089c | |||
| e303417e04 | |||
| c8d9f8e2e4 | |||
| 51f64797cd | |||
| 1ea4459d9f | |||
| 55371e5abf | |||
| fb12a3033d | |||
| a6ea15e63c | |||
| 5a991295e0 | |||
| 9b47f9f786 | |||
| f65c2fcb1d | |||
| 156bb8238d | |||
| db488bef51 | |||
| d72d02b970 | |||
| dd2725be68 | |||
| 8e2d342de6 | |||
| 91eeb2ab76 | |||
| f2e0d161a1 | |||
| 2ebf4e767b | |||
| f7fb10635f | |||
| 32e779eef3 | |||
| 482e50aae9 | |||
| cd0a05f114 | |||
| d4408e0f54 | |||
| eee88a8012 | |||
| 0368e1769a | |||
| 2d4f8f1377 | |||
| 8ef91222ea | |||
| 808aa4467c | |||
| b2ab401279 | |||
| 9bbd646f40 | |||
| 57ece83c30 | |||
| c3c67d9608 | |||
| f59fb94dae | |||
| 00199c41bb | |||
| 400ae664bb | |||
| b39ca7ee31 | |||
| 4250501058 | |||
| eaaf551497 | |||
| f233a64eb5 | |||
| 2b81b6673f | |||
| 4c46f04d77 | |||
| d467c8536b | |||
| abc32edf28 | |||
| 047a1b5166 | |||
| a06fa7374d | |||
| fe01de5667 | |||
| 275b042998 | |||
| 4c4887c5fc | |||
| 0ebaba98f0 | |||
| d3bfcd498b | |||
| efad1e4790 | |||
| 9c9d3d7bd0 | |||
| 756f35f480 | |||
| 55503ce771 | |||
| c57726a587 | |||
| b12c28a984 | |||
| b357eca307 | |||
| acd4b9a8ac | |||
| ded4b024f3 | |||
| f21e6e03a3 | |||
| 6f982eb7e4 | |||
| 2cad98f01f | |||
| eb26dc3213 | |||
| 405c4d51f0 | |||
| 3e30914e13 | |||
| 53aaf91ce4 | |||
| b9b5d43dc6 | |||
| 38e48c0c40 | |||
| 84679f1a5b | |||
| 4c7351176c | |||
| ba7a2fd135 | |||
| 3995f55cbc | |||
| cbfc32b11f | |||
| 9b1dc1de7a | |||
| db09d18e92 | |||
| 210b9ebf56 | |||
| fa80ef90d2 | |||
| 6c492e51fa | |||
| 7bf00ef25c | |||
| 8fad3036bf | |||
| c939f04b1a | |||
| 916c415b4b | |||
| 9afd7f6c87 | |||
| 648393cc7b | |||
| 6f48af2610 | |||
| adca981eee | |||
| 38b1e46241 | |||
| 6b3666f826 | |||
| 02929b2cce | |||
| d31235ca13 | |||
| 7d230acf40 | |||
| 13dc1c8795 | |||
| 997b46bfaa | |||
| 57bcb616bc | |||
| 3196dc2d61 | |||
| ef3569e667 | |||
| 627911d4ff | |||
| 2266f7cb6a | |||
| a0ebbaa840 | |||
| 36b321735e | |||
| 75cacc2855 | |||
| 83e71ab27c | |||
| d35d854259 | |||
| c58678d84d | |||
| 618981f1ae | |||
| b2ae46b80f | |||
| 9ebc58b1a2 | |||
| 87f9d11d65 | |||
| 8cb3b4aef2 | |||
| 09547b4c8d | |||
| d186daa131 | |||
| 6a8ca8296b | |||
| 7ae529c3b0 | |||
| 911f9eadd0 | |||
| c9ee60e197 | |||
| 4e5789df89 | |||
| a18a6f50ab | |||
| 276c02f341 | |||
| 6a9e0b1005 | |||
| bbebf9ad3e | |||
| 11146b6bae | |||
| 499392c6f9 | |||
| a287da9ccd | |||
| c22e640df3 | |||
| 2862631f03 | |||
| 749bcc889b | |||
| 6a74c97a0a | |||
| e0e8cd6ca3 | |||
| e7659ecd9d | |||
| 7d0106b220 | |||
| df631591f2 | |||
| 4977bb21ec | |||
| aeceb200ec | |||
| a15129a00c | |||
| de2cfd2927 | |||
| 8bf9adbc08 | |||
| 582b721160 | |||
| 4dc06ee43f | |||
| 8081aec730 | |||
| aae80681f2 | |||
| b862a0cac6 | |||
| 7e618779bc | |||
| 71704a713b | |||
| 937d151187 | |||
| 4ac2f02775 | |||
| f8a9c363ba | |||
| 6d7f43b901 | |||
| 95467a3f0b | |||
| bd7094b9f5 | |||
| ff0feaf34e | |||
| dc75a10989 | |||
| b292990075 | |||
| 486a66be54 | |||
| dd4419fd5e | |||
| 303c6ecc1d | |||
| 85eb55de37 | |||
| e040f8069b | |||
| 17b929124f | |||
| 79015bf8d9 | |||
| 1c91736a6d | |||
| 1b4fea1794 | |||
| 85a44b7349 | |||
| 5360180a2a | |||
| 2c5f5b0c67 | |||
| 9dce0e40b5 | |||
| ff20b56074 | |||
| 3c953cb0ef | |||
| 9e795374bc | |||
| 3548c133e3 | |||
| 297d35364e | |||
| b8e305f183 | |||
| be51384549 | |||
| f005434769 | |||
| fabfc7d4d8 | |||
| 10a724cc62 | |||
| ccc3eeab10 | |||
| b0166dbe27 | |||
| 65e9f6651c | |||
| 934f724130 | |||
| 57b3912227 | |||
| 692f922fa4 | |||
| 33d3bc276e | |||
| f0137be719 | |||
| c76d763639 | |||
| 0fed5c1193 | |||
| a8b82d2b67 | |||
| 0b22e8b544 | |||
| 085bd1aa93 | |||
| f1e7099541 | |||
| 31d143de11 | |||
| f3522a282c | |||
| 24f56df8c3 | |||
| 14cd71ed0a | |||
| b00f94df64 | |||
| 49af07f444 | |||
| d1c55cb901 | |||
| 855e850ef3 | |||
| c720e0dd04 | |||
| 87da155477 | |||
| 505d4cce78 | |||
| c431da9571 | |||
| 75259c1ea1 | |||
| b29087b680 | |||
| af12cf1bf6 | |||
| abc61f680a | |||
| 1119790b02 | |||
| 56cff485d0 | |||
| 3a85f218ed | |||
| c7a8885d9d | |||
| 220db55e71 | |||
| 792b321a81 | |||
| 2ad7305349 | |||
| 198fbb9b3d | |||
| b4064fa092 | |||
| ee3b66bdcd | |||
| a24c20a731 | |||
| 135b8bd4f5 | |||
| cbc8ebd8f5 | |||
| 58d9d35515 | |||
| 736a064bac | |||
| 163a76eb6e | |||
| 3258a91d5d | |||
| 623ac7ea6d | |||
| 0358859467 | |||
| 838812640e | |||
| bfa652f2d0 | |||
| d1c08a810b | |||
| c457e2b67a | |||
| c4c20f6ed5 | |||
| f23cf98317 | |||
| a6827493f0 | |||
| 9565fe9b1b | |||
| 8de24bc16e | |||
| 3ecc1e0228 | |||
| 1abf00e443 | |||
| 6c515ef47f | |||
| 0b44791eae | |||
| 0cfc82d731 | |||
| b78846078c | |||
| 8537abfff8 | |||
| 4b77c9df9d | |||
| b979a8a707 | |||
| 9231c197a5 | |||
| 8ac3a223a8 | |||
| 5a6f20d575 | |||
| c5568f756f | |||
| 22f5af9987 | |||
| e352ab2bdd | |||
| bbf513a2cd | |||
| 9bcf837f17 | |||
| a212a63e6a | |||
| e2cae42115 | |||
| 50fa0d1512 | |||
| bb1d1dc263 | |||
| 1ca6dbcdc8 | |||
| 349c3cf7b8 | |||
| 6c9a9d344a | |||
| f8e5341ac0 | |||
| 12c96b93d9 | |||
| bcc95e520b | |||
| 69b43a955f | |||
| 3dff21e0be | |||
| d5ee465bf9 | |||
| 65b7a783fe | |||
| 1bc94b92ac | |||
| 5088ab5061 | |||
| d70fa2847b | |||
| 8bf3f5ea78 | |||
| a9f7bcb12f | |||
| bd1bbfee4b | |||
| 226afd4550 | |||
| ce9737c6a0 | |||
| 23f6914b9b | |||
| 2a3cc43b62 | |||
| 8266815cda | |||
| 8b4ea01810 | |||
| 83187b30c0 | |||
| 3c09b57059 | |||
| a147d2a200 | |||
| 28a59ba344 | |||
| 94cc0b7a12 | |||
| e36b1a7016 | |||
| bf46b894e9 | |||
| f0ca828544 | |||
| 36521e4275 | |||
| a93a09e0f7 | |||
| a54773fbff | |||
| b8bb45b106 | |||
| ecade13455 | |||
| 49678e4b48 | |||
| ea150dc336 | |||
| 5de01c1444 | |||
| f86e2edc54 | |||
| bf01e41fd9 | |||
| edcfd7761b | |||
| b8daf944f1 | |||
| 315436e43b | |||
| 2c2af1d117 | |||
| 03ac2d0f17 | |||
| 8299614e60 | |||
| 7a62202392 | |||
| eb92dd59f9 | |||
| d9aa2b155a | |||
| e5bdc1438a | |||
| e3daef19e7 | |||
| 0e0ec4691a | |||
| 7ccec5cd95 | |||
| 7613d9dc33 | |||
| 77ad600a33 | |||
| abafa68647 | |||
| d91828dd90 | |||
| 19f2a74ba8 | |||
| 58a929edd5 | |||
| bed47dffb9 | |||
| 136995d2a1 | |||
| c1559a7c8e | |||
| 993ef87dca | |||
| b62eb61400 | |||
| 0a20210a59 | |||
| f6305858a5 | |||
| db7af52fcc | |||
| 09a5f8da1d | |||
| c104febf63 | |||
| 0e68e8b40a | |||
| 9a3ecc1ac8 | |||
| ec82534a1e | |||
| 9bcc8041e9 | |||
| a944542858 | |||
| a5e6a0dc0c | |||
| a575fbca94 | |||
| fc4e11d127 | |||
| 9988a506cd | |||
| 12836f9db9 | |||
| 2627e221f2 | |||
| 5e2b3b34e5 | |||
| 37e2f73909 | |||
| 759584f8c5 | |||
| 0babdffe3e | |||
| cd9e6609ad | |||
| 9982445dad | |||
| 13f647feaa | |||
| 7b00f35a0d | |||
| f6b3724268 | |||
| 212521c92b | |||
| 69d3853111 | |||
| d242e4b95b | |||
| 2266001d19 | |||
| 2f141aa483 | |||
| dd02a9ac9d | |||
| b203139356 | |||
| c479fcf251 | |||
| d7c3e54eaa | |||
| d5fe50e471 | |||
| 205535c8e9 | |||
| e9aedc701c | |||
| cf464d252d | |||
| 5e09ac696c | |||
| ba9357da96 | |||
| c6fb879cea | |||
| e2cb7006c4 | |||
| 3737e0b087 | |||
| a1158cc946 | |||
| 404f8a790c | |||
| 35a008af18 | |||
| 79bf590576 | |||
| 61e39bccdf | |||
| 6b7dfee88b | |||
| 21412a8c55 | |||
| 239e40c8d5 | |||
| 1ce2c7f3e8 | |||
| de750a67ec | |||
| 8e6ea4d117 | |||
| ef188564f3 | |||
| 413271eaa6 | |||
| eb1ce3dd6b | |||
| 18e4f42c3c | |||
| e0e92921b5 | |||
| 94e22ba0fd | |||
| 67eefd0ba1 | |||
| bf031af7b1 | |||
| 617611ee22 | |||
| d43b884c2a | |||
| 80f5ee1eb2 | |||
| ee30497237 | |||
| be964c78ec | |||
| 2543162dec | |||
| 3136eb8e4b | |||
| 7b6523e54d | |||
| 30c051d485 | |||
| f191d372f0 | |||
| cb69cb2d64 | |||
| 5d9c67e97e | |||
| 0ba37592f7 | |||
| e0e8667a0b | |||
| 2157d9e17e | |||
| 62e7fa1f63 | |||
| 0ac7366cdc | |||
| c768d97637 | |||
| 9bd8e62702 | |||
| 9a3acdcff8 | |||
| 93c1ee225e | |||
| 1e32175cdc | |||
| 00d9f037b5 | |||
| 44a2eca449 | |||
| 20df6e9c00 | |||
| 7ba3e599d2 | |||
| 4247a6b807 | |||
| 775dc47abe | |||
| da9269ca97 | |||
| d2e3744ca3 | |||
| 3914cf07e7 | |||
| 1e7418095f | |||
| efe5db38ee | |||
| 523efbfea5 | |||
| b96ecd072a | |||
| 28ffe7e3db | |||
| 721294948c | |||
| b287aaccec | |||
| bbc6efd773 | |||
| dc9c5a4bc7 | |||
| e90c532c3a | |||
| 397e2a8522 | |||
| 8f547e6340 | |||
| defd5520ea | |||
| b6b608219a | |||
| 22a1bc337f | |||
| caa179a1d3 | |||
| e8e47aee21 | |||
| 83f1aeec1d | |||
| 6d9dd3109e | |||
| 77fde04ef7 | |||
| 9d139fa306 | |||
| 6d66e3f680 | |||
| e8d98e3d89 | |||
| a1d20085e6 | |||
| 6da7e6158f | |||
| c91045a9d0 | |||
| 44cdb3dcea | |||
| 358fd28c28 | |||
| e912928cce | |||
| cac0d3c33e | |||
| 18f98f4fe1 | |||
| 4166f73d9d | |||
| bbd9fe9777 | |||
| b7e8517b31 | |||
| da7c8621f7 | |||
| 8cc37f3115 | |||
| c6e2970b65 | |||
| b006b9ac0c | |||
| e1455cecd8 | |||
| b247ef85bf | |||
| fcdf965037 | |||
| 640ee80010 | |||
| 95283b4dd3 | |||
| 2a0d7533d7 | |||
| 57b28576f0 | |||
| aead48726e | |||
| cd17ce9250 | |||
| 9d7357058a | |||
| 9889aa10bd | |||
| d619fa1767 | |||
| 7161d7ad96 | |||
| 12de1d175c | |||
| f27a956c71 | |||
| d119c7d629 | |||
| 0a9031fd42 | |||
| 438463b1c4 | |||
| 5dd9acbe44 | |||
| 05b8b2a30c | |||
| 6c167038af | |||
| dfc123819e | |||
| be6a88cb77 | |||
| 2134a76517 | |||
| 9f8947f1dd | |||
| 85004f8510 | |||
| f40e22dda6 | |||
| 4c99e9dc73 | |||
| 53efb2bad5 | |||
| ed63fbaf9a | |||
| cd7fd100a7 | |||
| d80f4c7d3b | |||
| 8f9cbe1c49 | |||
| f84832e0c2 | |||
| 0975c3c399 | |||
| 1f722cde22 | |||
| 4aecc9f090 | |||
| c9a594100b | |||
| 7ca497f0d6 | |||
| cf8d15e8d5 | |||
| bc57fa0619 | |||
| 5d72003ebb | |||
| 08a693a0a0 | |||
| 59b2e1ab82 | |||
| 4ef297bf38 | |||
| 8e6f6d64a4 | |||
| 5f8d20b5b2 | |||
| c285441233 | |||
| 316cb00ada | |||
| 0185f84cc8 | |||
| 4b0d3c3688 | |||
| 91cfa90503 | |||
| cc08451eb8 | |||
| f04d52c044 | |||
| fe19cc7568 | |||
| b2f5ca356a | |||
| 78da4ca024 | |||
| 3ece713a05 | |||
| bf26f1129e | |||
| 7ee5cc80a2 | |||
| 0ccd8bdfa8 | |||
| 0a939feaa3 | |||
| 1e1d457548 | |||
| 5541a1f80e | |||
| 0e0220bdbf | |||
| 9d20561af4 | |||
| f8145480fc | |||
| 605ab9e46c | |||
| 17a26da1e6 | |||
| 636a0ba37f | |||
| 29720b7360 | |||
| d0d02be711 | |||
| 88cb81d3d6 | |||
| ef27942b8a | |||
| 63aab5cdd6 | |||
| 0e136b42a2 | |||
| 6df0215246 | |||
| 63ba607738 | |||
| 30f7118c7a | |||
| 9d5a0fdd8a | |||
| 0b1f938389 | |||
| d3157b46ee | |||
| 8b3be4224d | |||
| 1d5c07dedb | |||
| f148f1efa2 | |||
| abfcd9d3b6 | |||
| 6cf1ada36e | |||
| 33324ee23d | |||
| 2c2efe2e1e | |||
| ec29bcf013 | |||
| c9f18aae0f | |||
| df03c89a48 | |||
| eb8584613b | |||
| 9000f4ad05 | |||
| 0b1259fc4a | |||
| eb0e51d44d | |||
| f633d1ee92 | |||
| f1e4d5ed6c | |||
| b5498a373a | |||
| b73607da80 | |||
| 106604682a | |||
| cd7ac20d80 | |||
| be3ebea45b | |||
| 5a6219c726 | |||
| 4124e804a0 | |||
| 8d1a34bbb9 | |||
| abead647e2 | |||
| 07ed728605 | |||
| d796fcc0e7 | |||
| 7b7ac7a495 | |||
| c8145ce581 | |||
| da7f8ad936 | |||
| 41df910771 | |||
| 01704a4c1b | |||
| 8ab9eb9857 | |||
| e1439c4a5b | |||
| e7f1d0deea | |||
| 0998b01321 | |||
| 743071d9bb | |||
| f54905e685 | |||
| 0afad94378 | |||
| e350511102 | |||
| fd443941a2 | |||
| b146aaaeb7 | |||
| dd4b03e812 | |||
| bf69b97639 | |||
| 6d59b8d85b | |||
| e3dc9f3c31 | |||
| 42a42a7962 | |||
| c05e03fc09 | |||
| 7016ccef10 | |||
| 6f636093b6 | |||
| 3e698074e7 | |||
| dc9194ca00 | |||
| 6efa882ca3 | |||
| fcd5fcca83 | |||
| 95212af935 | |||
| da2113bde9 | |||
| fc3f14c0ee | |||
| 296e2ef90f | |||
| dcb8939c7f | |||
| 31a6aabfe5 | |||
| 2e9997110a | |||
| e1304dc0c3 | |||
| 5aa82629dd | |||
| dcdec98c8e | |||
| 3d76f09c3a | |||
| b3f4e90862 | |||
| 4902ddaf87 | |||
| a83318cf4b | |||
| 12faecdf89 | |||
| c92bc84316 | |||
| 48c2168dff | |||
| 16c722d1d8 | |||
| 5cffcd6336 | |||
| 0bf816f2e8 | |||
| 6104b91d3f | |||
| 33c8cb7b3b | |||
| 4f286c9073 | |||
| fd1e40d22e | |||
| e2b8f40275 | |||
| 78409dfec1 | |||
| 98345c0f65 | |||
| 95c6bd1c8a | |||
| 8c77f2dc03 | |||
| 11e95d2a61 | |||
| abaefe22bc | |||
| bda06df668 | |||
| 4a505c19df | |||
| d417ccaf49 | |||
| b4aa1900e2 | |||
| 713902dc47 | |||
| 627a9e2ce1 | |||
| 2ae7a70be9 | |||
| e58703877b | |||
| 9c4be5d098 | |||
| d1801b1f2e | |||
| 4b5ec242e7 | |||
| d5b48a0aa3 | |||
| 6372cb7b41 | |||
| 931d3390f0 | |||
| ff388fe3e6 | |||
| ef1c1a12d2 | |||
| 24b1a625b3 | |||
| 6cf258a809 | |||
| c66fda7c71 | |||
| ac850e559f | |||
| 7df36fe9f5 | |||
| 161724fb17 | |||
| cf05e9cf78 | |||
| 44f911a0a8 | |||
| 32527b26d5 | |||
| e008faf729 | |||
| 46d235bca0 | |||
| a91b780936 | |||
| aa4c6874f1 | |||
| 6d7a54915e | |||
| f30b1c2358 | |||
| 42968cb945 | |||
| 87034e26ae | |||
| becd03a4aa | |||
| a1aa325ce3 | |||
| 34cba83ac4 | |||
| fb11264f42 | |||
| bad31dfff1 | |||
| dd3844d1d3 | |||
| bc22076ad8 | |||
| 754e646b0c | |||
| 9feafb6dbd | |||
| c7fcfc863d | |||
| d565802ea1 | |||
| ea1d459423 | |||
| 377d11d13b | |||
| d65da600e5 | |||
| 82189e1bc5 | |||
| 7f8bfb6e4a | |||
| 7f70cadacb | |||
| 98f2e2c729 | |||
| 395fdc4960 | |||
| 094b049c94 | |||
| 5d77730c78 | |||
| a743d5dc71 | |||
| c23135c9e8 | |||
| 0722beeb0b | |||
| 8b89447549 | |||
| 8047d08b3b | |||
| 30792a1e1a | |||
| 91db2207b3 | |||
| 59a86dabee | |||
| d87d66ab88 | |||
| 032d849f17 | |||
| c451f54925 | |||
| 6a857e01f6 | |||
| 2da780e4dc | |||
| 71edaba9df | |||
| 37134c5987 | |||
| 0c2a459c30 | |||
| e0fc7f69dd | |||
| bbf1639c63 | |||
| cb12b4436f | |||
| 0277a37fca | |||
| ac3577bc56 | |||
| 0811a23cd4 | |||
| 05c6d57f29 | |||
| 58c62f0a34 | |||
| 2174225259 | |||
| 6a0f1dad7f | |||
| 40cadab8a6 | |||
| 6157f57872 | |||
| c4bb07184d | |||
| af5d6ca27d | |||
| 78f2ec8f32 | |||
| a113356695 | |||
| 43753c8e9a | |||
| fc8c765215 | |||
| 86a1859d02 | |||
| 360986f38d | |||
| 1be0d26c1f | |||
| c167a1f4f4 | |||
| 5eb0ca9b9d | |||
| 6e26ed2bb7 | |||
| 058d9c3525 | |||
| b247fbb2ef | |||
| bc6f122364 | |||
| 815d77856d | |||
| 05eaef84bb | |||
| 770c461a8f | |||
| 16b6ffd915 | |||
| 9701b573e0 | |||
| 83cd14104d | |||
| e2988acc2f | |||
| cea4669b76 | |||
| 17b4d4c7b2 | |||
| e95f0fcceb | |||
| 6d5d6f0f24 | |||
| 7ce8faf176 | |||
| f31e3313b0 | |||
| f6ac98a37d | |||
| f8e7e301cd | |||
| 35bafb3235 | |||
| ae5d2ecf48 | |||
| 1907d2a90a | |||
| 4448a54cc1 | |||
| bfc0d606dc | |||
| 3306228840 | |||
| d7e00ae691 | |||
| 0e2e2db3fa | |||
| bf90d34c2f | |||
| 383af7bf76 | |||
| ac910ed200 | |||
| 7709d9df20 | |||
| e61415223b | |||
| a30945312a | |||
| bf682302ee | |||
| 72191f5b13 | |||
| e324e59930 | |||
| 727caccfc9 | |||
| 85160b0487 | |||
| 8996c1da29 | |||
| 437dcbdd68 | |||
| 3e84c77bbb | |||
| 2c9af712a2 | |||
| c1f3d968bf | |||
| 79118f51c2 | |||
| 285314da1c | |||
| daad5824bf | |||
| d135677c25 | |||
| cade0f65e2 | |||
| 106169ed7f | |||
| a8879057c0 | |||
| f6404f93ca | |||
| 81325df368 | |||
| 965bfc49dd | |||
| 425ea4e5b6 | |||
| b8ef3149ef | |||
| c07af5a1a3 | |||
| c3c957bb80 | |||
| 732c506e27 | |||
| 0189a8b0f6 | |||
| 3f44b690c2 | |||
| e7572066a4 | |||
| 41dff175b3 | |||
| d339403e89 | |||
| e0cf55f5e9 | |||
| 411e332f1b | |||
| 97eadb867c | |||
| e428628fcc | |||
| 1789437cc5 | |||
| ac80c04bd3 | |||
| fa9b767bf2 | |||
| abeaea4f79 | |||
| b65f2eb55f | |||
| 7d620ffd5e | |||
| 6f6ba2f025 | |||
| 33ba7e659b | |||
| 750ec55646 | |||
| 86d3fff666 | |||
| e91531fc23 | |||
| 2524f16525 | |||
| cefec44070 | |||
| 20376ca951 | |||
| 475b8d731e | |||
| 963b6f628a | |||
| 63ea6f1ecf | |||
| 947c9f70fb | |||
| 5e52d4d6b3 | |||
| 939dcb4c0a | |||
| 223ab5a38f | |||
| db7a37a111 | |||
| fe0d932f50 | |||
| 69fb0a4a28 | |||
| 04a0ae3aa9 | |||
| e5d6047fb4 | |||
| 9e782d4c1e | |||
| 98a4b3e78b | |||
| 2b4d1cf1db | |||
| fe76dfe1f8 | |||
| c3774bef7e | |||
| 695a7400a9 | |||
| e6a8800f66 | |||
| cee8731393 | |||
| 4ae94dc027 | |||
| 3a69a6a452 | |||
| f8f21ef7c0 | |||
| 0587eb4956 | |||
| 433374abea | |||
| 23ed3a520b | |||
| 5646442931 | |||
| 1a6298b6ea | |||
| bf9b572bc3 | |||
| cf72e53a10 | |||
| 98bd79f548 | |||
| 84a866028a | |||
| 10bd03611c | |||
| 7c27d4b202 | |||
| 8165d0b469 | |||
| e796937d02 | |||
| 49c952a631 | |||
| 5f9d236d22 | |||
| 59f5a82261 | |||
| f22a1adb8b | |||
| a8e8c37fdd | |||
| 37486a9cc6 | |||
| efebbffe96 | |||
| 5e035a4209 | |||
| 12fa517297 | |||
| 36ae0e5476 | |||
| 74f66d3119 | |||
| adfaee7ab5 | |||
| d37490adc3 | |||
| 087bb60b31 | |||
| 5019547d33 | |||
| 58f012f3de | |||
| b938c9b7f6 | |||
| 2b1facc7a6 | |||
| 1d5ea80a2b | |||
| 0415cc209d | |||
| 545e5cbcd6 | |||
| 1fab02c25a | |||
| 258736f505 | |||
| 0bc4da38fc | |||
| 037f200527 | |||
| b541792465 | |||
| eb9b256ee8 | |||
| 5d8b32a249 | |||
| c960b364c9 | |||
| b817036343 | |||
| 46036e6ce6 | |||
| 1ffda0dd34 | |||
| da01b460fe | |||
| 90a1508b87 | |||
| b07016113c | |||
| d8317fcf81 | |||
| a6bc642721 | |||
| b730f243dc | |||
| 71a57275ab | |||
| 41bf8d925f | |||
| 6d172498d1 | |||
| cad58658c2 | |||
| a58b990855 | |||
| b6b1903a37 | |||
| ed5596a8f4 | |||
| 49d0acd188 | |||
| 58a74fe1fb | |||
| a1ab4aec3d | |||
| f77f7e1437 | |||
| adda049265 | |||
| 9b2a9260ef | |||
| c8cc31af88 | |||
| d333de274f | |||
| 9e220d5d30 | |||
| 2cf0cb471f | |||
| 269ba6add9 | |||
| 78d460a6d1 | |||
| 3254018ddb | |||
| f2b7df94d7 | |||
| 59fd3aad31 | |||
| a3d18d43ed | |||
| 20cbebeef1 | |||
| 2968482199 | |||
| f8ac382072 | |||
| aef43910b1 | |||
| 87efd4ab84 | |||
| a8b600845e | |||
| fcd9fd8513 | |||
| ffe73f0124 | |||
| 0c57250d87 | |||
| f7e012d216 | |||
| c9e3c8b38d | |||
| 908a7b6c3d | |||
| cfd7e8a829 | |||
| 804b818c6b | |||
| 9b9d14c2c4 | |||
| 38fc8eeaba | |||
| e70221a9f1 | |||
| 126202648f | |||
| dc8475995f | |||
| 3ca1373274 | |||
| 4aaf07d62a | |||
| ff10a4603f | |||
| 53eb56bb1e | |||
| c6209d76eb | |||
| 99dc8c7871 | |||
| f588ccff72 | |||
| 69746f2f0b | |||
| 65da9425df | |||
| b7583e95a5 | |||
| 9437a1a844 | |||
| 435564f0f2 | |||
| 2a6e522a87 | |||
| 9c1db7dca7 | |||
| cd7cb19aee | |||
| d84fa4d154 | |||
| d574706600 | |||
| 8369e59b4d | |||
| 5be8fbab56 | |||
| 6101733232 | |||
| 778861f461 | |||
| 6c9d6a4d57 | |||
| 9962118dbd | |||
| a4b2c10fb8 | |||
| 2c17bb2c36 | |||
| da91217bc9 | |||
| 2e467cbc74 | |||
| 561a3bf7a0 | |||
| 83cad07fb3 | |||
| 4f6a4f244c | |||
| cef49da576 | |||
| e16453591e | |||
| 450319790e | |||
| 4b783037d3 | |||
| d04f40c274 | |||
| 9ab4f35b84 | |||
| 4668c4996a | |||
| 330dc2fd44 | |||
| 96eed571d9 | |||
| 24d80000ac | |||
| 7ff527293a | |||
| d88b2dd198 | |||
| 66654faef3 | |||
| c8de30f3d9 | |||
| f0fb38fed4 | |||
| 43ab7c22a7 | |||
| 829cd70889 | |||
| 972421efe2 | |||
| 98ada40532 | |||
| 931d704612 | |||
| bb4e7da720 | |||
| 64e122c5f6 | |||
| d0d0bf570e | |||
| e53052ab7a | |||
| cd46ebbb34 | |||
| 8d4136d864 | |||
| 4125e575af | |||
| 7259c0d69f | |||
| ce2dd22bd7 | |||
| 1eb072fd43 | |||
| f49b0822aa | |||
| de824d3713 | |||
| c0358d8d0c | |||
| a9e4f345e9 | |||
| be18b103b7 | |||
| 55405c1a26 | |||
| 779770dae5 | |||
| 002b16e1c6 | |||
| ddf9eb1f9a | |||
| bb4fecf3d1 | |||
| 4fbe52da40 | |||
| 1e3197a1ea | |||
| 5f692dfce2 | |||
| 78a7d7fa21 | |||
| a9dda1554e | |||
| 9a417bfc5e | |||
| 90bc51ed2e | |||
| 02dc835721 | |||
| a05e8f0e37 | |||
| b10cbb9b20 | |||
| 1aaab741a0 | |||
| bafa46393c | |||
| 45d43c41bc | |||
| e944646541 | |||
| 21e1443ed5 | |||
| 93a5ffb037 | |||
| d5711589cd | |||
| 375a359c97 | |||
| 3228bac56d | |||
| c66b4e32db | |||
| 57b60dd51f | |||
| ff911d0dc5 | |||
| 7a71498a3e | |||
| 76bcdc2581 | |||
| 91a218b29d | |||
| 4a6cbda1b4 | |||
| 8c08153e33 | |||
| b44b3866a1 | |||
| c242bb372b | |||
| 8c9e34133c | |||
| 3403ac361a | |||
| 07d6cb3f4a | |||
| 545aa61cf4 | |||
| 9fb78ce827 | |||
| 490b6d092e | |||
| 42b13bd312 | |||
| 28add22f20 | |||
| ce545274a6 | |||
| aa6c951e8c | |||
| c4f4dfc3fb | |||
| 548f6ef2b6 | |||
| b15ff4eb8c | |||
| 7790214620 | |||
| 3942e45cab | |||
| 2ace9ae4e4 | |||
| 5ac0ef6253 | |||
| f552667312 | |||
| 5669a18bd8 | |||
| a97d73ab05 | |||
| 252d2c425b | |||
| 09fc4bba61 | |||
| 79d4db8541 | |||
| 9c42626772 | |||
| bbfe83c86b | |||
| 55aa4e424a | |||
| 8015f5c0c5 | |||
| f3fe14863d | |||
| d96c368660 | |||
| 3f34b8b0d1 | |||
| 6a58ea9e56 | |||
| 23888398d1 | |||
| bfbc5eb91e | |||
| 98b0d4169e | |||
| 356cd271b2 | |||
| baf7561cf8 | |||
| b09f22961c | |||
| f3ad3a5dfd | |||
| ee49d321c5 | |||
| 3467ad3d02 | |||
| 6741604027 | |||
| 35312cf96c | |||
| 15f028fe59 | |||
| 8a2301af56 | |||
| 66747a8eef | |||
| 19d413ac1e | |||
| 4a332ff1af | |||
| dc942db52f | |||
| f535a2aa71 | |||
| dfdd6dfa20 | |||
| 2af81d1ee3 | |||
| ece25bce1a | |||
| 6fc234183a | |||
| 15a56f705f | |||
| 899f7e125f | |||
| aa19bb3f30 | |||
| 562852a0ae | |||
| a4b992c1ab | |||
| 3460c1dfbd | |||
| 653f6c2d46 | |||
| ed7851a4b3 | |||
| cb841e5cde | |||
| 4dae0e514e | |||
| 363c46ace8 | |||
| abe5aca3e2 | |||
| bea10b4356 | |||
| f5f83f1924 | |||
| 403e2d58b9 | |||
| 222df44d21 | |||
| 566e548713 | |||
| 1434d54e7a | |||
| 4229d0f9a7 | |||
| 7f9eb35e1f | |||
| ed7d7a74ea | |||
| 035e54ba4d | |||
| 284707c3a8 | |||
| 1f63028a83 | |||
| 8a0aa91ed7 | |||
| 62079991b7 | |||
| 4e7e172ff3 | |||
| 33a565a719 | |||
| f0b9257387 | |||
| c398c9cb6a | |||
| a3d3e30e3a | |||
| 2b86465d4c | |||
| 6529240da6 | |||
| 0751ad1eeb | |||
| 786550bdc9 | |||
| bde756a1ab | |||
| 423fb2d7bc | |||
| f96b4f287a | |||
| c00e7d3f65 | |||
| 1f38d4846b | |||
| 47a64610ca | |||
| f0a845f0f9 | |||
| abec23118d | |||
| 0957119550 | |||
| f48fa3e4e8 | |||
| 5ffc58d6ca | |||
| 7d958635f0 | |||
| 33990426c1 | |||
| 9f3fc7ebf8 | |||
| c8357da13b | |||
| 2290f14fb1 | |||
| 7796984444 | |||
| 75113c26c6 | |||
| 939a9ecd21 | |||
| f307c7cd88 | |||
| 33ecceb90c | |||
| e0d1cab079 | |||
| 811d72a727 | |||
| c3c575c2e1 | |||
| c189629eca | |||
| 37117c22d4 | |||
| b05e9d2ab4 | |||
| 0451333990 | |||
| ab2e6c19a4 | |||
| f7959bc887 | |||
| 45874c699d | |||
| 286cdc41ab | |||
| 78708eb5d5 | |||
| cf36745770 | |||
| 6622c7f98d | |||
| 3112b74527 | |||
| b3ae6b634f | |||
| 982bca5d40 | |||
| c8dcde6cd0 | |||
| 8f9db61688 | |||
| ebdbaf34e6 | |||
| a081b1e79e | |||
| 38c31e64db | |||
| ae6f67420c | |||
| ca19bd31d4 | |||
| 413dfd5628 | |||
| f9515901cc | |||
| 3f42fabff8 | |||
| 1caa578771 | |||
| b7c11c1818 | |||
| 3eb3db0663 | |||
| be46f32056 | |||
| 6e5c915f96 | |||
| 04d13a8116 | |||
| e638ede3f2 | |||
| 2348abe4bf | |||
| f7e7a399d9 | |||
| ba91f34636 | |||
| 16865d43a8 | |||
| 0d13aee15c | |||
| 49b4144ffd | |||
| 186e2d972e | |||
| 40dd63ecef | |||
| 6d66d6da15 | |||
| 03ec3513f3 | |||
| 87763fc234 | |||
| f6c44cae2e | |||
| da2ee04fce | |||
| 7673c36af3 | |||
| 9457b2af2f | |||
| 7203991032 | |||
| 5a685f7156 | |||
| a6a25030ad | |||
| 00458a31d5 | |||
| c6ddf6d6cc | |||
| 34b21b3065 | |||
| 8fbb355cd2 | |||
| e8b3b7e578 | |||
| 59ca44f493 | |||
| 9e1457c2c3 | |||
| fac83e14bc | |||
| a97cec57e4 | |||
| 38c10b47d3 | |||
| 1a2523fd15 | |||
| 03243cb422 | |||
| 2ad7ee0344 | |||
| 55ce3618ce | |||
| e9e34c1ab2 | |||
| d4c916b496 | |||
| 8fbc9c9342 | |||
| 1b6fd9dfe8 | |||
| 304467e3f5 | |||
| 7452032d81 | |||
| 87e2048f1b | |||
| d876084392 | |||
| 840729afa5 | |||
| 941ad03f3c | |||
| d73d191f99 | |||
| c2664e0283 | |||
| ee61cede4e | |||
| b47669b80b | |||
| c0d0c63592 | |||
| b09c39c8dc | |||
| b4b09ddc3c | |||
| d0a21086bd | |||
| d44882c1b5 | |||
| 23c68efa2d | |||
| 560c5de1b7 | |||
| 5d91dbd000 | |||
| 6c31ee36cd | |||
| edc29780ed | |||
| aad7e4dd1c | |||
| a6a727e8a4 | |||
| d1fc65fabc | |||
| d4be5ef9de | |||
| 1374be5a31 | |||
| b2bbc28580 | |||
| 59b3e672aa | |||
| a2f8bce8f5 | |||
| a2b9adb3a2 | |||
| 28067640b5 | |||
| da67916843 | |||
| e54ce479ad | |||
| 6024d8a42d | |||
| f565f08aa0 | |||
| fd4afe09f8 | |||
| dd0904f95c | |||
| 4c3076f2a4 | |||
| 1e73f63ff8 | |||
| d167d5b1be | |||
| 71fa14f791 | |||
| 8dd1873e76 | |||
| f91f5c7401 | |||
| c62b7cc679 | |||
| 3ee213ddca | |||
| 8429877b02 | |||
| 05a0faff6a | |||
| e09f6e4987 | |||
| e23f4b0265 | |||
| f582d4a13e | |||
| 2f41bd495d | |||
| 162a8c4393 | |||
| 3d1ce4c53f | |||
| 6db3ae9b8e | |||
| 6d0cb9dc33 | |||
| 46e95e8309 | |||
| a7b9375877 | |||
| 0c6a8a130e | |||
| 9903f1e703 | |||
| 6fad719e42 | |||
| 9aaee8ee47 | |||
| 166221d784 | |||
| 925d69a2ee | |||
| 5ff08e241a | |||
| 3defd24087 | |||
| 9d86147d20 | |||
| 80801ac4ab | |||
| 210926cd91 | |||
| 677a69deed | |||
| 8dfdee21ce | |||
| 6ea77ab4cd | |||
| e3c996688d | |||
| bc3a570dda | |||
| 0800021a2d | |||
| 435eddd867 | |||
| 6e0fb055d1 | |||
| 1e9ac7ffeb | |||
| b4873ecb43 | |||
| 1859d57784 | |||
| 69d58fbb50 | |||
| cb34991663 | |||
| c700364e1c | |||
| 9a6b1dc3a1 | |||
| 54b5b80a07 | |||
| 831459b895 | |||
| 4e101604c3 | |||
| a6455269f0 | |||
| cd257b91c5 | |||
| d8f57bf899 | |||
| 989fb11fd7 | |||
| 140965b738 | |||
| 14ee51aead | |||
| 2e97ba5700 | |||
| f549d53b68 | |||
| a085ad4719 | |||
| f230a9232e | |||
| e84bf35e2a | |||
| 20f090537f | |||
| dbe7a7c4fd | |||
| b7a4e3903e | |||
| b4c1c2f731 | |||
| 1b940e7daa | |||
| f4ee50a7ad | |||
| bee32d960a | |||
| 040a3b782c | |||
| d649037c3e | |||
| 0a49d3dd52 | |||
| 53bb37b749 | |||
| d2586278d6 | |||
| 6635c393e9 | |||
| 6222179a57 | |||
| 05bda6f38d | |||
| 4295cefeb1 | |||
| 67228c9b26 | |||
| fd2bfff023 | |||
| 4e6c86341d | |||
| 2a14c67edc | |||
| c236f05f4b | |||
| 0eeacdc80c | |||
| 41f39bf3fc | |||
| 9677144015 | |||
| 15797c556f | |||
| acacf35a2a | |||
| d3f5b1cbb6 | |||
| 196ed8101b | |||
| dc650c5368 | |||
| 2bb521b135 | |||
| 409cc7d9b0 | |||
| fe26be2312 | |||
| 34519de3b7 | |||
| 147d578922 | |||
| 9c317b64c3 | |||
| 3b8f6233b0 | |||
| 455b0cd696 | |||
| 1fa66405c5 | |||
| b680a85b57 | |||
| 682ebc5f64 | |||
| b8ba39dfae | |||
| 6c9e6a3a5a | |||
| 70698024f5 | |||
| 6df17a334c | |||
| a5fb59b17f | |||
| 7ed6485f86 | |||
| 478150e850 | |||
| 3c2e30f348 | |||
| b873e6349c | |||
| 2b1a32fd9c | |||
| a2105634a4 | |||
| 7c71bd7be7 | |||
| 7c1961e618 | |||
| baeddd4d15 | |||
| 6f5a8a33d9 | |||
| 52b2559a14 | |||
| 3d150c30a7 | |||
| e58e573f3e | |||
| 375aa38f5d | |||
| 0e6317678f | |||
| e7dffcd0f6 | |||
| 065304d175 | |||
| 15f43dd326 | |||
| 09d759d196 | |||
| 68757950ce | |||
| 3c45bdf18a | |||
| c135967e59 | |||
| f71af7c2a8 | |||
| 5b01eb9437 | |||
| 2e716f80d2 | |||
| d7c0bc8c23 | |||
| f30bf08580 | |||
| a640803fc9 | |||
| 9954ddb780 | |||
| b218df6920 | |||
| 5b6950e545 | |||
| c7911c7130 | |||
| 62f792ea14 | |||
| 6a85960605 | |||
| 63a0b8ba79 | |||
| 634b382a3d | |||
| fbf5deda21 | |||
| d4b848272e | |||
| fc29f2003e | |||
| ab469aa07d | |||
| 562450751f | |||
| adacd01f82 | |||
| 74d3320519 | |||
| 309a15d1ba | |||
| bcef11681d | |||
| 8d15c8cfbf | |||
| 716bb8574d | |||
| bd2fec4813 | |||
| ead4b34127 | |||
| 72ae414da4 | |||
| 4c9618be3f | |||
| 901028f1e8 | |||
| adfbfc1255 | |||
| b66c03dfe9 | |||
| 2a909e634b | |||
| 9d86056f1c | |||
| 309fd76ddf | |||
| a3293b154e | |||
| eb8963a673 | |||
| 89ce9a5db2 | |||
| f4f2567105 | |||
| 5a3fe61f2a | |||
| 55c327ffcb | |||
| 0fdb39f1c3 | |||
| dae1b5a619 | |||
| 26b5680913 | |||
| a2855fa24a | |||
| 9c3cf7b69a | |||
| be7877f526 | |||
| e765d8e69e | |||
| 4bd8df1fd3 | |||
| 4e76f2fc44 | |||
| cf00ee42f5 | |||
| 886758d2be | |||
| 8339d2c7c9 | |||
| 811e4bd0cf | |||
| 49feff082f | |||
| efdd54a670 | |||
| 84ac004772 | |||
| bb35818976 | |||
| 822af70dce | |||
| d5f33212ac | |||
| db2aa83a7c | |||
| 9231fdbf4c | |||
| 017d7538ae | |||
| a1c78ad9d4 | |||
| 754791efd3 | |||
| 50b7ec3c73 | |||
| 7ae417b4b6 | |||
| 5d04638091 | |||
| 2b2263a349 | |||
| 39ace9bdee | |||
| 1885d3df99 | |||
| 83ea931e3c | |||
| b281a80150 | |||
| c98d91e44d | |||
| 3ea54e9d25 | |||
| 1d3f218662 | |||
| 7da4fb68da | |||
| 7a24c957bd | |||
| 0ea6a926c5 | |||
| 49bc602fb2 | |||
| cdaef30cc9 | |||
| 56e15d09a9 | |||
| c91e8b1737 | |||
| 094343739b | |||
| 82134a1d50 | |||
| 6a0ff3686c | |||
| e0c24c0e99 | |||
| 1c80941c69 | |||
| e88ea71aef | |||
| e0f1410b48 | |||
| c3c85276d1 | |||
| af2888d394 | |||
| d0dd8b7955 | |||
| 75bce2822e | |||
| 425cc1ea85 | |||
| 2bf33c4dd2 | |||
| dc19cd5d9d | |||
| dfc25dbdd0 | |||
| c4091c4c66 | |||
| ef95b1268e | |||
| e068bbec73 | |||
| 9cfd1c67b6 | |||
| 8978a6a3ff | |||
| 4e3d732934 | |||
| 03548cdfbc | |||
| 70dd69d533 | |||
| 453f324f54 | |||
| c1aa55f3ea | |||
| 4b1e13e982 | |||
| 4584eb3058 | |||
| 02a7ae15f9 | |||
| 74b1b60125 | |||
| 39df994ff9 | |||
| d9875fe232 | |||
| 26c10b9931 | |||
| 750662eb08 | |||
| 6b49889041 | |||
| 03ddee3663 | |||
| 10caab1729 | |||
| c6a72def88 | |||
| 21a31d7f8b | |||
| 2c4df108e5 | |||
| 5db8addcc6 | |||
| dd0e81d094 | |||
| 90f093eb67 | |||
| a056a9d601 | |||
| 2ad2a402fb | |||
| 3d07a94bd7 | |||
| 366857cd26 | |||
| 9578246bbb | |||
| 9ee9e9c6de | |||
| e22cc28114 | |||
| a227af3664 | |||
| 599d410d99 | |||
| 5e37ab60d8 | |||
| 0b06235527 | |||
| b8d42cdea7 | |||
| 455791b710 | |||
| 90323cd355 | |||
| c07d9e96ce | |||
| 810adb8a94 | |||
| 606aadb891 | |||
| 8f73670925 | |||
| 8c559d6231 | |||
| 786cb6859b | |||
| de8800f41a | |||
| 7a00798027 | |||
| 6ded06c6d9 | |||
| f53741c5b9 | |||
| 2681bafb76 | |||
| ac635c70cd | |||
| ef7e47d162 | |||
| 4211b9abbd | |||
| 0c0120ef27 | |||
| dacd457478 | |||
| 7b03a0316d | |||
| 52201d95b1 | |||
| e2cde628bb | |||
| 3335fa78fc | |||
| 7abc7fa573 | |||
| f6247fe67c | |||
| 996a9135f6 | |||
| 3599751f93 | |||
| 2d186e1e76 | |||
| bb2f46d7cc | |||
| 463fbe2680 | |||
| 95a7e50137 | |||
| 9d93ad1f16 | |||
| 44104797d6 | |||
| 1548501050 | |||
| de3911e930 | |||
| 5a8a901560 | |||
| 12d45e9114 | |||
| d057067543 | |||
| 560d375e0f | |||
| 3388d6636c | |||
| 2624a6dcd0 | |||
| b5c2785e10 | |||
| 493834d45d | |||
| 926546b153 | |||
| 56434db4f5 | |||
| 688292e6ff | |||
| f7415e1ca4 | |||
| 2961fa0e08 | |||
| ad17ff9a92 | |||
| 558ab25f51 | |||
| a5db7c9acb | |||
| 580297e290 | |||
| 79d11ea709 | |||
| 99f40a9682 | |||
| e86756cb39 | |||
| 1325246da8 | |||
| dfa9a91906 | |||
| 5e2926a207 | |||
| 9048832a9a | |||
| 7d5a385811 | |||
| 900e93f758 | |||
| 99430a5931 | |||
| c9b4029ce7 | |||
| 78c3051585 | |||
| cd4310df25 | |||
| 259cff9f22 | |||
| 7b7eb00385 | |||
| 62b9e5a6f9 | |||
| a399502ecd | |||
| 92a840f1b2 | |||
| 74fdc16bd1 | |||
| 56cfdce453 | |||
| efa8eb379f | |||
| 7f095bdc42 | |||
| e20161b3de | |||
| fc8fdbacb4 | |||
| 7fde638556 | |||
| be93c19b7e | |||
| 967eb81112 | |||
| 9f602f73eb | |||
| 41de7e76ec | |||
| 607a22ad12 | |||
| 4b402c4041 | |||
| daccb10d8c | |||
| 63f1dd7877 | |||
| 79801f5c30 | |||
| 9c7a1bc067 | |||
| cf0ff88120 | |||
| e0b67536e0 | |||
| 94c7dcc7f1 | |||
| 38e155d819 | |||
| efd5575683 | |||
| 1a7c213405 | |||
| 8e3d60c359 | |||
| 924b4fe742 | |||
| 7e154a467b | |||
| b90f1581be | |||
| 821992e21f | |||
| f0c0ce9db1 | |||
| 8ecb9aaa91 | |||
| 22258fb0bf | |||
| a725b8bb6e | |||
| bdfdccd511 | |||
| 194bc60429 | |||
| 430ca3322b | |||
| 3d803c2e80 | |||
| fa3dcbb3bc | |||
| ee342063d8 | |||
| bb3bc60f83 | |||
| e7a4cfac4d | |||
| 6478aa1c9d | |||
| 7b5839335a | |||
| a360af8687 | |||
| 36cb25b341 | |||
| e565ecdaef | |||
| f96fdc2970 | |||
| 0d04cdc323 | |||
| 926f604f09 | |||
| 180743612c | |||
| d05f189049 | |||
| ceaa9f1101 | |||
| 6f4cbe0bde | |||
| 8d4bb9b40d | |||
| 1765fe2a29 | |||
| 79a710ce98 | |||
| bec5451f12 | |||
| 86dfdcb8ec | |||
| 42d986b96d | |||
| fbc4ca980c | |||
| 80c52e0ea4 | |||
| 50b76dd5a2 | |||
| 225fcd5e41 | |||
| afffd345bc | |||
| 716576043d | |||
| 28231d39a4 | |||
| 9e23c3d625 | |||
| bdd5869244 | |||
| fc1415d705 | |||
| 8218f62478 | |||
| fd354d999d | |||
| ec00b25793 | |||
| 967b7d89e3 | |||
| 32f8439143 | |||
| 0ff8bd2aa9 | |||
| 2866383228 | |||
| 00ac7edeb3 | |||
| 537068cfde | |||
| c3c6a48059 | |||
| 5c166b3f40 | |||
| 230fa3286b | |||
| 061c0b10fd | |||
| 32f8a98cf8 | |||
| 6c60ecb237 | |||
| c3fae5e801 | |||
| a594e256ae | |||
| 41d90c2408 | |||
| 7ff42b1b7a | |||
| 4d7cfd0de5 | |||
| 266d32bd77 | |||
| 7e1184c071 | |||
| 1ce51e57ab | |||
| 142b4fd699 | |||
| cc8feaa483 | |||
| d9d5d35a77 | |||
| 9277156b6c | |||
| 1490a19fa1 | |||
| 9b7adcd4d9 | |||
| a8d32f9964 | |||
| 5093337de1 | |||
| f54225568c | |||
| 255ff446ba | |||
| 9a0dc4bfdc | |||
| 9d975750bc | |||
| 7c979e6490 | |||
| d60ca1661c | |||
| bb62391a4c | |||
| 0b25c0b677 | |||
| a5d6082418 | |||
| 631cbcd781 | |||
| 20c4633d2a | |||
| 5669cac16d | |||
| 6180762160 | |||
| 376726cf90 | |||
| 284bb7ac71 | |||
| eca466bdaa | |||
| d56abec195 | |||
| 961e25f608 | |||
| 138bf698b0 | |||
| e5bb4cca12 | |||
| 5e2cb0e3a8 | |||
| 16a65cb367 | |||
| 1bae9b8ff7 | |||
| d7c1f43b49 | |||
| f933af9f57 | |||
| 91e1ff5e30 | |||
| 5908e10549 | |||
| 464e6354c5 | |||
| d470e55f8c | |||
| 98a1b01b0c | |||
| e240424be5 | |||
| 1cb5a12abb | |||
| ff2a4a6fcd | |||
| c58d2fce89 | |||
| 7a962b9f03 | |||
| a679079a1d | |||
| e39e776d03 | |||
| e135ffc2c1 | |||
| e79eac688a | |||
| 643a90c48d | |||
| 2a448a899d | |||
| 7b86f8f024 | |||
| e686f12317 | |||
| a86f1eca79 | |||
| 668c1c0792 | |||
| c4fad66f2a | |||
| 02572e8cca | |||
| 1d8385f7ac | |||
| f8c966c39c | |||
| 3c8efe7c0a | |||
| dbc10e0feb | |||
| 239bf97b47 | |||
| 858db2f239 | |||
| c34bdb74e6 | |||
| 9601102885 | |||
| 56c2d1cc55 | |||
| a67b0d4771 | |||
| ef204817ae | |||
| 9bc5bc2548 | |||
| fd4be36991 | |||
| 9b46b02717 | |||
| 3bc4dc58d7 | |||
| 594666eb61 | |||
| e80f41a701 | |||
| f9c2aa7689 | |||
| 9dd4bf5574 | |||
| 5a9b785773 | |||
| d96a28487a | |||
| 0554898b5d | |||
| 6f9ce6a199 | |||
| e3119112a6 | |||
| d3af0e9090 | |||
| 2feb44e2c5 | |||
| cc0b92bc75 | |||
| e576d32fb6 | |||
| 2d6865d421 | |||
| 0f1133729f | |||
| d7160ee563 | |||
| 18add94a31 | |||
| 18d3ffc194 | |||
| 0a30a5b077 | |||
| 9049dd7725 | |||
| 6f418da388 | |||
| 41c6bf5fe4 | |||
| 33d6d26bbf | |||
| 787285d58f | |||
| 40fc6f529e | |||
| baef18cedd | |||
| a918cea2fe | |||
| 9789905a1f | |||
| f458580dee | |||
| 223a30401c | |||
| 2927493cf3 | |||
| 79db920fa7 | |||
| b3d65cc7df | |||
| 208d6d6d94 | |||
| aa135a3780 | |||
| 044e7b63c2 | |||
| 5b7b328193 | |||
| 8d5a1be227 | |||
| 90d5765fb6 | |||
| 1db14793fa | |||
| cbb4e95928 | |||
| 20c091a5e7 | |||
| e9c098d024 | |||
| 9f75970347 | |||
| f1366e8e19 | |||
| 0f85e3557b | |||
| 17ee731546 | |||
| af2461cccc | |||
| 60c1549771 | |||
| ab6dcf7032 | |||
| 8aae235a71 | |||
| c032574491 | |||
| 1065917872 | |||
| 56e361ac44 | |||
| 2e00829b1e | |||
| 625aaceb00 | |||
| 98d85e6b74 | |||
| 319d49084b | |||
| eb542067af | |||
| 04b9a2c605 | |||
| 8028e75fbb | |||
| 3eb51d85da | |||
| 79a35c2fe6 | |||
| 2dd4c34423 | |||
| 684f6b2299 | |||
| b791a80b75 | |||
| 13006f94e2 | |||
| 41772c325f | |||
| a4fc057a1c | |||
| aae29e72ae | |||
| 87c831e5dd | |||
| 40a5f1c80a | |||
| 04f1e18342 | |||
| 365a40d11f | |||
| 60b5dac3ab | |||
| 8565c18e84 | |||
| 03ba4bc760 | |||
| ae3a2cb272 | |||
| 6c8e208ef3 | |||
| 0181f1c08c | |||
| 7f00c5a02e | |||
| d0648e27e2 | |||
| 31348af2e3 | |||
| 096c0ad564 | |||
| 16c41585e1 | |||
| 566ab9261d | |||
| 1cdadfdece | |||
| 448a19bf54 | |||
| d3051eed48 | |||
| ed55de888a | |||
| da601f0bef | |||
| 08ac36812b | |||
| 556de444e8 | |||
| 3750200c5e | |||
| c5f7d650b5 | |||
| 535c72cad7 | |||
| 8a83edc1b5 | |||
| 5b415a6227 | |||
| 5172f0bf39 | |||
| d9579f418d | |||
| 3579bbd1c4 | |||
| 817b85001f | |||
| e8868a7fb9 | |||
| 2cd9ac60f1 | |||
| 464f384cea | |||
| 8b16f07eb0 | |||
| fefda40acf | |||
| 8c2f62fb92 | |||
| 1a6b961b5f | |||
| 01014a6a84 | |||
| cb0c55daa7 | |||
| 82575a7aea | |||
| 80da0c5830 | |||
| 83b6abf4ad | |||
| ea0ebc020c | |||
| f358db9f02 | |||
| 94c9cadbd8 | |||
| 2ae6460f46 | |||
| 0067b16d1e | |||
| ec9f6220c9 | |||
| af53e2b6b0 | |||
| b42b333a72 | |||
| 99b0369f1b | |||
| d6ea1e2f12 | |||
| 4d6b45427c | |||
| 1be8365684 | |||
| c3d11c8ff6 | |||
| 8ff65abbc6 | |||
| bf4b6e5f80 | |||
| 25fda7adc5 | |||
| f3af7b5f35 | |||
| 33cfc56ad0 | |||
| 464cc26ccf | |||
| d18754afdd | |||
| beb7953d38 | |||
| fbfc811a44 | |||
| 7e66e5a713 | |||
| 07b5bbae06 | |||
| 3087913b74 | |||
| 904ea05bf6 | |||
| 6f4885d86d | |||
| 2dc29cfee3 | |||
| bd05df5cc5 | |||
| ee1f14621a | |||
| 58a9d9eb9a | |||
| bc1013dacf | |||
| 9f195df103 | |||
| 1cc7dc6360 | |||
| 328965ed7c | |||
| 133de9a087 | |||
| 7261384655 | |||
| 4718071cbb | |||
| 22be0816aa | |||
| 49e88322de | |||
| 14f3d44c37 | |||
| 0ba17ec116 | |||
| 79d59c004b | |||
| 873e9720e9 | |||
| de6d3e493c | |||
| 7f1fdb774c | |||
| 128efc3193 | |||
| c49efc0c22 | |||
| 3e2b8a8d02 | |||
| 9861279395 | |||
| 538a5df9d5 | |||
| 90d6ebc879 | |||
| 6de1f8c770 | |||
| 6d532bfc02 | |||
| ba537d657f | |||
| 305fbc7c92 | |||
| 29341d60aa | |||
| c170862de7 | |||
| ca6efd73f3 | |||
| d05fee1182 | |||
| 1f87676d52 | |||
| c2ce2f88c7 | |||
| 2fed55ae6b | |||
| 51db59622c | |||
| db1d2aaff5 | |||
| 4322fdc910 | |||
| 2a5c5a4e15 | |||
| 4b2abf8ac2 | |||
| 365cb4b368 | |||
| c85bff235d | |||
| ad16180b1a | |||
| 5ff02b469f | |||
| 44f57ad9a8 | |||
| 94fd6f6901 | |||
| e61242a337 | |||
| 722964667f | |||
| fbb9c1c249 | |||
| 15f341b655 | |||
| b358490607 | |||
| f9e4196fd5 | |||
| 751525802d | |||
| 2abacd2a2d | |||
| a3155e0613 | |||
| 70b9e4caf5 | |||
| 317ae9233e | |||
| 5b8f03cd9d | |||
| 2a4783307a | |||
| bddecba9ed | |||
| 931e76e3d1 | |||
| 70c2ec8ed5 | |||
| 9c7edb9242 | |||
| 0867821ae7 | |||
| 0b2d51d859 | |||
| ef8022f715 | |||
| e03ec0032b | |||
| 62642443ef | |||
| 3e04c92ff9 | |||
| b77628c458 | |||
| 40c5e6d67a | |||
| e4d175780e | |||
| 16b9665033 | |||
| b7238caea5 | |||
| e63c0e3cbb | |||
| 16db2c4e57 | |||
| bd4a61addd | |||
| f19c18dc14 | |||
| 570f10d91c | |||
| 9550b884f7 | |||
| 4b45ef62ed | |||
| a1543b7da0 | |||
| 90087160c6 | |||
| be33875199 | |||
| 867bf70f1a | |||
| 9018ef30fe | |||
| 508f84893f | |||
| f414d241c1 | |||
| 0c1307b083 | |||
| b8b6cd409a | |||
| fbee41f8c7 | |||
| 55edd5047e | |||
| 0587e24fdb | |||
| 451ccb778d | |||
| 5656f81bde | |||
| b07ea5055b | |||
| 5eb27afd63 | |||
| 05d43a4074 | |||
| aa895cfa9b | |||
| 172c7eb270 | |||
| eb6c0b8027 | |||
| 06d2520db2 | |||
| bf31a3efbc | |||
| 445dcfe4d0 | |||
| 25ca0278dd | |||
| 78a380bcc4 | |||
| 4f1a56f0f0 | |||
| 754bfb181c | |||
| 7903ba0297 | |||
| c1b2243adb | |||
| d52c750942 | |||
| 7c2a9b0744 | |||
| 888d7e6422 | |||
| 919275cc58 | |||
| 4fe5297e35 | |||
| 22dee4f6f3 | |||
| a7dbe58c85 | |||
| aa3da0e24c | |||
| 033ab5490b | |||
| c9f785e00f | |||
| 0e8ab0588f | |||
| 0ebe198ff1 | |||
| 438ad8148b | |||
| a60133bfb3 | |||
| 98b3e37144 | |||
| 6e23903c63 | |||
| 574c4a264f | |||
| dd5ffaf058 | |||
| 0b16270b88 | |||
| f562a88249 | |||
| 59f8d116af | |||
| a5558f8fcc | |||
| 823ae03a08 | |||
| f8c958a409 | |||
| 25785d8c3f | |||
| 35d3da9697 | |||
| d3e9930235 | |||
| 1ccca7cc68 | |||
| 12a9e2972a | |||
| 444c1f170a | |||
| 3cb2fb8250 | |||
| 1e8457441d | |||
| 5a9448245b | |||
| eafe5a9d8f | |||
| d45d90e8ae | |||
| 42a9374e71 | |||
| 82a775eca3 | |||
| 1dae1a71fc | |||
| ac0fed6402 | |||
| fb656d480e | |||
| 2b7341af57 | |||
| ce1f9d935d | |||
| bdadca1a65 | |||
| d7b4d0756e | |||
| 1279e27825 | |||
| d92e3bd620 | |||
| 7f583ec1ac | |||
| 7962101e5e | |||
| ae254f0a10 | |||
| 68e0b0ac84 | |||
| 5f21d13572 | |||
| 233bffdb7d | |||
| bf9349c4dc | |||
| 4847548779 | |||
| cb245b5435 | |||
| 249b897872 | |||
| 08c731fd84 | |||
| 302f4407f6 | |||
| de5dfd99f6 | |||
| acb22f0fde | |||
| d1505b15c4 | |||
| cca2e7876d | |||
| 2c4d8dbe9b | |||
| 9305ad2102 | |||
| 7a98dab6a4 | |||
| 971defbbbd | |||
| 6b0de08157 | |||
| 87c1de66f2 | |||
| 2aa171c348 | |||
| 6452342222 | |||
| da204c131d | |||
| 9369cc44e6 | |||
| 38bca6731c | |||
| 2adab7f71a | |||
| be96f6e62d | |||
| 8b5ea39916 | |||
| 1024fc623e | |||
| 8ab05d4c36 | |||
| 0c9e79cd67 | |||
| 2ed6bb86c1 | |||
| 61da0f08dd | |||
| 1432c268a8 | |||
| ec6a03afdd | |||
| bf371a6e5d | |||
| b28cf68097 | |||
| a0af7a51ed | |||
| dfa3ef0564 | |||
| 0066531266 | |||
| 53a7cb0e9d | |||
| 86739bea8b | |||
| ab127ba92e | |||
| 6a2a9460e9 | |||
| 07ad362854 | |||
| 76b0328eb1 | |||
| 3c85136279 | |||
| bf048b8d7c | |||
| 9ac2bb30f4 | |||
| 78b74cce8e | |||
| 82033af097 | |||
| 951308b5f3 | |||
| 8d5456b6d0 | |||
| f674de4f5d | |||
| fafa5938da | |||
| 4d5546953a | |||
| b61baa87ec | |||
| 805c701767 | |||
| dad041c49f | |||
| 2ecdc54b0b | |||
| ce260f79d2 | |||
| 11ca1bec0b | |||
| 05d9adeb99 | |||
| 73f29484e7 | |||
| 0154a26e0b | |||
| cee1c4f63d | |||
| e5397c5ec2 | |||
| e36f5cb366 | |||
| 8b9fed75f3 | |||
| 66e9bd90eb | |||
| b29c1224c1 | |||
| bd6175157c | |||
| 6692e8c508 | |||
| 6c25131964 | |||
| 0bdae34b5e | |||
| f6fecb957e | |||
| 0a3d51e9cf | |||
| a69513c044 | |||
| 219f5d9845 | |||
| ba60e0f692 | |||
| 18424dd82f | |||
| 32ebea91ff | |||
| 3b53e06e0d | |||
| 4d38798dd5 | |||
| 92a3898540 | |||
| 7433095240 | |||
| 190b6a2aa6 | |||
| 0095896051 | |||
| c647e4307a | |||
| bab5c54219 | |||
| e74479717a | |||
| 9ebd453b87 | |||
| 5ad5d0cff4 | |||
| 68cb382242 | |||
| f5d1c7cc0a | |||
| c7fb8a4f20 | |||
| eb87e690ed | |||
| 539fc8b760 | |||
| c6e54c83c8 | |||
| 878d13ef42 | |||
| 5580bcf870 | |||
| 12adcf8925 | |||
| c8ef9223e5 | |||
| fc37e654fc | |||
| eb69896355 | |||
| 61ff2fd0f3 | |||
| b6d045cebf | |||
| f47177ecb4 | |||
| de850262b8 | |||
| de57af46c0 | |||
| badf9baf9b | |||
| adcd83f6a8 | |||
| 81d4d8cea1 | |||
| 4da0b70694 | |||
| 7056009b6a | |||
| ddb960ddfb | |||
| 0ebd985672 | |||
| c13dc62065 | |||
| 705946cc40 | |||
| aafa4a3c8b | |||
| af68084895 | |||
| 9633c5dab6 | |||
| aa11141660 | |||
| 8bb5b943d7 | |||
| 22776f24ab | |||
| 216442ddc1 | |||
| dd3ac7a2c9 | |||
| 11447324ff | |||
| f8210b353e | |||
| 2b66c1358b | |||
| 102d86d4b6 | |||
| 227f49a0cc | |||
| a17f169e01 | |||
| 72ea3d6b98 | |||
| 17cacf258e | |||
| f7aacefcd6 | |||
| ace7ffab5f | |||
| eec63b112f | |||
| caf7bc8569 | |||
| fd437ff4c5 | |||
| fb218f8b10 | |||
| 4693080ce0 | |||
| 60ddcdf960 | |||
| 303bafb3ac | |||
| 7a0d0d9b96 | |||
| 84a9d2d072 | |||
| 1b5adf40da | |||
| 59a32aaae6 | |||
| 18106a4fc6 | |||
| fc2297a2ca | |||
| 5b7b765090 | |||
| 90769ac709 | |||
| ac9f1e9de5 | |||
| 5bf31e7a86 | |||
| dd17506078 | |||
| 5d1424f67c | |||
| 2346b0ab99 | |||
| 88dec6ef2b | |||
| e71f494839 | |||
| 22bb0414a1 | |||
| 6477bb8d77 | |||
| 70ddc0ce43 | |||
| 9986e4c6d0 | |||
| e2710161f6 | |||
| 5f11fe521d | |||
| d018b32d0b | |||
| e54b7cda3d | |||
| fc63841169 | |||
| b674c598f9 | |||
| 710230a294 | |||
| 169f7440ac | |||
| 57ec12eb6b | |||
| 2c26f77a25 | |||
| 95dc90e6b2 | |||
| 400392230b | |||
| eca66f9577 | |||
| 121bb99cc2 | |||
| cac1ef7ade | |||
| d74d79b3d8 | |||
| c6b28bc193 | |||
| 5d05574518 | |||
| bf478aeba2 | |||
| c9dfe1ad92 | |||
| 926609eb59 | |||
| e32116b9a3 | |||
| e11d5ac708 | |||
| f6c3d4cadc | |||
| 3e9d271b52 | |||
| ecc8beef3f | |||
| b9afb7bcec | |||
| b4041759f7 | |||
| c3473b5b4f | |||
| 1b9bf9c62d | |||
| ed96a6b6c0 | |||
| 4989d0c904 | |||
| 9a5bdae07f | |||
| 67016feb96 | |||
| 22bdfb7e56 | |||
| ceb2c4f3ef | |||
| d5a93a6400 | |||
| 01a2513812 | |||
| 8e7a752b2a | |||
| 999d3f1539 | |||
| a7ee51e5d8 | |||
| 0e965b6529 | |||
| a9db06f5e7 | |||
| 6827c4038b | |||
| e8a6e90a61 | |||
| ff956cb546 | |||
| 7d7e0f9800 | |||
| 3ae05a672d | |||
| d700abff0a | |||
| 5267f34e76 | |||
| d6e8290a1c | |||
| 36f66d40e5 | |||
| 5f12616cb9 | |||
| bc43efba75 | |||
| ef5f476cd6 | |||
| 98bf7710e4 | |||
| 7263af13ed | |||
| d992a809f5 | |||
| 04f8d39860 | |||
| b7bf14ab72 | |||
| e8abbe0623 | |||
| b14d59e977 | |||
| 5f12c17355 | |||
| d170d78530 | |||
| 4d9160ca9f | |||
| 8f670f31b8 | |||
| 5838345f48 | |||
| 3f1c84f65a | |||
| 83b2b8fe60 | |||
| ac24300274 | |||
| 2e657b7b12 | |||
| c063617553 | |||
| 38a4f0234d | |||
| 740a723072 | |||
| 495cf58014 | |||
| 8e98759359 | |||
| 4ae0bb83f1 | |||
| 5459d812e7 | |||
| 831c222541 | |||
| faad247d85 | |||
| 1e829ceaf3 | |||
| 79fe175440 | |||
| 9b32bfb3db | |||
| 37fea072bc | |||
| 31a603e905 | |||
| ca21c285b0 | |||
| 5a3eaa85bf | |||
| a5777683f3 | |||
| 90dd91c6cd | |||
| 8d8a8fe295 | |||
| 65e22bb76a | |||
| f83ed19dfe | |||
| 53b14bde4d | |||
| 7742a5dac2 | |||
| bddcb31fe2 | |||
| b411a89703 | |||
| e61752bd3a | |||
| 7a1d6fe509 | |||
| 4fd2743efa | |||
| 2c0eaaec3d | |||
| 3898fe3311 | |||
| 853b0e84cc | |||
| 42fe208eda | |||
| 444dc01931 | |||
| 95ce10f23b | |||
| 660fc3bb34 | |||
| c71af7f610 | |||
| ce476f2e5c | |||
| a9fc85027d | |||
| b2aa385942 | |||
| 424a7da470 | |||
| b92504bebc | |||
| e0846792d2 | |||
| b9bf60ea23 | |||
| bd27b4c162 | |||
| 28de676956 | |||
| b3cde9900c | |||
| 2155bba5b0 | |||
| a53fdc7126 | |||
| 3fc0ebdd51 | |||
| 211f416806 | |||
| b90ad587c2 | |||
| e7aecb89dd | |||
| a45f8969a0 | |||
| d3c06a3f76 | |||
| f447ee7b9d | |||
| 3e168ce2ca | |||
| c64edd2706 | |||
| 8a1f106c72 | |||
| 4ac99ffe0e | |||
| fdcf87c70c | |||
| 5aabb83f5a | |||
| bd678f9ca1 | |||
| a87890b3cc | |||
| 86594851cb | |||
| a83ccccffc | |||
| 50635e9c15 | |||
| 7d3dad3d1d | |||
| dd22e78515 | |||
| 5df1cb0566 | |||
| 423df67042 | |||
| 568d5c46ed | |||
| da25b91980 | |||
| bc0dad6c1c | |||
| 9b8aa9b75d | |||
| d5bc125617 | |||
| 4ffaabcc04 | |||
| b597a0d31c | |||
| fb32e5ca9a | |||
| cd7ab6231f | |||
| 5908fd6552 | |||
| 6d2c6caa23 | |||
| 5eb00502ec | |||
| 3f9d6759d4 | |||
| aba70207ab | |||
| a8134a49c4 | |||
| fa47f0c707 | |||
| 8501af298f | |||
| 5c7b1358d4 | |||
| 3938d8863e | |||
| 7838f9f3a3 | |||
| de3c5751db | |||
| 5ee7e03c1b | |||
| 7a405b86c9 | |||
| ffc3f33670 | |||
| 857055b797 | |||
| d15ba3939d | |||
| 1ec83e4969 | |||
| 9275760599 | |||
| d97d3ff5fc | |||
| ea6734f550 | |||
| f73751843f | |||
| dbfbc56de7 | |||
| 70c5b23089 | |||
| 2ec6ffe478 | |||
| 793205afc5 | |||
| c6b74daa0a | |||
| 23ce1fb1ba | |||
| 29188e0562 | |||
| d9773c963f | |||
| 1206b1eb96 | |||
| 93af87a9e0 | |||
| 7a6970e570 | |||
| ea584e94bd | |||
| 42b02b3a5f | |||
| 44f6a536d2 | |||
| d7b8e071dd | |||
| 3f1aa1f9e2 | |||
| 82024a65cd | |||
| f4ce08211d | |||
| 7c6ae96a09 | |||
| 80b62d50f5 | |||
| d498f4e55e | |||
| 1c1e008dcf | |||
| fe41e8bc18 | |||
| ccc6723a8e | |||
| 1e7ef46e9c | |||
| e0c8189f1a | |||
| 8bcad002df | |||
| 5c76131d3d | |||
| cabdb4ef17 | |||
| a34891851b | |||
| 05c1ef75c4 | |||
| be2f1e59f2 | |||
| 75f0a5e36a | |||
| 68107fe355 | |||
| 477beae3bb | |||
| 6689b592ff | |||
| 6b6e94da08 | |||
| fc60b554a1 | |||
| bffb0919cc | |||
| e947103b6d | |||
| 62051d5171 | |||
| 783a6b866b | |||
| 2024a6c941 | |||
| 37d5c166ca | |||
| 060897b25b | |||
| 499cc57082 | |||
| b279d19040 | |||
| cb35e84f51 | |||
| 511ffa4698 | |||
| 7a1da2409d | |||
| cbd3ffe056 | |||
| ec0aa32cd4 | |||
| 55679b4389 | |||
| c0b71f8286 | |||
| 240b66d737 | |||
| b360feb4c1 | |||
| 5fcd614186 | |||
| 4be1aa516c | |||
| 5e250403d3 | |||
| f8af9c6ad0 | |||
| 57994e4a24 | |||
| 0540995e5c | |||
| 3a0734d94c | |||
| 5b7de7705e | |||
| 7121afdd44 | |||
| 5213650fed | |||
| 8204e0e14a | |||
| e741ee2f45 | |||
| 0564e8a284 | |||
| 966e65bb66 | |||
| 896998ef3f | |||
| 4abca8614f | |||
| 7c0b159a81 | |||
| a8b4d1ac2a | |||
| b933c9d206 | |||
| f45042aa8e | |||
| 2ab8bc679f | |||
| 2571b0c4e3 | |||
| 959a81a41b | |||
| 4480b469a6 | |||
| fcfa1252a0 | |||
| e1e2d0b364 | |||
| 9815a0911b | |||
| dc5839b6bb | |||
| 4373777871 | |||
| 415d27c8bf | |||
| 5366820a2f | |||
| 5f8a27074e | |||
| 24ba9fdf6c | |||
| 824a0dd63e | |||
| c2d606d587 | |||
| 2deaece7e2 | |||
| 0d84221b2c | |||
| cdd7e55a88 | |||
| 1f5cc071f8 | |||
| 625e4c4c72 | |||
| 7850a28ec8 | |||
| 730d3a6d7c | |||
| d6a44e9990 | |||
| 3069b5cf57 | |||
| 7873e455bb | |||
| a651b73db0 | |||
| d2ce4960f1 | |||
| 1af4ca344e | |||
| fa837b2dfd | |||
| 824a71388a | |||
| 4585cffce1 | |||
| 13046709a9 | |||
| 9d221a5e19 | |||
| 77aef9ff1d | |||
| 503561f464 | |||
| ada9d408ac | |||
| 3af65b2f45 | |||
| 369e1e6f58 | |||
| fb49413a41 | |||
| 42dfde6546 | |||
| c531b4a911 | |||
| e4ed916baa | |||
| 4ec977eaba | |||
| 74f58f29f9 | |||
| f97607370a | |||
| 850492dafa | |||
| 61c89a9168 | |||
| 49af18fbd6 | |||
| 6cd22f3bca | |||
| a2e2f8a8c9 | |||
| 27e33fb15c | |||
| 55e6123db9 | |||
| c828a5dfdf | |||
| 0603359e2d | |||
| bb781764b8 | |||
| 29275c7447 | |||
| 4c1063e1c5 | |||
| d6b9587a97 | |||
| 6fbaabc1bc | |||
| a36117e12d | |||
| e5efd09ebb | |||
| ecc951609d | |||
| 063474f408 | |||
| 3dfbc348e3 | |||
| 9a4b53a212 | |||
| 03edfbe6f5 | |||
| 3d2cb25a67 | |||
| 6df14e50b2 | |||
| 008e0efeb0 | |||
| 128a66f7fe | |||
| 62406991df | |||
| d1173a69f8 | |||
| a0b0809b1c | |||
| 4c9ef6e830 | |||
| 0c96f0aa51 | |||
| ac73763726 | |||
| 5ba19d64e9 | |||
| fefbc43fb0 | |||
| a8b837c4a9 | |||
| 02ff6cca70 | |||
| ef47f68e4a | |||
| 2ef8b187fa | |||
| b0927c39fb | |||
| d0e0111f88 | |||
| 2328944987 | |||
| cb1942c242 | |||
| bf64ff215b | |||
| 68c7e68a8a | |||
| 91f70d0bd9 | |||
| 4669eb24be | |||
| debe5953a8 | |||
| 1c7877b048 | |||
| 9ca2e2c968 | |||
| f42ef0624d | |||
| 64baedb484 | |||
| 4638f99aaa | |||
| aebe5fc68c | |||
| 1ecf70dca0 | |||
| 7c485f8bb8 | |||
| 21e9608b23 | |||
| 7f1b028840 | |||
| bef83a4d2e | |||
| 8cc9e68363 | |||
| d7aada38a1 | |||
| 4f69adc8ab | |||
| 52da5b16e7 | |||
| 11d09a92d0 | |||
| c7eacd1aac | |||
| a126d535cf | |||
| 3554a803e7 | |||
| c66cecaa55 | |||
| b37954b966 | |||
| 86f90fd9ff | |||
| 4c7beb9d7b | |||
| 3618a97c20 | |||
| 03fdf5e7f8 | |||
| cae73b9a32 | |||
| e34f04380d | |||
| 6df77038a2 | |||
| 45c0a44411 | |||
| 2d869d6831 | |||
| eaa7e9b1f0 | |||
| 6e37750fbd | |||
| 8fd297f8b4 | |||
| ddf6569dc5 | |||
| 97895ec41a | |||
| 6d56d5c1f6 | |||
| 6c2fa8defc | |||
| c9f1e18df1 | |||
| 740fad06c1 | |||
| 0665268578 | |||
| c8b9bdebfe | |||
| a587f0d3f1 | |||
| 8c51d06222 | |||
| b32a7713e0 | |||
| 831c5a93af | |||
| 1a8dcae10e | |||
| 8219f9e090 | |||
| 5ddb601e43 | |||
| 5541248264 | |||
| b3cb97f0ad | |||
| e75c33a561 | |||
| 483ead55d5 | |||
| d63a5a1c3c | |||
| e0a3307563 | |||
| 7f3282ec04 | |||
| b773ebdab1 | |||
| 1583283635 | |||
| c87f710d58 | |||
| 1568c5cae9 | |||
| a03919c3b3 | |||
| 7411bcf167 | |||
| d96f5ba1ca | |||
| d6de96c4b4 | |||
| ffd2f61dd9 | |||
| 54b9e1f6d1 | |||
| 2721cb8dee | |||
| 41bea4cafa | |||
| 6f222b49f2 | |||
| 8dfe8c773a | |||
| cf645c3ba1 | |||
| e896d1e9d7 | |||
| 6dba68f62d | |||
| 3d083b758f | |||
| aa5b2db10a | |||
| b73faae0d0 | |||
| 4788e1c8c8 | |||
| bf16de50fe | |||
| 7e611ffbf3 | |||
| 65162a87b6 | |||
| 445497cf89 | |||
| fa1af8e47b | |||
| 624331472a | |||
| 72b7f8a949 | |||
| 88c9834ef2 | |||
| d882348f39 | |||
| b6ad7a1e06 | |||
| 6f7625fa47 | |||
| de7bc22649 | |||
| 52857dc0a6 | |||
| 032dd93b2f | |||
| 5b18e851d2 | |||
| f01602b570 | |||
| 0123498452 | |||
| f55e06d8bf | |||
| b613b11422 | |||
| 8efae1cba2 | |||
| bf55b1910f | |||
| 71b4480c4a | |||
| b6b1057a18 | |||
| 5b98acde2f | |||
| aad6f340b3 | |||
| a1104ab97e | |||
| 1ab81b4972 | |||
| 06b66216d7 | |||
| cd3eaed335 | |||
| 9d80d7def7 | |||
| 84ac5ccc8f | |||
| 5dfd7abb2b | |||
| 24af4b9313 | |||
| 6613b8f2e0 | |||
| 08c486452f | |||
| a45ac6ab98 | |||
| 80a322aaa2 | |||
| 82f7875a52 | |||
| 4637ddaa7f | |||
| 8d2269f762 | |||
| 5f03e66489 | |||
| a9c1f1a041 | |||
| 49cee773c5 | |||
| c78828ab7c | |||
| e90d3c29ab | |||
| 153807f243 | |||
| 5db0b56c5b | |||
| 404db1ae5b | |||
| 02c4b1af71 | |||
| aa11659062 | |||
| d4985fb3aa | |||
| 8815511ccb | |||
| 40fb4d16ef | |||
| c69f5b07ba | |||
| 56c90e212a | |||
| 0f14873255 | |||
| 0bb7569d46 | |||
| ec57922bb6 | |||
| 781d294f49 | |||
| f515af2232 | |||
| fe8191b899 | |||
| 4d2cd6703b | |||
| 292220c596 | |||
| 53f37a6704 | |||
| 75c1a82556 | |||
| c5b3777d93 | |||
| 678bbf8fe8 | |||
| 342607f4a4 | |||
| 5f4cdd66fa | |||
| 91942e37ff | |||
| 60913970dc | |||
| 82c42b9ec5 | |||
| 2a3d8c25bc | |||
| cee0c51dbb | |||
| fdbbdb706f | |||
| f6dfe23cf8 | |||
| ffd4bf8bf0 | |||
| bb3002b173 | |||
| d4dc54447a | |||
| d109881410 | |||
| d1605952b0 | |||
| 2cf1187b32 | |||
| 178730266d | |||
| dabfd74622 | |||
| 5da0182800 | |||
| ed37439ef7 | |||
| af92f19291 | |||
| 86f7f245e4 | |||
| 2d690801d1 | |||
| fede54be77 | |||
| 85ff82a694 | |||
| c8df92d0eb | |||
| 144d30d7ef | |||
| 4313d92e6b | |||
| 0695543f63 | |||
| 0bec6a037c | |||
| 3ff9a1f24a | |||
| a771eea4f6 | |||
| 61a0ca9e0d | |||
| 551b33c8e5 | |||
| fa34b9aed6 | |||
| bbb609179f | |||
| a27d4d58ec | |||
| 50d92f0fd4 | |||
| a15791e788 | |||
| 954580a4af | |||
| ab7d79275e | |||
| d3658166fb | |||
| 54b72bdd0a | |||
| d28446301f | |||
| 9050f92e5b | |||
| feefeb44d7 | |||
| d542b15cc0 | |||
| 2d7954c7da | |||
| b1918dae5e | |||
| 031a0b576d | |||
| 0cef25ef8c | |||
| cdb08be951 | |||
| 900fd82a92 | |||
| 44f963f281 | |||
| 01858e1caf | |||
| 2060db8e11 | |||
| 9ded063417 | |||
| d72da2777c | |||
| 89aede80cc | |||
| e0d3cd91c6 | |||
| 1a054ac1f4 | |||
| 3230f4a0ec | |||
| dadca0f91a | |||
| d489b8b3e0 | |||
| bd0992275c | |||
| 3e7597f2bd | |||
| 0e71f6db84 | |||
| f6b9982c23 | |||
| fb113a9479 | |||
| 15791510c8 | |||
| 0f72a8e89d | |||
| 14af87527f | |||
| 83e84865be | |||
| c2a3c5a748 | |||
| 83494cb4f5 | |||
| 0bc19c3fbf | |||
| 571415d1a4 | |||
| 7b2cf8215f | |||
| fee4d3f6ca | |||
| 161cc0cda9 | |||
| 71bff9fcf3 | |||
| 80d14c9b22 | |||
| c5bdf08558 | |||
| 596f160a1e | |||
| d8b6c053a2 | |||
| 4b262cae58 | |||
| 1a5116cba0 | |||
| 01581dd35f | |||
| 7fdd964379 | |||
| 0cfcc97e9d | |||
| 8986be0aab | |||
| f76bbbf5e6 | |||
| fe217da05c | |||
| 80aa7c4019 | |||
| 6f33351eb3 | |||
| 35f13c7327 | |||
| a8b9e01b3e | |||
| 7193e189f3 | |||
| 3f2a806abe | |||
| 5e4907e940 | |||
| bf63c5d1e3 | |||
| 78989e9049 | |||
| 1510bdbcf6 | |||
| 024d688b77 | |||
| ef82a29e23 | |||
| 1f56a20b62 | |||
| 0c2a62f847 | |||
| ea748b50f2 | |||
| 62bfc4dba6 | |||
| ceb2b150ff | |||
| dc015c380a | |||
| c9e0f0bf20 | |||
| bd6d4d0553 | |||
| f0273f00e1 | |||
| 962cdbbebd | |||
| 2c51e3a327 | |||
| 8e311cc45c | |||
| c441bea4d1 | |||
| ad30668eb6 | |||
| 62f4801523 | |||
| ec1408346e | |||
| 0e0a703496 | |||
| 54b693d5b1 | |||
| 1262277714 | |||
| 3a67fc6c5a | |||
| 26abbe8e5b | |||
| 5d0914daea | |||
| 7541a492b7 | |||
| 3a071b8db9 | |||
| 9342b4b951 | |||
| 4682e0ac7c | |||
| 7cfebffbb8 | |||
| 693fe912f2 | |||
| bc3a8e0ca2 | |||
| e38334cfd2 | |||
| 92cab33b73 | |||
| 3f467613fc | |||
| 205d33a813 | |||
| da326baa5e | |||
| d9198b5646 | |||
| 60001a62c4 | |||
| ee7d5e7206 | |||
| 2726fb3d5d | |||
| d7aa4076c9 | |||
| 122ce41020 | |||
| e7afee1176 | |||
| 88730906ec | |||
| a15080a1d7 | |||
| 35431bce0d | |||
| 7b7576ad55 | |||
| 162faee4f2 | |||
| b7ff98d7ff | |||
| 0474f0c906 | |||
| 430e100142 | |||
| 1473083a41 | |||
| 7cda73f192 | |||
| 7c2bb31a55 | |||
| ba82023445 | |||
| 13be84e4d4 | |||
| 7ae728a9a3 | |||
| a7743a4f47 | |||
| 103ff28530 | |||
| 8dfdb37de3 | |||
| 17fd773a30 | |||
| 979422cdc6 | |||
| 3be756eaed | |||
| 1ba3d3acd6 | |||
| 23cedc3f1c | |||
| 741c548f3c | |||
| 556f4ad5df | |||
| 561a61e7fe | |||
| 47919983bf | |||
| efc136cce5 | |||
| b035c02f78 | |||
| 2da63654e5 | |||
| 3ace01cfb3 | |||
| e3d7c7c6f9 | |||
| 8807d880dc | |||
| 70d6ab0bf5 | |||
| e42848f4b7 | |||
| 25386af41a | |||
| f29685f8a1 | |||
| ad13011043 | |||
| df69ad9f0e | |||
| 9864b35465 | |||
| 6025002971 | |||
| 0c38a8fdd4 | |||
| fb75bd9790 | |||
| 399d7cd596 | |||
| 0a7ab9a47d | |||
| 9618f86980 | |||
| a71fc18530 | |||
| 3ac8a2871e | |||
| a24717765e | |||
| a40073afa4 | |||
| e6b117e33f | |||
| 3e6a6bf396 | |||
| 931e6f1625 | |||
| 4ce47284dc | |||
| f5dcc6092b | |||
| fef4e09dfc | |||
| 60ef7ba855 | |||
| 6f968bafb2 | |||
| 9f6aab11d4 | |||
| 0006c6f0fd | |||
| 2c427e04be | |||
| f53454f81d | |||
| 784b11ce19 | |||
| 715eb8fa32 | |||
| a02118d5bc | |||
| 85fc0fdb51 | |||
| f7af8c7cc7 | |||
| 0c99a3d0c5 | |||
| 66dfb5c89a | |||
| 6435b4eb44 | |||
| 4e7b6aec3a | |||
| 6c25d7bed3 | |||
| 028fd52c9b | |||
| 9a715f6b68 | |||
| 8c32f8c77d | |||
| b7778de224 | |||
| c70d69322b | |||
| e35e251863 | |||
| eae53e11e6 | |||
| 4f5f27cf2b | |||
| 5e42e90abc | |||
| a10b207de2 | |||
| e2d214e030 | |||
| 4f64a5d36d | |||
| 0d4753785f | |||
| 2e9084f369 | |||
| 0f90e6df75 | |||
| 53146ad685 | |||
| 0223fc6fd5 | |||
| 218380ba43 | |||
| afd23f7ad8 | |||
| 6991a243aa | |||
| 1f944c6eeb | |||
| 31f9977411 | |||
| 3d27d15f00 | |||
| ab6499e5b7 | |||
| 4ff4859036 | |||
| 53cf756207 | |||
| 0087afc2e3 | |||
| bd07e1d2fd | |||
| 8b06105fa1 | |||
| 68dc6d5bc3 | |||
| acd72e3ab2 | |||
| bbb6fcc4f0 | |||
| fbf31b5d52 | |||
| a0c689c273 | |||
| bfd905602f | |||
| a0a67873aa | |||
| 6cd8ab0cbc | |||
| 5350b1d938 | |||
| baaa3f7f42 | |||
| 4d4af00399 | |||
| 3a33062405 | |||
| 7d4a0a417a | |||
| 5a729a69cd | |||
| dbc1ae45de | |||
| 9e6b755f62 | |||
| a2fafee53a | |||
| c7df6783df | |||
| fcb6921b57 | |||
| 135dcfa3e5 | |||
| acfab01dcf | |||
| 6fdbc7dbf3 | |||
| d1a6702aa4 | |||
| 28944ef6c1 | |||
| 6e7f5fae09 | |||
| ed85d8281a | |||
| f3d3a3a5db | |||
| c89697c49c | |||
| 9414143b5f | |||
| d07b2b9915 | |||
| 04131f86df | |||
| 2d89b7d0a9 | |||
| 603a89055c | |||
| 3f9720bca0 | |||
| 7619850855 | |||
| 3571292fbf | |||
| 8f16165f92 | |||
| 6ff7fd80a1 | |||
| 5aa373dc04 | |||
| 32dc963556 | |||
| 8f5d8397f9 | |||
| 681ec6f845 | |||
| d2ccd8ba53 | |||
| 7f67cb93ec | |||
| d29b32fce2 | |||
| 101db126c8 | |||
| ba79088ffc | |||
| 3a27166c2e | |||
| 429e85f5d6 | |||
| b5d472fad7 | |||
| 52383d0161 | |||
| 48d2febebf | |||
| ca085034de | |||
| f6c12b10ac | |||
| 5b77ef01d4 | |||
| 5d85fad522 | |||
| 2fe2e350ce | |||
| 986fd5bfc6 | |||
| f104b930cf | |||
| 4423710a13 | |||
| 9381c08c43 | |||
| 0f59d76997 | |||
| b3743a9ae5 | |||
| 13d061911b | |||
| 935e72d449 | |||
| 8b55bd5828 | |||
| a12ddc47e7 | |||
| 57ce8449b0 | |||
| 67b9fdaad7 | |||
| f9cf418f0f | |||
| dfa7fe1289 | |||
| d2471cf6f9 | |||
| a68df696ec | |||
| 4b93df5a30 | |||
| 12dd3c0277 | |||
| ccb6ddd840 | |||
| c48584fbb1 | |||
| f2cb1fb09f | |||
| ac60182c91 | |||
| 700d37be8d | |||
| 8b5761efb2 | |||
| ef4d85f5c0 | |||
| 5b32f2e0dd | |||
| 4cbeb6815b | |||
| 2c188a45c8 | |||
| d338f69837 | |||
| 7ebad74372 | |||
| e2a13a9945 | |||
| c6b0dc6a29 | |||
| f667ef98cb | |||
| 425174e82f | |||
| 7201b56a6d | |||
| 34cab0e0b7 | |||
| 4dfa8eedb8 | |||
| 633808de06 | |||
| f4591f97aa | |||
| 07511dfaf4 | |||
| 7944ce0594 | |||
| ad682c394d | |||
| 7210613551 | |||
| 83acb53c08 | |||
| a7162240e6 | |||
| 12095f8cd6 | |||
| 925f0d2e09 | |||
| b6d206e095 | |||
| 5542ee4d0d | |||
| 4ffa706e4f | |||
| 169cde6c3c | |||
| 34a9dbe826 | |||
| 8e23e24bd5 | |||
| f288d367ac | |||
| 5e2fa13126 | |||
| 1571a8afd4 | |||
| 67a2f14cef | |||
| a0d5b61c2a | |||
| d7bb422a5c | |||
| 40c6f3c724 | |||
| df8f8c9a2c | |||
| 536c43257b | |||
| 4e8f6b3603 | |||
| 80c94f02e9 | |||
| aad02113c6 | |||
| 72c75b75cf | |||
| ffa992acf7 | |||
| 99b78dd198 | |||
| 7f81a86e9e | |||
| 4c4f6e362f | |||
| 1a302ca957 | |||
| 11f9d2f124 | |||
| a93bc83c8d | |||
| 3516989738 | |||
| 26991443ed | |||
| eece50acec | |||
| 28d4e5b045 | |||
| c110888aee | |||
| c53875ce8c | |||
| 7f18c06b0a | |||
| 96dcf0fe8a | |||
| 0c22e4e3d1 | |||
| bd3ed89516 | |||
| 1c043b8426 | |||
| 23ed15d19f | |||
| 312d905c9b | |||
| cba9319cc7 | |||
| d839f1ada7 | |||
| 6da14c2d48 | |||
| a34285196b | |||
| e4587b2151 | |||
| ea30174057 | |||
| dd676866aa | |||
| f0d10553b4 | |||
| ef616c604a | |||
| 2288efbf48 | |||
| f656e1bae2 | |||
| 5a7fc8cd8c | |||
| 141e4e0276 | |||
| 20d3e1d297 | |||
| 79715345ef | |||
| dff3f41ef6 | |||
| 5e634a59a2 | |||
| 26e46d365c | |||
| bcd7c8e921 | |||
| 70283f5b9f | |||
| 2e941bb91c | |||
| 541bf1db5a | |||
| 048bc4c06e | |||
| 4d0a6cc382 | |||
| 6feea0d75b | |||
| f97a51ce24 | |||
| df530b53e5 | |||
| 6aa02f8c63 | |||
| 7ab04e17e7 | |||
| bf3f1027c8 | |||
| 62cc4077bb | |||
| e683461416 | |||
| 33dab4fe54 | |||
| 8166a8caf5 | |||
| 44801df8f8 | |||
| 56af1a0adf | |||
| f8617db012 | |||
| 2ab9af3b38 | |||
| 24a89f7753 | |||
| cc4785f094 | |||
| 093f902335 | |||
| 104c797dd0 | |||
| a9cd6df97e | |||
| f31142e758 | |||
| 9ae88ede12 | |||
| 792f908afb | |||
| 29e3c3061c | |||
| 14367ddc09 | |||
| 8157fccf6d | |||
| cbf7f21ade | |||
| 9c4f3be0f3 | |||
| f6e8e120a1 | |||
| 08f922d8c9 | |||
| e9d6a43907 | |||
| feb4576ee7 | |||
| 56b43f62d1 | |||
| 4b410494b3 | |||
| 13f5867a16 | |||
| df9bd36cab | |||
| 77c071e26f | |||
| af76381b98 | |||
| 35d0534eb9 | |||
| 4be12b29b9 | |||
| dd64e65ea0 | |||
| c23aa50bea | |||
| 8eb0d0fddd | |||
| 8904745129 | |||
| 936ac8826d | |||
| 545d3c5a93 | |||
| 3c371a6cb0 | |||
| 9ce5cea911 | |||
| 98d9837fbc | |||
| 53a89bbbc7 | |||
| 0a744a73b3 | |||
| 0675c5f716 | |||
| 72963d1f13 | |||
| 028261f760 | |||
| a98284b1ef | |||
| daa31b2cb3 | |||
| b414ea41d6 | |||
| f78d0082ae | |||
| 3e18d32ce5 | |||
| 94d68b6a08 | |||
| c9ff0e3961 | |||
| 8dd68e2034 | |||
| 2cd662c43b | |||
| 4945184f8c | |||
| cb01bf2986 | |||
| f43e27814c | |||
| 20268708cc | |||
| c8da4a1b7e | |||
| 829472a1d7 | |||
| e23461c837 | |||
| 21f6caacd4 | |||
| 082c46a903 | |||
| 6a3bef8378 | |||
| b6c3010f02 | |||
| 90d2c01218 | |||
| 83af50368f | |||
| cf258b7a67 | |||
| 5d77dc4f58 | |||
| e4542215cc | |||
| 3d3677e912 | |||
| 427f48be6b | |||
| c6996a48a4 | |||
| 6b50bb0fe6 | |||
| 80b3871c55 | |||
| 4839523e53 | |||
| ecb9c311b5 | |||
| bd97ce9489 | |||
| 79cb23e8ac | |||
| c5ac004f15 | |||
| 5fbfa0f2c8 | |||
| 78a339a794 | |||
| f904df4b63 | |||
| 5e4ac11df3 | |||
| 16b4f560cd | |||
| 75e6576c67 | |||
| 0b4c26578e | |||
| ebcc07e3e9 | |||
| 55c2b61921 | |||
| ca696fe94c | |||
| 585444c50c | |||
| 9815aab7a3 | |||
| 349ec0db77 | |||
| a876baf0a9 | |||
| 91fd8521c3 | |||
| 4ec9a87e46 | |||
| fb5e3662d5 | |||
| 31efe10c75 | |||
| 72bc9d5f2b | |||
| 600f13436d | |||
| b347a2f839 | |||
| 47b5bd7243 | |||
| d4c55748f1 | |||
| 0625db0bf5 | |||
| 05141ede16 | |||
| c112188207 | |||
| 5af2df0cd5 | |||
| f324374b95 | |||
| 2aad128883 | |||
| 3c78fdec1c | |||
| 6fe9aa69cc | |||
| e4bb943fe5 | |||
| 0fb741f269 | |||
| 4c85393a1d | |||
| d5c2680fde | |||
| 49729647ea | |||
| 85a883e281 | |||
| 8123a00e97 | |||
| 0f6a064c08 | |||
| 2bc0632d0d | |||
| 75445a0c66 | |||
| 6a9d202414 | |||
| ad7552ea8d | |||
| c0ada940bd | |||
| 1690788827 | |||
| 7c55c39085 | |||
| f17d4fe412 | |||
| f019bc4bd7 | |||
| cfc408095c | |||
| 6b5fac3004 | |||
| 0569c547ee | |||
| 06fc1bce9e | |||
| 093b8ca475 | |||
| 5fcc2caeed | |||
| f30a51e673 | |||
| 642723d09e | |||
| 155e708540 | |||
| d726473c6d | |||
| e80412df23 | |||
| 66765acf00 | |||
| 7208ea1da9 | |||
| 5e2f3ec6f0 | |||
| cd7fa8027a | |||
| 617847e3c0 | |||
| 71a7211411 | |||
| dc7335cdf8 | |||
| a7c1e4c7ae | |||
| 87594008f8 | |||
| 5e6fc58db3 | |||
| 87d583f454 | |||
| a67831773f | |||
| 5b89b6fe2d | |||
| a6350daa02 | |||
| dfb6f4fec6 | |||
| f38034e455 | |||
| c57b3931d5 | |||
| f73a3a58ae | |||
| 1e0e573165 | |||
| 27e08a8e2e | |||
| 49ef9ef225 | |||
| c013086e64 | |||
| 48f872a68c | |||
| 4f9f175f25 | |||
| 47e5dc218a | |||
| 90372932fe | |||
| 0bb2b285da | |||
| 3da854fe40 | |||
| 57729823a0 | |||
| 9e168f9d1c | |||
| ea45496a74 | |||
| a5fcd91ba5 | |||
| 2ba05b041f | |||
| 8e49146a35 | |||
| dad3fd2dc1 | |||
| 284ef52bba | |||
| e493ce9981 | |||
| 7b45a5d452 | |||
| 4a026fa352 | |||
| dc847ba145 | |||
| c0ec40e483 | |||
| 929c22a4e8 | |||
| ba181197c2 | |||
| 218930c897 | |||
| c8f5dfcf17 | |||
| 27c8deb4ec | |||
| 4ae4895ebe | |||
| afe95fa780 | |||
| 166a40c66e | |||
| 588615b20e | |||
| d5dca46854 | |||
| 23e5eeec00 | |||
| 287b42997d | |||
| 5236cb1888 | |||
| 3b5b548af3 | |||
| 4782fb50c4 | |||
| f55876bcc5 | |||
| 8a80af39c9 | |||
| 35f4a264d6 | |||
| 6c798cbdaf | |||
| 279f1c986f | |||
| 443e96777b | |||
| 65bc4e0fc0 | |||
| a6dbd26f75 | |||
| f3f052ba36 | |||
| 1bc90b992b | |||
| fc37887a21 | |||
| 984658f5e9 | |||
| 4ed1476531 | |||
| ca69e1a2f5 | |||
| 20f73cb756 | |||
| 4e2fba404d | |||
| 7943f7f697 | |||
| 7c397f5722 | |||
| 06fcc0c650 | |||
| 0de224b153 | |||
| ed9e692263 | |||
| cc0c826f36 | |||
| 0099ef6896 | |||
| 55d7374ab7 | |||
| 988aa4b5da | |||
| c5d06e7943 | |||
| 23e8043160 | |||
| d66d7146a3 | |||
| eabfd84ceb | |||
| d320d1468d | |||
| b47fa27a35 | |||
| 68ad9a91b2 | |||
| c17a4165c1 | |||
| 96c171805a | |||
| 9a536979ab | |||
| 46a5294d94 | |||
| ec181649ae | |||
| 4fdcb30ff8 | |||
| 07add06c59 | |||
| a7b33b55e8 | |||
| 0cbbaf3f68 | |||
| c564f32ab6 | |||
| 7c2c949f01 | |||
| 066168da52 | |||
| 1df71ec64d | |||
| a9ee52f2d7 | |||
| 7b225a5ab0 | |||
| d7a6f25c63 | |||
| f46792334c | |||
| ee3936916f | |||
| 109de52fe2 | |||
| 10dd0f3fa0 | |||
| 2f064c68bc | |||
| 079583eaa4 | |||
| 0e82072323 | |||
| 678ad6b7eb | |||
| 63e34e5227 | |||
| c606295ea6 | |||
| 27d72e30ad | |||
| 5660878f7b | |||
| 12e55b2cac | |||
| 97e094dfd8 | |||
| 9622fbb62f | |||
| cc8dc6d35e | |||
| 215661ef91 | |||
| 5a3e09518c | |||
| ebba124c5c | |||
| a62325ac87 | |||
| 1d2ab2126c | |||
| b07dea836c | |||
| f9d00e0498 | |||
| 757ceda063 | |||
| d27e3ab99d | |||
| ce930f19b9 | |||
| 3b14939d66 | |||
| 279caf033c | |||
| eff280f3e7 | |||
| 7c70eb87bc | |||
| 6ef401a9f0 | |||
| b29a36f461 | |||
| 17f22347ae | |||
| 22aaf8960b | |||
| 0046ef7707 | |||
| 68b1d063f7 | |||
| 5e6c3001bd | |||
| 7ed4e963aa | |||
| 001d868cbd | |||
| 6610b4cee5 | |||
| cbbe28f40d | |||
| 603187393a | |||
| 411e938e3b | |||
| 610da4f662 | |||
| 3ec80f9dda | |||
| 91c5818236 | |||
| c436454cd4 | |||
| a877d4831d | |||
| d522308a29 | |||
| 85744b72e5 | |||
| f0b7051e1a | |||
| 3b23d6764f | |||
| 9b7c74a5d9 | |||
| 4d105d7bd7 | |||
| eee779a923 | |||
| ab847c81fa | |||
| b217ee414f | |||
| 23dc6edb99 | |||
| 79df8825c8 | |||
| 71c50b7e20 | |||
| af98fd29bf | |||
| cddea83e65 | |||
| 9f16739518 | |||
| 3f0da88ff7 | |||
| cc63af8e72 | |||
| bf2268b0af | |||
| 00b4cc3cd4 | |||
| f546db5437 | |||
| f8aaa57f31 | |||
| cabcf94be3 | |||
| 2d6624cf9e | |||
| 02982df0d4 | |||
| 421a24c38d | |||
| d7f75d17cc | |||
| 5d9ad430af | |||
| 46eca01fa3 | |||
| 4d9c22bfc6 | |||
| 52e59cf4df | |||
| 688b8fe114 | |||
| aecdfa2d5c | |||
| cb8feb732f | |||
| c490bdfbf9 | |||
| e7494d632c | |||
| e3006f98c9 | |||
| b34baf1e3a | |||
| 372dc7ac1a | |||
| 66a62e6c13 | |||
| 04c0a9ad45 | |||
| 0944ca9d91 | |||
| d468f8b75c | |||
| 6e256507d3 | |||
| a33ce09e6e | |||
| 9f973bb703 | |||
| 6d0a605c5f | |||
| a948bf6ee8 | |||
| b8999e367a | |||
| 59ad091e69 | |||
| 598e030a7e | |||
| 774a17cedf | |||
| d889e1b233 | |||
| 32d85fb896 | |||
| af308b99a3 | |||
| 49d9c60a53 | |||
| ed83df972f | |||
| 3124728e03 | |||
| af469ea5bd | |||
| 2a27568537 | |||
| 1d3e96ffa6 | |||
| b7b1396c51 | |||
| 71bcf75d9a | |||
| 850c2273ee | |||
| 78d41a27cc | |||
| 0f8625cac2 | |||
| cb09dbef66 | |||
| 5692f9b33b | |||
| fdfbbde10d | |||
| a27462d58b | |||
| 91da622df5 | |||
| 373b5047fd | |||
| 36610b6acf | |||
| eab0ac3a13 | |||
| f637ae4794 | |||
| ffb07eb24b | |||
| f101fcd0e7 | |||
| fc0f75d13b | |||
| 1e045a0187 | |||
| cdf64d4ee2 | |||
| 8fd75e6965 | |||
| 0b8faade6f | |||
| d56cedfc67 | |||
| 906857b28a | |||
| 9513155fa4 | |||
| a6356be348 | |||
| f33ef92f0c | |||
| d435230059 | |||
| 6d0cea5fe6 | |||
| 2996358cf2 | |||
| 0bf4817474 | |||
| 8e5569f773 | |||
| d30c13891b | |||
| a2c260fba0 | |||
| 017d2c804b | |||
| b5efc79bc5 | |||
| e2037cf22b | |||
| 68ac433218 | |||
| b7d23408ad | |||
| 488e3c3d56 | |||
| dd5f3873da | |||
| 73ce945d40 | |||
| d37ee498cd | |||
| b3d6726f65 | |||
| f9e4b4e74c | |||
| 2b080b5cfc | |||
| e8b8f6c6dd | |||
| f0ea540b34 | |||
| 2a13ef9ae0 | |||
| 91e6ef8655 | |||
| 2119d59da8 | |||
| 3ccad33194 | |||
| bafc8a0bde | |||
| 92c56fdf2b | |||
| dcb72e0067 | |||
| 2e718b85e9 | |||
| 17d2f0bb0d | |||
| 0dfdb61ee9 | |||
| 8d9a459083 | |||
| 89a7c70730 | |||
| e1a72e0e2b | |||
| 4c0a31d38b | |||
| 8fa6cb5e03 | |||
| 4e2de638af | |||
| 31a061ebaa | |||
| f7234c93af | |||
| b7d5849191 | |||
| af9448e6f2 | |||
| d0fe56a98e | |||
| b8926ea267 | |||
| 43335b5c87 | |||
| af6e3869ff | |||
| 964f0e1400 | |||
| b2e2298822 | |||
| 87ee3e627f | |||
| 45a3ea6fed | |||
| 7c9e88dfb3 | |||
| 2a0f03a511 | |||
| ec1d3ddee2 | |||
| cdc2a6f637 | |||
| 023dba9475 | |||
| f8d97be932 | |||
| 0c352eef2d | |||
| 877a2c144b | |||
| f7900f298f | |||
| 1e28a8c033 | |||
| ba67206bb9 | |||
| 41ceb6a4eb | |||
| 13fcd7a901 | |||
| 756d9a4bc2 | |||
| 4a031de0d9 | |||
| 54b8d98cde | |||
| f220d294e0 | |||
| 8294e97113 | |||
| 47a5d4527b | |||
| dcec9d7bb7 | |||
| ea29007bc0 | |||
| 3a626cd251 | |||
| e9ce0b10de | |||
| c5d64baba4 | |||
| 29ca6815ae | |||
| 5217f7cf69 | |||
| 57063095c1 | |||
| 48757e581e | |||
| e8ad0339a3 | |||
| 3bbd75f1f2 | |||
| f67b164b0d | |||
| b05cc3a1e4 | |||
| 8890978ad3 | |||
| 9a5c423d59 | |||
| 6a09409ec9 | |||
| 27f0ae8416 | |||
| 91d38a535f | |||
| 95c882934e | |||
| e88f5607ac | |||
| 5d4d65a85b | |||
| 92ddb410cd | |||
| 1336b844fd | |||
| 26b6fd2236 | |||
| ff0f02d809 | |||
| b04715d48c | |||
| da68ea6812 | |||
| 7e3f194031 | |||
| 65d34ebb96 | |||
| 142dc0afd7 | |||
| 39c14ec7c1 | |||
| 0d20df9a51 | |||
| 3db110c0b9 | |||
| 23fa3dedc4 | |||
| e4259a8f13 | |||
| 51d34f5936 | |||
| a51ec2094f | |||
| 940c2faea1 | |||
| aed56b1a8f | |||
| a88aa20824 | |||
| 2328ed8ffa | |||
| 0105129fa8 | |||
| b78faa461f | |||
| b1db581ebe | |||
| e05183c7d2 | |||
| c923684edd | |||
| 9d5a89eab6 | |||
| bdf3ea4369 | |||
| 4c37847ea4 | |||
| a3bd5eba02 | |||
| bb33ffc332 | |||
| 3cc6093e4b | |||
| d160d1ed02 | |||
| a651e7e2da | |||
| e785cbb81d | |||
| 2b0c779173 | |||
| a965d1ac98 | |||
| 0e3113b7ce | |||
| fad36d0cfd | |||
| 7d5ebbb611 | |||
| 85eee0dfbb | |||
| 369a395ee9 | |||
| 4e3d76a1d1 | |||
| 7450b9acf3 | |||
| c7d378555a | |||
| 5f0ce5811a | |||
| 9b7fdadce4 | |||
| 132f5fb3de | |||
| 3828d4cd22 | |||
| c7641be093 | |||
| 8266842809 | |||
| d7213b12cc | |||
| c163521b9e | |||
| 7305713b97 | |||
| edffa5666d | |||
| 54756cd3b2 | |||
| b73ec87afc | |||
| 61f4f08744 | |||
| 07387e9586 | |||
| 147a39b984 | |||
| 7a758a35fe | |||
| f146bebe5a | |||
| be3512aa57 | |||
| cc4a4ec796 | |||
| a1d8c86ee3 | |||
| 61ebcd8adb | |||
| 24282236f0 | |||
| 5a99aeb864 | |||
| e95f8fa3dc | |||
| 9a64aa76c1 | |||
| 42029791e4 | |||
| 4f60fe7bc6 | |||
| baf5490504 | |||
| 013bffc161 | |||
| c03e6ee41b | |||
| d94279ae75 | |||
| 3a423e8ce7 | |||
| 37c87164dc | |||
| 4b54843ed7 | |||
| ef55d0da78 | |||
| 9961cdd7c8 | |||
| 2e842333b1 | |||
| 6ccde0452a | |||
| 795714bc2f | |||
| d9bee03ff6 | |||
| 4f0488abb5 | |||
| 12c815c597 | |||
| d098bdc59b | |||
| ba5f8afaa8 | |||
| 918ebe1620 | |||
| 6be0027853 | |||
| bc757f1ddc | |||
| 8da035aac6 | |||
| ef6034abfd | |||
| 0391282b5e | |||
| 28554350de | |||
| 8d1386df0f | |||
| e7752e8135 | |||
| 43c19007e0 | |||
| c6b791d070 | |||
| 8bcc5a36bb | |||
| cdb6c801c1 | |||
| 511ead4b8d | |||
| 4080f7b8ad | |||
| 9ed21737d5 | |||
| 337bad8525 | |||
| 0f35d07052 | |||
| 7f44e88eda | |||
| b7ff765d8d | |||
| c28d709d7f | |||
| d7fbae286a | |||
| 0633aae7dc | |||
| f87f11e92c | |||
| 2b04388361 | |||
| 3c0f21d174 | |||
| 8e2f8ffb9e | |||
| e68d1b88de | |||
| ed53ef29f4 | |||
| 4289f17be2 | |||
| 54e02b8147 | |||
| 7f98c2ea3f | |||
| 7189a4c379 | |||
| 415022aa14 | |||
| edf2047f04 | |||
| b85ae146a7 | |||
| 5ec7d85629 | |||
| f13af5a811 | |||
| f976740b57 | |||
| e8afc416dd | |||
| 0cccf9c67d | |||
| cdc08a434f | |||
| 3f18369ad2 | |||
| db976a1f74 | |||
| e61f5d029a | |||
| eaca892c4e | |||
| 015c26d303 | |||
| 8210637bc5 | |||
| 790543131a | |||
| a40f68cf94 | |||
| adc948e87c | |||
| 742b08e1d5 | |||
| 79e8489942 | |||
| d6fa130cb5 | |||
| 0c92f81efc | |||
| 11fd4a5dcc | |||
| b399e8a359 | |||
| e04fc9b304 | |||
| ea69dc2a7e | |||
| ecc7f130b4 | |||
| 95443bd551 | |||
| 0ce97e6315 | |||
| 25b0a97851 | |||
| 28997772a5 | |||
| b7c72f7a97 | |||
| 9f7b38c068 | |||
| 3b36ba797f | |||
| 4d2e6c3391 | |||
| 3520d35f38 | |||
| 5f104bab57 | |||
| 2050a8b8f0 | |||
| e3544c6ef7 | |||
| 472b976946 | |||
| f62f71a81a | |||
| f426e1b3bd | |||
| 5f870ac950 | |||
| 415816cf35 | |||
| 9103112555 | |||
| 5986841e27 | |||
| 2573b138bf | |||
| 308ce66af5 | |||
| bdad993901 | |||
| 3b62ab564a | |||
| d319d9fc5e | |||
| ea5c8a72e2 | |||
| 3b60c28b3a | |||
| ea0219a5d5 | |||
| 481e7bc6b9 | |||
| 1ccba85c91 | |||
| 2539e56514 | |||
| 3929d289e0 | |||
| 52585aea74 | |||
| 73dee84cab | |||
| efecdccf35 | |||
| da5f2e168a | |||
| 5cdb95be1f | |||
| 7fa735a43b | |||
| 3579fd1b09 | |||
| 237b8fe3d9 | |||
| 02e4de5166 | |||
| 64c8093c1e | |||
| 0797f9bc05 | |||
| 602c4e51ec | |||
| 9f8ca75a81 | |||
| 80a87f36ea | |||
| 63addc9258 | |||
| f32b440c4a | |||
| 6b6afb7708 | |||
| a4041cb40b | |||
| 7749b71fff | |||
| 3006124e6d | |||
| 3d276f4a7f | |||
| b20d173324 | |||
| f44d1e62d2 | |||
| 21ac2afb3a | |||
| f7dd327bc2 | |||
| 09298a32e7 | |||
| 37f292ea91 | |||
| d1dbbc1e33 | |||
| 52ec152dd3 | |||
| c7bddb637b | |||
| 4e3b0c5aea | |||
| b6631cd878 | |||
| c212700341 | |||
| e121788ff5 | |||
| 96460d5ea3 | |||
| 9cf9720efa | |||
| 2d9f55b632 | |||
| 7133a16511 | |||
| a38dfc006e | |||
| 86e7c7321f | |||
| 58db719a2c | |||
| 9abeb99b32 | |||
| d828a7fc35 | |||
| c6f9ea4434 | |||
| fb6843815c | |||
| b97181a793 | |||
| 5d15aca85f | |||
| b98a1a3303 | |||
| 696c5308a9 | |||
| 3542d55e67 | |||
| 3c8a120e51 | |||
| cd24308f20 | |||
| 69190e088e | |||
| d058a234ba | |||
| 41e536109b | |||
| f916aa0f92 | |||
| cdbc260571 | |||
| b234710af9 | |||
| 23498883d4 | |||
| a47e8d0da2 | |||
| 6dd0e07af8 | |||
| b1c9671a60 | |||
| 7aaa1ff270 | |||
| 85698ca4f7 | |||
| 176d91937d | |||
| e0da0744b5 | |||
| 0b4902bdc2 | |||
| e9904e66e6 | |||
| 3de8e8fd6a | |||
| 38a470a873 | |||
| 4308a79e89 | |||
| 93d3350c8c | |||
| 615c009c42 | |||
| a325a294bd | |||
| 4b91383efc | |||
| 18ab63bd37 | |||
| a7fb1ffcd8 | |||
| 11f173693b | |||
| 5b2cd8d03a | |||
| b10e67be3b | |||
| d41c077fac | |||
| 3175a2c76a | |||
| 3b60b712ec | |||
| afed3610fc | |||
| 74f38eacda | |||
| b189faca52 | |||
| d4cd6149ac | |||
| e1cd9aef8f | |||
| ba37275503 | |||
| e01b44af61 | |||
| 72a90074bc | |||
| 705a6e3a8e | |||
| f4a240d225 | |||
| 793f0c1dd6 | |||
| 008edd0eeb | |||
| 9e6b6e7b82 | |||
| 164d6e47b9 | |||
| 88b4d69278 | |||
| 5bcbcd3c57 | |||
| 1b2d862973 | |||
| e6f6a59f3b | |||
| e198bc9b9a | |||
| b7f81f0999 | |||
| eb8dc15ad6 | |||
| 2ee3a1b6f3 | |||
| 0960b17fbc | |||
| 6534566b7e | |||
| e60350d95d | |||
| f40743183e | |||
| e852a21634 | |||
| 45deaee762 | |||
| 444fdb79dc | |||
| 140dd873f1 | |||
| 27dae156db | |||
| 2deb23e00e | |||
| 8152bc6fbf | |||
| af026c5953 | |||
| 11275cbaaf | |||
| fe9bf5fc4a | |||
| cd4924d472 | |||
| f56b984d97 | |||
| f804adbff3 | |||
| 109aabc6f2 | |||
| ad620f02c7 | |||
| 5bd432a85f | |||
| 026175c8f7 | |||
| f156014daa | |||
| 2cd55e456a | |||
| 8c2ca60c8b | |||
| 3fda2245a4 | |||
| 296887754f | |||
| 9ae72cdcf4 | |||
| 16fec084f5 | |||
| 10c61da686 | |||
| 24624491cd | |||
| 233c4150d1 | |||
| 5893ebec55 | |||
| 11642192d1 | |||
| e57bdd4e58 | |||
| 461488e9bf | |||
| 2988b67c24 | |||
| 4f62541bfb | |||
| 24576a39e5 | |||
| 3ab19be9ea | |||
| 5b009a5afb | |||
| 3efb5fe7e2 | |||
| ee53f98d8c | |||
| d5a33a0323 | |||
| f25927855e | |||
| c873035084 | |||
| f32bba6531 | |||
| 40bc936739 | |||
| 6b5685ef0c | |||
| e8e213ad1e | |||
| 5f4df34829 | |||
| c255a20d7c | |||
| b5204111da | |||
| 3a51f2a778 | |||
| 4086f5051c | |||
| 5440108431 | |||
| 46bd53a929 | |||
| a10c2ccd41 | |||
| 1cca100a48 | |||
| 04ad46dd31 | |||
| aa13d14019 | |||
| b1f003646b | |||
| e90eccdf92 | |||
| ba06447cd5 | |||
| 9808520992 | |||
| 8b931b085c | |||
| 528faceb35 | |||
| c2a8fa91b1 | |||
| 091fba74cb | |||
| 083ef2e6fc | |||
| de3a7603ac | |||
| 0ac5d621b6 | |||
| bdd409970f | |||
| d8f38f79f2 | |||
| 0f1172f55b | |||
| 3df47b7b59 | |||
| 6e9066ebf4 | |||
| dd94931116 | |||
| da81233d61 | |||
| a76ae2d756 | |||
| 97b65f9b4b | |||
| c0fe414e0a | |||
| 182dadd433 | |||
| 1d0f88264f | |||
| 332baca538 | |||
| e2a78888b9 | |||
| 5d6d0e63c5 | |||
| 2eb468f885 | |||
| 98140ae5d9 | |||
| d1ccb22d8a | |||
| 66c8070da8 | |||
| 3271e3e803 | |||
| 16d47923c3 | |||
| 6f1633fa75 | |||
| 08e4103fa1 | |||
| eee95190cc | |||
| e8311357ff | |||
| 0f14fdd4c9 | |||
| ece0f08a2b | |||
| 5edb3d55e5 | |||
| 63382f758e | |||
| bbef964eb5 | |||
| e6db7ad1d5 | |||
| 8cc492721b | |||
| a80fe20456 | |||
| f7986805c6 | |||
| aa5ca90f00 | |||
| 4af00e4a45 | |||
| c01c95d77f | |||
| 20a9037d5b | |||
| 34d3998566 | |||
| 198d6c00d6 | |||
| 1663df8a05 | |||
| d8926a2571 | |||
| 4796f9d914 | |||
| a588df4371 | |||
| 2c1c660c6e | |||
| 13f4ed6e0e | |||
| 1e451991db | |||
| 749b236d3d | |||
| 00ce372b71 | |||
| 370e1c1a17 | |||
| 28495273b4 | |||
| 36a9c5cc6b | |||
| 228de1f12a | |||
| 01555463d2 | |||
| 6b99075dc8 | |||
| 8578ee0864 | |||
| 897e07f639 | |||
| 875249eb00 | |||
| 4d5a4e4cef | |||
| 86a6e6bd04 | |||
| 8f3042e5b3 | |||
| a1ab87107b | |||
| f49c99937c | |||
| 9b24f12bf5 | |||
| 487ce7c82a | |||
| cc835d523c | |||
| 64c3bc070a | |||
| 7405b2e819 | |||
| ca5081e327 | |||
| a79941df22 | |||
| 8137d63000 | |||
| 4aa21242b6 | |||
| 8ce93faf08 | |||
| 903ece6160 | |||
| 9f440c11e0 | |||
| 58bd5627bf | |||
| 97dcb8977a | |||
| 2fdd64c1b5 | |||
| 591b993685 | |||
| 543a00e597 | |||
| f361c7004d | |||
| bb7c62777d | |||
| d51f52a649 | |||
| e353809680 | |||
| c2f0f958ef | |||
| 087b7a6607 | |||
| 6271463240 | |||
| 6f1911533c | |||
| d5d8b98d82 | |||
| e7fe7ec0f6 | |||
| 049abd698f | |||
| 45d21677a0 | |||
| 76bec6ce7f | |||
| 6563cb6ec6 | |||
| 13cd409575 | |||
| 13292ff73e | |||
| 3f8e2456f7 | |||
| 822ee7db88 | |||
| 94a650475d | |||
| 03cf00422a | |||
| 51a9e678f0 | |||
| ad76ee76a8 | |||
| 630136b5b7 | |||
| b5f101bdac | |||
| 5940564d84 | |||
| 67902b5da7 | |||
| c0476c7881 | |||
| f68b6b0e5e | |||
| 44857702ae | |||
| b1399cd5f9 | |||
| 6f1e4a19a2 | |||
| 93393e005e | |||
| 4ea2755fce | |||
| ecb51a83d4 | |||
| 093b5c0e63 | |||
| bf42b0ae44 | |||
| 342b4fd19d | |||
| cbdb861ee4 | |||
| da5a8b9a59 | |||
| 1e6e8b446d | |||
| c1fdaa6ae0 | |||
| 142814d451 | |||
| 704755d005 | |||
| d1263700c0 | |||
| 0704fe9695 | |||
| 1d3f1d88ef | |||
| 8b3edac091 | |||
| 05cab85579 | |||
| b72fbe200d | |||
| b1194da6a5 | |||
| 338e4669e5 | |||
| c5e2659771 | |||
| 1d432728ac | |||
| 2fd702a319 | |||
| f26ad16af7 | |||
| 8f2ae51fe5 | |||
| 2f84d00300 | |||
| b82a2d97ef | |||
| 3e9dbe3e0a | |||
| 975b2fb79e | |||
| fa509ce64e | |||
| 99292edd46 | |||
| 3e992cb23c | |||
| e7b4d024ee | |||
| ff67a6d338 | |||
| 8e4989ed03 | |||
| 0940f01634 | |||
| 9d1cb1bc92 | |||
| 0ca4e30b19 | |||
| ba88f8a6f0 | |||
| aefe0cbf51 | |||
| 9ad489d133 | |||
| 661b30784e | |||
| 43a5ba9415 | |||
| 08a65d74d5 | |||
| cefe156811 | |||
| 3b5b4d628b | |||
| 8746e48df0 | |||
| 0ec8b57825 | |||
| 045827043d | |||
| 4d66a86579 | |||
| 2a8881d0e8 | |||
| ffc60bb917 | |||
| 2e454c770b | |||
| 7d711135bc | |||
| f62b2b5b45 | |||
| 7919596a21 | |||
| 9b4898efeb | |||
| 45dd1683fd | |||
| 8bca908f15 | |||
| 9cbb8ddd7f | |||
| 1be222af2e | |||
| bf9fc8fef4 | |||
| 86e7330fa2 | |||
| 34bfb715e1 | |||
| 019d7069f8 | |||
| c54fcfb45d | |||
| cde87cb225 | |||
| 12435774ca | |||
| 80b9507e7a | |||
| 0ac0f0ffd0 | |||
| 3d14aba4b4 | |||
| 64f694865c | |||
| d36b728088 | |||
| 1a7b4c42ab | |||
| 2a64ce740e | |||
| 78988ed60e | |||
| 2832adda88 | |||
| a4e4fb4094 | |||
| 777ec64635 | |||
| 9cec8c1750 | |||
| 8ca5aa1190 | |||
| 4d8f1b9ca4 | |||
| 3da179f77b | |||
| a34e8cb0bd | |||
| b249767c5c | |||
| 89a7434565 | |||
| 3b537cbdeb | |||
| 731464f5b8 | |||
| 1ad70f8721 | |||
| 2ea8c73cd8 | |||
| f257f2c396 | |||
| 3cd8e6f5c6 | |||
| 0715db7681 | |||
| a39de8a686 | |||
| ccaf335466 | |||
| 40e36e9b52 | |||
| 9eebe9d54e | |||
| a23a191615 | |||
| 7d9c5586f9 | |||
| f07c89bba4 | |||
| 59cba930e5 | |||
| 39ae56e136 | |||
| f92130338b | |||
| 2867d29021 | |||
| f76ac8bdee | |||
| 83caffe000 | |||
| 96160837d2 | |||
| 3480f1c59e | |||
| 65ac4f69af | |||
| 2c50fab3dd | |||
| 9525ccac4f | |||
| ff76c4bd5d | |||
| 5dacf77627 | |||
| 2a213c6af7 | |||
| b2535e7db6 | |||
| 28236147ee | |||
| 4969783383 | |||
| b64080be1b | |||
| aadebd6d23 | |||
| 71cc0074ef | |||
| d77f52bf85 | |||
| b71163706b | |||
| 1fb7df12d7 | |||
| b3996b3221 | |||
| 7251748d59 | |||
| 73e9f35ab1 | |||
| d7f0056e2d | |||
| 9b7b133cbc | |||
| 7545e5de6c | |||
| a0c30702c1 | |||
| 03c988388e | |||
| 0a56c522eb | |||
| 646858ea08 | |||
| d9b821cecc | |||
| d5448e07ab | |||
| 3aa182e26a | |||
| de3b490f8e | |||
| 4481906be2 | |||
| d9f1a8ce9f | |||
| aa6d2e3035 | |||
| 4365843c20 | |||
| b4d2d635f7 | |||
| b9b28900b1 | |||
| d463b82aba | |||
| ed861ff782 | |||
| 8cc1944160 | |||
| 80e390b906 | |||
| c2acb2be60 | |||
| 8ba95c08a1 | |||
| c7de51ca9a | |||
| e02ee3bb2e | |||
| 394ceee141 | |||
| 40b48510f4 | |||
| be3b37114c | |||
| e212a87b86 | |||
| b890c11c14 | |||
| 2e27425e93 | |||
| 6269e011db | |||
| e70482dfc0 | |||
| 9b8861e3e1 | |||
| 38ca3b29b5 | |||
| 066076b157 | |||
| be27ac0e69 | |||
| 9e6d4eeb92 | |||
| 38dd58e796 | |||
| 1219e41d29 | |||
| f89c4203a0 | |||
| b9fbc39754 | |||
| fbd3ef8752 | |||
| 200010be19 | |||
| 5e02a83b53 | |||
| 443fee8537 | |||
| 570a5c72a9 | |||
| c52b59dcea | |||
| 81cdb0fe78 | |||
| 5b447d61a6 | |||
| fd90d99cd0 | |||
| 22994a6d14 | |||
| 58cbda2950 | |||
| d965b91b08 | |||
| 459bed9243 | |||
| fd38e1cf15 | |||
| 7345034e66 | |||
| 33397836a5 | |||
| 92f8c40e4c | |||
| 5e16e7bf53 | |||
| 168bf61b23 | |||
| 8811677154 | |||
| 12f1ce4794 | |||
| 8f8e9de601 | |||
| 5b3133f9fc | |||
| 782ecfa5c3 | |||
| 5f7321ea28 | |||
| 2d69afb34d | |||
| 3e6631312d | |||
| a355225a83 | |||
| 6021ca5c31 | |||
| aace34c8a3 | |||
| dd354bd396 | |||
| 17efc3ab79 | |||
| d7fd56051a | |||
| e7274a9873 | |||
| b3573efddb | |||
| 259aa97d8b | |||
| ae1f3780f8 | |||
| 25dea232d6 | |||
| 1c56b48238 | |||
| a258a90291 | |||
| 0737e930cb | |||
| c227f3d985 | |||
| 4d54637921 | |||
| 64e395d6cf | |||
| f7f8ef257c | |||
| ad65c891e7 | |||
| 42936fc917 | |||
| b699945b47 | |||
| e76693cad9 | |||
| b90bc6c348 | |||
| c9abb75fce | |||
| b00466f025 | |||
| 44448ba68d | |||
| f7a417fdb4 | |||
| 6fa0e4072d | |||
| e15d18aa1c | |||
| 164ef26a60 | |||
| 0dada847ef | |||
| 36b7dbb8d0 | |||
| 02e483c99b | |||
| afe30e15a0 | |||
| 9a1ea9ac03 | |||
| 693647a141 | |||
| cea107b165 | |||
| 509c640a80 | |||
| 617e7cee81 | |||
| d87d4b9b56 | |||
| c889717d24 | |||
| 1f302990c6 | |||
| 37024afe9c | |||
| 18b855140d | |||
| 7c520b52c1 | |||
| b98e363a5c | |||
| 0a7ea9d206 | |||
| 3d473b9763 | |||
| e0df7505f6 | |||
| 43bb0b0b93 | |||
| 6164604462 | |||
| 826c422ac4 | |||
| bf63a43bda | |||
| 55fc46c707 | |||
| 5102430a68 | |||
| 0f897bc1f9 | |||
| d948b0b49b | |||
| b6de97ad53 | |||
| 8cefa6b82e | |||
| 81e1b3fc61 | |||
| 4c1cfd9278 | |||
| 14bb0b02ac | |||
| 240c793e7a | |||
| 89a853212b | |||
| 97d1e0bbbb | |||
| cfb5ccc7d3 | |||
| 835e547195 | |||
| af9ccb7072 | |||
| 74de7cf33c | |||
| f5e65b98a9 | |||
| eb76d7a226 | |||
| e635f3dc1d | |||
| 2a6b7d57cb | |||
| 8bb225bec6 | |||
| 39d3fc4742 | |||
| 5c98260cec | |||
| f599f41336 | |||
| 1384a6d0fd | |||
| 28089c98c1 | |||
| 10d6d50b6c | |||
| 752f6fb15a | |||
| 8fcf459285 | |||
| 9c01bcb3e5 | |||
| a2c068d949 | |||
| 4ad3f2cdc2 | |||
| 29918c498c | |||
| 269432a5e6 | |||
| a33b774314 | |||
| cc5ccaaca1 | |||
| 33ea689861 | |||
| 581836b716 | |||
| 0516b78d6f | |||
| 84d7cbf916 | |||
| f514fd2182 | |||
| 86707928d4 | |||
| 3c3fb3cd3f | |||
| 337899a03d | |||
| bae0c071cd | |||
| 19cb3c7871 | |||
| 2e4dec365d | |||
| ca3e2e6cc0 | |||
| 283979fc46 | |||
| a81c1ab6ae | |||
| 48d4d55ecc | |||
| b7691f5658 | |||
| 1382f10433 | |||
| d8db728c33 | |||
| d2259f20cb | |||
| 9720d6b7a5 | |||
| 7753ba2d37 | |||
| 2fb9850af5 | |||
| 9eba6ffdd4 | |||
| 762657eeef | |||
| 16e3b0484d | |||
| 974828222e | |||
| a9700e61db | |||
| 5a23d570b5 | |||
| 28b1c48235 | |||
| ab9fcbdfb9 | |||
| ef80b3711e | |||
| 6672a03e7f | |||
| e7833a070e | |||
| 25b9ac3df4 | |||
| 718ac3f83b | |||
| e4f686deb7 | |||
| d241d66a69 | |||
| f92a1be0b6 | |||
| 7cc0d47322 | |||
| da998d09d7 | |||
| 5e66a60f1c | |||
| 7f55ea0c53 | |||
| f7d1d9b8b1 | |||
| 6b4c8e76e6 | |||
| e12a0c154c | |||
| 9c7e99e829 | |||
| d14ea2ecaa | |||
| a94d86da6d | |||
| 5e591fc1b7 | |||
| 32e83e00e4 | |||
| 132269618d | |||
| 84d118de07 | |||
| 1716ac562c | |||
| e215aae39a | |||
| 12782cad4d | |||
| fc5ed17fe9 | |||
| 94d04934b3 | |||
| 1387f9b23e | |||
| 6817eab5f1 | |||
| 218f591a5d | |||
| 17af0de7b6 | |||
| 9d962053a2 | |||
| 59909b5ca7 | |||
| a6cd0f0e73 | |||
| 2c43393bf1 | |||
| 669c8c3cca | |||
| b0b0cc045f | |||
| 20d16d7b31 | |||
| 714722bb2d | |||
| 830495a607 | |||
| 41a4593b6d | |||
| 08b727833e | |||
| c8b82b9d08 | |||
| 5becb4c43a | |||
| 13694293e3 | |||
| 815beac356 | |||
| 5e60204832 | |||
| d2624b13a0 | |||
| 61f5de9662 | |||
| 40dbf30784 | |||
| afd77c4745 | |||
| d70bd4aaa4 | |||
| 8e05261588 | |||
| a676d4387c | |||
| 08a5afcf9f | |||
| eeaa3c1643 | |||
| 7c8c233cf4 | |||
| 129a9850eb | |||
| 1f98a4fff3 | |||
| 58e4702b14 | |||
| c60749678b | |||
| d5214e4644 | |||
| 52804ca6d1 | |||
| 4fb9606361 | |||
| c534d95972 | |||
| 46ccfda493 | |||
| 6dc62334d6 | |||
| c7d003d551 | |||
| cc754122fc | |||
| 240a94182e | |||
| 16af509c46 | |||
| 86e474fff1 | |||
| 9a3d5729bb | |||
| 5a1c29fd8c | |||
| 180775a0ec | |||
| d018e279f8 | |||
| 11636bc7c7 | |||
| 518c1ceb94 | |||
| 696efe494e | |||
| 4419d357c4 | |||
| fbbba6db92 | |||
| 53d428907b | |||
| 8133ba16b1 | |||
| e9aa0e89d3 | |||
| 7e3c59e53e | |||
| f6314f8e73 | |||
| 3bcfd84fba | |||
| 7c0ae76cd0 | |||
| 2dee8a25d5 | |||
| 507aa6d949 | |||
| 59f173f2e6 | |||
| c3790c239c | |||
| 45e51e7730 | |||
| 4834eae887 | |||
| 01108e6172 | |||
| 95b74c211d | |||
| cb79a90031 | |||
| 4502436c47 | |||
| c3d0cf940c | |||
| e7343cc67c | |||
| 83145486b0 | |||
| 6fd1795d25 | |||
| f770232b63 | |||
| a8e694c235 | |||
| 15a6d94953 | |||
| 056331981e | |||
| cef16862da | |||
| 8a4015722d | |||
| 156345cb4b | |||
| f29280ba5c | |||
| 742be06ea9 | |||
| af98954fc1 | |||
| 4d63770189 | |||
| bbea3a6b84 | |||
| 19d3a56194 | |||
| 5cab2b711f | |||
| 1e5455e266 | |||
| 4fe585acc2 | |||
| e52448b84b | |||
| 1f92b55f58 | |||
| 8b15b742ad | |||
| 849dc0560b | |||
| a026c5fd08 | |||
| fd7aade26b | |||
| 510f8ede10 | |||
| 8f9125b08a | |||
| e5e97c0a0a | |||
| 870ca713df | |||
| 6854a3fd26 | |||
| 620360d41a | |||
| 20bd49285b | |||
| 6bd2730317 | |||
| f734cca337 | |||
| ce5b19d011 | |||
| f82a64d149 | |||
| f49b1afd6c | |||
| 796c5626a7 | |||
| e54c9cd401 | |||
| f8951d7f57 | |||
| 6454e1d644 | |||
| e184c8cb42 | |||
| fdd211e399 | |||
| 7001e21e7d | |||
| 82d0732c12 | |||
| 53cd125780 | |||
| 3c91f9b5ab | |||
| f073dca22a | |||
| 8b1e35d7dc | |||
| b75d8ca621 | |||
| 9beefd7d5a | |||
| 88145efa97 | |||
| bdc13f9238 | |||
| ce58f0607b | |||
| bbc0d330a9 | |||
| 60e7e17c86 | |||
| 237bb8514e | |||
| bd26c933d2 | |||
| b6b58da2d2 | |||
| 40c646cf7a | |||
| 3231a8c51c | |||
| 4170d6a491 | |||
| 0b50c525cf | |||
| 8ba38e8e74 | |||
| b163545771 | |||
| c0b82f8e58 | |||
| b75ff5fa03 | |||
| 9440d7fe88 | |||
| 24809fce07 | |||
| 9819ad347f | |||
| 8fe83750b7 | |||
| 1809f05904 | |||
| 0ac250a035 | |||
| 405a00bb2c | |||
| 3a3ca8e6a9 | |||
| 27e678480e | |||
| 7052565380 | |||
| 31070ffbca | |||
| 7f3dec7bee | |||
| b1e0db4944 | |||
| c439952a41 | |||
| 2f28afebb6 | |||
| fa7ba30ba3 | |||
| 1cf5f510ed | |||
| 526c874caa | |||
| f88f744097 | |||
| 95733796f0 | |||
| 552f319b9d | |||
| 38e5952417 | |||
| 7f891939f1 | |||
| 69a5ce1e31 | |||
| 534802b761 | |||
| 5c258e212c | |||
| 6a6133c102 | |||
| 3c1825187a | |||
| 8523b34be7 | |||
| 65cfd4360a | |||
| bbf5f42c87 | |||
| 3631e53ff0 | |||
| f322d9bddb | |||
| 05ce7b9d5e | |||
| 72ddedfc5c | |||
| 36686d7425 | |||
| 34387ec0f1 | |||
| 83a6b0c626 | |||
| 76da66fb7e | |||
| 607f9eda35 | |||
| f25cec265d | |||
| 8e66b96221 | |||
| b5c1bb346c | |||
| e94b323e6c | |||
| bc65ee10c0 | |||
| 2001483659 | |||
| 444aba55dd | |||
| 3f640b1037 | |||
| b07084711c | |||
| fa8ab2134f | |||
| 1a677da792 | |||
| b6d61a818e | |||
| 8495ffaa45 | |||
| dbd1d79770 | |||
| 1910178199 | |||
| 839a6a2c8a | |||
| a769edbc89 | |||
| 57ffecd0e5 | |||
| 801d135390 | |||
| 0428f44113 | |||
| 7beff3fd5a | |||
| 88a095e40e | |||
| dd961985f0 | |||
| d44b05a9e5 | |||
| 5bd3b02be6 | |||
| 3cf5c1853d | |||
| a4d86496e1 | |||
| 90bdc85f8c | |||
| 0828873b52 | |||
| 816b707a16 | |||
| c9257ab4bf | |||
| 69ce3b3d33 | |||
| c4caa7c401 | |||
| dc93a292c3 | |||
| 174ee1b646 | |||
| 9b1c4f47fb | |||
| 582ba45c00 | |||
| f1cbd55007 | |||
| 3a34370422 | |||
| 29ab244de6 | |||
| 920b2c2b40 | |||
| ac96d192a6 | |||
| 07fbeb6cf0 | |||
| fc64cdee64 | |||
| 0c0e96c55f | |||
| 5b953c1ef2 | |||
| 562ca45e07 | |||
| 6bbd53512e | |||
| e352a8ed1b | |||
| e55225e2bc | |||
| 3e63abd335 | |||
| 0620fa3094 | |||
| d93288f711 | |||
| ca69af7b97 | |||
| 952e13fef8 | |||
| 4be3087642 | |||
| 49da8a23a8 | |||
| 3ad943a9eb | |||
| 3082093293 | |||
| b03bbab5ad | |||
| 9574730050 | |||
| 91ea6fe4ee | |||
| 769be13189 | |||
| e42175241e | |||
| 12257b438b | |||
| 9ecc736c30 | |||
| 6c4e6bf1d6 | |||
| 97fe817186 | |||
| 52b12ed7eb | |||
| d8ab4474b4 | |||
| 1ecbd95adf | |||
| cad6e6624f | |||
| 3505cbe05c | |||
| e15359e589 | |||
| edb86f5f5a | |||
| adf2651d1f | |||
| 5031d64e28 | |||
| ae3ad59b16 | |||
| e6cd7b0467 | |||
| 97e9f52331 | |||
| 25957d917a | |||
| 20b932da97 | |||
| 207080babc | |||
| 48bacd01cc | |||
| 297d0f1f30 | |||
| eedbe1b770 | |||
| 5ff6b1da07 | |||
| 8b49e0ee2a | |||
| e031ec9359 | |||
| 1bd1cd6938 | |||
| 81c5a21b8d | |||
| 61e4bbabaf | |||
| 4cf475680d | |||
| ca4aa340f6 | |||
| 767d8a4b05 | |||
| 0b8dcaba8f | |||
| af6a318aae | |||
| c6e2900be7 | |||
| 963d9b6032 | |||
| b2ee738bb1 | |||
| c8ca3ff404 | |||
| 5d8fa2c7af | |||
| 58df5e5376 | |||
| 348ad1a624 | |||
| 73e17d5aa8 | |||
| 300d9892a5 | |||
| e47b5b43b8 | |||
| 21c9d9e200 | |||
| 4f6916c4d8 | |||
| 8633957726 | |||
| 0850c953b3 | |||
| 23e95fd7ab | |||
| e1045f01c6 | |||
| e6d22fc3a0 | |||
| 9232244920 | |||
| 476eb90a90 | |||
| 063191889d | |||
| 589099a005 | |||
| a0ec7de058 | |||
| 14a19a3da9 | |||
| 1b04382a9b | |||
| 71e5828d41 | |||
| 65a02f7d32 | |||
| acf9174bef | |||
| 243ca5b1e2 | |||
| f6059c377c | |||
| 41328bde97 | |||
| 3242cf5384 | |||
| d8de2017b5 | |||
| 843280f82b | |||
| 42344795cd | |||
| 517f6d1a26 | |||
| 70992609d4 | |||
| bf736bc55d | |||
| d4cfd3e7ac | |||
| c2d47cd2e1 | |||
| e1a9e0ac29 | |||
| 5e145c1c22 | |||
| 714ff3c663 | |||
| f5c08070d9 | |||
| 392995ca46 | |||
| 805ed84f61 | |||
| 5010706d8b | |||
| 6278ff0f30 | |||
| 56c25bfb78 | |||
| b814f0b7e3 | |||
| 65bec16fb3 | |||
| 556d1d0390 | |||
| 1ebf740908 | |||
| 51d359268e | |||
| 3f0c515355 | |||
| f95839c785 | |||
| 5a004ae429 | |||
| 04fb610fe7 | |||
| a667d04e53 | |||
| a8f23ed712 | |||
| ecf947258a | |||
| a58612718e | |||
| cd078a6264 | |||
| 9f637ead38 | |||
| b521aafd26 | |||
| a84e15b8cc | |||
| 0c330fc020 | |||
| cfbb7bec58 | |||
| 3b357f51a6 | |||
| 09acf215f0 | |||
| 07dd8b94ed | |||
| ef308fd121 | |||
| fce64d760b | |||
| f0c9bb7c91 | |||
| d8672796b0 | |||
| 5929e84036 | |||
| 83063532a0 | |||
| 07279558a5 | |||
| 2166473852 | |||
| 44397e3062 | |||
| 883a0a0e6a | |||
| b5ed81b349 | |||
| 625b0afa52 | |||
| 2660fbaa20 | |||
| 9e37702d24 | |||
| bc11c6a7f2 | |||
| 10e9766fd3 | |||
| 6d24a2cb87 | |||
| 0a4dfaeaf9 | |||
| c0a4fd145c | |||
| 70f16e1a0b | |||
| cb27571e9f | |||
| 0518da5819 | |||
| d2797abdb4 | |||
| bf3ee660e0 | |||
| 68406b9906 | |||
| 6f7fd6613a | |||
| 6d5b386394 | |||
| 1ea18a2922 | |||
| f8f4b961a1 | |||
| 57565db531 | |||
| d844420c07 | |||
| 34634bddf1 | |||
| c97b7f6748 | |||
| 76cc19f525 | |||
| 5baaebb3fd | |||
| 9d072920da | |||
| 965ca36525 | |||
| b4988ce20c | |||
| d3d617239f | |||
| 6c3b34a61d | |||
| d76d1adb59 | |||
| cadc6b171e | |||
| fdae2a20ae | |||
| 45701a81e9 | |||
| 409e0c8e1c | |||
| 7076d41b29 | |||
| 5a6cb69951 | |||
| 11a75ee78a | |||
| b9b692d71d | |||
| d8f8afcbd0 | |||
| 8cb62ef31a | |||
| bb5d5fc683 | |||
| 2fc0dcc10a | |||
| 9fd55157d6 | |||
| 6c384dba71 | |||
| 9730297381 | |||
| 99e80a8ed0 | |||
| 26fef2d481 | |||
| c9e65f4221 | |||
| 20bd33fada | |||
| bd0af2e921 | |||
| 4ab66299d4 | |||
| 42227f93c0 | |||
| 89fcf4ea7c | |||
| 3322710dac | |||
| 404bf11d8c | |||
| 60a2ecbd17 | |||
| 828822243a | |||
| 2068ae215e | |||
| d4262ecceb | |||
| 8be7d8a635 | |||
| c038040e1b | |||
| 21450b8a51 | |||
| 5fc1bd026a | |||
| d60f1a5601 | |||
| da83f8403e | |||
| 4ff17af5de | |||
| a9d1b4e6d7 | |||
| 66612075d2 | |||
| b921c55677 | |||
| bdc5e9ceb0 | |||
| f2b2effc4b | |||
| 301e0496ff | |||
| 98660e1f97 | |||
| 6cf93379b3 | |||
| 8639abec97 | |||
| d5361b8d09 | |||
| 6bfdfab6f3 | |||
| bec998ab94 | |||
| 77636945fb | |||
| fd5c45ae10 | |||
| ad71386adf | |||
| 043517717e | |||
| 76c52300a2 | |||
| dda32c6880 | |||
| ac4bb5c35f | |||
| a96cae4f44 | |||
| 7cb75cb2e7 | |||
| 0940084fd2 | |||
| 95ad06c8c3 | |||
| 3c13c4f3ee | |||
| 2fe938b7da | |||
| 784da52ea6 | |||
| 78524a56ed | |||
| 6c614f0c1f | |||
| d42df4ed04 | |||
| 6d94126368 | |||
| e0f72d2791 | |||
| 3e51710fe6 | |||
| 7bfdca7a53 | |||
| 48d5628fd4 | |||
| c8fb619d37 | |||
| 57024614bd | |||
| a31b502668 | |||
| e58c3ac374 | |||
| 00f4e6ec44 | |||
| 6355e61eb8 | |||
| 27828f44b9 | |||
| 9525ca08b9 | |||
| 501caf0a69 | |||
| c17baef172 | |||
| 21ade71bad | |||
| 23e02d8eb0 | |||
| 86286e1ac8 | |||
| 7bbe12b2bd | |||
| e65a2a400d | |||
| 741079f317 | |||
| 0f5d4fd11b | |||
| 8eae206715 | |||
| 7434d44412 | |||
| 8394bbd47f | |||
| 14a2eeba0c | |||
| a18dde9b0d | |||
| 8438d820ad | |||
| e19ad023d2 | |||
| 0695f08f05 | |||
| 22ab4721e2 | |||
| 51f23c5dc2 | |||
| 1f48e3d44a | |||
| 0113627d7b | |||
| 0a5de0ff0b | |||
| 9c4bad8f1e | |||
| c7783dbd6c | |||
| ee9c7e204f | |||
| 483dcb6340 | |||
| 9ad7b65996 | |||
| ec1659cba0 | |||
| 09a8db10d4 | |||
| f3323beaca | |||
| 275973da8c | |||
| e2c89a9487 | |||
| 869690c485 | |||
| a3c7c07ecc | |||
| dc8a8af117 | |||
| 6c28e1e69a | |||
| 0e1163f698 | |||
| 8654415f33 | |||
| 1a6ad05a23 | |||
| 1d91535ba6 | |||
| 8799c888e3 | |||
| d7209d9057 | |||
| 5960103cb8 | |||
| 2ffea39a5c | |||
| 1e76b1bf2d | |||
| 2022ca1d52 | |||
| e1319d1a2d | |||
| a61df6cb03 | |||
| 790b885d0a | |||
| 1a2eacc5a6 | |||
| f7a2f7a727 | |||
| a4adca595a | |||
| c51e179db8 | |||
| b582fc13c3 | |||
| add33cb5e6 | |||
| 83105d0d8f | |||
| 7b0818b8e5 | |||
| 28cd3a8c9f | |||
| 0355645a0e | |||
| cb7a608d75 | |||
| bdb0d77227 | |||
| 149102927b | |||
| d8c0d722d2 | |||
| cb7be3767c | |||
| 34bf2877c8 | |||
| 3ebec8fa41 | |||
| f877d19c6a | |||
| a63a9c7d45 | |||
| 1779cea6e3 | |||
| 26eff330f9 | |||
| 9245f0adac | |||
| 8964ceba08 | |||
| cc9e74123c | |||
| cca9edc97a | |||
| 5e75f7022f | |||
| 5e97eb1840 | |||
| c9e4147b11 | |||
| 3f25e7ec79 | |||
| 1372bf784f | |||
| eed5fdd768 | |||
| f7939c758f | |||
| bf7045566d | |||
| ebd11e7482 | |||
| 94626487db | |||
| 24bdedf802 | |||
| 0025ba4921 | |||
| 7c0676343f | |||
| 1fe4e3afde | |||
| 9dee9e7ade | |||
| 33901384c6 | |||
| 7a221d0858 | |||
| 60ee98f578 | |||
| 5b24d7129e | |||
| b8592ad412 | |||
| e696b72f08 | |||
| 344821ed35 | |||
| 126b4c332f | |||
| c32c177e15 | |||
| 853cdd741f | |||
| 69d42ae95b | |||
| 5ff701ca3f | |||
| 9f58912fd7 | |||
| 0c746f5c5a | |||
| a8cedea15a | |||
| 87832ede17 | |||
| 4d99c689f0 | |||
| 28b26f67e2 | |||
| b934232411 | |||
| 2f120786fd | |||
| 6075fee556 | |||
| de584807e1 | |||
| a1285cbf15 | |||
| cf1f6f3961 | |||
| f4d97ef9fa | |||
| 28883e80d4 | |||
| a0f74cdd9d | |||
| 296bf443a8 | |||
| af7be9bdd7 | |||
| 2cfd5568e1 | |||
| faf40a42bc | |||
| 97c972f14d | |||
| 3fa5204b0c | |||
| 5a756ca981 | |||
| 01f9feff9f | |||
| 2757494265 | |||
| b88a8f7bb1 | |||
| b4225bedb5 | |||
| a82b4d315a | |||
| 3d92784bd4 | |||
| c06e766d7e | |||
| 4a3d15b6de | |||
| a798dcfae9 | |||
| b4a170cb8a | |||
| 665318da3d | |||
| 66cdf577f5 | |||
| 891218615e | |||
| a938e1f184 | |||
| 7c7ee633c1 | |||
| 18af84e193 | |||
| 025b859c7e | |||
| 0e239a4f71 | |||
| ca85b0afbe | |||
| a0a9461f79 | |||
| 6a2eb5f442 | |||
| 0c5892bcb6 | |||
| 91ff07fcf7 | |||
| bb7af56e69 | |||
| 77f9e8ce0f | |||
| 5ca4c4a44d | |||
| a44022c388 | |||
| 6333cf43a8 | |||
| 91ee62d1ab | |||
| ede69b4659 | |||
| 61aaeff413 | |||
| 4e1cd75f6f | |||
| a8ff2e95da | |||
| 4d502ea44d | |||
| 66b3588897 | |||
| 9134849744 | |||
| fcf8512956 | |||
| ae975b10e9 | |||
| b43f1441a9 | |||
| 5a2aa83030 | |||
| 4de27d0404 | |||
| c6d59681ff | |||
| 3b668c0bb1 | |||
| 4aed1fe8a8 | |||
| 2381264a3f | |||
| 4562e83b24 | |||
| 7be77c19f5 | |||
| 82247c0f14 | |||
| d70d61b1cb | |||
| d069c668f8 | |||
| e91dd28a76 | |||
| 595e9b25ba | |||
| 06d2d8cea3 | |||
| 936c3cc4d7 | |||
| 08abbb8dba | |||
| 972cf3cd01 | |||
| da4847c5a8 | |||
| 08494058e9 | |||
| 9080ece3fb | |||
| 438912700c | |||
| 6b57e4e0ff | |||
| 6da3a33e6c | |||
| 2c8badfea9 | |||
| 91182a86bf | |||
| 0b7e0cadc0 | |||
| 163515c6e9 | |||
| 40d612ffc7 | |||
| 88a73ecdea | |||
| 64642fabc4 | |||
| 7083a05a25 | |||
| 9f3ed32d0f | |||
| 1521ac5563 | |||
| 695246d80a | |||
| 908164f6d5 | |||
| 96206b6108 | |||
| e2fff7fd87 | |||
| 53690bfad2 | |||
| ae37a7d998 | |||
| 7b37e05dec | |||
| 022450768f | |||
| 7c5661152e | |||
| fb55b3a89a | |||
| df1509983c | |||
| 185c2f86cd | |||
| 10fc44e2af | |||
| c3275dfd36 | |||
| 43741ad5d1 | |||
| 8dec406161 | |||
| 58f8d74591 | |||
| 867fc61b12 | |||
| 8e2e477a7f | |||
| 9b34f5a9ff | |||
| 5e34f938c1 | |||
| 2fd56cb01c | |||
| 4f0e272549 | |||
| 1a5279a3ef | |||
| 7775f5785f | |||
| 2de73991ff | |||
| 354d033e60 | |||
| ebc2cdad2e | |||
| 5bb841935e | |||
| 65fd4b39ce | |||
| 96d2de2258 | |||
| a71f2863ac | |||
| a9b942981d | |||
| 4b1ba2ec21 | |||
| c09184fd94 | |||
| b0d8d196e1 | |||
| 7c43123956 | |||
| eede84eb9e | |||
| b5b20234e9 | |||
| 5beb298e47 | |||
| 6b499b9a16 | |||
| 4c639961f5 | |||
| dfd3f507fb | |||
| d5695b3170 | |||
| 994fceece3 | |||
| 8c451eb0e6 | |||
| 79b4366203 | |||
| 3675d2eae8 | |||
| 38b55d2186 | |||
| bee0d12455 | |||
| 13f2c90a7b | |||
| a3dca3dabc | |||
| e5c7a81ce3 | |||
| 8b0100523b | |||
| 1350599c0b | |||
| bc54cdc537 | |||
| 5d10cf0fe6 | |||
| 7b8a10f3ea | |||
| cb3a55dae6 | |||
| 5789d76582 | |||
| 2e588ae221 | |||
| b5dd948e56 | |||
| 1263b7de75 | |||
| 75a6122173 | |||
| 053102f433 | |||
| d3a2c0ed34 | |||
| 8fbc374f31 | |||
| 08b7ebba91 | |||
| a1cd043fdc | |||
| 671a8e7972 | |||
| efa16dbb44 | |||
| a6241be42a | |||
| faa88aafe8 | |||
| 1b3a98425f | |||
| 22bc9ddc73 | |||
| 0423775687 | |||
| 307c170fb6 | |||
| 0e04fcc071 | |||
| 4322b17a81 | |||
| 451af66be0 | |||
| 454577c6b1 | |||
| 53be4d2712 | |||
| 3c37fd37fa | |||
| cf0ba794d7 | |||
| c21e2063fe | |||
| ad037c6615 | |||
| 7bbfac5dba | |||
| 80ddb00f10 | |||
| 74b2260ba6 | |||
| 603e55f252 | |||
| a9c1c7d239 | |||
| 3cc697832a | |||
| bb98f5756a | |||
| e1d2203371 | |||
| 93467cb363 | |||
| ea526d0822 | |||
| 0e627c920f | |||
| ea35f1dce1 | |||
| a5b80c9d1f | |||
| f704094a5f | |||
| 1f58f15bff | |||
| b930716745 | |||
| 9587479b76 | |||
| 3c0fbf3a6a | |||
| caa330c91f | |||
| 4a55d5729d | |||
| d6a6697891 | |||
| 778cfb37a2 | |||
| ce85ee3aa6 | |||
| b23de4affc | |||
| d8a7e894aa | |||
| d5acfaa14e | |||
| cc35d0645a | |||
| c9368925a3 | |||
| 0d9ce1bab0 | |||
| 519fb90d5a | |||
| 6768fd4d87 | |||
| d0456d0f42 | |||
| 7cda3fe85b | |||
| 5b7071e4b0 | |||
| ac3496e681 | |||
| 657334a5fd | |||
| 31195975f5 | |||
| 6717bb2b72 | |||
| 0e08526428 | |||
| 888e8c6dac | |||
| e017eff5e4 | |||
| e4dd79bbb1 | |||
| 4588831bff | |||
| a4f37220a0 | |||
| d654770732 | |||
| 19fc9e3466 | |||
| d048557bfe | |||
| 5feea0382e | |||
| 18cf7f7ed0 | |||
| cfbfd59b8f | |||
| d9336d9ae4 | |||
| 3365c4da9e | |||
| 8f2bd7663d | |||
| 8306b4373b | |||
| 149e959d09 | |||
| 54a42d08d7 | |||
| 481b083506 | |||
| 8835435558 | |||
| a80d8286c2 | |||
| 6b15827246 | |||
| 41d0a8b295 | |||
| d0e1ea8f06 | |||
| f3b9647bb4 | |||
| 9de67c586f | |||
| 92f594f5e7 | |||
| 06d5273217 | |||
| 94d7babbf1 | |||
| 306216dbe5 | |||
| ab2e20ee0a | |||
| 146e95d88f | |||
| d7ae86799c | |||
| 7b26c9e2ef | |||
| 6bcafdbc87 | |||
| 059c089f93 | |||
| c1e7193c4b | |||
| 2423563d45 | |||
| 260672986e | |||
| 5d48406d64 | |||
| 2b2dbabc11 | |||
| 13b64bc55a | |||
| 279f099ba0 | |||
| 32747641e4 | |||
| db43ed6f41 | |||
| 7699621983 | |||
| 4dfbcd0b4e | |||
| a9ee18300e | |||
| b4861d2b5c | |||
| 913f2b84a6 | |||
| cc89933d8f | |||
| a14ea6582d | |||
| 076f3289d2 | |||
| 518083dfe0 | |||
| 2b366bb321 | |||
| 292d4c077a | |||
| fc4c03640d | |||
| 985253197f | |||
| 48b4249790 | |||
| fb64fcb271 | |||
| 41e452dcc5 | |||
| d218c66e25 | |||
| e173b1cb2a | |||
| 9b598db559 | |||
| e122d677ad | |||
| 4c63cbf5b1 | |||
| 288705fefd | |||
| 8c4ae98f3d | |||
| 08aa367892 | |||
| ff527a0190 | |||
| 6e05f8ca93 | |||
| 6309d070d1 | |||
| fe14130b3c | |||
| 52ebffa857 | |||
| d14f15863d | |||
| 7c9b585a47 | |||
| c039f4af83 | |||
| 07285e5f8b | |||
| 16d80ebab3 | |||
| 61e816f24c | |||
| 2feb16d957 | |||
| 3043fbe73b | |||
| 9f99c3f55b | |||
| a07a6d8c26 | |||
| 695841a3cf | |||
| 3efaa713da | |||
| 9822f687f7 | |||
| b9d83c04bc | |||
| 298ad6782d | |||
| f4be2b8bcd | |||
| e83e239faf | |||
| 62bf7f0fc2 | |||
| 7dea485d57 | |||
| 5b9858a8a3 | |||
| 42a5b3ec17 | |||
| 2d1cb076c6 | |||
| 289c93d081 | |||
| c0fe706597 | |||
| 9cba1c8bf4 | |||
| cbf095465c | |||
| c007dbdc13 | |||
| ff493d017b | |||
| 7f6ad9653e | |||
| 2851a9f04e | |||
| c536f85b2e | |||
| b1352ff8b7 | |||
| cc63c8499f | |||
| f191b8b8d1 | |||
| 5003db987d | |||
| 07aab5e868 | |||
| 875dfbbf0e | |||
| 9e7efa45d4 | |||
| 8bf892b306 | |||
| 8480b0197b | |||
| df07fb5951 | |||
| 4ab4bcc074 | |||
| 1d4f019de4 | |||
| 677aacc8e3 | |||
| fda937175d | |||
| 024250803a | |||
| b711ce33b7 | |||
| 52bec63275 | |||
| 657fa80f4d | |||
| 373e90ee6d | |||
| 41d4c5b424 | |||
| 86a9dea428 | |||
| 8606d80c66 | |||
| 5bffa1d918 | |||
| c9b0fe47bf | |||
| bcd744b6b7 | |||
| 5e511e01bf | |||
| 52291c645e | |||
| a31466d34e | |||
| d38eac959b | |||
| 9dbb8acd4b | |||
| 46154c6705 | |||
| 54ff03c35d | |||
| 18c710c906 | |||
| 59236b789f | |||
| fd3d43cae1 | |||
| 8eae643911 | |||
| fd9413874a | |||
| 227f9fb77d | |||
| c40ee7e629 | |||
| 841e967d48 | |||
| 9df0dcedae | |||
| 724e053732 | |||
| e409895c02 | |||
| 32d9b6181c | |||
| 2b018fade2 | |||
| e65f9cb17a | |||
| 1367f34398 | |||
| e47f6b879a | |||
| 5809edd74b | |||
| 05bfa11915 | |||
| 435f804c6f | |||
| ae3f1ac0a9 | |||
| 269a465fc4 | |||
| 60e0bbd713 | |||
| 827c97f0d3 | |||
| c8bd76cd66 | |||
| ec5f585df4 | |||
| 1de48f33ca | |||
| 6b41a9593e | |||
| 82267083e8 | |||
| c385961d33 | |||
| 20bab6edec | |||
| 67bed54f32 | |||
| 562a571281 | |||
| fc68c81791 | |||
| 5d9070bc60 | |||
| b11fb0dfd1 | |||
| d1c5c5f160 | |||
| 0b1d1440aa | |||
| 0c420d64b3 | |||
| f9082104ed | |||
| 983834cd52 | |||
| 96d10c8b39 | |||
| 24cb992843 | |||
| 7907c0bf58 | |||
| ebf4fd9a09 | |||
| 38b9901274 | |||
| 642842d61b | |||
| e161c511af | |||
| f29e82685e | |||
| 3a5ae96e7b | |||
| b63a685386 | |||
| 877da82b06 | |||
| 6637629045 | |||
| e925b6c572 | |||
| 5412f4aba5 | |||
| 2d5ad0d208 | |||
| 1ade70aa1e | |||
| 2658c4d57b | |||
| 84c76bc04a | |||
| 6effcd3755 | |||
| d9866489f0 | |||
| c4d8bdc3db | |||
| 681eb1cfcc | |||
| a5d21f3b09 | |||
| 7ba068c3e4 | |||
| b201eeedbd | |||
| f28cb84977 | |||
| 714872cd58 | |||
| 0708bd60ee | |||
| 23a6c85b80 | |||
| 4a28599fbd | |||
| 7c66d3c793 | |||
| cc9edfffd8 | |||
| 6fa2454c9a | |||
| 487e699021 | |||
| a7cdb745c1 | |||
| 73c86ee6a0 | |||
| 48eb590065 | |||
| 33562a9d8d | |||
| c9194ba382 | |||
| a199fa6388 | |||
| 4c8608dc61 | |||
| a6b0f788e7 | |||
| df6604a734 |
19
.claude/settings.json.example
Normal file
19
.claude/settings.json.example
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [],
|
||||
"deny": []
|
||||
},
|
||||
"env": {
|
||||
"__comment": "Environment variables for MCP servers. Override in .claude/settings.local.json with actual values.",
|
||||
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
|
||||
},
|
||||
"enabledMcpjsonServers": [
|
||||
"context7",
|
||||
"sequential-thinking",
|
||||
"github",
|
||||
"fetch",
|
||||
"playwright",
|
||||
"ide"
|
||||
],
|
||||
"enableAllProjectMcpServers": true
|
||||
}
|
||||
6
.cursorrules
Normal file
6
.cursorrules
Normal file
@ -0,0 +1,6 @@
|
||||
# Cursor Rules for Dify Project
|
||||
|
||||
## Automated Test Generation
|
||||
|
||||
- Use `web/testing/testing.md` as the canonical instruction set for generating frontend automated tests.
|
||||
- When proposing or saving tests, re-read that document and follow every requirement.
|
||||
@ -1,11 +1,4 @@
|
||||
FROM mcr.microsoft.com/devcontainers/anaconda:0-3
|
||||
FROM mcr.microsoft.com/devcontainers/python:3.12-bookworm
|
||||
|
||||
# Copy environment.yml (if found) to a temp location so we update the environment. Also
|
||||
# copy "noop.txt" so the COPY instruction does not fail if no environment.yml exists.
|
||||
COPY environment.yml* .devcontainer/noop.txt /tmp/conda-tmp/
|
||||
RUN if [ -f "/tmp/conda-tmp/environment.yml" ]; then umask 0002 && /opt/conda/bin/conda env update -n base -f /tmp/conda-tmp/environment.yml; fi \
|
||||
&& rm -rf /tmp/conda-tmp
|
||||
|
||||
# [Optional] Uncomment this section to install additional OS packages.
|
||||
# RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
||||
# && apt-get -y install --no-install-recommends <your-package-list-here>
|
||||
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
|
||||
&& apt-get -y install libgmp-dev libmpfr-dev libmpc-dev
|
||||
|
||||
@ -1,23 +1,26 @@
|
||||
# Devlopment with devcontainer
|
||||
# Development with devcontainer
|
||||
|
||||
This project includes a devcontainer configuration that allows you to open the project in a container with a fully configured development environment.
|
||||
Both frontend and backend environments are initialized when the container is started.
|
||||
|
||||
## GitHub Codespaces
|
||||
|
||||
[](https://codespaces.new/langgenius/dify)
|
||||
|
||||
you can simply click the button above to open this project in GitHub Codespaces.
|
||||
|
||||
For more info, check out the [GitHub documentation](https://docs.github.com/en/free-pro-team@latest/github/developing-online-with-codespaces/creating-a-codespace#creating-a-codespace).
|
||||
|
||||
|
||||
## VS Code Dev Containers
|
||||
|
||||
[](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/langgenius/dify)
|
||||
|
||||
if you have VS Code installed, you can click the button above to open this project in VS Code Dev Containers.
|
||||
|
||||
You can learn more in the [Dev Containers documentation](https://code.visualstudio.com/docs/devcontainers/containers).
|
||||
|
||||
|
||||
## Pros of Devcontainer
|
||||
|
||||
Unified Development Environment: By using devcontainers, you can ensure that all developers are developing in the same environment, reducing the occurrence of "it works on my machine" type of issues.
|
||||
|
||||
Quick Start: New developers can set up their development environment in a few simple steps, without spending a lot of time on environment configuration.
|
||||
@ -25,13 +28,15 @@ Quick Start: New developers can set up their development environment in a few si
|
||||
Isolation: Devcontainers isolate your project from your host operating system, reducing the chance of OS updates or other application installations impacting the development environment.
|
||||
|
||||
## Cons of Devcontainer
|
||||
|
||||
Learning Curve: For developers unfamiliar with Docker and VS Code, using devcontainers may be somewhat complex.
|
||||
|
||||
Performance Impact: While usually minimal, programs running inside a devcontainer may be slightly slower than those running directly on the host.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
if you see such error message when you open this project in codespaces:
|
||||

|
||||
|
||||
a simple workaround is change `/signin` endpoint into another one, then login with github account and close the tab, then change it back to `/signin` endpoint. Then all things will be fine.
|
||||
The reason is `signin` endpoint is not allowed in codespaces, details can be found [here](https://github.com/orgs/community/discussions/5204)
|
||||
a simple workaround is change `/signin` endpoint into another one, then login with GitHub account and close the tab, then change it back to `/signin` endpoint. Then all things will be fine.
|
||||
The reason is `signin` endpoint is not allowed in codespaces, details can be found [here](https://github.com/orgs/community/discussions/5204)
|
||||
|
||||
@ -1,18 +1,17 @@
|
||||
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
|
||||
// README at: https://github.com/devcontainers/templates/tree/main/src/anaconda
|
||||
{
|
||||
"name": "Anaconda (Python 3)",
|
||||
"build": {
|
||||
"name": "Python 3.12",
|
||||
"build": {
|
||||
"context": "..",
|
||||
"dockerfile": "Dockerfile"
|
||||
},
|
||||
"features": {
|
||||
"ghcr.io/dhoeric/features/act:1": {},
|
||||
"ghcr.io/devcontainers/features/node:1": {
|
||||
"nodeGypDependencies": true,
|
||||
"version": "lts"
|
||||
},
|
||||
"ghcr.io/devcontainers-contrib/features/npm-package:1": {
|
||||
"ghcr.io/devcontainers-extra/features/npm-package:1": {
|
||||
"package": "typescript",
|
||||
"version": "latest"
|
||||
},
|
||||
@ -33,8 +32,8 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"postStartCommand": "cd api && pip install -r requirements.txt",
|
||||
"postCreateCommand": "cd web && npm install"
|
||||
"postStartCommand": "./.devcontainer/post_start_command.sh",
|
||||
"postCreateCommand": "./.devcontainer/post_create_command.sh"
|
||||
|
||||
// Features to add to the dev container. More info: https://containers.dev/features.
|
||||
// "features": {},
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
This file copied into the container along with environment.yml* from the parent
|
||||
folder. This file is included to prevents the Dockerfile COPY instruction from
|
||||
failing if no environment.yml is found.
|
||||
folder. This file is included to prevents the Dockerfile COPY instruction from
|
||||
failing if no environment.yml is found.
|
||||
|
||||
15
.devcontainer/post_create_command.sh
Executable file
15
.devcontainer/post_create_command.sh
Executable file
@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
WORKSPACE_ROOT=$(pwd)
|
||||
|
||||
corepack enable
|
||||
cd web && pnpm install
|
||||
pipx install uv
|
||||
|
||||
echo "alias start-api=\"cd $WORKSPACE_ROOT/api && uv run python -m flask run --host 0.0.0.0 --port=5001 --debug\"" >> ~/.bashrc
|
||||
echo "alias start-worker=\"cd $WORKSPACE_ROOT/api && uv run python -m celery -A app.celery worker -P threads -c 1 --loglevel INFO -Q dataset,priority_dataset,priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor\"" >> ~/.bashrc
|
||||
echo "alias start-web=\"cd $WORKSPACE_ROOT/web && pnpm dev\"" >> ~/.bashrc
|
||||
echo "alias start-web-prod=\"cd $WORKSPACE_ROOT/web && pnpm build && pnpm start\"" >> ~/.bashrc
|
||||
echo "alias start-containers=\"cd $WORKSPACE_ROOT/docker && docker-compose -f docker-compose.middleware.yaml -p dify --env-file middleware.env up -d\"" >> ~/.bashrc
|
||||
echo "alias stop-containers=\"cd $WORKSPACE_ROOT/docker && docker-compose -f docker-compose.middleware.yaml -p dify --env-file middleware.env down\"" >> ~/.bashrc
|
||||
|
||||
source /home/vscode/.bashrc
|
||||
3
.devcontainer/post_start_command.sh
Executable file
3
.devcontainer/post_start_command.sh
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
cd api && uv sync
|
||||
39
.editorconfig
Normal file
39
.editorconfig
Normal file
@ -0,0 +1,39 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
# Unix-style newlines with a newline ending every file
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
trim_trailing_whitespace = true
|
||||
|
||||
[*.py]
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
|
||||
[*.{yml,yaml}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.toml]
|
||||
indent_size = 4
|
||||
indent_style = space
|
||||
|
||||
# Markdown and MDX are whitespace sensitive languages.
|
||||
# Do not remove trailing spaces.
|
||||
[*.{md,mdx}]
|
||||
trim_trailing_whitespace = false
|
||||
|
||||
# Matches multiple files with brace expansion notation
|
||||
# Set default charset
|
||||
[*.{js,jsx,ts,tsx,mjs}]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
# Matches the exact files package.json
|
||||
[package.json]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
7
.gitattributes
vendored
Normal file
7
.gitattributes
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
# Ensure that .sh scripts use LF as line separator, even if they are checked out
|
||||
# to Windows(NTFS) file-system, by a user of Docker for Windows.
|
||||
# These .sh scripts will be run from the Container after `docker compose up -d`.
|
||||
# If they appear to be CRLF style, Dash from the Container will fail to execute
|
||||
# them.
|
||||
|
||||
*.sh text eol=lf
|
||||
226
.github/CODEOWNERS
vendored
Normal file
226
.github/CODEOWNERS
vendored
Normal file
@ -0,0 +1,226 @@
|
||||
# CODEOWNERS
|
||||
# This file defines code ownership for the Dify project.
|
||||
# Each line is a file pattern followed by one or more owners.
|
||||
# Owners can be @username, @org/team-name, or email addresses.
|
||||
# For more information, see: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
|
||||
|
||||
* @crazywoola @laipz8200 @Yeuoly
|
||||
|
||||
# Backend (default owner, more specific rules below will override)
|
||||
api/ @QuantumGhost
|
||||
|
||||
# Backend - Workflow - Engine (Core graph execution engine)
|
||||
api/core/workflow/graph_engine/ @laipz8200 @QuantumGhost
|
||||
api/core/workflow/runtime/ @laipz8200 @QuantumGhost
|
||||
api/core/workflow/graph/ @laipz8200 @QuantumGhost
|
||||
api/core/workflow/graph_events/ @laipz8200 @QuantumGhost
|
||||
api/core/workflow/node_events/ @laipz8200 @QuantumGhost
|
||||
api/core/model_runtime/ @laipz8200 @QuantumGhost
|
||||
|
||||
# Backend - Workflow - Nodes (Agent, Iteration, Loop, LLM)
|
||||
api/core/workflow/nodes/agent/ Nov1c444
|
||||
api/core/workflow/nodes/iteration/ Nov1c444
|
||||
api/core/workflow/nodes/loop/ Nov1c444
|
||||
api/core/workflow/nodes/llm/ Nov1c444
|
||||
|
||||
# Backend - RAG (Retrieval Augmented Generation)
|
||||
api/core/rag/ @JohnJyong
|
||||
api/services/rag_pipeline/ @JohnJyong
|
||||
api/services/dataset_service.py @JohnJyong
|
||||
api/services/knowledge_service.py @JohnJyong
|
||||
api/services/external_knowledge_service.py @JohnJyong
|
||||
api/services/hit_testing_service.py @JohnJyong
|
||||
api/services/metadata_service.py @JohnJyong
|
||||
api/services/vector_service.py @JohnJyong
|
||||
api/services/entities/knowledge_entities/ @JohnJyong
|
||||
api/services/entities/external_knowledge_entities/ @JohnJyong
|
||||
api/controllers/console/datasets/ @JohnJyong
|
||||
api/controllers/service_api/dataset/ @JohnJyong
|
||||
api/models/dataset.py @JohnJyong
|
||||
api/tasks/rag_pipeline/ @JohnJyong
|
||||
api/tasks/add_document_to_index_task.py @JohnJyong
|
||||
api/tasks/batch_clean_document_task.py @JohnJyong
|
||||
api/tasks/clean_document_task.py @JohnJyong
|
||||
api/tasks/clean_notion_document_task.py @JohnJyong
|
||||
api/tasks/document_indexing_task.py @JohnJyong
|
||||
api/tasks/document_indexing_sync_task.py @JohnJyong
|
||||
api/tasks/document_indexing_update_task.py @JohnJyong
|
||||
api/tasks/duplicate_document_indexing_task.py @JohnJyong
|
||||
api/tasks/recover_document_indexing_task.py @JohnJyong
|
||||
api/tasks/remove_document_from_index_task.py @JohnJyong
|
||||
api/tasks/retry_document_indexing_task.py @JohnJyong
|
||||
api/tasks/sync_website_document_indexing_task.py @JohnJyong
|
||||
api/tasks/batch_create_segment_to_index_task.py @JohnJyong
|
||||
api/tasks/create_segment_to_index_task.py @JohnJyong
|
||||
api/tasks/delete_segment_from_index_task.py @JohnJyong
|
||||
api/tasks/disable_segment_from_index_task.py @JohnJyong
|
||||
api/tasks/disable_segments_from_index_task.py @JohnJyong
|
||||
api/tasks/enable_segment_to_index_task.py @JohnJyong
|
||||
api/tasks/enable_segments_to_index_task.py @JohnJyong
|
||||
api/tasks/clean_dataset_task.py @JohnJyong
|
||||
api/tasks/deal_dataset_index_update_task.py @JohnJyong
|
||||
api/tasks/deal_dataset_vector_index_task.py @JohnJyong
|
||||
|
||||
# Backend - Plugins
|
||||
api/core/plugin/ @Mairuis @Yeuoly @Stream29
|
||||
api/services/plugin/ @Mairuis @Yeuoly @Stream29
|
||||
api/controllers/console/workspace/plugin.py @Mairuis @Yeuoly @Stream29
|
||||
api/controllers/inner_api/plugin/ @Mairuis @Yeuoly @Stream29
|
||||
api/tasks/process_tenant_plugin_autoupgrade_check_task.py @Mairuis @Yeuoly @Stream29
|
||||
|
||||
# Backend - Trigger/Schedule/Webhook
|
||||
api/controllers/trigger/ @Mairuis @Yeuoly
|
||||
api/controllers/console/app/workflow_trigger.py @Mairuis @Yeuoly
|
||||
api/controllers/console/workspace/trigger_providers.py @Mairuis @Yeuoly
|
||||
api/core/trigger/ @Mairuis @Yeuoly
|
||||
api/core/app/layers/trigger_post_layer.py @Mairuis @Yeuoly
|
||||
api/services/trigger/ @Mairuis @Yeuoly
|
||||
api/models/trigger.py @Mairuis @Yeuoly
|
||||
api/fields/workflow_trigger_fields.py @Mairuis @Yeuoly
|
||||
api/repositories/workflow_trigger_log_repository.py @Mairuis @Yeuoly
|
||||
api/repositories/sqlalchemy_workflow_trigger_log_repository.py @Mairuis @Yeuoly
|
||||
api/libs/schedule_utils.py @Mairuis @Yeuoly
|
||||
api/services/workflow/scheduler.py @Mairuis @Yeuoly
|
||||
api/schedule/trigger_provider_refresh_task.py @Mairuis @Yeuoly
|
||||
api/schedule/workflow_schedule_task.py @Mairuis @Yeuoly
|
||||
api/tasks/trigger_processing_tasks.py @Mairuis @Yeuoly
|
||||
api/tasks/trigger_subscription_refresh_tasks.py @Mairuis @Yeuoly
|
||||
api/tasks/workflow_schedule_tasks.py @Mairuis @Yeuoly
|
||||
api/tasks/workflow_cfs_scheduler/ @Mairuis @Yeuoly
|
||||
api/events/event_handlers/sync_plugin_trigger_when_app_created.py @Mairuis @Yeuoly
|
||||
api/events/event_handlers/update_app_triggers_when_app_published_workflow_updated.py @Mairuis @Yeuoly
|
||||
api/events/event_handlers/sync_workflow_schedule_when_app_published.py @Mairuis @Yeuoly
|
||||
api/events/event_handlers/sync_webhook_when_app_created.py @Mairuis @Yeuoly
|
||||
|
||||
# Backend - Async Workflow
|
||||
api/services/async_workflow_service.py @Mairuis @Yeuoly
|
||||
api/tasks/async_workflow_tasks.py @Mairuis @Yeuoly
|
||||
|
||||
# Backend - Billing
|
||||
api/services/billing_service.py @hj24 @zyssyz123
|
||||
api/controllers/console/billing/ @hj24 @zyssyz123
|
||||
|
||||
# Backend - Enterprise
|
||||
api/configs/enterprise/ @GarfieldDai @GareArc
|
||||
api/services/enterprise/ @GarfieldDai @GareArc
|
||||
api/services/feature_service.py @GarfieldDai @GareArc
|
||||
api/controllers/console/feature.py @GarfieldDai @GareArc
|
||||
api/controllers/web/feature.py @GarfieldDai @GareArc
|
||||
|
||||
# Backend - Database Migrations
|
||||
api/migrations/ @snakevash @laipz8200
|
||||
|
||||
# Frontend
|
||||
web/ @iamjoel
|
||||
|
||||
# Frontend - App - Orchestration
|
||||
web/app/components/workflow/ @iamjoel @zxhlyh
|
||||
web/app/components/workflow-app/ @iamjoel @zxhlyh
|
||||
web/app/components/app/configuration/ @iamjoel @zxhlyh
|
||||
web/app/components/app/app-publisher/ @iamjoel @zxhlyh
|
||||
|
||||
# Frontend - WebApp - Chat
|
||||
web/app/components/base/chat/ @iamjoel @zxhlyh
|
||||
|
||||
# Frontend - WebApp - Completion
|
||||
web/app/components/share/text-generation/ @iamjoel @zxhlyh
|
||||
|
||||
# Frontend - App - List and Creation
|
||||
web/app/components/apps/ @JzoNgKVO @iamjoel
|
||||
web/app/components/app/create-app-dialog/ @JzoNgKVO @iamjoel
|
||||
web/app/components/app/create-app-modal/ @JzoNgKVO @iamjoel
|
||||
web/app/components/app/create-from-dsl-modal/ @JzoNgKVO @iamjoel
|
||||
|
||||
# Frontend - App - API Documentation
|
||||
web/app/components/develop/ @JzoNgKVO @iamjoel
|
||||
|
||||
# Frontend - App - Logs and Annotations
|
||||
web/app/components/app/workflow-log/ @JzoNgKVO @iamjoel
|
||||
web/app/components/app/log/ @JzoNgKVO @iamjoel
|
||||
web/app/components/app/log-annotation/ @JzoNgKVO @iamjoel
|
||||
web/app/components/app/annotation/ @JzoNgKVO @iamjoel
|
||||
|
||||
# Frontend - App - Monitoring
|
||||
web/app/(commonLayout)/app/(appDetailLayout)/\[appId\]/overview/ @JzoNgKVO @iamjoel
|
||||
web/app/components/app/overview/ @JzoNgKVO @iamjoel
|
||||
|
||||
# Frontend - App - Settings
|
||||
web/app/components/app-sidebar/ @JzoNgKVO @iamjoel
|
||||
|
||||
# Frontend - RAG - Hit Testing
|
||||
web/app/components/datasets/hit-testing/ @JzoNgKVO @iamjoel
|
||||
|
||||
# Frontend - RAG - List and Creation
|
||||
web/app/components/datasets/list/ @iamjoel @WTW0313
|
||||
web/app/components/datasets/create/ @iamjoel @WTW0313
|
||||
web/app/components/datasets/create-from-pipeline/ @iamjoel @WTW0313
|
||||
web/app/components/datasets/external-knowledge-base/ @iamjoel @WTW0313
|
||||
|
||||
# Frontend - RAG - Orchestration (general rule first, specific rules below override)
|
||||
web/app/components/rag-pipeline/ @iamjoel @WTW0313
|
||||
web/app/components/rag-pipeline/components/rag-pipeline-main.tsx @iamjoel @zxhlyh
|
||||
web/app/components/rag-pipeline/store/ @iamjoel @zxhlyh
|
||||
|
||||
# Frontend - RAG - Documents List
|
||||
web/app/components/datasets/documents/list.tsx @iamjoel @WTW0313
|
||||
web/app/components/datasets/documents/create-from-pipeline/ @iamjoel @WTW0313
|
||||
|
||||
# Frontend - RAG - Segments List
|
||||
web/app/components/datasets/documents/detail/ @iamjoel @WTW0313
|
||||
|
||||
# Frontend - RAG - Settings
|
||||
web/app/components/datasets/settings/ @iamjoel @WTW0313
|
||||
|
||||
# Frontend - Ecosystem - Plugins
|
||||
web/app/components/plugins/ @iamjoel @zhsama
|
||||
|
||||
# Frontend - Ecosystem - Tools
|
||||
web/app/components/tools/ @iamjoel @Yessenia-d
|
||||
|
||||
# Frontend - Ecosystem - MarketPlace
|
||||
web/app/components/plugins/marketplace/ @iamjoel @Yessenia-d
|
||||
|
||||
# Frontend - Login and Registration
|
||||
web/app/signin/ @douxc @iamjoel
|
||||
web/app/signup/ @douxc @iamjoel
|
||||
web/app/reset-password/ @douxc @iamjoel
|
||||
web/app/install/ @douxc @iamjoel
|
||||
web/app/init/ @douxc @iamjoel
|
||||
web/app/forgot-password/ @douxc @iamjoel
|
||||
web/app/account/ @douxc @iamjoel
|
||||
|
||||
# Frontend - Service Authentication
|
||||
web/service/base.ts @douxc @iamjoel
|
||||
|
||||
# Frontend - WebApp Authentication and Access Control
|
||||
web/app/(shareLayout)/components/ @douxc @iamjoel
|
||||
web/app/(shareLayout)/webapp-signin/ @douxc @iamjoel
|
||||
web/app/(shareLayout)/webapp-reset-password/ @douxc @iamjoel
|
||||
web/app/components/app/app-access-control/ @douxc @iamjoel
|
||||
|
||||
# Frontend - Explore Page
|
||||
web/app/components/explore/ @CodingOnStar @iamjoel
|
||||
|
||||
# Frontend - Personal Settings
|
||||
web/app/components/header/account-setting/ @CodingOnStar @iamjoel
|
||||
web/app/components/header/account-dropdown/ @CodingOnStar @iamjoel
|
||||
|
||||
# Frontend - Analytics
|
||||
web/app/components/base/ga/ @CodingOnStar @iamjoel
|
||||
|
||||
# Frontend - Base Components
|
||||
web/app/components/base/ @iamjoel @zxhlyh
|
||||
|
||||
# Frontend - Utils and Hooks
|
||||
web/utils/classnames.ts @iamjoel @zxhlyh
|
||||
web/utils/time.ts @iamjoel @zxhlyh
|
||||
web/utils/format.ts @iamjoel @zxhlyh
|
||||
web/utils/clipboard.ts @iamjoel @zxhlyh
|
||||
web/hooks/use-document-title.ts @iamjoel @zxhlyh
|
||||
|
||||
# Frontend - Billing and Education
|
||||
web/app/components/billing/ @iamjoel @zxhlyh
|
||||
web/app/education-apply/ @iamjoel @zxhlyh
|
||||
|
||||
# Frontend - Workspace
|
||||
web/app/components/header/account-dropdown/workplace-selector/ @iamjoel @zxhlyh
|
||||
41
.github/CODE_OF_CONDUCT.md
vendored
Normal file
41
.github/CODE_OF_CONDUCT.md
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
# Dify Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, caste, color, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
- Demonstrating empathy and kindness toward other people
|
||||
- Being respectful of differing opinions, viewpoints, and experiences
|
||||
- Giving and gracefully accepting constructive feedback
|
||||
- Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
- Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
- The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
- Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
- Public or private harassment
|
||||
- Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
- Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Language Policy
|
||||
|
||||
To facilitate clear and effective communication, all discussions, comments, documentation, and pull requests in this project should be conducted in English. This ensures that all contributors can participate and collaborate effectively.
|
||||
24
.github/DISCUSSION_TEMPLATE/general.yml
vendored
Normal file
24
.github/DISCUSSION_TEMPLATE/general.yml
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
title: "General Discussion"
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Self Checks
|
||||
description: "To make sure we get to you in time, please check the following :)"
|
||||
options:
|
||||
- label: I have searched for existing issues [search for existing issues](https://github.com/langgenius/dify/issues), including closed ones.
|
||||
required: true
|
||||
- label: I confirm that I am using English to submit this report (我已阅读并同意 [Language Policy](https://github.com/langgenius/dify/issues/1542)).
|
||||
required: true
|
||||
- label: "[FOR CHINESE USERS] 请务必使用英文提交 Issue,否则会被关闭。谢谢!:)"
|
||||
required: true
|
||||
- label: "Please do not modify this template :) and fill in all the required fields."
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Content
|
||||
placeholder: Please describe the content you would like to discuss.
|
||||
validations:
|
||||
required: true
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: Please limit one request per issue.
|
||||
30
.github/DISCUSSION_TEMPLATE/help.yml
vendored
Normal file
30
.github/DISCUSSION_TEMPLATE/help.yml
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
title: "Help"
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Self Checks
|
||||
description: "To make sure we get to you in time, please check the following :)"
|
||||
options:
|
||||
- label: I have searched for existing issues [search for existing issues](https://github.com/langgenius/dify/issues), including closed ones.
|
||||
required: true
|
||||
- label: I confirm that I am using English to submit this report (我已阅读并同意 [Language Policy](https://github.com/langgenius/dify/issues/1542)).
|
||||
required: true
|
||||
- label: "[FOR CHINESE USERS] 请务必使用英文提交 Issue,否则会被关闭。谢谢!:)"
|
||||
required: true
|
||||
- label: "Please do not modify this template :) and fill in all the required fields."
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 1. Is this request related to a challenge you're experiencing? Tell me about your story.
|
||||
placeholder: Please describe the specific scenario or problem you're facing as clearly as possible. For instance "I was trying to use [feature] for [specific task], and [what happened]... It was frustrating because...."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 2. Additional context or comments
|
||||
placeholder: (Any other information, comments, documentations, links, or screenshots that would provide more clarity. This is the place to add anything else not covered above.)
|
||||
validations:
|
||||
required: false
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: Please limit one request per issue.
|
||||
37
.github/DISCUSSION_TEMPLATE/suggestion.yml
vendored
Normal file
37
.github/DISCUSSION_TEMPLATE/suggestion.yml
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
title: Suggestions for New Features
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Self Checks
|
||||
description: "To make sure we get to you in time, please check the following :)"
|
||||
options:
|
||||
- label: I have searched for existing issues [search for existing issues](https://github.com/langgenius/dify/issues), including closed ones.
|
||||
required: true
|
||||
- label: I confirm that I am using English to submit this report (我已阅读并同意 [Language Policy](https://github.com/langgenius/dify/issues/1542)).
|
||||
required: true
|
||||
- label: "[FOR CHINESE USERS] 请务必使用英文提交 Issue,否则会被关闭。谢谢!:)"
|
||||
required: true
|
||||
- label: "Please do not modify this template :) and fill in all the required fields."
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 1. Is this request related to a challenge you're experiencing? Tell me about your story.
|
||||
placeholder: Please describe the specific scenario or problem you're facing as clearly as possible. For instance "I was trying to use [feature] for [specific task], and [what happened]... It was frustrating because...."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 2. Additional context or comments
|
||||
placeholder: (Any other information, comments, documentations, links, or screenshots that would provide more clarity. This is the place to add anything else not covered above.)
|
||||
validations:
|
||||
required: false
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: 3. Can you help us with this feature?
|
||||
description: Let us know! This is not a commitment, but a starting point for collaboration.
|
||||
options:
|
||||
- label: I am interested in contributing to this feature.
|
||||
required: false
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: Please limit one request per issue.
|
||||
65
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
65
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
name: "🕷️ Bug report"
|
||||
description: Report errors or unexpected behavior
|
||||
labels:
|
||||
- bug
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Self Checks
|
||||
description: "To make sure we get to you in time, please check the following :)"
|
||||
options:
|
||||
- label: I have read the [Contributing Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) and [Language Policy](https://github.com/langgenius/dify/issues/1542).
|
||||
required: true
|
||||
- label: This is only for bug report, if you would like to ask a question, please head to [Discussions](https://github.com/langgenius/dify/discussions/categories/general).
|
||||
required: true
|
||||
- label: I have searched for existing issues [search for existing issues](https://github.com/langgenius/dify/issues), including closed ones.
|
||||
required: true
|
||||
- label: I confirm that I am using English to submit this report, otherwise it will be closed.
|
||||
required: true
|
||||
- label: 【中文用户 & Non English User】请使用英语提交,否则会被关闭 :)
|
||||
required: true
|
||||
- label: "Please do not modify this template :) and fill in all the required fields."
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Dify version
|
||||
description: See about section in Dify console
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: dropdown
|
||||
attributes:
|
||||
label: Cloud or Self Hosted
|
||||
description: How / Where was Dify installed from?
|
||||
multiple: true
|
||||
options:
|
||||
- Cloud
|
||||
- Self Hosted (Docker)
|
||||
- Self Hosted (Source)
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Steps to reproduce
|
||||
description: We highly suggest including screenshots and a bug report log. Please use the right markdown syntax for code blocks.
|
||||
placeholder: Having detailed steps helps us reproduce the bug. If you have logs, please use fenced code blocks (triple backticks ```) to format them.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: ✔️ Expected Behavior
|
||||
description: Describe what you expected to happen.
|
||||
placeholder: What were you expecting? Please do not copy and paste the steps to reproduce here.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: ❌ Actual Behavior
|
||||
description: Describe what actually happened.
|
||||
placeholder: What happened instead? Please do not copy and paste the steps to reproduce here.
|
||||
validations:
|
||||
required: false
|
||||
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: "\U0001F510 Security Vulnerabilities"
|
||||
url: "https://github.com/langgenius/dify/security/advisories/new"
|
||||
about: Report security vulnerabilities through GitHub Security Advisories to ensure responsible disclosure. 💡 Please do not report security vulnerabilities in public issues.
|
||||
- name: "\U0001F4A1 Model Providers & Plugins"
|
||||
url: "https://github.com/langgenius/dify-official-plugins/issues/new/choose"
|
||||
about: Report issues with official plugins or model providers, you will need to provide the plugin version and other relevant details.
|
||||
- name: "\U0001F4AC Documentation Issues"
|
||||
url: "https://github.com/langgenius/dify-docs/issues/new"
|
||||
about: Report issues with the documentation, such as typos, outdated information, or missing content. Please provide the specific section and details of the issue.
|
||||
- name: "\U0001F4E7 Discussions"
|
||||
url: https://github.com/langgenius/dify/discussions/categories/general
|
||||
about: General discussions and seek help from the community
|
||||
40
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
40
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
name: "⭐ Feature or enhancement request"
|
||||
description: Propose something new.
|
||||
labels:
|
||||
- enhancement
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Self Checks
|
||||
description: "To make sure we get to you in time, please check the following :)"
|
||||
options:
|
||||
- label: I have read the [Contributing Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) and [Language Policy](https://github.com/langgenius/dify/issues/1542).
|
||||
required: true
|
||||
- label: I have searched for existing issues [search for existing issues](https://github.com/langgenius/dify/issues), including closed ones.
|
||||
required: true
|
||||
- label: I confirm that I am using English to submit this report, otherwise it will be closed.
|
||||
required: true
|
||||
- label: "Please do not modify this template :) and fill in all the required fields."
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 1. Is this request related to a challenge you're experiencing? Tell me about your story.
|
||||
placeholder: Please describe the specific scenario or problem you're facing as clearly as possible. For instance "I was trying to use [feature] for [specific task], and [what happened]... It was frustrating because...."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: 2. Additional context or comments
|
||||
placeholder: (Any other information, comments, documentations, links, or screenshots that would provide more clarity. This is the place to add anything else not covered above.)
|
||||
validations:
|
||||
required: false
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: 3. Can you help us with this feature?
|
||||
description: Let us know! This is not a commitment, but a starting point for collaboration.
|
||||
options:
|
||||
- label: I am interested in contributing to this feature.
|
||||
required: false
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: Please limit one request per issue.
|
||||
44
.github/ISSUE_TEMPLATE/refactor.yml
vendored
Normal file
44
.github/ISSUE_TEMPLATE/refactor.yml
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
name: "✨ Refactor"
|
||||
description: Refactor existing code for improved readability and maintainability.
|
||||
title: "[Chore/Refactor] "
|
||||
labels:
|
||||
- refactor
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Self Checks
|
||||
description: "To make sure we get to you in time, please check the following :)"
|
||||
options:
|
||||
- label: I have read the [Contributing Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) and [Language Policy](https://github.com/langgenius/dify/issues/1542).
|
||||
required: true
|
||||
- label: This is only for refactoring, if you would like to ask a question, please head to [Discussions](https://github.com/langgenius/dify/discussions/categories/general).
|
||||
required: true
|
||||
- label: I have searched for existing issues [search for existing issues](https://github.com/langgenius/dify/issues), including closed ones.
|
||||
required: true
|
||||
- label: I confirm that I am using English to submit this report, otherwise it will be closed.
|
||||
required: true
|
||||
- label: 【中文用户 & Non English User】请使用英语提交,否则会被关闭 :)
|
||||
required: true
|
||||
- label: "Please do not modify this template :) and fill in all the required fields."
|
||||
required: true
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Description
|
||||
placeholder: "Describe the refactor you are proposing."
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: motivation
|
||||
attributes:
|
||||
label: Motivation
|
||||
placeholder: "Explain why this refactor is necessary."
|
||||
validations:
|
||||
required: false
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
attributes:
|
||||
label: Additional Context
|
||||
placeholder: "Add any other context or screenshots about the request here."
|
||||
validations:
|
||||
required: false
|
||||
13
.github/ISSUE_TEMPLATE/tracker.yml
vendored
Normal file
13
.github/ISSUE_TEMPLATE/tracker.yml
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
name: "👾 Tracker"
|
||||
description: For inner usages, please do not use this template.
|
||||
title: "[Tracker] "
|
||||
labels:
|
||||
- tracker
|
||||
body:
|
||||
- type: textarea
|
||||
id: content
|
||||
attributes:
|
||||
label: Blockers
|
||||
placeholder: "- [ ] ..."
|
||||
validations:
|
||||
required: true
|
||||
32
.github/ISSUE_TEMPLATE/🐛-bug-report.md
vendored
32
.github/ISSUE_TEMPLATE/🐛-bug-report.md
vendored
@ -1,32 +0,0 @@
|
||||
---
|
||||
name: "\U0001F41B Bug report"
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: bug
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
Please provide a clear and concise description of what the bug is. Include
|
||||
screenshots if needed. Please test using the latest version of the relevant
|
||||
Dify packages to make sure your issue has not already been fixed.
|
||||
-->
|
||||
|
||||
Dify version: Cloud | Self Host
|
||||
|
||||
## Steps To Reproduce
|
||||
<!--
|
||||
Your bug will get fixed much faster if we can run your code and it doesn't
|
||||
have dependencies other than Dify. Issues without reproduction steps or
|
||||
code examples may be immediately closed as not actionable.
|
||||
-->
|
||||
|
||||
1.
|
||||
2.
|
||||
|
||||
|
||||
## The current behavior
|
||||
|
||||
|
||||
## The expected behavior
|
||||
20
.github/ISSUE_TEMPLATE/🚀-feature-request.md
vendored
20
.github/ISSUE_TEMPLATE/🚀-feature-request.md
vendored
@ -1,20 +0,0 @@
|
||||
---
|
||||
name: "\U0001F680 Feature request"
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
10
.github/ISSUE_TEMPLATE/🤔-questions-and-help.md
vendored
10
.github/ISSUE_TEMPLATE/🤔-questions-and-help.md
vendored
@ -1,10 +0,0 @@
|
||||
---
|
||||
name: "\U0001F914 Questions and Help"
|
||||
about: Ask a usage or consultation question
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
|
||||
12
.github/copilot-instructions.md
vendored
Normal file
12
.github/copilot-instructions.md
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
# Copilot Instructions
|
||||
|
||||
GitHub Copilot must follow the unified frontend testing requirements documented in `web/testing/testing.md`.
|
||||
|
||||
Key reminders:
|
||||
|
||||
- Generate tests using the mandated tech stack, naming, and code style (AAA pattern, `fireEvent`, descriptive test names, cleans up mocks).
|
||||
- Cover rendering, prop combinations, and edge cases by default; extend coverage for hooks, routing, async flows, and domain-specific components when applicable.
|
||||
- Target >95% line and branch coverage and 100% function/statement coverage.
|
||||
- Apply the project's mocking conventions for i18n, toast notifications, and Next.js utilities.
|
||||
|
||||
Any suggestions from Copilot that conflict with `web/testing/testing.md` should be revised before acceptance.
|
||||
12
.github/dependabot.yml
vendored
Normal file
12
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm"
|
||||
directory: "/web"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
open-pull-requests-limit: 2
|
||||
- package-ecosystem: "uv"
|
||||
directory: "/api"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
open-pull-requests-limit: 2
|
||||
1
.github/linters/.hadolint.yaml
vendored
Normal file
1
.github/linters/.hadolint.yaml
vendored
Normal file
@ -0,0 +1 @@
|
||||
failure-threshold: "error"
|
||||
2
.github/linters/.isort.cfg
vendored
Normal file
2
.github/linters/.isort.cfg
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
[settings]
|
||||
line_length=120
|
||||
11
.github/linters/.yaml-lint.yml
vendored
Normal file
11
.github/linters/.yaml-lint.yml
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
---
|
||||
|
||||
extends: default
|
||||
|
||||
rules:
|
||||
brackets:
|
||||
max-spaces-inside: 1
|
||||
comments-indentation: disable
|
||||
document-start: disable
|
||||
line-length: disable
|
||||
truthy: disable
|
||||
22
.github/linters/editorconfig-checker.json
vendored
Normal file
22
.github/linters/editorconfig-checker.json
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
{
|
||||
"Verbose": false,
|
||||
"Debug": false,
|
||||
"IgnoreDefaults": false,
|
||||
"SpacesAfterTabs": false,
|
||||
"NoColor": false,
|
||||
"Exclude": [
|
||||
"^web/public/vs/",
|
||||
"^web/public/pdf.worker.min.mjs$",
|
||||
"web/app/components/base/icons/src/vender/"
|
||||
],
|
||||
"AllowedContentTypes": [],
|
||||
"PassedFiles": [],
|
||||
"Disable": {
|
||||
"EndOfLine": false,
|
||||
"Indentation": false,
|
||||
"IndentSize": true,
|
||||
"InsertFinalNewline": false,
|
||||
"TrimTrailingWhitespace": false,
|
||||
"MaxLineLength": false
|
||||
}
|
||||
}
|
||||
23
.github/pull_request_template.md
vendored
Normal file
23
.github/pull_request_template.md
vendored
Normal file
@ -0,0 +1,23 @@
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> 1. Make sure you have read our [contribution guidelines](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md)
|
||||
> 1. Ensure there is an associated issue and you have been assigned to it
|
||||
> 1. Use the correct syntax to link this PR: `Fixes #<issue number>`.
|
||||
|
||||
## Summary
|
||||
|
||||
<!-- Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. -->
|
||||
|
||||
## Screenshots
|
||||
|
||||
| Before | After |
|
||||
|--------|-------|
|
||||
| ... | ... |
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] This change requires a documentation update, included: [Dify Document](https://github.com/langgenius/dify-docs)
|
||||
- [x] I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!)
|
||||
- [x] I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change.
|
||||
- [x] I've updated the documentation accordingly.
|
||||
- [x] I ran `dev/reformat`(backend) and `cd web && npx lint-staged`(frontend) to appease the lint gods
|
||||
97
.github/workflows/api-tests.yml
vendored
Normal file
97
.github/workflows/api-tests.yml
vendored
Normal file
@ -0,0 +1,97 @@
|
||||
name: Run Pytest
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
concurrency:
|
||||
group: api-tests-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: API Tests
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
strategy:
|
||||
matrix:
|
||||
python-version:
|
||||
- "3.11"
|
||||
- "3.12"
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup UV and Python
|
||||
uses: astral-sh/setup-uv@v6
|
||||
with:
|
||||
enable-cache: true
|
||||
python-version: ${{ matrix.python-version }}
|
||||
cache-dependency-glob: api/uv.lock
|
||||
|
||||
- name: Check UV lockfile
|
||||
run: uv lock --project api --check
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --project api --dev
|
||||
|
||||
- name: Run pyrefly check
|
||||
run: |
|
||||
cd api
|
||||
uv add --dev pyrefly
|
||||
uv run pyrefly check || true
|
||||
|
||||
- name: Run dify config tests
|
||||
run: uv run --project api dev/pytest/pytest_config_tests.py
|
||||
|
||||
- name: Set up dotenvs
|
||||
run: |
|
||||
cp docker/.env.example docker/.env
|
||||
cp docker/middleware.env.example docker/middleware.env
|
||||
|
||||
- name: Expose Service Ports
|
||||
run: sh .github/workflows/expose_service_ports.sh
|
||||
|
||||
- name: Set up Sandbox
|
||||
uses: hoverkraft-tech/compose-action@v2.0.2
|
||||
with:
|
||||
compose-file: |
|
||||
docker/docker-compose.middleware.yaml
|
||||
services: |
|
||||
db_postgres
|
||||
redis
|
||||
sandbox
|
||||
ssrf_proxy
|
||||
|
||||
- name: setup test config
|
||||
run: |
|
||||
cp api/tests/integration_tests/.env.example api/tests/integration_tests/.env
|
||||
|
||||
- name: Run Workflow
|
||||
run: uv run --project api bash dev/pytest/pytest_workflow.sh
|
||||
|
||||
- name: Run Tool
|
||||
run: uv run --project api bash dev/pytest/pytest_tools.sh
|
||||
|
||||
- name: Run TestContainers
|
||||
run: uv run --project api bash dev/pytest/pytest_testcontainers.sh
|
||||
|
||||
- name: Run Unit tests
|
||||
run: |
|
||||
uv run --project api bash dev/pytest/pytest_unit_tests.sh
|
||||
|
||||
- name: Coverage Summary
|
||||
run: |
|
||||
set -x
|
||||
# Extract coverage percentage and create a summary
|
||||
TOTAL_COVERAGE=$(python -c 'import json; print(json.load(open("coverage.json"))["totals"]["percent_covered_display"])')
|
||||
|
||||
# Create a detailed coverage summary
|
||||
echo "### Test Coverage Summary :test_tube:" >> $GITHUB_STEP_SUMMARY
|
||||
echo "Total Coverage: ${TOTAL_COVERAGE}%" >> $GITHUB_STEP_SUMMARY
|
||||
uv run --project api coverage report --format=markdown >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
38
.github/workflows/api-unit-tests.yml
vendored
38
.github/workflows/api-unit-tests.yml
vendored
@ -1,38 +0,0 @@
|
||||
name: Run Pytest
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
push:
|
||||
branches:
|
||||
- deploy/dev
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: '3.10'
|
||||
|
||||
- name: Cache pip dependencies
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('api/requirements.txt') }}
|
||||
restore-keys: ${{ runner.os }}-pip-
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install pytest
|
||||
pip install -r api/requirements.txt
|
||||
|
||||
- name: Run pytest
|
||||
run: pytest api/tests/unit_tests
|
||||
90
.github/workflows/autofix.yml
vendored
Normal file
90
.github/workflows/autofix.yml
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
name: autofix.ci
|
||||
on:
|
||||
pull_request:
|
||||
branches: ["main"]
|
||||
push:
|
||||
branches: ["main"]
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
autofix:
|
||||
if: github.repository == 'langgenius/dify'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
# Use uv to ensure we have the same ruff version in CI and locally.
|
||||
- uses: astral-sh/setup-uv@v6
|
||||
with:
|
||||
python-version: "3.11"
|
||||
- run: |
|
||||
cd api
|
||||
uv sync --dev
|
||||
# fmt first to avoid line too long
|
||||
uv run ruff format ..
|
||||
# Fix lint errors
|
||||
uv run ruff check --fix .
|
||||
# Format code
|
||||
uv run ruff format ..
|
||||
|
||||
- name: count migration progress
|
||||
run: |
|
||||
cd api
|
||||
./cnt_base.sh
|
||||
|
||||
- name: ast-grep
|
||||
run: |
|
||||
uvx --from ast-grep-cli sg --pattern 'db.session.query($WHATEVER).filter($HERE)' --rewrite 'db.session.query($WHATEVER).where($HERE)' -l py --update-all
|
||||
uvx --from ast-grep-cli sg --pattern 'session.query($WHATEVER).filter($HERE)' --rewrite 'session.query($WHATEVER).where($HERE)' -l py --update-all
|
||||
uvx --from ast-grep-cli sg -p '$A = db.Column($$$B)' -r '$A = mapped_column($$$B)' -l py --update-all
|
||||
uvx --from ast-grep-cli sg -p '$A : $T = db.Column($$$B)' -r '$A : $T = mapped_column($$$B)' -l py --update-all
|
||||
# Convert Optional[T] to T | None (ignoring quoted types)
|
||||
cat > /tmp/optional-rule.yml << 'EOF'
|
||||
id: convert-optional-to-union
|
||||
language: python
|
||||
rule:
|
||||
kind: generic_type
|
||||
all:
|
||||
- has:
|
||||
kind: identifier
|
||||
pattern: Optional
|
||||
- has:
|
||||
kind: type_parameter
|
||||
has:
|
||||
kind: type
|
||||
pattern: $T
|
||||
fix: $T | None
|
||||
EOF
|
||||
uvx --from ast-grep-cli sg scan --inline-rules "$(cat /tmp/optional-rule.yml)" --update-all
|
||||
# Fix forward references that were incorrectly converted (Python doesn't support "Type" | None syntax)
|
||||
find . -name "*.py" -type f -exec sed -i.bak -E 's/"([^"]+)" \| None/Optional["\1"]/g; s/'"'"'([^'"'"']+)'"'"' \| None/Optional['"'"'\1'"'"']/g' {} \;
|
||||
find . -name "*.py.bak" -type f -delete
|
||||
|
||||
- name: mdformat
|
||||
run: |
|
||||
uvx mdformat .
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
package_json_file: web/package.json
|
||||
run_install: false
|
||||
|
||||
- name: Setup NodeJS
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 22
|
||||
cache: pnpm
|
||||
cache-dependency-path: ./web/package.json
|
||||
|
||||
- name: Web dependencies
|
||||
working-directory: ./web
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: oxlint
|
||||
working-directory: ./web
|
||||
run: |
|
||||
pnpx oxlint --fix
|
||||
|
||||
- uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27
|
||||
62
.github/workflows/build-api-image.yml
vendored
62
.github/workflows/build-api-image.yml
vendored
@ -1,62 +0,0 @@
|
||||
name: Build and Push API Image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
- 'deploy/dev'
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false
|
||||
steps:
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USER }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: langgenius/dify-api
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
type=ref,event=branch
|
||||
type=sha,enable=true,priority=100,prefix=,suffix=,format=long
|
||||
type=semver,pattern={{major}}.{{minor}}.{{patch}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
context: "{{defaultContext}}:api"
|
||||
platforms: ${{ startsWith(github.ref, 'refs/tags/') && 'linux/amd64,linux/arm64' || 'linux/amd64' }}
|
||||
build-args: |
|
||||
COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
- name: Deploy to server
|
||||
if: github.ref == 'refs/heads/deploy/dev'
|
||||
uses: appleboy/ssh-action@v0.1.8
|
||||
with:
|
||||
host: ${{ secrets.SSH_HOST }}
|
||||
username: ${{ secrets.SSH_USER }}
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
script: |
|
||||
${{ secrets.SSH_SCRIPT }}
|
||||
151
.github/workflows/build-push.yml
vendored
Normal file
151
.github/workflows/build-push.yml
vendored
Normal file
@ -0,0 +1,151 @@
|
||||
name: Build and Push API & Web
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "main"
|
||||
- "deploy/**"
|
||||
- "build/**"
|
||||
- "release/e-*"
|
||||
- "hotfix/**"
|
||||
tags:
|
||||
- "*"
|
||||
|
||||
concurrency:
|
||||
group: build-push-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
DOCKERHUB_USER: ${{ secrets.DOCKERHUB_USER }}
|
||||
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
DIFY_WEB_IMAGE_NAME: ${{ vars.DIFY_WEB_IMAGE_NAME || 'langgenius/dify-web' }}
|
||||
DIFY_API_IMAGE_NAME: ${{ vars.DIFY_API_IMAGE_NAME || 'langgenius/dify-api' }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ matrix.platform == 'linux/arm64' && 'arm64_runner' || 'ubuntu-latest' }}
|
||||
if: github.repository == 'langgenius/dify'
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- service_name: "build-api-amd64"
|
||||
image_name_env: "DIFY_API_IMAGE_NAME"
|
||||
context: "api"
|
||||
platform: linux/amd64
|
||||
- service_name: "build-api-arm64"
|
||||
image_name_env: "DIFY_API_IMAGE_NAME"
|
||||
context: "api"
|
||||
platform: linux/arm64
|
||||
- service_name: "build-web-amd64"
|
||||
image_name_env: "DIFY_WEB_IMAGE_NAME"
|
||||
context: "web"
|
||||
platform: linux/amd64
|
||||
- service_name: "build-web-arm64"
|
||||
image_name_env: "DIFY_WEB_IMAGE_NAME"
|
||||
context: "web"
|
||||
platform: linux/arm64
|
||||
|
||||
steps:
|
||||
- name: Prepare
|
||||
run: |
|
||||
platform=${{ matrix.platform }}
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ env.DOCKERHUB_USER }}
|
||||
password: ${{ env.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Extract metadata for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env[matrix.image_name_env] }}
|
||||
|
||||
- name: Build Docker image
|
||||
id: build
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: "{{defaultContext}}:${{ matrix.context }}"
|
||||
platforms: ${{ matrix.platform }}
|
||||
build-args: COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
outputs: type=image,name=${{ env[matrix.image_name_env] }},push-by-digest=true,name-canonical=true,push=true
|
||||
cache-from: type=gha,scope=${{ matrix.service_name }}
|
||||
cache-to: type=gha,mode=max,scope=${{ matrix.service_name }}
|
||||
|
||||
- name: Export digest
|
||||
env:
|
||||
DIGEST: ${{ steps.build.outputs.digest }}
|
||||
run: |
|
||||
mkdir -p /tmp/digests
|
||||
sanitized_digest=${DIGEST#sha256:}
|
||||
touch "/tmp/digests/${sanitized_digest}"
|
||||
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: digests-${{ matrix.context }}-${{ env.PLATFORM_PAIR }}
|
||||
path: /tmp/digests/*
|
||||
if-no-files-found: error
|
||||
retention-days: 1
|
||||
|
||||
create-manifest:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository == 'langgenius/dify'
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- service_name: "merge-api-images"
|
||||
image_name_env: "DIFY_API_IMAGE_NAME"
|
||||
context: "api"
|
||||
- service_name: "merge-web-images"
|
||||
image_name_env: "DIFY_WEB_IMAGE_NAME"
|
||||
context: "web"
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
path: /tmp/digests
|
||||
pattern: digests-${{ matrix.context }}-*
|
||||
merge-multiple: true
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ env.DOCKERHUB_USER }}
|
||||
password: ${{ env.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env[matrix.image_name_env] }}
|
||||
tags: |
|
||||
type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') && !contains(github.ref, '-') }}
|
||||
type=ref,event=branch
|
||||
type=sha,enable=true,priority=100,prefix=,suffix=,format=long
|
||||
type=raw,value=${{ github.ref_name }},enable=${{ startsWith(github.ref, 'refs/tags/') }}
|
||||
|
||||
- name: Create manifest list and push
|
||||
working-directory: /tmp/digests
|
||||
env:
|
||||
IMAGE_NAME: ${{ env[matrix.image_name_env] }}
|
||||
run: |
|
||||
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
||||
$(printf "$IMAGE_NAME@sha256:%s " *)
|
||||
|
||||
- name: Inspect image
|
||||
env:
|
||||
IMAGE_NAME: ${{ env[matrix.image_name_env] }}
|
||||
IMAGE_VERSION: ${{ steps.meta.outputs.version }}
|
||||
run: |
|
||||
docker buildx imagetools inspect "$IMAGE_NAME:$IMAGE_VERSION"
|
||||
62
.github/workflows/build-web-image.yml
vendored
62
.github/workflows/build-web-image.yml
vendored
@ -1,62 +0,0 @@
|
||||
name: Build and Push WEB Image
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
- 'deploy/dev'
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
build-and-push:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false
|
||||
steps:
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USER }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: langgenius/dify-web
|
||||
tags: |
|
||||
type=raw,value=latest,enable={{is_default_branch}}
|
||||
type=ref,event=branch
|
||||
type=sha,enable=true,priority=100,prefix=,suffix=,format=long
|
||||
type=semver,pattern={{major}}.{{minor}}.{{patch}}
|
||||
type=semver,pattern={{major}}.{{minor}}
|
||||
type=semver,pattern={{major}}
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
context: "{{defaultContext}}:web"
|
||||
platforms: ${{ startsWith(github.ref, 'refs/tags/') && 'linux/amd64,linux/arm64' || 'linux/amd64' }}
|
||||
build-args: |
|
||||
COMMIT_SHA=${{ fromJSON(steps.meta.outputs.json).labels['org.opencontainers.image.revision'] }}
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
- name: Deploy to server
|
||||
if: github.ref == 'refs/heads/deploy/dev'
|
||||
uses: appleboy/ssh-action@v0.1.8
|
||||
with:
|
||||
host: ${{ secrets.SSH_HOST }}
|
||||
username: ${{ secrets.SSH_USER }}
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
script: |
|
||||
${{ secrets.SSH_SCRIPT }}
|
||||
36
.github/workflows/check_no_chinese_comments.py
vendored
36
.github/workflows/check_no_chinese_comments.py
vendored
@ -1,36 +0,0 @@
|
||||
import os
|
||||
import re
|
||||
from zhon.hanzi import punctuation
|
||||
|
||||
def has_chinese_characters(text):
|
||||
for char in text:
|
||||
if '\u4e00' <= char <= '\u9fff' or char in punctuation:
|
||||
return True
|
||||
return False
|
||||
|
||||
def check_file_for_chinese_comments(file_path):
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
for line_number, line in enumerate(file, start=1):
|
||||
if has_chinese_characters(line):
|
||||
print(f"Found Chinese characters in {file_path} on line {line_number}:")
|
||||
print(line.strip())
|
||||
return True
|
||||
return False
|
||||
|
||||
def main():
|
||||
has_chinese = False
|
||||
excluded_files = ["model_template.py", 'stopwords.py', 'commands.py',
|
||||
'indexing_runner.py', 'web_reader_tool.py', 'spark_provider.py']
|
||||
|
||||
for root, _, files in os.walk("."):
|
||||
for file in files:
|
||||
if file.endswith(".py") and file not in excluded_files:
|
||||
file_path = os.path.join(root, file)
|
||||
if check_file_for_chinese_comments(file_path):
|
||||
has_chinese = True
|
||||
|
||||
if has_chinese:
|
||||
raise Exception("Found Chinese characters in Python files. Please remove them.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
31
.github/workflows/check_no_chinese_comments.yml
vendored
31
.github/workflows/check_no_chinese_comments.yml
vendored
@ -1,31 +0,0 @@
|
||||
name: Check for Chinese comments
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'main'
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
check-chinese-comments:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Check out repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install zhon
|
||||
|
||||
- name: Run script to check for Chinese comments
|
||||
run: |
|
||||
python .github/workflows/check_no_chinese_comments.py
|
||||
116
.github/workflows/db-migration-test.yml
vendored
Normal file
116
.github/workflows/db-migration-test.yml
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
name: DB Migration Test
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
concurrency:
|
||||
group: db-migration-test-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
db-migration-test-postgres:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup UV and Python
|
||||
uses: astral-sh/setup-uv@v6
|
||||
with:
|
||||
enable-cache: true
|
||||
python-version: "3.12"
|
||||
cache-dependency-glob: api/uv.lock
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --project api
|
||||
- name: Ensure Offline migration are supported
|
||||
run: |
|
||||
# upgrade
|
||||
uv run --directory api flask db upgrade 'base:head' --sql
|
||||
# downgrade
|
||||
uv run --directory api flask db downgrade 'head:base' --sql
|
||||
|
||||
- name: Prepare middleware env
|
||||
run: |
|
||||
cd docker
|
||||
cp middleware.env.example middleware.env
|
||||
|
||||
- name: Set up Middlewares
|
||||
uses: hoverkraft-tech/compose-action@v2.0.2
|
||||
with:
|
||||
compose-file: |
|
||||
docker/docker-compose.middleware.yaml
|
||||
services: |
|
||||
db_postgres
|
||||
redis
|
||||
|
||||
- name: Prepare configs
|
||||
run: |
|
||||
cd api
|
||||
cp .env.example .env
|
||||
|
||||
- name: Run DB Migration
|
||||
env:
|
||||
DEBUG: true
|
||||
run: uv run --directory api flask upgrade-db
|
||||
|
||||
db-migration-test-mysql:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Setup UV and Python
|
||||
uses: astral-sh/setup-uv@v6
|
||||
with:
|
||||
enable-cache: true
|
||||
python-version: "3.12"
|
||||
cache-dependency-glob: api/uv.lock
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --project api
|
||||
- name: Ensure Offline migration are supported
|
||||
run: |
|
||||
# upgrade
|
||||
uv run --directory api flask db upgrade 'base:head' --sql
|
||||
# downgrade
|
||||
uv run --directory api flask db downgrade 'head:base' --sql
|
||||
|
||||
- name: Prepare middleware env for MySQL
|
||||
run: |
|
||||
cd docker
|
||||
cp middleware.env.example middleware.env
|
||||
sed -i 's/DB_TYPE=postgresql/DB_TYPE=mysql/' middleware.env
|
||||
sed -i 's/DB_HOST=db_postgres/DB_HOST=db_mysql/' middleware.env
|
||||
sed -i 's/DB_PORT=5432/DB_PORT=3306/' middleware.env
|
||||
sed -i 's/DB_USERNAME=postgres/DB_USERNAME=mysql/' middleware.env
|
||||
|
||||
- name: Set up Middlewares
|
||||
uses: hoverkraft-tech/compose-action@v2.0.2
|
||||
with:
|
||||
compose-file: |
|
||||
docker/docker-compose.middleware.yaml
|
||||
services: |
|
||||
db_mysql
|
||||
redis
|
||||
|
||||
- name: Prepare configs for MySQL
|
||||
run: |
|
||||
cd api
|
||||
cp .env.example .env
|
||||
sed -i 's/DB_TYPE=postgresql/DB_TYPE=mysql/' .env
|
||||
sed -i 's/DB_PORT=5432/DB_PORT=3306/' .env
|
||||
sed -i 's/DB_USERNAME=postgres/DB_USERNAME=root/' .env
|
||||
|
||||
- name: Run DB Migration
|
||||
env:
|
||||
DEBUG: true
|
||||
run: uv run --directory api flask upgrade-db
|
||||
25
.github/workflows/deploy-dev.yml
vendored
Normal file
25
.github/workflows/deploy-dev.yml
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
name: Deploy Dev
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["Build and Push API & Web"]
|
||||
branches:
|
||||
- "deploy/dev"
|
||||
types:
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
if: |
|
||||
github.event.workflow_run.conclusion == 'success' &&
|
||||
github.event.workflow_run.head_branch == 'deploy/dev'
|
||||
steps:
|
||||
- name: Deploy to server
|
||||
uses: appleboy/ssh-action@v0.1.8
|
||||
with:
|
||||
host: ${{ secrets.SSH_HOST }}
|
||||
username: ${{ secrets.SSH_USER }}
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
script: |
|
||||
${{ vars.SSH_SCRIPT || secrets.SSH_SCRIPT }}
|
||||
41
.github/workflows/deploy-enterprise.yml
vendored
Normal file
41
.github/workflows/deploy-enterprise.yml
vendored
Normal file
@ -0,0 +1,41 @@
|
||||
name: Deploy Enterprise
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["Build and Push API & Web"]
|
||||
branches:
|
||||
- "deploy/enterprise"
|
||||
types:
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
if: |
|
||||
github.event.workflow_run.conclusion == 'success' &&
|
||||
github.event.workflow_run.head_branch == 'deploy/enterprise'
|
||||
|
||||
steps:
|
||||
- name: trigger deployments
|
||||
env:
|
||||
DEV_ENV_ADDRS: ${{ vars.DEV_ENV_ADDRS }}
|
||||
DEPLOY_SECRET: ${{ secrets.DEPLOY_SECRET }}
|
||||
run: |
|
||||
IFS=',' read -ra ENDPOINTS <<< "${DEV_ENV_ADDRS:-}"
|
||||
BODY='{"project":"dify-api","tag":"deploy-enterprise"}'
|
||||
|
||||
for ENDPOINT in "${ENDPOINTS[@]}"; do
|
||||
ENDPOINT="$(echo "$ENDPOINT" | xargs)"
|
||||
[ -z "$ENDPOINT" ] && continue
|
||||
|
||||
API_SIGNATURE=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$DEPLOY_SECRET" | awk '{print "sha256="$2}')
|
||||
|
||||
curl -sSf -X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Hub-Signature-256: $API_SIGNATURE" \
|
||||
-d "$BODY" \
|
||||
"$ENDPOINT"
|
||||
done
|
||||
28
.github/workflows/deploy-trigger-dev.yml
vendored
Normal file
28
.github/workflows/deploy-trigger-dev.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
name: Deploy Trigger Dev
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["Build and Push API & Web"]
|
||||
branches:
|
||||
- "deploy/trigger-dev"
|
||||
types:
|
||||
- completed
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
if: |
|
||||
github.event.workflow_run.conclusion == 'success' &&
|
||||
github.event.workflow_run.head_branch == 'deploy/trigger-dev'
|
||||
steps:
|
||||
- name: Deploy to server
|
||||
uses: appleboy/ssh-action@v0.1.8
|
||||
with:
|
||||
host: ${{ secrets.TRIGGER_SSH_HOST }}
|
||||
username: ${{ secrets.SSH_USER }}
|
||||
key: ${{ secrets.SSH_PRIVATE_KEY }}
|
||||
script: |
|
||||
${{ vars.SSH_SCRIPT || secrets.SSH_SCRIPT }}
|
||||
48
.github/workflows/docker-build.yml
vendored
Normal file
48
.github/workflows/docker-build.yml
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
name: Build docker image
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- "main"
|
||||
paths:
|
||||
- api/Dockerfile
|
||||
- web/Dockerfile
|
||||
|
||||
concurrency:
|
||||
group: docker-build-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build-docker:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- service_name: "api-amd64"
|
||||
platform: linux/amd64
|
||||
context: "api"
|
||||
- service_name: "api-arm64"
|
||||
platform: linux/arm64
|
||||
context: "api"
|
||||
- service_name: "web-amd64"
|
||||
platform: linux/amd64
|
||||
context: "web"
|
||||
- service_name: "web-arm64"
|
||||
platform: linux/arm64
|
||||
context: "web"
|
||||
steps:
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build Docker Image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
push: false
|
||||
context: "{{defaultContext}}:${{ matrix.context }}"
|
||||
file: "${{ matrix.file }}"
|
||||
platforms: ${{ matrix.platform }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
17
.github/workflows/expose_service_ports.sh
vendored
Executable file
17
.github/workflows/expose_service_ports.sh
vendored
Executable file
@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
|
||||
yq eval '.services.weaviate.ports += ["8080:8080"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services.weaviate.ports += ["50051:50051"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services.qdrant.ports += ["6333:6333"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services.chroma.ports += ["8000:8000"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services["milvus-standalone"].ports += ["19530:19530"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services.pgvector.ports += ["5433:5432"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services["pgvecto-rs"].ports += ["5431:5432"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services["elasticsearch"].ports += ["9200:9200"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services.couchbase-server.ports += ["8091-8096:8091-8096"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services.couchbase-server.ports += ["11210:11210"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services.tidb.ports += ["4000:4000"]' -i docker/tidb/docker-compose.yaml
|
||||
yq eval '.services.oceanbase.ports += ["2881:2881"]' -i docker/docker-compose.yaml
|
||||
yq eval '.services.opengauss.ports += ["6600:6600"]' -i docker/docker-compose.yaml
|
||||
|
||||
echo "Ports exposed for sandbox, weaviate (HTTP 8080, gRPC 50051), tidb, qdrant, chroma, milvus, pgvector, pgvecto-rs, elasticsearch, couchbase, opengauss"
|
||||
78
.github/workflows/main-ci.yml
vendored
Normal file
78
.github/workflows/main-ci.yml
vendored
Normal file
@ -0,0 +1,78 @@
|
||||
name: Main CI Pipeline
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: ["main"]
|
||||
push:
|
||||
branches: ["main"]
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
checks: write
|
||||
statuses: write
|
||||
|
||||
concurrency:
|
||||
group: main-ci-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
# Check which paths were changed to determine which tests to run
|
||||
check-changes:
|
||||
name: Check Changed Files
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
api-changed: ${{ steps.changes.outputs.api }}
|
||||
web-changed: ${{ steps.changes.outputs.web }}
|
||||
vdb-changed: ${{ steps.changes.outputs.vdb }}
|
||||
migration-changed: ${{ steps.changes.outputs.migration }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: dorny/paths-filter@v3
|
||||
id: changes
|
||||
with:
|
||||
filters: |
|
||||
api:
|
||||
- 'api/**'
|
||||
- 'docker/**'
|
||||
- '.github/workflows/api-tests.yml'
|
||||
web:
|
||||
- 'web/**'
|
||||
vdb:
|
||||
- 'api/core/rag/datasource/**'
|
||||
- 'docker/**'
|
||||
- '.github/workflows/vdb-tests.yml'
|
||||
- 'api/uv.lock'
|
||||
- 'api/pyproject.toml'
|
||||
migration:
|
||||
- 'api/migrations/**'
|
||||
- '.github/workflows/db-migration-test.yml'
|
||||
|
||||
# Run tests in parallel
|
||||
api-tests:
|
||||
name: API Tests
|
||||
needs: check-changes
|
||||
if: needs.check-changes.outputs.api-changed == 'true'
|
||||
uses: ./.github/workflows/api-tests.yml
|
||||
|
||||
web-tests:
|
||||
name: Web Tests
|
||||
needs: check-changes
|
||||
if: needs.check-changes.outputs.web-changed == 'true'
|
||||
uses: ./.github/workflows/web-tests.yml
|
||||
|
||||
style-check:
|
||||
name: Style Check
|
||||
uses: ./.github/workflows/style.yml
|
||||
|
||||
vdb-tests:
|
||||
name: VDB Tests
|
||||
needs: check-changes
|
||||
if: needs.check-changes.outputs.vdb-changed == 'true'
|
||||
uses: ./.github/workflows/vdb-tests.yml
|
||||
|
||||
db-migration-test:
|
||||
name: DB Migration Test
|
||||
needs: check-changes
|
||||
if: needs.check-changes.outputs.migration-changed == 'true'
|
||||
uses: ./.github/workflows/db-migration-test.yml
|
||||
22
.github/workflows/stale.yml
vendored
22
.github/workflows/stale.yml
vendored
@ -7,7 +7,7 @@ name: Mark stale issues and pull requests
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 3 * * *'
|
||||
- cron: '0 3 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
@ -18,13 +18,13 @@ jobs:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@v5
|
||||
with:
|
||||
days-before-issue-stale: 30
|
||||
days-before-issue-close: 3
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message: "Close due to it's no longer active, if you have any questions, you can reopen it."
|
||||
stale-pr-message: "Close due to it's no longer active, if you have any questions, you can reopen it."
|
||||
stale-issue-label: 'no-issue-activity'
|
||||
stale-pr-label: 'no-pr-activity'
|
||||
any-of-labels: 'duplicate,question,invalid,wontfix,no-issue-activity,no-pr-activity,enhancement'
|
||||
- uses: actions/stale@v5
|
||||
with:
|
||||
days-before-issue-stale: 15
|
||||
days-before-issue-close: 3
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
stale-issue-message: "Close due to it's no longer active, if you have any questions, you can reopen it."
|
||||
stale-pr-message: "Close due to it's no longer active, if you have any questions, you can reopen it."
|
||||
stale-issue-label: 'no-issue-activity'
|
||||
stale-pr-label: 'no-pr-activity'
|
||||
any-of-labels: 'duplicate,question,invalid,wontfix,no-issue-activity,no-pr-activity,enhancement,cant-reproduce,help-wanted'
|
||||
|
||||
182
.github/workflows/style.yml
vendored
Normal file
182
.github/workflows/style.yml
vendored
Normal file
@ -0,0 +1,182 @@
|
||||
name: Style check
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
concurrency:
|
||||
group: style-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
checks: write
|
||||
statuses: write
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
python-style:
|
||||
name: Python Style
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v46
|
||||
with:
|
||||
files: |
|
||||
api/**
|
||||
.github/workflows/style.yml
|
||||
|
||||
- name: Setup UV and Python
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
uses: astral-sh/setup-uv@v6
|
||||
with:
|
||||
enable-cache: false
|
||||
python-version: "3.12"
|
||||
cache-dependency-glob: api/uv.lock
|
||||
|
||||
- name: Install dependencies
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
run: uv sync --project api --dev
|
||||
|
||||
- name: Run Import Linter
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
run: uv run --directory api --dev lint-imports
|
||||
|
||||
- name: Run Basedpyright Checks
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
run: dev/basedpyright-check
|
||||
|
||||
- name: Run Mypy Type Checks
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
run: uv --directory api run mypy --exclude-gitignore --exclude 'tests/' --exclude 'migrations/' --check-untyped-defs --disable-error-code=import-untyped .
|
||||
|
||||
- name: Dotenv check
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
run: uv run --project api dotenv-linter ./api/.env.example ./web/.env.example
|
||||
|
||||
web-style:
|
||||
name: Web Style
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./web
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v46
|
||||
with:
|
||||
files: web/**
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
package_json_file: web/package.json
|
||||
run_install: false
|
||||
|
||||
- name: Setup NodeJS
|
||||
uses: actions/setup-node@v4
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
with:
|
||||
node-version: 22
|
||||
cache: pnpm
|
||||
cache-dependency-path: ./web/package.json
|
||||
|
||||
- name: Web dependencies
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
working-directory: ./web
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Web style check
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
working-directory: ./web
|
||||
run: |
|
||||
pnpm run lint
|
||||
|
||||
- name: Web type check
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
working-directory: ./web
|
||||
run: pnpm run type-check
|
||||
|
||||
docker-compose-template:
|
||||
name: Docker Compose Template
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v46
|
||||
with:
|
||||
files: |
|
||||
docker/generate_docker_compose
|
||||
docker/.env.example
|
||||
docker/docker-compose-template.yaml
|
||||
docker/docker-compose.yaml
|
||||
|
||||
- name: Generate Docker Compose
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
run: |
|
||||
cd docker
|
||||
./generate_docker_compose
|
||||
|
||||
- name: Check for changes
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
run: git diff --exit-code
|
||||
|
||||
superlinter:
|
||||
name: SuperLinter
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v46
|
||||
with:
|
||||
files: |
|
||||
**.sh
|
||||
**.yaml
|
||||
**.yml
|
||||
**Dockerfile
|
||||
dev/**
|
||||
.editorconfig
|
||||
|
||||
- name: Super-linter
|
||||
uses: super-linter/super-linter/slim@v8
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
env:
|
||||
BASH_SEVERITY: warning
|
||||
DEFAULT_BRANCH: origin/main
|
||||
EDITORCONFIG_FILE_NAME: editorconfig-checker.json
|
||||
FILTER_REGEX_INCLUDE: pnpm-lock.yaml
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
IGNORE_GENERATED_FILES: true
|
||||
IGNORE_GITIGNORED_FILES: true
|
||||
VALIDATE_BASH: true
|
||||
VALIDATE_BASH_EXEC: true
|
||||
# FIXME: temporarily disabled until api-docker.yaml's run script is fixed for shellcheck
|
||||
# VALIDATE_GITHUB_ACTIONS: true
|
||||
VALIDATE_DOCKERFILE_HADOLINT: true
|
||||
VALIDATE_EDITORCONFIG: true
|
||||
VALIDATE_XML: true
|
||||
VALIDATE_YAML: true
|
||||
43
.github/workflows/tool-test-sdks.yaml
vendored
Normal file
43
.github/workflows/tool-test-sdks.yaml
vendored
Normal file
@ -0,0 +1,43 @@
|
||||
name: Run Unit Test For SDKs
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- sdks/**
|
||||
|
||||
concurrency:
|
||||
group: sdk-tests-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: unit test for Node.js SDK
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [16, 18, 20, 22]
|
||||
|
||||
defaults:
|
||||
run:
|
||||
working-directory: sdks/nodejs-client
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: ''
|
||||
cache-dependency-path: 'pnpm-lock.yaml'
|
||||
|
||||
- name: Install Dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Test
|
||||
run: pnpm test
|
||||
91
.github/workflows/translate-i18n-base-on-english.yml
vendored
Normal file
91
.github/workflows/translate-i18n-base-on-english.yml
vendored
Normal file
@ -0,0 +1,91 @@
|
||||
name: Check i18n Files and Create PR
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'web/i18n/en-US/*.ts'
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
check-and-update:
|
||||
if: github.repository == 'langgenius/dify'
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: web
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Check for file changes in i18n/en-US
|
||||
id: check_files
|
||||
run: |
|
||||
git fetch origin "${{ github.event.before }}" || true
|
||||
git fetch origin "${{ github.sha }}" || true
|
||||
changed_files=$(git diff --name-only "${{ github.event.before }}" "${{ github.sha }}" -- 'i18n/en-US/*.ts')
|
||||
echo "Changed files: $changed_files"
|
||||
if [ -n "$changed_files" ]; then
|
||||
echo "FILES_CHANGED=true" >> $GITHUB_ENV
|
||||
file_args=""
|
||||
for file in $changed_files; do
|
||||
filename=$(basename "$file" .ts)
|
||||
file_args="$file_args --file $filename"
|
||||
done
|
||||
echo "FILE_ARGS=$file_args" >> $GITHUB_ENV
|
||||
echo "File arguments: $file_args"
|
||||
else
|
||||
echo "FILES_CHANGED=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
- name: Install pnpm
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
package_json_file: web/package.json
|
||||
run_install: false
|
||||
|
||||
- name: Set up Node.js
|
||||
if: env.FILES_CHANGED == 'true'
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 'lts/*'
|
||||
cache: pnpm
|
||||
cache-dependency-path: ./web/package.json
|
||||
|
||||
- name: Install dependencies
|
||||
if: env.FILES_CHANGED == 'true'
|
||||
working-directory: ./web
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Generate i18n translations
|
||||
if: env.FILES_CHANGED == 'true'
|
||||
working-directory: ./web
|
||||
run: pnpm run auto-gen-i18n ${{ env.FILE_ARGS }}
|
||||
|
||||
- name: Generate i18n type definitions
|
||||
if: env.FILES_CHANGED == 'true'
|
||||
working-directory: ./web
|
||||
run: pnpm run gen:i18n-types
|
||||
|
||||
- name: Create Pull Request
|
||||
if: env.FILES_CHANGED == 'true'
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: 'chore(i18n): update translations based on en-US changes'
|
||||
title: 'chore(i18n): translate i18n files and update type definitions'
|
||||
body: |
|
||||
This PR was automatically created to update i18n files and TypeScript type definitions based on changes in en-US locale.
|
||||
|
||||
**Triggered by:** ${{ github.sha }}
|
||||
|
||||
**Changes included:**
|
||||
- Updated translation files for all locales
|
||||
- Regenerated TypeScript type definitions for type safety
|
||||
branch: chore/automated-i18n-updates-${{ github.sha }}
|
||||
delete-branch: true
|
||||
90
.github/workflows/vdb-tests.yml
vendored
Normal file
90
.github/workflows/vdb-tests.yml
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
name: Run VDB Tests
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
concurrency:
|
||||
group: vdb-tests-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: VDB Tests
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version:
|
||||
- "3.11"
|
||||
- "3.12"
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Free Disk Space
|
||||
uses: endersonmenezes/free-disk-space@v2
|
||||
with:
|
||||
remove_dotnet: true
|
||||
remove_haskell: true
|
||||
remove_tool_cache: true
|
||||
|
||||
- name: Setup UV and Python
|
||||
uses: astral-sh/setup-uv@v6
|
||||
with:
|
||||
enable-cache: true
|
||||
python-version: ${{ matrix.python-version }}
|
||||
cache-dependency-glob: api/uv.lock
|
||||
|
||||
- name: Check UV lockfile
|
||||
run: uv lock --project api --check
|
||||
|
||||
- name: Install dependencies
|
||||
run: uv sync --project api --dev
|
||||
|
||||
- name: Set up dotenvs
|
||||
run: |
|
||||
cp docker/.env.example docker/.env
|
||||
cp docker/middleware.env.example docker/middleware.env
|
||||
|
||||
- name: Expose Service Ports
|
||||
run: sh .github/workflows/expose_service_ports.sh
|
||||
|
||||
# - name: Set up Vector Store (TiDB)
|
||||
# uses: hoverkraft-tech/compose-action@v2.0.2
|
||||
# with:
|
||||
# compose-file: docker/tidb/docker-compose.yaml
|
||||
# services: |
|
||||
# tidb
|
||||
# tiflash
|
||||
|
||||
- name: Set up Vector Stores (Weaviate, Qdrant, PGVector, Milvus, PgVecto-RS, Chroma, MyScale, ElasticSearch, Couchbase, OceanBase)
|
||||
uses: hoverkraft-tech/compose-action@v2.0.2
|
||||
with:
|
||||
compose-file: |
|
||||
docker/docker-compose.yaml
|
||||
services: |
|
||||
weaviate
|
||||
qdrant
|
||||
couchbase-server
|
||||
etcd
|
||||
minio
|
||||
milvus-standalone
|
||||
pgvecto-rs
|
||||
pgvector
|
||||
chroma
|
||||
elasticsearch
|
||||
oceanbase
|
||||
|
||||
- name: setup test config
|
||||
run: |
|
||||
echo $(pwd)
|
||||
ls -lah .
|
||||
cp api/tests/integration_tests/.env.example api/tests/integration_tests/.env
|
||||
|
||||
# - name: Check VDB Ready (TiDB)
|
||||
# run: uv run --project api python api/tests/integration_tests/vdb/tidb_vector/check_tiflash_ready.py
|
||||
|
||||
- name: Test Vector Stores
|
||||
run: uv run --project api bash dev/pytest/pytest_vdb.sh
|
||||
58
.github/workflows/web-tests.yml
vendored
Normal file
58
.github/workflows/web-tests.yml
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
name: Web Tests
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
|
||||
concurrency:
|
||||
group: web-tests-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
test:
|
||||
name: Web Tests
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./web
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Check changed files
|
||||
id: changed-files
|
||||
uses: tj-actions/changed-files@v46
|
||||
with:
|
||||
files: web/**
|
||||
|
||||
- name: Install pnpm
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
uses: pnpm/action-setup@v4
|
||||
with:
|
||||
package_json_file: web/package.json
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
with:
|
||||
node-version: 22
|
||||
cache: pnpm
|
||||
cache-dependency-path: ./web/package.json
|
||||
|
||||
- name: Install dependencies
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
working-directory: ./web
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Check i18n types synchronization
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
working-directory: ./web
|
||||
run: pnpm run check:i18n-types
|
||||
|
||||
- name: Run tests
|
||||
if: steps.changed-files.outputs.any_changed == 'true'
|
||||
working-directory: ./web
|
||||
run: pnpm test
|
||||
100
.gitignore
vendored
100
.gitignore
vendored
@ -6,6 +6,9 @@ __pycache__/
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# *db files
|
||||
*.db
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
@ -46,6 +49,7 @@ htmlcov/
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
coverage.json
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
@ -96,6 +100,7 @@ __pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat-schedule.db
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
@ -103,6 +108,7 @@ celerybeat.pid
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.env-local
|
||||
.venv
|
||||
env/
|
||||
venv/
|
||||
@ -121,10 +127,12 @@ venv.bak/
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
# type checking
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
pyrightconfig.json
|
||||
!api/pyrightconfig.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
@ -134,19 +142,105 @@ dmypy.json
|
||||
web/.vscode/settings.json
|
||||
|
||||
# Intellij IDEA Files
|
||||
.idea/
|
||||
.idea/*
|
||||
!.idea/vcs.xml
|
||||
!.idea/icon.png
|
||||
.ideaDataSources/
|
||||
*.iml
|
||||
api/.idea
|
||||
|
||||
api/.env
|
||||
api/storage/*
|
||||
|
||||
docker-legacy/volumes/app/storage/*
|
||||
docker-legacy/volumes/db/data/*
|
||||
docker-legacy/volumes/redis/data/*
|
||||
docker-legacy/volumes/weaviate/*
|
||||
docker-legacy/volumes/qdrant/*
|
||||
docker-legacy/volumes/etcd/*
|
||||
docker-legacy/volumes/minio/*
|
||||
docker-legacy/volumes/milvus/*
|
||||
docker-legacy/volumes/chroma/*
|
||||
docker-legacy/volumes/opensearch/data/*
|
||||
docker-legacy/volumes/pgvectors/data/*
|
||||
docker-legacy/volumes/pgvector/data/*
|
||||
|
||||
docker/volumes/app/storage/*
|
||||
docker/volumes/certbot/*
|
||||
docker/volumes/db/data/*
|
||||
docker/volumes/redis/data/*
|
||||
docker/volumes/weaviate/*
|
||||
docker/volumes/qdrant/*
|
||||
docker/tidb/volumes/*
|
||||
docker/volumes/etcd/*
|
||||
docker/volumes/minio/*
|
||||
docker/volumes/milvus/*
|
||||
docker/volumes/chroma/*
|
||||
docker/volumes/opensearch/data/*
|
||||
docker/volumes/myscale/data/*
|
||||
docker/volumes/myscale/log/*
|
||||
docker/volumes/unstructured/*
|
||||
docker/volumes/pgvector/data/*
|
||||
docker/volumes/pgvecto_rs/data/*
|
||||
docker/volumes/couchbase/*
|
||||
docker/volumes/oceanbase/*
|
||||
docker/volumes/plugin_daemon/*
|
||||
docker/volumes/matrixone/*
|
||||
docker/volumes/mysql/*
|
||||
docker/volumes/seekdb/*
|
||||
!docker/volumes/oceanbase/init.d
|
||||
|
||||
docker/nginx/conf.d/default.conf
|
||||
docker/nginx/ssl/*
|
||||
!docker/nginx/ssl/.gitkeep
|
||||
docker/middleware.env
|
||||
docker/docker-compose.override.yaml
|
||||
|
||||
sdks/python-client/build
|
||||
sdks/python-client/dist
|
||||
sdks/python-client/dify_client.egg-info
|
||||
|
||||
.vscode/
|
||||
.vscode/*
|
||||
!.vscode/launch.json.template
|
||||
!.vscode/README.md
|
||||
api/.vscode
|
||||
web/.vscode
|
||||
# vscode Code History Extension
|
||||
.history
|
||||
|
||||
.idea/
|
||||
|
||||
# pnpm
|
||||
/.pnpm-store
|
||||
|
||||
# plugin migrate
|
||||
plugins.jsonl
|
||||
|
||||
# mise
|
||||
mise.toml
|
||||
|
||||
# Next.js build output
|
||||
.next/
|
||||
|
||||
# PWA generated files
|
||||
web/public/sw.js
|
||||
web/public/sw.js.map
|
||||
web/public/workbox-*.js
|
||||
web/public/workbox-*.js.map
|
||||
web/public/fallback-*.js
|
||||
|
||||
# AI Assistant
|
||||
.roo/
|
||||
api/.env.backup
|
||||
/clickzetta
|
||||
|
||||
# Benchmark
|
||||
scripts/stress-test/setup/config/
|
||||
scripts/stress-test/reports/
|
||||
|
||||
# mcp
|
||||
.playwright-mcp/
|
||||
.serena/
|
||||
|
||||
# settings
|
||||
*.local.json
|
||||
|
||||
34
.mcp.json
Normal file
34
.mcp.json
Normal file
@ -0,0 +1,34 @@
|
||||
{
|
||||
"mcpServers": {
|
||||
"context7": {
|
||||
"type": "http",
|
||||
"url": "https://mcp.context7.com/mcp"
|
||||
},
|
||||
"sequential-thinking": {
|
||||
"type": "stdio",
|
||||
"command": "npx",
|
||||
"args": ["-y", "@modelcontextprotocol/server-sequential-thinking"],
|
||||
"env": {}
|
||||
},
|
||||
"github": {
|
||||
"type": "stdio",
|
||||
"command": "npx",
|
||||
"args": ["-y", "@modelcontextprotocol/server-github"],
|
||||
"env": {
|
||||
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_PERSONAL_ACCESS_TOKEN}"
|
||||
}
|
||||
},
|
||||
"fetch": {
|
||||
"type": "stdio",
|
||||
"command": "uvx",
|
||||
"args": ["mcp-server-fetch"],
|
||||
"env": {}
|
||||
},
|
||||
"playwright": {
|
||||
"type": "stdio",
|
||||
"command": "npx",
|
||||
"args": ["-y", "@playwright/mcp@latest"],
|
||||
"env": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
14
.vscode/README.md
vendored
Normal file
14
.vscode/README.md
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
# Debugging with VS Code
|
||||
|
||||
This `launch.json.template` file provides various debug configurations for the Dify project within VS Code / Cursor. To use these configurations, you should copy the contents of this file into a new file named `launch.json` in the same `.vscode` directory.
|
||||
|
||||
## How to Use
|
||||
|
||||
1. **Create `launch.json`**: If you don't have one, create a file named `launch.json` inside the `.vscode` directory.
|
||||
1. **Copy Content**: Copy the entire content from `launch.json.template` into your newly created `launch.json` file.
|
||||
1. **Select Debug Configuration**: Go to the Run and Debug view in VS Code / Cursor (Ctrl+Shift+D or Cmd+Shift+D).
|
||||
1. **Start Debugging**: Select the desired configuration from the dropdown menu and click the green play button.
|
||||
|
||||
## Tips
|
||||
|
||||
- If you need to debug with Edge browser instead of Chrome, modify the `serverReadyAction` configuration in the "Next.js: debug full stack" section, change `"debugWithChrome"` to `"debugWithEdge"` to use Microsoft Edge for debugging.
|
||||
65
.vscode/launch.json.template
vendored
Normal file
65
.vscode/launch.json.template
vendored
Normal file
@ -0,0 +1,65 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: Flask API",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"module": "flask",
|
||||
"env": {
|
||||
"FLASK_APP": "app.py",
|
||||
"FLASK_ENV": "development"
|
||||
},
|
||||
"args": [
|
||||
"run",
|
||||
"--host=0.0.0.0",
|
||||
"--port=5001",
|
||||
"--no-debugger",
|
||||
"--no-reload"
|
||||
],
|
||||
"jinja": true,
|
||||
"justMyCode": true,
|
||||
"cwd": "${workspaceFolder}/api",
|
||||
"python": "${workspaceFolder}/api/.venv/bin/python"
|
||||
},
|
||||
{
|
||||
"name": "Python: Celery Worker (Solo)",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"module": "celery",
|
||||
"env": {},
|
||||
"args": [
|
||||
"-A",
|
||||
"app.celery",
|
||||
"worker",
|
||||
"-P",
|
||||
"solo",
|
||||
"-c",
|
||||
"1",
|
||||
"-Q",
|
||||
"dataset,priority_dataset,priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor",
|
||||
"--loglevel",
|
||||
"INFO"
|
||||
],
|
||||
"justMyCode": false,
|
||||
"cwd": "${workspaceFolder}/api",
|
||||
"python": "${workspaceFolder}/api/.venv/bin/python"
|
||||
},
|
||||
{
|
||||
"name": "Next.js: debug full stack",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/web/node_modules/next/dist/bin/next",
|
||||
"runtimeArgs": ["--inspect"],
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"serverReadyAction": {
|
||||
"action": "debugWithChrome",
|
||||
"killOnServerStop": true,
|
||||
"pattern": "- Local:.+(https?://.+)",
|
||||
"uriFormat": "%s",
|
||||
"webRoot": "${workspaceFolder}/web"
|
||||
},
|
||||
"cwd": "${workspaceFolder}/web"
|
||||
}
|
||||
]
|
||||
}
|
||||
5
.windsurf/rules/testing.md
Normal file
5
.windsurf/rules/testing.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Windsurf Testing Rules
|
||||
|
||||
- Use `web/testing/testing.md` as the single source of truth for frontend automated testing.
|
||||
- Honor every requirement in that document when generating or accepting tests.
|
||||
- When proposing or saving tests, re-read that document and follow every requirement.
|
||||
54
AGENTS.md
Normal file
54
AGENTS.md
Normal file
@ -0,0 +1,54 @@
|
||||
# AGENTS.md
|
||||
|
||||
## Project Overview
|
||||
|
||||
Dify is an open-source platform for developing LLM applications with an intuitive interface combining agentic AI workflows, RAG pipelines, agent capabilities, and model management.
|
||||
|
||||
The codebase is split into:
|
||||
|
||||
- **Backend API** (`/api`): Python Flask application organized with Domain-Driven Design
|
||||
- **Frontend Web** (`/web`): Next.js 15 application using TypeScript and React 19
|
||||
- **Docker deployment** (`/docker`): Containerized deployment configurations
|
||||
|
||||
## Backend Workflow
|
||||
|
||||
- Run backend CLI commands through `uv run --project api <command>`.
|
||||
|
||||
- Before submission, all backend modifications must pass local checks: `make lint`, `make type-check`, and `uv run --project api --dev dev/pytest/pytest_unit_tests.sh`.
|
||||
|
||||
- Use Makefile targets for linting and formatting; `make lint` and `make type-check` cover the required checks.
|
||||
|
||||
- Integration tests are CI-only and are not expected to run in the local environment.
|
||||
|
||||
## Frontend Workflow
|
||||
|
||||
```bash
|
||||
cd web
|
||||
pnpm lint
|
||||
pnpm lint:fix
|
||||
pnpm test
|
||||
```
|
||||
|
||||
## Testing & Quality Practices
|
||||
|
||||
- Follow TDD: red → green → refactor.
|
||||
- Use `pytest` for backend tests with Arrange-Act-Assert structure.
|
||||
- Enforce strong typing; avoid `Any` and prefer explicit type annotations.
|
||||
- Write self-documenting code; only add comments that explain intent.
|
||||
|
||||
## Language Style
|
||||
|
||||
- **Python**: Keep type hints on functions and attributes, and implement relevant special methods (e.g., `__repr__`, `__str__`).
|
||||
- **TypeScript**: Use the strict config, lean on ESLint + Prettier workflows, and avoid `any` types.
|
||||
|
||||
## General Practices
|
||||
|
||||
- Prefer editing existing files; add new documentation only when requested.
|
||||
- Inject dependencies through constructors and preserve clean architecture boundaries.
|
||||
- Handle errors with domain-specific exceptions at the correct layer.
|
||||
|
||||
## Project Conventions
|
||||
|
||||
- Backend architecture adheres to DDD and Clean Architecture principles.
|
||||
- Async work runs through Celery with Redis as the broker.
|
||||
- Frontend user-facing strings must use `web/i18n/en-US/`; avoid hardcoded text.
|
||||
110
CONTRIBUTING.md
110
CONTRIBUTING.md
@ -1,61 +1,99 @@
|
||||
# Contributing
|
||||
# CONTRIBUTING
|
||||
|
||||
Thanks for your interest in [Dify](https://dify.ai) and for wanting to contribute! Before you begin, read the
|
||||
[code of conduct](https://github.com/langgenius/.github/blob/main/CODE_OF_CONDUCT.md) and check out the
|
||||
[existing issues](https://github.com/langgenius/langgenius-gateway/issues).
|
||||
This document describes how to set up your development environment to build and test [Dify](https://dify.ai).
|
||||
So you're looking to contribute to Dify - that's awesome, we can't wait to see what you do. As a startup with limited headcount and funding, we have grand ambitions to design the most intuitive workflow for building and managing LLM applications. Any help from the community counts, truly.
|
||||
|
||||
### Install dependencies
|
||||
We need to be nimble and ship fast given where we are, but we also want to make sure that contributors like you get as smooth an experience at contributing as possible. We've assembled this contribution guide for that purpose, aiming at getting you familiarized with the codebase & how we work with contributors, so you could quickly jump to the fun part.
|
||||
|
||||
You need to install and configure the following dependencies on your machine to build [Dify](https://dify.ai):
|
||||
This guide, like Dify itself, is a constant work in progress. We highly appreciate your understanding if at times it lags behind the actual project, and welcome any feedback for us to improve.
|
||||
|
||||
- [Git](http://git-scm.com/)
|
||||
- [Docker](https://www.docker.com/)
|
||||
- [Docker Compose](https://docs.docker.com/compose/install/)
|
||||
- [Node.js v18.x (LTS)](http://nodejs.org)
|
||||
- [npm](https://www.npmjs.com/) version 8.x.x or [Yarn](https://yarnpkg.com/)
|
||||
- [Python](https://www.python.org/) version 3.10.x
|
||||
In terms of licensing, please take a minute to read our short [License and Contributor Agreement](./LICENSE). The community also adheres to the [code of conduct](https://github.com/langgenius/.github/blob/main/CODE_OF_CONDUCT.md).
|
||||
|
||||
## Local development
|
||||
## Before you jump in
|
||||
|
||||
To set up a working development environment, just fork the project git repository and install the backend and frontend dependencies using the proper package manager and create run the docker-compose stack.
|
||||
Looking for something to tackle? Browse our [good first issues](https://github.com/langgenius/dify/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22) and pick one to get started!
|
||||
|
||||
### Fork the repository
|
||||
Got a cool new model runtime or tool to add? Open a PR in our [plugin repo](https://github.com/langgenius/dify-plugins) and show us what you've built.
|
||||
|
||||
you need to fork the [repository](https://github.com/langgenius/dify).
|
||||
Need to update an existing model runtime, tool, or squash some bugs? Head over to our [official plugin repo](https://github.com/langgenius/dify-official-plugins) and make your magic happen!
|
||||
|
||||
### Clone the repo
|
||||
Join the fun, contribute, and let's build something awesome together! 💡✨
|
||||
|
||||
Clone your GitHub forked repository:
|
||||
Don't forget to link an existing issue or open a new issue in the PR's description.
|
||||
|
||||
```
|
||||
git clone git@github.com:<github_username>/dify.git
|
||||
```
|
||||
### Bug reports
|
||||
|
||||
### Install backend
|
||||
> [!IMPORTANT]
|
||||
> Please make sure to include the following information when submitting a bug report:
|
||||
|
||||
To learn how to install the backend application, please refer to the [Backend README](api/README.md).
|
||||
- A clear and descriptive title
|
||||
- A detailed description of the bug, including any error messages
|
||||
- Steps to reproduce the bug
|
||||
- Expected behavior
|
||||
- **Logs**, if available, for backend issues, this is really important, you can find them in docker-compose logs
|
||||
- Screenshots or videos, if applicable
|
||||
|
||||
### Install frontend
|
||||
How we prioritize:
|
||||
|
||||
To learn how to install the frontend application, please refer to the [Frontend README](web/README.md).
|
||||
| Issue Type | Priority |
|
||||
| ------------------------------------------------------------ | --------------- |
|
||||
| Bugs in core functions (cloud service, cannot login, applications not working, security loopholes) | Critical |
|
||||
| Non-critical bugs, performance boosts | Medium Priority |
|
||||
| Minor fixes (typos, confusing but working UI) | Low Priority |
|
||||
|
||||
### Visit dify in your browser
|
||||
### Feature requests
|
||||
|
||||
Finally, you can now visit [http://localhost:3000](http://localhost:3000) to view the [Dify](https://dify.ai) in local environment.
|
||||
> [!NOTE]
|
||||
> Please make sure to include the following information when submitting a feature request:
|
||||
|
||||
- A clear and descriptive title
|
||||
- A detailed description of the feature
|
||||
- A use case for the feature
|
||||
- Any other context or screenshots about the feature request
|
||||
|
||||
## Create a pull request
|
||||
How we prioritize:
|
||||
|
||||
After making your changes, open a pull request (PR). Once you submit your pull request, others from the Dify team/community will review it with you.
|
||||
| Feature Type | Priority |
|
||||
| ------------------------------------------------------------ | --------------- |
|
||||
| High-Priority Features as being labeled by a team member | High Priority |
|
||||
| Popular feature requests from our [community feedback board](https://github.com/langgenius/dify/discussions/categories/feedbacks) | Medium Priority |
|
||||
| Non-core features and minor enhancements | Low Priority |
|
||||
| Valuable but not immediate | Future-Feature |
|
||||
|
||||
Did you have an issue, like a merge conflict, or don't know how to open a pull request? Check out [GitHub's pull request tutorial](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests) on how to resolve merge conflicts and other issues. Once your PR has been merged, you will be proudly listed as a contributor in the [contributor chart](https://github.com/langgenius/langgenius-gateway/graphs/contributors).
|
||||
## Submitting your PR
|
||||
|
||||
## Community channels
|
||||
### Pull Request Process
|
||||
|
||||
Stuck somewhere? Have any questions? Join the [Discord Community Server](https://discord.gg/j3XRWSPBf7). We are here to help!
|
||||
1. Fork the repository
|
||||
1. Before you draft a PR, please create an issue to discuss the changes you want to make
|
||||
1. Create a new branch for your changes
|
||||
1. Please add tests for your changes accordingly
|
||||
1. Ensure your code passes the existing tests
|
||||
1. Please link the issue in the PR description, `fixes #<issue_number>`
|
||||
1. Get merged!
|
||||
|
||||
### i18n (Internationalization) Support
|
||||
### Setup the project
|
||||
|
||||
We are looking for contributors to help with translations in other languages. If you are interested in helping, please join the [Discord Community Server](https://discord.gg/AhzKf7dNgk) and let us know.
|
||||
Also check out the [Frontend i18n README]((web/i18n/README_EN.md)) for more information.
|
||||
#### Frontend
|
||||
|
||||
For setting up the frontend service, please refer to our comprehensive [guide](https://github.com/langgenius/dify/blob/main/web/README.md) in the `web/README.md` file. This document provides detailed instructions to help you set up the frontend environment properly.
|
||||
|
||||
**Testing**: All React components must have comprehensive test coverage. See [web/testing/testing.md](https://github.com/langgenius/dify/blob/main/web/testing/testing.md) for the canonical frontend testing guidelines and follow every requirement described there.
|
||||
|
||||
#### Backend
|
||||
|
||||
For setting up the backend service, kindly refer to our detailed [instructions](https://github.com/langgenius/dify/blob/main/api/README.md) in the `api/README.md` file. This document contains step-by-step guidance to help you get the backend up and running smoothly.
|
||||
|
||||
#### Other things to note
|
||||
|
||||
We recommend reviewing this document carefully before proceeding with the setup, as it contains essential information about:
|
||||
|
||||
- Prerequisites and dependencies
|
||||
- Installation steps
|
||||
- Configuration details
|
||||
- Common troubleshooting tips
|
||||
|
||||
Feel free to reach out if you encounter any issues during the setup process.
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you ever get stuck or get a burning question while contributing, simply shoot your queries our way via the related GitHub issue, or hop onto our [Discord](https://discord.gg/8Tpq4AcN9c) for a quick chat.
|
||||
|
||||
@ -1,57 +0,0 @@
|
||||
# 贡献
|
||||
|
||||
感谢您对 [Dify](https://dify.ai) 的兴趣,并希望您能够做出贡献!在开始之前,请先阅读[行为准则](https://github.com/langgenius/.github/blob/main/CODE_OF_CONDUCT.md)并查看[现有问题](https://github.com/langgenius/dify/issues)。
|
||||
本文档介绍了如何设置开发环境以构建和测试 [Dify](https://dify.ai)。
|
||||
|
||||
### 安装依赖项
|
||||
|
||||
您需要在计算机上安装和配置以下依赖项才能构建 [Dify](https://dify.ai):
|
||||
|
||||
- [Git](http://git-scm.com/)
|
||||
- [Docker](https://www.docker.com/)
|
||||
- [Docker Compose](https://docs.docker.com/compose/install/)
|
||||
- [Node.js v18.x (LTS)](http://nodejs.org)
|
||||
- [npm](https://www.npmjs.com/) 版本 8.x.x 或 [Yarn](https://yarnpkg.com/)
|
||||
- [Python](https://www.python.org/) 版本 3.10.x
|
||||
|
||||
## 本地开发
|
||||
|
||||
要设置一个可工作的开发环境,只需 fork 项目的 git 存储库,并使用适当的软件包管理器安装后端和前端依赖项,然后创建并运行 docker-compose。
|
||||
|
||||
### Fork存储库
|
||||
|
||||
您需要 fork [Git 仓库](https://github.com/langgenius/dify)。
|
||||
|
||||
### 克隆存储库
|
||||
|
||||
克隆您在 GitHub 上 fork 的仓库:
|
||||
|
||||
```
|
||||
git clone git@github.com:<github_username>/dify.git
|
||||
```
|
||||
|
||||
### 安装后端
|
||||
|
||||
要了解如何安装后端应用程序,请参阅[后端 README](api/README.md)。
|
||||
|
||||
### 安装前端
|
||||
|
||||
要了解如何安装前端应用程序,请参阅[前端 README](web/README.md)。
|
||||
|
||||
### 在浏览器中访问 Dify
|
||||
|
||||
最后,您现在可以访问 [http://localhost:3000](http://localhost:3000) 在本地环境中查看 [Dify](https://dify.ai)。
|
||||
|
||||
## 创建拉取请求
|
||||
|
||||
在进行更改后,打开一个拉取请求(PR)。提交拉取请求后,Dify 团队/社区的其他人将与您一起审查它。
|
||||
|
||||
如果遇到问题,比如合并冲突或不知道如何打开拉取请求,请查看 GitHub 的[拉取请求教程](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests),了解如何解决合并冲突和其他问题。一旦您的 PR 被合并,您将自豪地被列为[贡献者表](https://github.com/langgenius/dify/graphs/contributors)中的一员。
|
||||
|
||||
## 社区渠道
|
||||
|
||||
遇到困难了吗?有任何问题吗? 加入 [Discord Community Server](https://discord.gg/AhzKf7dNgk),我们将为您提供帮助。
|
||||
|
||||
### 多语言支持
|
||||
|
||||
需要参与贡献翻译内容,请参阅[前端多语言翻译 README](web/i18n/README_CN.md)。
|
||||
@ -1,55 +0,0 @@
|
||||
# コントリビュート
|
||||
|
||||
[Dify](https://dify.ai) に興味を持ち、貢献したいと思うようになったことに感謝します!始める前に、
|
||||
[行動規範](https://github.com/langgenius/.github/blob/main/CODE_OF_CONDUCT.md)を読み、
|
||||
[既存の問題](https://github.com/langgenius/langgenius-gateway/issues)をチェックしてください。
|
||||
本ドキュメントは、[Dify](https://dify.ai) をビルドしてテストするための開発環境の構築方法を説明するものです。
|
||||
|
||||
### 依存関係のインストール
|
||||
|
||||
[Dify](https://dify.ai)をビルドするには、お使いのマシンに以下の依存関係をインストールし、設定する必要があります:
|
||||
|
||||
- [Git](http://git-scm.com/)
|
||||
- [Docker](https://www.docker.com/)
|
||||
- [Docker Compose](https://docs.docker.com/compose/install/)
|
||||
- [Node.js v18.x (LTS)](http://nodejs.org)
|
||||
- [npm](https://www.npmjs.com/) バージョン 8.x.x もしくは [Yarn](https://yarnpkg.com/)
|
||||
- [Python](https://www.python.org/) バージョン 3.10.x
|
||||
|
||||
## ローカル開発
|
||||
|
||||
開発環境を構築するには、プロジェクトの git リポジトリをフォークし、適切なパッケージマネージャを使用してバックエンドとフロントエンドの依存関係をインストールし、docker-compose スタックを実行するように作成します。
|
||||
|
||||
### リポジトリのフォーク
|
||||
|
||||
[リポジトリ](https://github.com/langgenius/dify) をフォークする必要があります。
|
||||
|
||||
### リポジトリのクローン
|
||||
|
||||
GitHub でフォークしたリポジトリのクローンを作成する:
|
||||
|
||||
```
|
||||
git clone git@github.com:<github_username>/dify.git
|
||||
```
|
||||
|
||||
### バックエンドのインストール
|
||||
|
||||
バックエンドアプリケーションのインストール方法については、[Backend README](api/README.md) を参照してください。
|
||||
|
||||
### フロントエンドのインストール
|
||||
|
||||
フロントエンドアプリケーションのインストール方法については、[Frontend README](web/README.md) を参照してください。
|
||||
|
||||
### ブラウザで dify にアクセス
|
||||
|
||||
[Dify](https://dify.ai) をローカル環境で見ることができるようになりました [http://localhost:3000](http://localhost:3000)。
|
||||
|
||||
## プルリクエストの作成
|
||||
|
||||
変更後、プルリクエスト (PR) をオープンしてください。プルリクエストを提出すると、Dify チーム/コミュニティの他の人があなたと一緒にそれをレビューします。
|
||||
|
||||
マージコンフリクトなどの問題が発生したり、プルリクエストの開き方がわからなくなったりしませんでしたか? [GitHub's pull request tutorial](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests) で、マージコンフリクトやその他の問題を解決する方法をチェックしてみてください。あなたの PR がマージされると、[コントリビュータチャート](https://github.com/langgenius/langgenius-gateway/graphs/contributors)にコントリビュータとして誇らしげに掲載されます。
|
||||
|
||||
## コミュニティチャンネル
|
||||
|
||||
お困りですか?何か質問がありますか? [Discord Community サーバ](https://discord.gg/j3XRWSPBf7) に参加してください。私たちがお手伝いします!
|
||||
38
LICENSE
38
LICENSE
@ -1,36 +1,22 @@
|
||||
# Dify Open Source License
|
||||
# Open Source License
|
||||
|
||||
The Dify project is licensed under the Apache License 2.0, with the following additional conditions:
|
||||
Dify is licensed under a modified version of the Apache License 2.0, with the following additional conditions:
|
||||
|
||||
1. Dify is permitted to be used for commercialization, such as using Dify 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:
|
||||
1. Dify may be utilized commercially, including as a backend service for other applications or as an application development platform for enterprises. Should the conditions below be met, a commercial license must be obtained from the producer:
|
||||
|
||||
a. Multi-tenant SaaS service: Unless explicitly authorized by Dify in writing, you may not use the Dify.AI source code to operate a multi-tenant SaaS service that is similar to the Dify.AI service edition.
|
||||
b. LOGO and copyright information: In the process of using Dify, you may not remove or modify the LOGO or copyright information in the Dify console.
|
||||
a. Multi-tenant service: Unless explicitly authorized by Dify in writing, you may not use the Dify source code to operate a multi-tenant environment.
|
||||
- Tenant Definition: Within the context of Dify, one tenant corresponds to one workspace. The workspace provides a separated area for each tenant's data and configurations.
|
||||
|
||||
Please contact business@dify.ai by email to inquire about licensing matters.
|
||||
b. LOGO and copyright information: In the process of using Dify's frontend, you may not remove or modify the LOGO or copyright information in the Dify console or applications. This restriction is inapplicable to uses of Dify that do not involve its frontend.
|
||||
- Frontend Definition: For the purposes of this license, the "frontend" of Dify includes all components located in the `web/` directory when running Dify from the raw source code, or the "web" image when running Dify with Docker.
|
||||
|
||||
2. As a contributor, you should agree that your contributed code:
|
||||
2. As a contributor, you should agree that:
|
||||
|
||||
a. The producer can adjust the open-source agreement to be more strict or relaxed.
|
||||
b. Can be used for commercial purposes, such as Dify's cloud business.
|
||||
a. The producer can adjust the open-source agreement to be more strict or relaxed as deemed necessary.
|
||||
b. Your contributed code may be used for commercial purposes, including but not limited to its cloud business operations.
|
||||
|
||||
Apart from this, all other rights and restrictions follow the Apache License 2.0. If you need more detailed information, you can refer to the full version of Apache License 2.0.
|
||||
Apart from the specific conditions mentioned above, all other rights and restrictions follow the Apache License 2.0. Detailed information about the Apache License 2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
|
||||
The interactive design of this product is protected by appearance patent.
|
||||
|
||||
© 2023 LangGenius, Inc.
|
||||
|
||||
|
||||
----------
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
© 2025 LangGenius, Inc.
|
||||
|
||||
137
Makefile
Normal file
137
Makefile
Normal file
@ -0,0 +1,137 @@
|
||||
# Variables
|
||||
DOCKER_REGISTRY=langgenius
|
||||
WEB_IMAGE=$(DOCKER_REGISTRY)/dify-web
|
||||
API_IMAGE=$(DOCKER_REGISTRY)/dify-api
|
||||
VERSION=latest
|
||||
|
||||
# Default target - show help
|
||||
.DEFAULT_GOAL := help
|
||||
|
||||
# Backend Development Environment Setup
|
||||
.PHONY: dev-setup prepare-docker prepare-web prepare-api
|
||||
|
||||
# Dev setup target
|
||||
dev-setup: prepare-docker prepare-web prepare-api
|
||||
@echo "✅ Backend development environment setup complete!"
|
||||
|
||||
# Step 1: Prepare Docker middleware
|
||||
prepare-docker:
|
||||
@echo "🐳 Setting up Docker middleware..."
|
||||
@cp -n docker/middleware.env.example docker/middleware.env 2>/dev/null || echo "Docker middleware.env already exists"
|
||||
@cd docker && docker compose -f docker-compose.middleware.yaml --env-file middleware.env -p dify-middlewares-dev up -d
|
||||
@echo "✅ Docker middleware started"
|
||||
|
||||
# Step 2: Prepare web environment
|
||||
prepare-web:
|
||||
@echo "🌐 Setting up web environment..."
|
||||
@cp -n web/.env.example web/.env 2>/dev/null || echo "Web .env already exists"
|
||||
@cd web && pnpm install
|
||||
@echo "✅ Web environment prepared (not started)"
|
||||
|
||||
# Step 3: Prepare API environment
|
||||
prepare-api:
|
||||
@echo "🔧 Setting up API environment..."
|
||||
@cp -n api/.env.example api/.env 2>/dev/null || echo "API .env already exists"
|
||||
@cd api && uv sync --dev
|
||||
@cd api && uv run flask db upgrade
|
||||
@echo "✅ API environment prepared (not started)"
|
||||
|
||||
# Clean dev environment
|
||||
dev-clean:
|
||||
@echo "⚠️ Stopping Docker containers..."
|
||||
@cd docker && docker compose -f docker-compose.middleware.yaml --env-file middleware.env -p dify-middlewares-dev down
|
||||
@echo "🗑️ Removing volumes..."
|
||||
@rm -rf docker/volumes/db
|
||||
@rm -rf docker/volumes/redis
|
||||
@rm -rf docker/volumes/plugin_daemon
|
||||
@rm -rf docker/volumes/weaviate
|
||||
@rm -rf api/storage
|
||||
@echo "✅ Cleanup complete"
|
||||
|
||||
# Backend Code Quality Commands
|
||||
format:
|
||||
@echo "🎨 Running ruff format..."
|
||||
@uv run --project api --dev ruff format ./api
|
||||
@echo "✅ Code formatting complete"
|
||||
|
||||
check:
|
||||
@echo "🔍 Running ruff check..."
|
||||
@uv run --project api --dev ruff check ./api
|
||||
@echo "✅ Code check complete"
|
||||
|
||||
lint:
|
||||
@echo "🔧 Running ruff format, check with fixes, and import linter..."
|
||||
@uv run --project api --dev sh -c 'ruff format ./api && ruff check --fix ./api'
|
||||
@uv run --directory api --dev lint-imports
|
||||
@echo "✅ Linting complete"
|
||||
|
||||
type-check:
|
||||
@echo "📝 Running type check with basedpyright..."
|
||||
@uv run --directory api --dev basedpyright
|
||||
@echo "✅ Type check complete"
|
||||
|
||||
test:
|
||||
@echo "🧪 Running backend unit tests..."
|
||||
@uv run --project api --dev dev/pytest/pytest_unit_tests.sh
|
||||
@echo "✅ Tests complete"
|
||||
|
||||
# Build Docker images
|
||||
build-web:
|
||||
@echo "Building web Docker image: $(WEB_IMAGE):$(VERSION)..."
|
||||
docker build -t $(WEB_IMAGE):$(VERSION) ./web
|
||||
@echo "Web Docker image built successfully: $(WEB_IMAGE):$(VERSION)"
|
||||
|
||||
build-api:
|
||||
@echo "Building API Docker image: $(API_IMAGE):$(VERSION)..."
|
||||
docker build -t $(API_IMAGE):$(VERSION) ./api
|
||||
@echo "API Docker image built successfully: $(API_IMAGE):$(VERSION)"
|
||||
|
||||
# Push Docker images
|
||||
push-web:
|
||||
@echo "Pushing web Docker image: $(WEB_IMAGE):$(VERSION)..."
|
||||
docker push $(WEB_IMAGE):$(VERSION)
|
||||
@echo "Web Docker image pushed successfully: $(WEB_IMAGE):$(VERSION)"
|
||||
|
||||
push-api:
|
||||
@echo "Pushing API Docker image: $(API_IMAGE):$(VERSION)..."
|
||||
docker push $(API_IMAGE):$(VERSION)
|
||||
@echo "API Docker image pushed successfully: $(API_IMAGE):$(VERSION)"
|
||||
|
||||
# Build all images
|
||||
build-all: build-web build-api
|
||||
|
||||
# Push all images
|
||||
push-all: push-web push-api
|
||||
|
||||
build-push-api: build-api push-api
|
||||
build-push-web: build-web push-web
|
||||
|
||||
# Build and push all images
|
||||
build-push-all: build-all push-all
|
||||
@echo "All Docker images have been built and pushed."
|
||||
|
||||
# Help target
|
||||
help:
|
||||
@echo "Development Setup Targets:"
|
||||
@echo " make dev-setup - Run all setup steps for backend dev environment"
|
||||
@echo " make prepare-docker - Set up Docker middleware"
|
||||
@echo " make prepare-web - Set up web environment"
|
||||
@echo " make prepare-api - Set up API environment"
|
||||
@echo " make dev-clean - Stop Docker middleware containers"
|
||||
@echo ""
|
||||
@echo "Backend Code Quality:"
|
||||
@echo " make format - Format code with ruff"
|
||||
@echo " make check - Check code with ruff"
|
||||
@echo " make lint - Format and fix code with ruff"
|
||||
@echo " make type-check - Run type checking with basedpyright"
|
||||
@echo " make test - Run backend unit tests"
|
||||
@echo ""
|
||||
@echo "Docker Build Targets:"
|
||||
@echo " make build-web - Build web Docker image"
|
||||
@echo " make build-api - Build API Docker image"
|
||||
@echo " make build-all - Build all Docker images"
|
||||
@echo " make push-all - Push all Docker images"
|
||||
@echo " make build-push-all - Build and push all Docker images"
|
||||
|
||||
# Phony targets
|
||||
.PHONY: build-web build-api push-web push-api build-all push-all build-push-all dev-setup prepare-docker prepare-web prepare-api dev-clean help format check lint type-check test
|
||||
312
README.md
312
README.md
@ -1,172 +1,222 @@
|
||||

|
||||

|
||||
|
||||
<p align="center">
|
||||
<a href="./README.md">English</a> |
|
||||
<a href="./README_CN.md">简体中文</a> |
|
||||
<a href="./README_JA.md">日本語</a> |
|
||||
<a href="./README_ES.md">Español</a>
|
||||
📌 <a href="https://dify.ai/blog/introducing-dify-workflow-file-upload-a-demo-on-ai-podcast">Introducing Dify Workflow File Upload: Recreate Google NotebookLM Podcast</a>
|
||||
</p>
|
||||
|
||||
#### [Website](https://dify.ai) • [Docs](https://docs.dify.ai) • [Deployment Docs](https://docs.dify.ai/getting-started/install-self-hosted) • [FAQ](https://docs.dify.ai/getting-started/faq) • [Twitter](https://twitter.com/dify_ai) • [Discord](https://discord.gg/FngNHpbcY7)
|
||||
<p align="center">
|
||||
<a href="https://cloud.dify.ai">Dify Cloud</a> ·
|
||||
<a href="https://docs.dify.ai/getting-started/install-self-hosted">Self-hosting</a> ·
|
||||
<a href="https://docs.dify.ai">Documentation</a> ·
|
||||
<a href="https://dify.ai/pricing">Dify edition overview</a>
|
||||
</p>
|
||||
|
||||
**Dify** is an easy-to-use LLMOps platform designed to empower more people to create sustainable, AI-native applications. With visual orchestration for various application types, Dify offers out-of-the-box, ready-to-use applications that can also serve as Backend-as-a-Service APIs. Unify your development process with one API for plugins and datasets integration, and streamline your operations using a single interface for prompt engineering, visual analytics, and continuous improvement.
|
||||
<p align="center">
|
||||
<a href="https://dify.ai" target="_blank">
|
||||
<img alt="Static Badge" src="https://img.shields.io/badge/Product-F04438"></a>
|
||||
<a href="https://dify.ai/pricing" target="_blank">
|
||||
<img alt="Static Badge" src="https://img.shields.io/badge/free-pricing?logo=free&color=%20%23155EEF&label=pricing&labelColor=%20%23528bff"></a>
|
||||
<a href="https://discord.gg/FngNHpbcY7" target="_blank">
|
||||
<img src="https://img.shields.io/discord/1082486657678311454?logo=discord&labelColor=%20%235462eb&logoColor=%20%23f5f5f5&color=%20%235462eb"
|
||||
alt="chat on Discord"></a>
|
||||
<a href="https://reddit.com/r/difyai" target="_blank">
|
||||
<img src="https://img.shields.io/reddit/subreddit-subscribers/difyai?style=plastic&logo=reddit&label=r%2Fdifyai&labelColor=white"
|
||||
alt="join Reddit"></a>
|
||||
<a href="https://twitter.com/intent/follow?screen_name=dify_ai" target="_blank">
|
||||
<img src="https://img.shields.io/twitter/follow/dify_ai?logo=X&color=%20%23f5f5f5"
|
||||
alt="follow on X(Twitter)"></a>
|
||||
<a href="https://www.linkedin.com/company/langgenius/" target="_blank">
|
||||
<img src="https://custom-icon-badges.demolab.com/badge/LinkedIn-0A66C2?logo=linkedin-white&logoColor=fff"
|
||||
alt="follow on LinkedIn"></a>
|
||||
<a href="https://hub.docker.com/u/langgenius" target="_blank">
|
||||
<img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/langgenius/dify-web?labelColor=%20%23FDB062&color=%20%23f79009"></a>
|
||||
<a href="https://github.com/langgenius/dify/graphs/commit-activity" target="_blank">
|
||||
<img alt="Commits last month" src="https://img.shields.io/github/commit-activity/m/langgenius/dify?labelColor=%20%2332b583&color=%20%2312b76a"></a>
|
||||
<a href="https://github.com/langgenius/dify/" target="_blank">
|
||||
<img alt="Issues closed" src="https://img.shields.io/github/issues-search?query=repo%3Alanggenius%2Fdify%20is%3Aclosed&label=issues%20closed&labelColor=%20%237d89b0&color=%20%235d6b98"></a>
|
||||
<a href="https://github.com/langgenius/dify/discussions/" target="_blank">
|
||||
<img alt="Discussion posts" src="https://img.shields.io/github/discussions/langgenius/dify?labelColor=%20%239b8afb&color=%20%237a5af8"></a>
|
||||
<a href="https://insights.linuxfoundation.org/project/langgenius-dify" target="_blank">
|
||||
<img alt="LFX Health Score" src="https://insights.linuxfoundation.org/api/badge/health-score?project=langgenius-dify"></a>
|
||||
<a href="https://insights.linuxfoundation.org/project/langgenius-dify" target="_blank">
|
||||
<img alt="LFX Contributors" src="https://insights.linuxfoundation.org/api/badge/contributors?project=langgenius-dify"></a>
|
||||
<a href="https://insights.linuxfoundation.org/project/langgenius-dify" target="_blank">
|
||||
<img alt="LFX Active Contributors" src="https://insights.linuxfoundation.org/api/badge/active-contributors?project=langgenius-dify"></a>
|
||||
</p>
|
||||
|
||||
Applications created with Dify include:
|
||||
<p align="center">
|
||||
<a href="./README.md"><img alt="README in English" src="https://img.shields.io/badge/English-d9d9d9"></a>
|
||||
<a href="./docs/zh-TW/README.md"><img alt="繁體中文文件" src="https://img.shields.io/badge/繁體中文-d9d9d9"></a>
|
||||
<a href="./docs/zh-CN/README.md"><img alt="简体中文文件" src="https://img.shields.io/badge/简体中文-d9d9d9"></a>
|
||||
<a href="./docs/ja-JP/README.md"><img alt="日本語のREADME" src="https://img.shields.io/badge/日本語-d9d9d9"></a>
|
||||
<a href="./docs/es-ES/README.md"><img alt="README en Español" src="https://img.shields.io/badge/Español-d9d9d9"></a>
|
||||
<a href="./docs/fr-FR/README.md"><img alt="README en Français" src="https://img.shields.io/badge/Français-d9d9d9"></a>
|
||||
<a href="./docs/tlh/README.md"><img alt="README tlhIngan Hol" src="https://img.shields.io/badge/Klingon-d9d9d9"></a>
|
||||
<a href="./docs/ko-KR/README.md"><img alt="README in Korean" src="https://img.shields.io/badge/한국어-d9d9d9"></a>
|
||||
<a href="./docs/ar-SA/README.md"><img alt="README بالعربية" src="https://img.shields.io/badge/العربية-d9d9d9"></a>
|
||||
<a href="./docs/tr-TR/README.md"><img alt="Türkçe README" src="https://img.shields.io/badge/Türkçe-d9d9d9"></a>
|
||||
<a href="./docs/vi-VN/README.md"><img alt="README Tiếng Việt" src="https://img.shields.io/badge/Ti%E1%BA%BFng%20Vi%E1%BB%87t-d9d9d9"></a>
|
||||
<a href="./docs/de-DE/README.md"><img alt="README in Deutsch" src="https://img.shields.io/badge/German-d9d9d9"></a>
|
||||
<a href="./docs/bn-BD/README.md"><img alt="README in বাংলা" src="https://img.shields.io/badge/বাংলা-d9d9d9"></a>
|
||||
</p>
|
||||
|
||||
Out-of-the-box web sites supporting form mode and chat conversation mode
|
||||
A single API encompassing plugin capabilities, context enhancement, and more, saving you backend coding effort
|
||||
Visual data analysis, log review, and annotation for applications
|
||||
Dify is an open-source platform for developing LLM applications. Its intuitive interface combines agentic AI workflows, RAG pipelines, agent capabilities, model management, observability features, and more—allowing you to quickly move from prototype to production.
|
||||
|
||||
## Highlighted Features
|
||||
**1. LLMs support:** Choose capabilities based on different models when building your Dify AI apps. Dify is compatible with Langchain, meaning it will support various LLMs. Currently supported:
|
||||
## Quick start
|
||||
|
||||
- [x] **OpenAI**: GPT4, GPT3.5-turbo, GPT3.5-turbo-16k, text-davinci-003
|
||||
- [x] **Azure OpenAI Service**
|
||||
- [x] **Anthropic**: Claude2, Claude-instant
|
||||
- [x] **Replicate**
|
||||
- [x] **Hugging Face Hub**
|
||||
- [x] **ChatGLM**
|
||||
- [x] **Llama2**
|
||||
- [x] **MiniMax**
|
||||
- [x] **Spark**
|
||||
- [x] **Wenxin**
|
||||
- [x] **Tongyi**
|
||||
> Before installing Dify, make sure your machine meets the following minimum system requirements:
|
||||
>
|
||||
> - CPU >= 2 Core
|
||||
> - RAM >= 4 GiB
|
||||
|
||||
<br/>
|
||||
|
||||
We provide the following free resources for registered Dify cloud users (sign up at [dify.ai](https://dify.ai)):
|
||||
* 600,000 free Claude model tokens to build Claude-powered apps
|
||||
* 200 free OpenAI queries to build OpenAI-based apps
|
||||
|
||||
|
||||
**2. Visual orchestration:** Build an AI app in minutes by writing and debugging prompts visually.
|
||||
|
||||
**3. Text embedding:** Fully automated text preprocessing embeds your data as context without complex concepts. Supports PDF, TXT, and syncing data from Notion, webpages, APIs.
|
||||
|
||||
**4. API-based:** Backend-as-a-service. Access web apps directly or integrate via APIs without complex backend setup.
|
||||
|
||||
**5. Plugins:** Dify "Smart Chat" now supports first-party plugins like web browsing, Google search, Wikipedia to enable online lookup, analyzing web content, and explaining the AI's reasoning process conversationally.
|
||||
|
||||
**6. Team workspaces:** Team members can join workspaces to collaboratively edit, manage, and use team AI apps.
|
||||
|
||||
**7. Data labeling and improvement:** Visually inspect AI app logs and improve data via labeling. Observe the AI's reasoning process to continuously enhance performance. (Coming soon)
|
||||
|
||||
## Use cases
|
||||
* [Create an AI ChatBot with Business Data in Minutes.](https://docs.dify.ai/use-cases/create-an-ai-chatbot-with-business-data-in-minutes)
|
||||
* [How to Build an Notion AI Assistant Based on Your Own Notes?](https://docs.dify.ai/use-cases/build-an-notion-ai-assistant)
|
||||
* [Create a Midjoureny Prompt Bot Without Code in Just a Few Minutes.](https://docs.dify.ai/use-cases/create-a-midjoureny-prompt-bot-with-dify)
|
||||
|
||||
## Use Cloud Services
|
||||
|
||||
Visit [Dify.ai](https://dify.ai)
|
||||
|
||||
## Install the Community Edition
|
||||
|
||||
### System Requirements
|
||||
|
||||
Before installing Dify, make sure your machine meets the following minimum system requirements:
|
||||
|
||||
- CPU >= 2 Core
|
||||
- RAM >= 4GB
|
||||
|
||||
### Quick Start
|
||||
|
||||
The easiest way to start the Dify server is to run our [docker-compose.yml](docker/docker-compose.yaml) file. Before running the installation command, make sure that [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/) are installed on your machine:
|
||||
The easiest way to start the Dify server is through [Docker Compose](docker/docker-compose.yaml). Before running Dify with the following commands, make sure that [Docker](https://docs.docker.com/get-docker/) and [Docker Compose](https://docs.docker.com/compose/install/) are installed on your machine:
|
||||
|
||||
```bash
|
||||
cd dify
|
||||
cd docker
|
||||
cp .env.example .env
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
After running, you can access the Dify dashboard in your browser at [http://localhost/install](http://localhost/install) and start the initialization installation process.
|
||||
After running, you can access the Dify dashboard in your browser at [http://localhost/install](http://localhost/install) and start the initialization process.
|
||||
|
||||
### Helm Chart
|
||||
#### Seeking help
|
||||
|
||||
A big thanks to @BorisPolonsky for providing us with a [Helm Chart](https://helm.sh/) version, which allows Dify to be deployed on Kubernetes.
|
||||
You can go to https://github.com/BorisPolonsky/dify-helm for deployment information.
|
||||
Please refer to our [FAQ](https://docs.dify.ai/getting-started/install-self-hosted/faqs) if you encounter problems setting up Dify. Reach out to [the community and us](#community--contact) if you are still having issues.
|
||||
|
||||
### Configuration
|
||||
> If you'd like to contribute to Dify or do additional development, refer to our [guide to deploying from source code](https://docs.dify.ai/getting-started/install-self-hosted/local-source-code)
|
||||
|
||||
If you need to customize the configuration, please refer to the comments in our [docker-compose.yml](docker/docker-compose.yaml) file and manually set the environment configuration. After making the changes, please run 'docker-compose up -d' again.
|
||||
## Key features
|
||||
|
||||
## Roadmap
|
||||
**1. Workflow**:
|
||||
Build and test powerful AI workflows on a visual canvas, leveraging all the following features and beyond.
|
||||
|
||||
Features under development:
|
||||
**2. Comprehensive model support**:
|
||||
Seamless integration with hundreds of proprietary / open-source LLMs from dozens of inference providers and self-hosted solutions, covering GPT, Mistral, Llama3, and any OpenAI API-compatible models. A full list of supported model providers can be found [here](https://docs.dify.ai/getting-started/readme/model-providers).
|
||||
|
||||
- **Datasets**, supporting more datasets, e.g. syncing content from Notion or webpages
|
||||
We will support more datasets, including text, webpages, and even Notion content. Users can build AI applications based on their own data sources.
|
||||
- **Plugins**, introducing ChatGPT Plugin-standard plugins for applications, or using Dify-produced plugins
|
||||
We will release plugins complying with ChatGPT standard, or Dify's own plugins to enable more capabilities in applications.
|
||||

|
||||
|
||||
**3. Prompt IDE**:
|
||||
Intuitive interface for crafting prompts, comparing model performance, and adding additional features such as text-to-speech to a chat-based app.
|
||||
|
||||
## Q&A
|
||||
**4. RAG Pipeline**:
|
||||
Extensive RAG capabilities that cover everything from document ingestion to retrieval, with out-of-box support for text extraction from PDFs, PPTs, and other common document formats.
|
||||
|
||||
**Q: What can I do with Dify?**
|
||||
**5. Agent capabilities**:
|
||||
You can define agents based on LLM Function Calling or ReAct, and add pre-built or custom tools for the agent. Dify provides 50+ built-in tools for AI agents, such as Google Search, DALL·E, Stable Diffusion and WolframAlpha.
|
||||
|
||||
A: Dify is a simple yet powerful LLM development and operations tool. You can use it to build commercial-grade applications, personal assistants. If you want to develop your own applications, LangDifyGenius can save you backend work in integrating with OpenAI and offer visual operations capabilities, allowing you to continuously improve and train your GPT model.
|
||||
**6. LLMOps**:
|
||||
Monitor and analyze application logs and performance over time. You could continuously improve prompts, datasets, and models based on production data and annotations.
|
||||
|
||||
**Q: How do I use Dify to "train" my own model?**
|
||||
**7. Backend-as-a-Service**:
|
||||
All of Dify's offerings come with corresponding APIs, so you could effortlessly integrate Dify into your own business logic.
|
||||
|
||||
A: A valuable application consists of Prompt Engineering, context enhancement, and Fine-tuning. We've created a hybrid programming approach combining Prompts with programming languages (similar to a template engine), making it easy to accomplish long-text embedding or capturing subtitles from a user-input Youtube video - all of which will be submitted as context for LLMs to process. We place great emphasis on application operability, with data generated by users during App usage available for analysis, annotation, and continuous training. Without the right tools, these steps can be time-consuming.
|
||||
## Using Dify
|
||||
|
||||
**Q: What do I need to prepare if I want to create my own application?**
|
||||
- **Cloud <br/>**
|
||||
We host a [Dify Cloud](https://dify.ai) service for anyone to try with zero setup. It provides all the capabilities of the self-deployed version, and includes 200 free GPT-4 calls in the sandbox plan.
|
||||
|
||||
A: We assume you already have an OpenAI API Key; if not, please register for one. If you already have some content that can serve as training context, that's great!
|
||||
- **Self-hosting Dify Community Edition<br/>**
|
||||
Quickly get Dify running in your environment with this [starter guide](#quick-start).
|
||||
Use our [documentation](https://docs.dify.ai) for further references and more in-depth instructions.
|
||||
|
||||
**Q: What interface languages are available?**
|
||||
- **Dify for enterprise / organizations<br/>**
|
||||
We provide additional enterprise-centric features. [Send us an email](mailto:business@dify.ai?subject=%5BGitHub%5DBusiness%20License%20Inquiry) to discuss your enterprise needs. <br/>
|
||||
|
||||
A: English and Chinese are currently supported, and you can contribute language packs to us.
|
||||
> For startups and small businesses using AWS, check out [Dify Premium on AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-t22mebxzwjhu6) and deploy it to your own AWS VPC with one click. It's an affordable AMI offering with the option to create apps with custom logo and branding.
|
||||
|
||||
## Star History
|
||||
## Staying ahead
|
||||
|
||||
Star Dify on GitHub and be instantly notified of new releases.
|
||||
|
||||

|
||||
|
||||
## Advanced Setup
|
||||
|
||||
### Custom configurations
|
||||
|
||||
If you need to customize the configuration, please refer to the comments in our [.env.example](docker/.env.example) file and update the corresponding values in your `.env` file. Additionally, you might need to make adjustments to the `docker-compose.yaml` file itself, such as changing image versions, port mappings, or volume mounts, based on your specific deployment environment and requirements. After making any changes, please re-run `docker-compose up -d`. You can find the full list of available environment variables [here](https://docs.dify.ai/getting-started/install-self-hosted/environments).
|
||||
|
||||
### Metrics Monitoring with Grafana
|
||||
|
||||
Import the dashboard to Grafana, using Dify's PostgreSQL database as data source, to monitor metrics in granularity of apps, tenants, messages, and more.
|
||||
|
||||
- [Grafana Dashboard by @bowenliang123](https://github.com/bowenliang123/dify-grafana-dashboard)
|
||||
|
||||
### Deployment with Kubernetes
|
||||
|
||||
If you'd like to configure a highly-available setup, there are community-contributed [Helm Charts](https://helm.sh/) and YAML files which allow Dify to be deployed on Kubernetes.
|
||||
|
||||
- [Helm Chart by @LeoQuote](https://github.com/douban/charts/tree/master/charts/dify)
|
||||
- [Helm Chart by @BorisPolonsky](https://github.com/BorisPolonsky/dify-helm)
|
||||
- [Helm Chart by @magicsong](https://github.com/magicsong/ai-charts)
|
||||
- [YAML file by @Winson-030](https://github.com/Winson-030/dify-kubernetes)
|
||||
- [YAML file by @wyy-holding](https://github.com/wyy-holding/dify-k8s)
|
||||
- [🚀 NEW! YAML files (Supports Dify v1.6.0) by @Zhoneym](https://github.com/Zhoneym/DifyAI-Kubernetes)
|
||||
|
||||
#### Using Terraform for Deployment
|
||||
|
||||
Deploy Dify to Cloud Platform with a single click using [terraform](https://www.terraform.io/)
|
||||
|
||||
##### Azure Global
|
||||
|
||||
- [Azure Terraform by @nikawang](https://github.com/nikawang/dify-azure-terraform)
|
||||
|
||||
##### Google Cloud
|
||||
|
||||
- [Google Cloud Terraform by @sotazum](https://github.com/DeNA/dify-google-cloud-terraform)
|
||||
|
||||
#### Using AWS CDK for Deployment
|
||||
|
||||
Deploy Dify to AWS with [CDK](https://aws.amazon.com/cdk/)
|
||||
|
||||
##### AWS
|
||||
|
||||
- [AWS CDK by @KevinZhao (EKS based)](https://github.com/aws-samples/solution-for-deploying-dify-on-aws)
|
||||
- [AWS CDK by @tmokmss (ECS based)](https://github.com/aws-samples/dify-self-hosted-on-aws)
|
||||
|
||||
#### Using Alibaba Cloud Computing Nest
|
||||
|
||||
Quickly deploy Dify to Alibaba cloud with [Alibaba Cloud Computing Nest](https://computenest.console.aliyun.com/service/instance/create/default?type=user&ServiceName=Dify%E7%A4%BE%E5%8C%BA%E7%89%88)
|
||||
|
||||
#### Using Alibaba Cloud Data Management
|
||||
|
||||
One-Click deploy Dify to Alibaba Cloud with [Alibaba Cloud Data Management](https://www.alibabacloud.com/help/en/dms/dify-in-invitational-preview/)
|
||||
|
||||
#### Deploy to AKS with Azure Devops Pipeline
|
||||
|
||||
One-Click deploy Dify to AKS with [Azure Devops Pipeline Helm Chart by @LeoZhang](https://github.com/Ruiruiz30/Dify-helm-chart-AKS)
|
||||
|
||||
## Contributing
|
||||
|
||||
For those who'd like to contribute code, see our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md).
|
||||
At the same time, please consider supporting Dify by sharing it on social media and at events and conferences.
|
||||
|
||||
> We are looking for contributors to help translate Dify into languages other than Mandarin or English. If you are interested in helping, please see the [i18n README](https://github.com/langgenius/dify/blob/main/web/i18n-config/README.md) for more information, and leave us a comment in the `global-users` channel of our [Discord Community Server](https://discord.gg/8Tpq4AcN9c).
|
||||
|
||||
## Community & contact
|
||||
|
||||
- [GitHub Discussion](https://github.com/langgenius/dify/discussions). Best for: sharing feedback and asking questions.
|
||||
- [GitHub Issues](https://github.com/langgenius/dify/issues). Best for: bugs you encounter using Dify.AI, and feature proposals. See our [Contribution Guide](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md).
|
||||
- [Discord](https://discord.gg/FngNHpbcY7). Best for: sharing your applications and hanging out with the community.
|
||||
- [X(Twitter)](https://twitter.com/dify_ai). Best for: sharing your applications and hanging out with the community.
|
||||
|
||||
**Contributors**
|
||||
|
||||
<a href="https://github.com/langgenius/dify/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=langgenius/dify" />
|
||||
</a>
|
||||
|
||||
## Star history
|
||||
|
||||
[](https://star-history.com/#langgenius/dify&Date)
|
||||
|
||||
## Security disclosure
|
||||
|
||||
## Contributing
|
||||
|
||||
We welcome you to contribute to Dify to help make Dify better. We welcome contributions in various ways, submitting code, issues, new ideas, or sharing the interesting and useful AI applications you have created based on Dify. At the same time, we also welcome you to share Dify at different events, conferences, and social media.
|
||||
|
||||
### Submit a Pull Request
|
||||
|
||||
To ensure proper review, all code contributions, including from contributors with direct commit access, must be submitted as PR requests and approved by core developers before merging branches.
|
||||
We welcome PRs from everyone! If you're willing to help out, you can learn more about how to contribute code to the project in the [Contribution Guide](CONTRIBUTING.md).
|
||||
|
||||
### Submit issues or ideas
|
||||
|
||||
You can submit your issues or ideas by adding issues to the Dify repository. If you encounter issues, please describe the steps you took to encounter the issue as much as possible so we can better discover it. If you have any new ideas for our product, we also welcome your feedback. Please share your insights as much as possible so we can get more feedback and further discussion in the community.
|
||||
|
||||
### Share your applications
|
||||
|
||||
We encourage all community members to share their AI applications built on Dify, which can be applied to different scenarios or different users. This will provide powerful inspiration for people who want to create AI capabilities! You can share your experience by [submitting an issue in the Dify-user-case repository](https://github.com/langgenius/dify-user-case/issues).
|
||||
|
||||
### Share Dify with others
|
||||
|
||||
We encourage community contributors to actively demonstrate different aspects of using Dify. You can talk or share any feature of using Dify at meetups and conferences, blogs or social media. We believe your unique sharing will be of great help to others! Mention @Dify.AI on Twitter and/or communicate on [Discord](https://discord.gg/FngNHpbcY7) so we can give pointers and tips and help you spread the word by promoting your content on the different Dify communication channels.
|
||||
|
||||
### Help others
|
||||
You can also help people in need of help on Discord, GitHub issues or other social platforms, guide others to solve problems encountered during use and share usage experiences. This is also a great contribution! If you want to become a maintainer of the Dify community, please contact the official team via [Discord](https://discord.gg/FngNHpbcY7) or email us at support@dify.ai.
|
||||
|
||||
|
||||
## Contact Us
|
||||
|
||||
If you have any questions, suggestions, or partnership inquiries, feel free to contact us through the following channels:
|
||||
|
||||
- Submit an Issue or PR on our GitHub Repo
|
||||
- Join the discussion in our [Discord](https://discord.gg/FngNHpbcY7) Community
|
||||
- Send an email to hello@dify.ai
|
||||
|
||||
We're eager to assist you and together create more fun and useful AI applications!
|
||||
|
||||
## Security
|
||||
|
||||
To protect your privacy, please avoid posting security issues on GitHub. Instead, send your questions to security@dify.ai and we will provide you with a more detailed answer.
|
||||
|
||||
## Citation
|
||||
|
||||
This software uses the following open-source software:
|
||||
|
||||
- Chase, H. (2022). LangChain [Computer software]. https://github.com/hwchase17/langchain
|
||||
|
||||
For more information, please refer to the official website or license text of the respective software.
|
||||
To protect your privacy, please avoid posting security issues on GitHub. Instead, report issues to security@dify.ai, and our team will respond with detailed answer.
|
||||
|
||||
## License
|
||||
|
||||
This repository is available under the [Dify Open Source License](LICENSE).
|
||||
This repository is licensed under the [Dify Open Source License](LICENSE), based on Apache 2.0 with additional conditions.
|
||||
|
||||
163
README_CN.md
163
README_CN.md
@ -1,163 +0,0 @@
|
||||

|
||||
<p align="center">
|
||||
<a href="./README.md">English</a> |
|
||||
<a href="./README_CN.md">简体中文</a> |
|
||||
<a href="./README_JA.md">日本語</a> |
|
||||
<a href="./README_ES.md">Español</a>
|
||||
</p>
|
||||
|
||||
|
||||
#### [官方网站](https://dify.ai) • [使用文档](https://docs.dify.ai/v/zh-hans) · [部署文档](https://docs.dify.ai/v/zh-hans/getting-started/install-self-hosted) · [FAQ](https://docs.dify.ai/v/zh-hans/getting-started/faq) • [Twitter](https://twitter.com/dify_ai) • [Discord](https://discord.gg/FngNHpbcY7)
|
||||
|
||||
**Dify** 是一个易用的 LLMOps 平台,基于不同的大型语言模型能力,让更多人可以简易地创建可持续运营的原生 AI 应用。Dify 提供多种类型应用的可视化编排,应用可开箱即用,也能以“后端即服务”的 API 提供服务。
|
||||
|
||||
通过 Dify 创建的应用包含了:
|
||||
|
||||
- 开箱即用的的 Web 站点,支持表单模式和聊天对话模式
|
||||
- 一套 API 即可包含插件、上下文增强等能力,替你省下了后端代码的编写工作
|
||||
- 可视化的对应用进行数据分析,查阅日志或进行标注
|
||||
|
||||
|
||||
|
||||
## 核心能力
|
||||
1. **模型支持:** 你可以在 Dify 上选择基于不同模型的能力来开发你的 AI 应用。Dify 兼容 Langchain,这意味着我们将逐步支持多种 LLMs ,目前支持的模型供应商:
|
||||
|
||||
- [x] **OpenAI**:GPT4、GPT3.5-turbo、GPT3.5-turbo-16k、text-davinci-003
|
||||
- [x] **Azure OpenAI Service**
|
||||
- [x] **Anthropic**:Claude2、Claude-instant
|
||||
- [x] **Replicate**
|
||||
- [x] **Hugging Face Hub**
|
||||
- [x] **ChatGLM**
|
||||
- [x] **Llama2**
|
||||
- [x] **MiniMax**
|
||||
- [x] **讯飞星火大模型**
|
||||
- [x] **文心一言**
|
||||
- [x] **通义千问**
|
||||
|
||||
|
||||
我们为所有注册云端版的用户免费提供以下资源(登录 [dify.ai](https://cloud.dify.ai) 即可使用):
|
||||
* 60 万 Tokens Claude 模型的消息调用额度,用于创建基于 Claude 模型的 AI 应用
|
||||
* 200 次 OpenAI 模型的消息调用额度,用于创建基于 OpenAI 模型的 AI 应用
|
||||
* 300 万 讯飞星火大模型 Token 的调用额度,用于创建基于讯飞星火大模型的 AI 应用
|
||||
* 100 万 MiniMax Token 的调用额度,用于创建基于 MiniMax 模型的 AI 应用
|
||||
2. **可视化编排 Prompt:** 通过界面化编写 prompt 并调试,只需几分钟即可发布一个 AI 应用。
|
||||
3. **文本 Embedding 处理(数据集)**:全自动完成文本预处理,使用你的数据作为上下文,无需理解晦涩的概念和技术处理。支持 PDF、txt 等文件格式,支持从 Notion、网页、API 同步数据。
|
||||
4. **基于 API 开发:** 后端即服务。您可以直接访问网页应用,也可以接入 API 集成到您的应用中,无需关注复杂的后端架构和部署过程。
|
||||
5. **插件能力:** Dify 「智聊」平台已支持网页浏览、Google 搜索、Wikipedia 查询等第一方插件,可在对话中实现联网搜索、分析网页内容、展示 AI 的推理过程。
|
||||
6. **团队 Workspace:** 团队成员可加入 Workspace 编辑、管理和使用团队内的 AI 应用。
|
||||
6. **数据标注与改进:** 可视化查阅 AI 应用日志并对数据进行改进标注,观测 AI 的推理过程,不断提高其性能。(Coming soon)
|
||||
-----------------------------
|
||||
## Use cases
|
||||
* [几分钟创建一个带有业务数据的官网 AI 智能客服](https://docs.dify.ai/v/zh-hans/use-cases/create-an-ai-chatbot-with-business-data-in-minutes)
|
||||
* [构建一个 Notion AI 助手](https://docs.dify.ai/v/zh-hans/use-cases/build-an-notion-ai-assistant)
|
||||
* [创建 Midjoureny 提示词机器人](https://docs.dify.ai/v/zh-hans/use-cases/create-a-midjoureny-prompt-word-robot-with-zero-code)
|
||||
|
||||
|
||||
## 使用云服务
|
||||
|
||||
访问 [Dify.ai](https://cloud.dify.ai) 使用云端版。
|
||||
|
||||
## 安装社区版
|
||||
|
||||
### 系统要求
|
||||
|
||||
在安装 Dify 之前,请确保您的机器满足以下最低系统要求:
|
||||
|
||||
- CPU >= 2 Core
|
||||
- RAM >= 4GB
|
||||
|
||||
### 快速启动
|
||||
|
||||
启动 Dify 服务器的最简单方法是运行我们的 [docker-compose.yml](docker/docker-compose.yaml) 文件。在运行安装命令之前,请确保您的机器上安装了 [Docker](https://docs.docker.com/get-docker/) 和 [Docker Compose](https://docs.docker.com/compose/install/):
|
||||
|
||||
```bash
|
||||
cd docker
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
运行后,可以在浏览器上访问 [http://localhost/install](http://localhost/install) 进入 Dify 控制台并开始初始化安装操作。
|
||||
|
||||
### Helm Chart
|
||||
|
||||
非常感谢 @BorisPolonsky 为我们提供了一个 [Helm Chart](https://helm.sh/) 版本,可以在 Kubernetes 上部署 Dify。
|
||||
您可以前往 https://github.com/BorisPolonsky/dify-helm 来获取部署信息。
|
||||
|
||||
### 配置
|
||||
|
||||
需要自定义配置,请参考我们的 [docker-compose.yml](docker/docker-compose.yaml) 文件中的注释,并手动设置环境配置,修改完毕后,请再次执行 `docker-compose up -d`。
|
||||
|
||||
## Roadmap
|
||||
|
||||
我们正在开发中的功能:
|
||||
|
||||
- **数据集**,支持更多的数据集,通过网页、API 同步内容。用户可以根据自己的数据源构建 AI 应用程序。
|
||||
- **插件**,我们将发布符合 ChatGPT 标准的插件,支持更多 Dify 自己的插件,支持用户自定义插件能力,以在应用程序中启用更多功能,例如以支持以目标为导向的分解推理任务。
|
||||
|
||||
## Q&A
|
||||
|
||||
**Q: 我能用 Dify 做什么?**
|
||||
|
||||
A: Dify 是一个简单且能力丰富的 LLM 开发和运营工具。你可以用它搭建商用级应用,个人助理。如果你想自己开发应用,Dify 也能为你省下接入 OpenAI 的后端工作,使用我们逐步提供的可视化运营能力,你可以持续的改进和训练你的 GPT 模型。
|
||||
|
||||
**Q: 如何使用 Dify “训练”自己的模型?**
|
||||
|
||||
A: 一个有价值的应用由 Prompt Engineering、上下文增强和 Fine-tune 三个环节组成。我们创造了一种 Prompt 结合编程语言的 Hybrid 编程方式(类似一个模版引擎),你可以轻松的完成长文本嵌入,或抓取用户输入的一个 Youtube 视频的字幕——这些都将作为上下文提交给 LLMs 进行计算。我们十分注重应用的可运营性,你的用户在使用 App 期间产生的数据,可进行分析、标记和持续训练。以上环节如果没有好的工具支持,可能会消耗你大量的时间。
|
||||
|
||||
**Q: 如果要创建一个自己的应用,我需要准备什么?**
|
||||
|
||||
A: 我们假定你已经有了 OpenAI 或 Claude 等模型的 API Key,如果没有请去注册一个。如果你已经有了一些内容可以作为训练上下文,就太好了。
|
||||
|
||||
**Q: 提供哪些界面语言?**
|
||||
|
||||
A: 支持英文、中文,你可以为我们贡献语言包并提供维护支持。
|
||||
|
||||
## Star History
|
||||
|
||||
[](https://star-history.com/#langgenius/dify&Date)
|
||||
|
||||
|
||||
## 贡献
|
||||
|
||||
我们欢迎你为 Dify 作出贡献帮助 Dify 变得更好。我们欢迎各种方式的贡献,提交代码、问题、新想法、或者分享你基于 Dify 创建出的各种有趣有用的 AI 应用。同时,我们也欢迎你在不同的活动、研讨会、社交媒体上分享 Dify。
|
||||
|
||||
### 贡献代码
|
||||
为了确保正确审查,所有代码贡献 - 包括来自具有直接提交更改权限的贡献者 - 都必须提交 PR 请求并在合并分支之前得到核心开发人员的批准。
|
||||
|
||||
我们欢迎所有人提交 PR!如果您愿意提供帮助,可以在 [贡献指南](CONTRIBUTING_CN.md) 中了解有关如何为项目做出代码贡献的更多信息。
|
||||
|
||||
### 提交问题或想法
|
||||
你可以通过 Dify 代码仓库新增 issues 来提交你的问题或想法。如遇到问题,请尽可能描述你遇到问题的操作步骤,以便我们更好地发现它。如果你对我们的产品有任何新想法,也欢迎向我们反馈,请尽可能多地分享你的见解,以便我们在社区中获得更多反馈和进一步讨论。
|
||||
|
||||
### 分享你的应用
|
||||
我们鼓励所有社区成员分享他们基于 Dify 创造出的 AI 应用,它们可以是应用于不同情景或不同用户,这将有助于为希望基于 AI 能力创造的人们提供强大灵感!你可以通过 [Dify-user-case 仓库项目提交 issue](https://github.com/langgenius/dify-user-case) 来分享你的应用案例。
|
||||
|
||||
### 向别人分享 Dify
|
||||
我们鼓励社区贡献者们积极展示你使用 Dify 的不同角度。你可以通过线下研讨会、博客或社交媒体上谈论或分享你使用 Dify 的任意功能,相信你独特的使用分享会给别人带来非常大的帮助!如果你需要任何指导帮助,欢迎联系我们 support@dify.ai ,你也可以在 twitter @Dify.AI 或在 [Discord 社区](https://discord.gg/FngNHpbcY7)交流来帮助你传播信息。
|
||||
|
||||
### 帮助别人
|
||||
你还可以在 Discord、GitHub issues或其他社交平台上帮助需要帮助的人,指导别人解决使用过程中遇到的问题和分享使用经验。这也是个非常了不起的贡献!如果你希望成为 Dify 社区的维护者,请通过[Discord 社区](https://discord.gg/FngNHpbcY7) 联系官方团队或邮件联系我们 support@dify.ai.
|
||||
|
||||
|
||||
## 联系我们
|
||||
|
||||
如果您有任何问题、建议或合作意向,欢迎通过以下方式联系我们:
|
||||
|
||||
- 在我们的 [GitHub Repo](https://github.com/langgenius/dify) 上提交 Issue 或 PR
|
||||
- 在我们的 [Discord 社区](https://discord.gg/FngNHpbcY7) 上加入讨论
|
||||
- 发送邮件至 hello@dify.ai
|
||||
|
||||
## 安全
|
||||
|
||||
为了保护您的隐私,请避免在 GitHub 上发布安全问题。发送问题至 security@dify.ai,我们将为您做更细致的解答。
|
||||
|
||||
## Citation
|
||||
|
||||
本软件使用了以下开源软件:
|
||||
|
||||
- Chase, H. (2022). LangChain [Computer software]. https://github.com/hwchase17/langchain
|
||||
|
||||
更多信息,请参考相应软件的官方网站或许可证文本。
|
||||
|
||||
## License
|
||||
|
||||
本仓库遵循 [Dify Open Source License](LICENSE) 开源协议。
|
||||
123
README_ES.md
123
README_ES.md
@ -1,123 +0,0 @@
|
||||

|
||||
<p align="center">
|
||||
<a href="./README.md">English</a> |
|
||||
<a href="./README_CN.md">简体中文</a> |
|
||||
<a href="./README_JA.md">日本語</a> |
|
||||
<a href="./README_ES.md">Español</a>
|
||||
</p>
|
||||
|
||||
[Sitio web](https://dify.ai) • [Documentación](https://docs.dify.ai) • [Twitter](https://twitter.com/dify_ai) • [Discord](https://discord.gg/FngNHpbcY7)
|
||||
|
||||
**Dify** es una plataforma LLMOps fácil de usar diseñada para capacitar a más personas para que creen aplicaciones sostenibles basadas en IA. Con orquestación visual para varios tipos de aplicaciones, Dify ofrece aplicaciones listas para usar que también pueden funcionar como APIs de Backend-as-a-Service. Unifica tu proceso de desarrollo con una API para la integración de complementos y conjuntos de datos, y agiliza tus operaciones utilizando una interfaz única para la ingeniería de indicaciones, análisis visual y mejora continua.
|
||||
|
||||
Las aplicaciones creadas con Dify incluyen:
|
||||
|
||||
- Sitios web listos para usar que admiten el modo de formulario y el modo de conversación por chat.
|
||||
- Una API única que abarca capacidades de complementos, mejora de contexto y más, lo que te ahorra esfuerzo de programación en el backend.
|
||||
- Análisis visual de datos, revisión de registros y anotación para aplicaciones.
|
||||
|
||||
Dify es compatible con Langchain, lo que significa que gradualmente admitiremos múltiples LLMs, actualmente compatibles con:
|
||||
|
||||
- GPT 3 (text-davinci-003)
|
||||
- GPT 3.5 Turbo (ChatGPT)
|
||||
- GPT-4
|
||||
|
||||
## Usar servicios en la nube
|
||||
|
||||
Visita [Dify.ai](https://dify.ai)
|
||||
|
||||
## Instalar la Edición Comunitaria
|
||||
|
||||
### Requisitos del sistema
|
||||
|
||||
Antes de instalar Dify, asegúrate de que tu máquina cumple con los siguientes requisitos mínimos del sistema:
|
||||
|
||||
- CPU >= 2 Core
|
||||
- RAM >= 4GB
|
||||
|
||||
### Inicio rápido
|
||||
|
||||
La forma más sencilla de iniciar el servidor de Dify es ejecutar nuestro archivo [docker-compose.yml](docker/docker-compose.yaml). Antes de ejecutar el comando de instalación, asegúrate de que [Docker](https://docs.docker.com/get-docker/) y [Docker Compose](https://docs.docker.com/compose/install/) estén instalados en tu máquina:
|
||||
|
||||
```bash
|
||||
cd docker
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Después de ejecutarlo, puedes acceder al panel de control de Dify en tu navegador desde [http://localhost/install](http://localhost/install) y comenzar el proceso de instalación de inicialización.
|
||||
|
||||
### Helm Chart
|
||||
|
||||
Un gran agradecimiento a @BorisPolonsky por proporcionarnos una versión de [Helm Chart](https://helm.sh/), que permite desplegar Dify en Kubernetes.
|
||||
Puede ir a https://github.com/BorisPolonsky/dify-helm para obtener información de despliegue.
|
||||
|
||||
### Configuración
|
||||
|
||||
Si necesitas personalizar la configuración, consulta los comentarios en nuestro archivo [docker-compose.yml](docker/docker-compose.yaml) y configura manualmente la configuración del entorno. Después de realizar los cambios, ejecuta nuevamente 'docker-compose up -d'.
|
||||
|
||||
## Hoja de ruta
|
||||
|
||||
Funciones en desarrollo:
|
||||
|
||||
- **Conjuntos de datos**, admitiendo más conjuntos de datos, por ejemplo, sincronización de contenido desde Notion o páginas web.
|
||||
Admitiremos más conjuntos de datos, incluidos texto, páginas web e incluso contenido de Notion. Los usuarios pueden construir aplicaciones de IA basadas en sus propias fuentes de datos
|
||||
- **Complementos**, introduciendo complementos estándar de ChatGPT para aplicaciones, o utilizando complementos producidos por Dify.
|
||||
Lanzaremos complementos que cumplan con el estándar de ChatGPT, o nuestros propios complementos de Dify para habilitar más capacidades en las aplicaciones.
|
||||
- **Modelos de código abierto**, por ejemplo, adoptar Llama como proveedor de modelos o para un ajuste adicional.
|
||||
Trabajaremos con excelentes modelos de código abierto como Llama, proporcionándolos como opciones de modelos en nuestra plataforma o utilizándolos para un ajuste adicional.
|
||||
|
||||
## Preguntas y respuestas
|
||||
|
||||
**P: ¿Qué puedo hacer con Dify?**
|
||||
|
||||
R: Dify es una herramienta de desarrollo y operaciones de LLM, simple pero poderosa. Puedes usarla para construir aplicaciones de calidad comercial y asistentes personales. Si deseas desarrollar tus propias aplicaciones, LangDifyGenius puede ahorrarte trabajo en el backend al integrar con OpenAI y ofrecer capacidades de operaciones visuales, lo que te permite mejorar y entrenar continuamente tu modelo GPT.
|
||||
|
||||
**P: ¿Cómo uso Dify para "entrenar" mi propio modelo?**
|
||||
|
||||
R: Una aplicación valiosa consta de Ingeniería de indicaciones, mejora de contexto y ajuste fino. Hemos creado un enfoque de programación híbrida que combina las indicaciones con lenguajes de programación (similar a un motor de plantillas), lo que facilita la incorporación de texto largo o la captura de subtítulos de un video de YouTube ingresado por el usuario, todo lo cual se enviará como contexto para que los LLM lo procesen. Damos gran importancia a la operabilidad de la aplicación, con los datos generados por los usuarios durante el uso de la aplicación disponibles para análisis, anotación y entrenamiento continuo. Sin las herramientas adecuadas, estos pasos pueden llevar mucho tiempo.
|
||||
|
||||
**P: ¿Qué necesito preparar si quiero crear mi propia aplicación?**
|
||||
|
||||
R: Suponemos que ya tienes una clave de API de OpenAI; si no la tienes, por favor regístrate. ¡Si ya tienes contenido que pueda servir como contexto de entrenamiento, eso es genial!
|
||||
|
||||
**P: ¿Qué idiomas de interfaz están disponibles?**
|
||||
|
||||
R: Actualmente se admiten inglés y chino, y puedes contribuir con paquetes de idiomas.
|
||||
|
||||
## Historial de estrellas
|
||||
|
||||
[](https://star-history.com/#langgenius/dify&Date)
|
||||
|
||||
## Contáctanos
|
||||
|
||||
Si tienes alguna pregunta, sugerencia o consulta sobre asociación, no dudes en contactarnos a través de los siguientes canales:
|
||||
|
||||
- Presentar un problema o una solicitud de extracción en nuestro repositorio de GitHub.
|
||||
- Únete a la discusión en nuestra comunidad de [Discord](https://discord.gg/FngNHpbcY7).
|
||||
- Envía un correo electrónico a hello@dify.ai.
|
||||
|
||||
¡Estamos ansiosos por ayudarte y crear juntos aplicaciones de IA más divertidas y útiles!
|
||||
|
||||
## Contribuciones
|
||||
|
||||
Para garantizar una revisión adecuada, todas las contribuciones de código, incluidas las de los colaboradores con acceso directo a los compromisos, deben enviarse mediante solicitudes de extracción y ser aprobadas por el equipo principal de
|
||||
|
||||
desarrollo antes de fusionarse.
|
||||
|
||||
¡Agradecemos todas las solicitudes de extracción! Si deseas ayudar, consulta la [Guía de Contribución](CONTRIBUTING.md) para obtener más información sobre cómo comenzar.
|
||||
|
||||
## Seguridad
|
||||
|
||||
Para proteger tu privacidad, evita publicar problemas de seguridad en GitHub. En su lugar, envía tus preguntas a security@dify.ai y te proporcionaremos una respuesta más detallada.
|
||||
|
||||
## Citación
|
||||
|
||||
Este software utiliza el siguiente software de código abierto:
|
||||
|
||||
- Chase, H. (2022). LangChain [Software de computadora]. https://github.com/hwchase17/langchain
|
||||
|
||||
Para obtener más información, consulta el sitio web oficial o el texto de la licencia del software correspondiente.
|
||||
|
||||
## Licencia
|
||||
|
||||
Este repositorio está disponible bajo la [Licencia de código abierto de Dify](LICENSE).
|
||||
122
README_JA.md
122
README_JA.md
@ -1,122 +0,0 @@
|
||||

|
||||
<p align="center">
|
||||
<a href="./README.md">English</a> |
|
||||
<a href="./README_CN.md">简体中文</a> |
|
||||
<a href="./README_JA.md">日本語</a> |
|
||||
<a href="./README_ES.md">Español</a>
|
||||
</p>
|
||||
|
||||
[Web サイト](https://dify.ai) • [ドキュメント](https://docs.dify.ai) • [Twitter](https://twitter.com/dify_ai) • [Discord](https://discord.gg/FngNHpbcY7)
|
||||
|
||||
|
||||
**Dify** は、より多くの人々が持続可能な AI ネイティブアプリケーションを作成できるように設計された、使いやすい LLMOps プラットフォームです。様々なアプリケーションタイプに対応したビジュアルオーケストレーションにより Dify は Backend-as-a-Service API としても機能する、すぐに使えるアプリケーションを提供します。プラグインやデータセットを統合するための1つの API で開発プロセスを統一し、プロンプトエンジニアリング、ビジュアル分析、継続的な改善のための1つのインターフェイスを使って業務を合理化します。
|
||||
|
||||
Difyで作成したアプリケーションは以下の通りです:
|
||||
|
||||
フォームモードとチャット会話モードをサポートする、すぐに使える Web サイト
|
||||
プラグイン機能、コンテキストの強化などを網羅する単一の API により、バックエンドのコーディングの手間を省きます。
|
||||
アプリケーションの視覚的なデータ分析、ログレビュー、アノテーションが可能です。
|
||||
Dify は LangChain と互換性があり、複数の LLM を徐々にサポートします:
|
||||
|
||||
- GPT 3 (text-davinci-003)
|
||||
- GPT 3.5 Turbo(ChatGPT)
|
||||
- GPT-4
|
||||
|
||||
## クラウドサービスの利用
|
||||
|
||||
[Dify.ai](https://dify.ai) をご覧ください
|
||||
|
||||
## Community Edition のインストール
|
||||
|
||||
### システム要件
|
||||
|
||||
Dify をインストールする前に、お使いのマシンが以下の最低システム要件を満たしていることを確認してください:
|
||||
|
||||
- CPU >= 1 Core
|
||||
- RAM >= 4GB
|
||||
|
||||
### クイックスタート
|
||||
|
||||
Dify サーバーを起動する最も簡単な方法は、[docker-compose.yml](docker/docker-compose.yaml) ファイルを実行することです。インストールコマンドを実行する前に、[Docker](https://docs.docker.com/get-docker/) と [Docker Compose](https://docs.docker.com/compose/install/) がお使いのマシンにインストールされていることを確認してください:
|
||||
|
||||
```bash
|
||||
cd docker
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
実行後、ブラウザで [http://localhost/install](http://localhost/install) にアクセスし、初期化インストール作業を開始することができます。
|
||||
|
||||
### Helm Chart
|
||||
|
||||
@BorisPolonsky に大感謝します。彼は Dify を Kubernetes 上にデプロイするための [Helm Chart](https://helm.sh/) バージョンを提供してくれました。
|
||||
デプロイ情報については、https://github.com/BorisPolonsky/dify-helm をご覧ください。
|
||||
|
||||
### 構成
|
||||
|
||||
カスタマイズが必要な場合は、[docker-compose.yml](docker/docker-compose.yaml) ファイルのコメントを参照し、手動で環境設定をお願いします。変更後、再度 'docker-compose up -d' を実行してください。
|
||||
|
||||
## ロードマップ
|
||||
|
||||
開発中の機能:
|
||||
|
||||
- **データセット**, Notionやウェブページからのコンテンツ同期など、より多くのデータセットをサポートします
|
||||
テキスト、ウェブページ、さらには Notion コンテンツなど、より多くのデータセットをサポートする予定です。ユーザーは、自分のデータソースをもとに AI アプリケーションを構築することができます。
|
||||
- **プラグイン**, アプリケーションに ChatGPT プラグイン標準のプラグインを導入する、または Dify 制作のプラグインを利用する
|
||||
今後、ChatGPT 規格に準拠したプラグインや、ディファイ独自のプラグインを公開し、より多くの機能をアプリケーションで実現できるようにします。
|
||||
- **オープンソースモデル**, 例えばモデルプロバイダーとして Llama を採用したり、さらにファインチューニングを行う
|
||||
Llama のような優れたオープンソースモデルを、私たちのプラットフォームのモデルオプションとして提供したり、さらなる微調整のために使用したりすることで、協力していきます。
|
||||
|
||||
|
||||
## Q&A
|
||||
|
||||
**Q: Dify で何ができるのか?**
|
||||
|
||||
A: Dify はシンプルでパワフルな LLM 開発・運用ツールです。商用グレードのアプリケーション、パーソナルアシスタントを構築するために使用することができます。独自のアプリケーションを開発したい場合、LangDifyGenius は OpenAI と統合する際のバックエンド作業を省き、視覚的な操作機能を提供し、GPT モデルを継続的に改善・訓練することが可能です。
|
||||
|
||||
**Q: Dify を使って、自分のモデルを「トレーニング」するにはどうすればいいのでしょうか?**
|
||||
|
||||
A: プロンプトエンジニアリング、コンテキスト拡張、ファインチューニングからなる価値あるアプリケーションです。プロンプトとプログラミング言語を組み合わせたハイブリッドプログラミングアプローチ(テンプレートエンジンのようなもの)で、長文の埋め込みやユーザー入力の YouTube 動画からの字幕取り込みなどを簡単に実現し、これらはすべて LLM が処理するコンテキストとして提出される予定です。また、アプリケーションの操作性を重視し、ユーザーがアプリケーションを使用する際に生成したデータを分析、アノテーション、継続的なトレーニングに利用できるようにしました。適切なツールがなければ、これらのステップに時間がかかることがあります。
|
||||
|
||||
**Q: 自分でアプリケーションを作りたい場合、何を準備すればよいですか?**
|
||||
|
||||
A: すでに OpenAI API Key をお持ちだと思いますが、お持ちでない場合はご登録ください。もし、すでにトレーニングのコンテキストとなるコンテンツをお持ちでしたら、それは素晴らしいことです!
|
||||
|
||||
**Q: インターフェイスにどの言語が使えますか?**
|
||||
|
||||
A: 現在、英語と中国語に対応しており、言語パックを寄贈することも可能です。
|
||||
|
||||
## Star ヒストリー
|
||||
|
||||
[](https://star-history.com/#langgenius/dify&Date)
|
||||
|
||||
## お問合せ
|
||||
|
||||
ご質問、ご提案、パートナーシップに関するお問い合わせは、以下のチャンネルからお気軽にご連絡ください:
|
||||
|
||||
- GitHub Repo で Issue や PR を提出する
|
||||
- [Discord](https://discord.gg/FngNHpbcY7) コミュニティで議論に参加する。
|
||||
- hello@dify.ai にメールを送信します
|
||||
|
||||
私たちは、皆様のお手伝いをさせていただき、より楽しく、より便利な AI アプリケーションを一緒に作っていきたいと思っています!
|
||||
|
||||
## コントリビュート
|
||||
|
||||
適切なレビューを行うため、コミットへの直接アクセスが可能なコントリビュータを含むすべてのコードコントリビュータは、プルリクエストで提出し、マージされる前にコア開発チームによって承認される必要があります。
|
||||
|
||||
私たちはすべてのプルリクエストを歓迎します!協力したい方は、[コントリビューションガイド](CONTRIBUTING.md) をチェックしてみてください。
|
||||
|
||||
## セキュリティ
|
||||
|
||||
プライバシー保護のため、GitHub へのセキュリティ問題の投稿は避けてください。代わりに、あなたの質問を security@dify.ai に送ってください。より詳細な回答を提供します。
|
||||
|
||||
## 引用
|
||||
|
||||
本ソフトウェアは、以下のオープンソースソフトウェアを使用しています:
|
||||
|
||||
- Chase, H. (2022). LangChain [Computer software]. https://github.com/hwchase17/langchain
|
||||
|
||||
詳しくは、各ソフトウェアの公式サイトまたはライセンス文をご参照ください。
|
||||
|
||||
## ライセンス
|
||||
|
||||
このリポジトリは、[Dify Open Source License](LICENSE) のもとで利用できます。
|
||||
@ -1,11 +1,19 @@
|
||||
.env
|
||||
*.env.*
|
||||
|
||||
storage/generate_files/*
|
||||
storage/privkeys/*
|
||||
storage/tools/*
|
||||
storage/upload_files/*
|
||||
|
||||
# Logs
|
||||
logs
|
||||
*.log*
|
||||
|
||||
# jetbrains
|
||||
.idea
|
||||
.idea
|
||||
.mypy_cache
|
||||
.ruff_cache
|
||||
|
||||
# venv
|
||||
.venv
|
||||
|
||||
642
api/.env.example
642
api/.env.example
@ -1,96 +1,418 @@
|
||||
# Server Edition
|
||||
EDITION=SELF_HOSTED
|
||||
|
||||
# Your App secret key will be used for securely signing the session cookie
|
||||
# Make sure you are changing this key for your deployment with a strong key.
|
||||
# You can generate a strong key using `openssl rand -base64 42`.
|
||||
# Alternatively you can set it with `SECRET_KEY` environment variable.
|
||||
SECRET_KEY=
|
||||
|
||||
# Ensure UTF-8 encoding
|
||||
LANG=en_US.UTF-8
|
||||
LC_ALL=en_US.UTF-8
|
||||
PYTHONIOENCODING=utf-8
|
||||
|
||||
# Console API base URL
|
||||
CONSOLE_API_URL=http://127.0.0.1:5001
|
||||
CONSOLE_WEB_URL=http://127.0.0.1:3000
|
||||
CONSOLE_API_URL=http://localhost:5001
|
||||
CONSOLE_WEB_URL=http://localhost:3000
|
||||
|
||||
# Service API base URL
|
||||
SERVICE_API_URL=http://127.0.0.1:5001
|
||||
SERVICE_API_URL=http://localhost:5001
|
||||
|
||||
# Web APP base URL
|
||||
APP_API_URL=http://127.0.0.1:5001
|
||||
APP_WEB_URL=http://127.0.0.1:3000
|
||||
APP_WEB_URL=http://localhost:3000
|
||||
|
||||
# celery configuration
|
||||
CELERY_BROKER_URL=redis://:difyai123456@localhost:6379/1
|
||||
# Files URL
|
||||
FILES_URL=http://localhost:5001
|
||||
|
||||
# INTERNAL_FILES_URL is used for plugin daemon communication within Docker network.
|
||||
# Set this to the internal Docker service URL for proper plugin file access.
|
||||
# Example: INTERNAL_FILES_URL=http://api:5001
|
||||
INTERNAL_FILES_URL=http://127.0.0.1:5001
|
||||
|
||||
# TRIGGER URL
|
||||
TRIGGER_URL=http://localhost:5001
|
||||
|
||||
# The time in seconds after the signature is rejected
|
||||
FILES_ACCESS_TIMEOUT=300
|
||||
|
||||
# Access token expiration time in minutes
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES=60
|
||||
|
||||
# Refresh token expiration time in days
|
||||
REFRESH_TOKEN_EXPIRE_DAYS=30
|
||||
|
||||
# redis configuration
|
||||
REDIS_HOST=localhost
|
||||
REDIS_PORT=6379
|
||||
REDIS_USERNAME=
|
||||
REDIS_PASSWORD=difyai123456
|
||||
REDIS_USE_SSL=false
|
||||
# SSL configuration for Redis (when REDIS_USE_SSL=true)
|
||||
REDIS_SSL_CERT_REQS=CERT_NONE
|
||||
# Options: CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED
|
||||
REDIS_SSL_CA_CERTS=
|
||||
# Path to CA certificate file for SSL verification
|
||||
REDIS_SSL_CERTFILE=
|
||||
# Path to client certificate file for SSL authentication
|
||||
REDIS_SSL_KEYFILE=
|
||||
# Path to client private key file for SSL authentication
|
||||
REDIS_DB=0
|
||||
|
||||
# PostgreSQL database configuration
|
||||
# redis Sentinel configuration.
|
||||
REDIS_USE_SENTINEL=false
|
||||
REDIS_SENTINELS=
|
||||
REDIS_SENTINEL_SERVICE_NAME=
|
||||
REDIS_SENTINEL_USERNAME=
|
||||
REDIS_SENTINEL_PASSWORD=
|
||||
REDIS_SENTINEL_SOCKET_TIMEOUT=0.1
|
||||
|
||||
# redis Cluster configuration.
|
||||
REDIS_USE_CLUSTERS=false
|
||||
REDIS_CLUSTERS=
|
||||
REDIS_CLUSTERS_PASSWORD=
|
||||
|
||||
# celery configuration
|
||||
CELERY_BROKER_URL=redis://:difyai123456@localhost:${REDIS_PORT}/1
|
||||
CELERY_BACKEND=redis
|
||||
|
||||
# Database configuration
|
||||
DB_TYPE=postgresql
|
||||
DB_USERNAME=postgres
|
||||
DB_PASSWORD=difyai123456
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
DB_DATABASE=dify
|
||||
|
||||
SQLALCHEMY_POOL_PRE_PING=true
|
||||
SQLALCHEMY_POOL_TIMEOUT=30
|
||||
|
||||
# Storage configuration
|
||||
# use for store upload files, private keys...
|
||||
# storage type: local, s3
|
||||
STORAGE_TYPE=local
|
||||
STORAGE_LOCAL_PATH=storage
|
||||
S3_ENDPOINT=https://your-bucket-name.storage.s3.clooudflare.com
|
||||
# storage type: opendal, s3, aliyun-oss, azure-blob, baidu-obs, google-storage, huawei-obs, oci-storage, tencent-cos, volcengine-tos, supabase
|
||||
STORAGE_TYPE=opendal
|
||||
|
||||
# Apache OpenDAL storage configuration, refer to https://github.com/apache/opendal
|
||||
OPENDAL_SCHEME=fs
|
||||
OPENDAL_FS_ROOT=storage
|
||||
|
||||
# S3 Storage configuration
|
||||
S3_USE_AWS_MANAGED_IAM=false
|
||||
S3_ENDPOINT=https://your-bucket-name.storage.s3.cloudflare.com
|
||||
S3_BUCKET_NAME=your-bucket-name
|
||||
S3_ACCESS_KEY=your-access-key
|
||||
S3_SECRET_KEY=your-secret-key
|
||||
S3_REGION=your-region
|
||||
|
||||
# Azure Blob Storage configuration
|
||||
AZURE_BLOB_ACCOUNT_NAME=your-account-name
|
||||
AZURE_BLOB_ACCOUNT_KEY=your-account-key
|
||||
AZURE_BLOB_CONTAINER_NAME=your-container-name
|
||||
AZURE_BLOB_ACCOUNT_URL=https://<your_account_name>.blob.core.windows.net
|
||||
|
||||
# Aliyun oss Storage configuration
|
||||
ALIYUN_OSS_BUCKET_NAME=your-bucket-name
|
||||
ALIYUN_OSS_ACCESS_KEY=your-access-key
|
||||
ALIYUN_OSS_SECRET_KEY=your-secret-key
|
||||
ALIYUN_OSS_ENDPOINT=your-endpoint
|
||||
ALIYUN_OSS_AUTH_VERSION=v1
|
||||
ALIYUN_OSS_REGION=your-region
|
||||
# Don't start with '/'. OSS doesn't support leading slash in object names.
|
||||
ALIYUN_OSS_PATH=your-path
|
||||
|
||||
# Google Storage configuration
|
||||
GOOGLE_STORAGE_BUCKET_NAME=your-bucket-name
|
||||
GOOGLE_STORAGE_SERVICE_ACCOUNT_JSON_BASE64=your-google-service-account-json-base64-string
|
||||
|
||||
# Tencent COS Storage configuration
|
||||
TENCENT_COS_BUCKET_NAME=your-bucket-name
|
||||
TENCENT_COS_SECRET_KEY=your-secret-key
|
||||
TENCENT_COS_SECRET_ID=your-secret-id
|
||||
TENCENT_COS_REGION=your-region
|
||||
TENCENT_COS_SCHEME=your-scheme
|
||||
|
||||
# Huawei OBS Storage Configuration
|
||||
HUAWEI_OBS_BUCKET_NAME=your-bucket-name
|
||||
HUAWEI_OBS_SECRET_KEY=your-secret-key
|
||||
HUAWEI_OBS_ACCESS_KEY=your-access-key
|
||||
HUAWEI_OBS_SERVER=your-server-url
|
||||
|
||||
# Baidu OBS Storage Configuration
|
||||
BAIDU_OBS_BUCKET_NAME=your-bucket-name
|
||||
BAIDU_OBS_SECRET_KEY=your-secret-key
|
||||
BAIDU_OBS_ACCESS_KEY=your-access-key
|
||||
BAIDU_OBS_ENDPOINT=your-server-url
|
||||
|
||||
# OCI Storage configuration
|
||||
OCI_ENDPOINT=your-endpoint
|
||||
OCI_BUCKET_NAME=your-bucket-name
|
||||
OCI_ACCESS_KEY=your-access-key
|
||||
OCI_SECRET_KEY=your-secret-key
|
||||
OCI_REGION=your-region
|
||||
|
||||
# Volcengine tos Storage configuration
|
||||
VOLCENGINE_TOS_ENDPOINT=your-endpoint
|
||||
VOLCENGINE_TOS_BUCKET_NAME=your-bucket-name
|
||||
VOLCENGINE_TOS_ACCESS_KEY=your-access-key
|
||||
VOLCENGINE_TOS_SECRET_KEY=your-secret-key
|
||||
VOLCENGINE_TOS_REGION=your-region
|
||||
|
||||
# Supabase Storage Configuration
|
||||
SUPABASE_BUCKET_NAME=your-bucket-name
|
||||
SUPABASE_API_KEY=your-access-key
|
||||
SUPABASE_URL=your-server-url
|
||||
|
||||
# CORS configuration
|
||||
WEB_API_CORS_ALLOW_ORIGINS=http://127.0.0.1:3000,*
|
||||
CONSOLE_CORS_ALLOW_ORIGINS=http://127.0.0.1:3000,*
|
||||
WEB_API_CORS_ALLOW_ORIGINS=http://localhost:3000,*
|
||||
CONSOLE_CORS_ALLOW_ORIGINS=http://localhost:3000,*
|
||||
# When the frontend and backend run on different subdomains, set COOKIE_DOMAIN to the site’s top-level domain (e.g., `example.com`). Leading dots are optional.
|
||||
COOKIE_DOMAIN=
|
||||
|
||||
# Cookie configuration
|
||||
COOKIE_HTTPONLY=true
|
||||
COOKIE_SAMESITE=None
|
||||
COOKIE_SECURE=true
|
||||
|
||||
# Session configuration
|
||||
SESSION_PERMANENT=true
|
||||
SESSION_USE_SIGNER=true
|
||||
|
||||
## support redis, sqlalchemy
|
||||
SESSION_TYPE=redis
|
||||
|
||||
# session redis configuration
|
||||
SESSION_REDIS_HOST=localhost
|
||||
SESSION_REDIS_PORT=6379
|
||||
SESSION_REDIS_PASSWORD=difyai123456
|
||||
SESSION_REDIS_DB=2
|
||||
|
||||
# Vector database configuration, support: weaviate, qdrant
|
||||
# Vector database configuration
|
||||
# Supported values are `weaviate`, `oceanbase`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `oracle`, `tencent`, `elasticsearch`, `elasticsearch-ja`, `analyticdb`, `couchbase`, `vikingdb`, `opengauss`, `tablestore`,`vastbase`,`tidb`,`tidb_on_qdrant`,`baidu`,`lindorm`,`huawei_cloud`,`upstash`, `matrixone`.
|
||||
VECTOR_STORE=weaviate
|
||||
# Prefix used to create collection name in vector database
|
||||
VECTOR_INDEX_NAME_PREFIX=Vector_index
|
||||
|
||||
# Weaviate configuration
|
||||
WEAVIATE_ENDPOINT=http://localhost:8080
|
||||
WEAVIATE_API_KEY=WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih
|
||||
WEAVIATE_GRPC_ENABLED=false
|
||||
WEAVIATE_BATCH_SIZE=100
|
||||
WEAVIATE_TOKENIZATION=word
|
||||
|
||||
# Qdrant configuration, use `path:` prefix for local mode or `https://your-qdrant-cluster-url.qdrant.io` for remote mode
|
||||
QDRANT_URL=path:storage/qdrant
|
||||
QDRANT_API_KEY=your-qdrant-api-key
|
||||
# OceanBase Vector configuration
|
||||
OCEANBASE_VECTOR_HOST=127.0.0.1
|
||||
OCEANBASE_VECTOR_PORT=2881
|
||||
OCEANBASE_VECTOR_USER=root@test
|
||||
OCEANBASE_VECTOR_PASSWORD=difyai123456
|
||||
OCEANBASE_VECTOR_DATABASE=test
|
||||
OCEANBASE_MEMORY_LIMIT=6G
|
||||
OCEANBASE_ENABLE_HYBRID_SEARCH=false
|
||||
OCEANBASE_FULLTEXT_PARSER=ik
|
||||
SEEKDB_MEMORY_LIMIT=2G
|
||||
|
||||
# Mail configuration, support: resend
|
||||
# Qdrant configuration, use `http://localhost:6333` for local mode or `https://your-qdrant-cluster-url.qdrant.io` for remote mode
|
||||
QDRANT_URL=http://localhost:6333
|
||||
QDRANT_API_KEY=difyai123456
|
||||
QDRANT_CLIENT_TIMEOUT=20
|
||||
QDRANT_GRPC_ENABLED=false
|
||||
QDRANT_GRPC_PORT=6334
|
||||
QDRANT_REPLICATION_FACTOR=1
|
||||
|
||||
#Couchbase configuration
|
||||
COUCHBASE_CONNECTION_STRING=127.0.0.1
|
||||
COUCHBASE_USER=Administrator
|
||||
COUCHBASE_PASSWORD=password
|
||||
COUCHBASE_BUCKET_NAME=Embeddings
|
||||
COUCHBASE_SCOPE_NAME=_default
|
||||
|
||||
# Milvus configuration
|
||||
MILVUS_URI=http://127.0.0.1:19530
|
||||
MILVUS_TOKEN=
|
||||
MILVUS_USER=root
|
||||
MILVUS_PASSWORD=Milvus
|
||||
MILVUS_ANALYZER_PARAMS=
|
||||
|
||||
# MyScale configuration
|
||||
MYSCALE_HOST=127.0.0.1
|
||||
MYSCALE_PORT=8123
|
||||
MYSCALE_USER=default
|
||||
MYSCALE_PASSWORD=
|
||||
MYSCALE_DATABASE=default
|
||||
MYSCALE_FTS_PARAMS=
|
||||
|
||||
# Relyt configuration
|
||||
RELYT_HOST=127.0.0.1
|
||||
RELYT_PORT=5432
|
||||
RELYT_USER=postgres
|
||||
RELYT_PASSWORD=postgres
|
||||
RELYT_DATABASE=postgres
|
||||
|
||||
# Tencent configuration
|
||||
TENCENT_VECTOR_DB_URL=http://127.0.0.1
|
||||
TENCENT_VECTOR_DB_API_KEY=dify
|
||||
TENCENT_VECTOR_DB_TIMEOUT=30
|
||||
TENCENT_VECTOR_DB_USERNAME=dify
|
||||
TENCENT_VECTOR_DB_DATABASE=dify
|
||||
TENCENT_VECTOR_DB_SHARD=1
|
||||
TENCENT_VECTOR_DB_REPLICAS=2
|
||||
TENCENT_VECTOR_DB_ENABLE_HYBRID_SEARCH=false
|
||||
|
||||
# ElasticSearch configuration
|
||||
ELASTICSEARCH_HOST=127.0.0.1
|
||||
ELASTICSEARCH_PORT=9200
|
||||
ELASTICSEARCH_USERNAME=elastic
|
||||
ELASTICSEARCH_PASSWORD=elastic
|
||||
|
||||
# PGVECTO_RS configuration
|
||||
PGVECTO_RS_HOST=localhost
|
||||
PGVECTO_RS_PORT=5431
|
||||
PGVECTO_RS_USER=postgres
|
||||
PGVECTO_RS_PASSWORD=difyai123456
|
||||
PGVECTO_RS_DATABASE=postgres
|
||||
|
||||
# PGVector configuration
|
||||
PGVECTOR_HOST=127.0.0.1
|
||||
PGVECTOR_PORT=5433
|
||||
PGVECTOR_USER=postgres
|
||||
PGVECTOR_PASSWORD=postgres
|
||||
PGVECTOR_DATABASE=postgres
|
||||
PGVECTOR_MIN_CONNECTION=1
|
||||
PGVECTOR_MAX_CONNECTION=5
|
||||
|
||||
# TableStore Vector configuration
|
||||
TABLESTORE_ENDPOINT=https://instance-name.cn-hangzhou.ots.aliyuncs.com
|
||||
TABLESTORE_INSTANCE_NAME=instance-name
|
||||
TABLESTORE_ACCESS_KEY_ID=xxx
|
||||
TABLESTORE_ACCESS_KEY_SECRET=xxx
|
||||
TABLESTORE_NORMALIZE_FULLTEXT_BM25_SCORE=false
|
||||
|
||||
# Tidb Vector configuration
|
||||
TIDB_VECTOR_HOST=xxx.eu-central-1.xxx.aws.tidbcloud.com
|
||||
TIDB_VECTOR_PORT=4000
|
||||
TIDB_VECTOR_USER=xxx.root
|
||||
TIDB_VECTOR_PASSWORD=xxxxxx
|
||||
TIDB_VECTOR_DATABASE=dify
|
||||
|
||||
# Tidb on qdrant configuration
|
||||
TIDB_ON_QDRANT_URL=http://127.0.0.1
|
||||
TIDB_ON_QDRANT_API_KEY=dify
|
||||
TIDB_ON_QDRANT_CLIENT_TIMEOUT=20
|
||||
TIDB_ON_QDRANT_GRPC_ENABLED=false
|
||||
TIDB_ON_QDRANT_GRPC_PORT=6334
|
||||
TIDB_PUBLIC_KEY=dify
|
||||
TIDB_PRIVATE_KEY=dify
|
||||
TIDB_API_URL=http://127.0.0.1
|
||||
TIDB_IAM_API_URL=http://127.0.0.1
|
||||
TIDB_REGION=regions/aws-us-east-1
|
||||
TIDB_PROJECT_ID=dify
|
||||
TIDB_SPEND_LIMIT=100
|
||||
|
||||
# Chroma configuration
|
||||
CHROMA_HOST=127.0.0.1
|
||||
CHROMA_PORT=8000
|
||||
CHROMA_TENANT=default_tenant
|
||||
CHROMA_DATABASE=default_database
|
||||
CHROMA_AUTH_PROVIDER=chromadb.auth.token_authn.TokenAuthenticationServerProvider
|
||||
CHROMA_AUTH_CREDENTIALS=difyai123456
|
||||
|
||||
# AnalyticDB configuration
|
||||
ANALYTICDB_KEY_ID=your-ak
|
||||
ANALYTICDB_KEY_SECRET=your-sk
|
||||
ANALYTICDB_REGION_ID=cn-hangzhou
|
||||
ANALYTICDB_INSTANCE_ID=gp-ab123456
|
||||
ANALYTICDB_ACCOUNT=testaccount
|
||||
ANALYTICDB_PASSWORD=testpassword
|
||||
ANALYTICDB_NAMESPACE=dify
|
||||
ANALYTICDB_NAMESPACE_PASSWORD=difypassword
|
||||
ANALYTICDB_HOST=gp-test.aliyuncs.com
|
||||
ANALYTICDB_PORT=5432
|
||||
ANALYTICDB_MIN_CONNECTION=1
|
||||
ANALYTICDB_MAX_CONNECTION=5
|
||||
|
||||
# OpenSearch configuration
|
||||
OPENSEARCH_HOST=127.0.0.1
|
||||
OPENSEARCH_PORT=9200
|
||||
OPENSEARCH_USER=admin
|
||||
OPENSEARCH_PASSWORD=admin
|
||||
OPENSEARCH_SECURE=true
|
||||
OPENSEARCH_VERIFY_CERTS=true
|
||||
|
||||
# Baidu configuration
|
||||
BAIDU_VECTOR_DB_ENDPOINT=http://127.0.0.1:5287
|
||||
BAIDU_VECTOR_DB_CONNECTION_TIMEOUT_MS=30000
|
||||
BAIDU_VECTOR_DB_ACCOUNT=root
|
||||
BAIDU_VECTOR_DB_API_KEY=dify
|
||||
BAIDU_VECTOR_DB_DATABASE=dify
|
||||
BAIDU_VECTOR_DB_SHARD=1
|
||||
BAIDU_VECTOR_DB_REPLICAS=3
|
||||
BAIDU_VECTOR_DB_INVERTED_INDEX_ANALYZER=DEFAULT_ANALYZER
|
||||
BAIDU_VECTOR_DB_INVERTED_INDEX_PARSER_MODE=COARSE_MODE
|
||||
|
||||
# Upstash configuration
|
||||
UPSTASH_VECTOR_URL=your-server-url
|
||||
UPSTASH_VECTOR_TOKEN=your-access-token
|
||||
|
||||
# ViKingDB configuration
|
||||
VIKINGDB_ACCESS_KEY=your-ak
|
||||
VIKINGDB_SECRET_KEY=your-sk
|
||||
VIKINGDB_REGION=cn-shanghai
|
||||
VIKINGDB_HOST=api-vikingdb.xxx.volces.com
|
||||
VIKINGDB_SCHEMA=http
|
||||
VIKINGDB_CONNECTION_TIMEOUT=30
|
||||
VIKINGDB_SOCKET_TIMEOUT=30
|
||||
|
||||
# Matrixone configration
|
||||
MATRIXONE_HOST=127.0.0.1
|
||||
MATRIXONE_PORT=6001
|
||||
MATRIXONE_USER=dump
|
||||
MATRIXONE_PASSWORD=111
|
||||
MATRIXONE_DATABASE=dify
|
||||
|
||||
# Lindorm configuration
|
||||
LINDORM_URL=http://ld-*******************-proxy-search-pub.lindorm.aliyuncs.com:30070
|
||||
LINDORM_USERNAME=admin
|
||||
LINDORM_PASSWORD=admin
|
||||
LINDORM_USING_UGC=True
|
||||
LINDORM_QUERY_TIMEOUT=1
|
||||
|
||||
# AlibabaCloud MySQL Vector configuration
|
||||
ALIBABACLOUD_MYSQL_HOST=127.0.0.1
|
||||
ALIBABACLOUD_MYSQL_PORT=3306
|
||||
ALIBABACLOUD_MYSQL_USER=root
|
||||
ALIBABACLOUD_MYSQL_PASSWORD=root
|
||||
ALIBABACLOUD_MYSQL_DATABASE=dify
|
||||
ALIBABACLOUD_MYSQL_MAX_CONNECTION=5
|
||||
ALIBABACLOUD_MYSQL_HNSW_M=6
|
||||
|
||||
# openGauss configuration
|
||||
OPENGAUSS_HOST=127.0.0.1
|
||||
OPENGAUSS_PORT=6600
|
||||
OPENGAUSS_USER=postgres
|
||||
OPENGAUSS_PASSWORD=Dify@123
|
||||
OPENGAUSS_DATABASE=dify
|
||||
OPENGAUSS_MIN_CONNECTION=1
|
||||
OPENGAUSS_MAX_CONNECTION=5
|
||||
|
||||
# Upload configuration
|
||||
UPLOAD_FILE_SIZE_LIMIT=15
|
||||
UPLOAD_FILE_BATCH_LIMIT=5
|
||||
UPLOAD_IMAGE_FILE_SIZE_LIMIT=10
|
||||
UPLOAD_VIDEO_FILE_SIZE_LIMIT=100
|
||||
UPLOAD_AUDIO_FILE_SIZE_LIMIT=50
|
||||
|
||||
# Comma-separated list of file extensions blocked from upload for security reasons.
|
||||
# Extensions should be lowercase without dots (e.g., exe,bat,sh,dll).
|
||||
# Empty by default to allow all file types.
|
||||
# Recommended: exe,bat,cmd,com,scr,vbs,ps1,msi,dll
|
||||
UPLOAD_FILE_EXTENSION_BLACKLIST=
|
||||
|
||||
# Model configuration
|
||||
MULTIMODAL_SEND_FORMAT=base64
|
||||
PROMPT_GENERATION_MAX_TOKENS=512
|
||||
CODE_GENERATION_MAX_TOKENS=1024
|
||||
PLUGIN_BASED_TOKEN_COUNTING_ENABLED=false
|
||||
|
||||
# Mail configuration, support: resend, smtp, sendgrid
|
||||
MAIL_TYPE=
|
||||
# If using SendGrid, use the 'from' field for authentication if necessary.
|
||||
MAIL_DEFAULT_SEND_FROM=no-reply <no-reply@dify.ai>
|
||||
# resend configuration
|
||||
RESEND_API_KEY=
|
||||
|
||||
RESEND_API_URL=https://api.resend.com
|
||||
# smtp configuration
|
||||
SMTP_SERVER=smtp.gmail.com
|
||||
SMTP_PORT=465
|
||||
SMTP_USERNAME=123
|
||||
SMTP_PASSWORD=abc
|
||||
SMTP_USE_TLS=true
|
||||
SMTP_OPPORTUNISTIC_TLS=false
|
||||
# Sendgid configuration
|
||||
SENDGRID_API_KEY=
|
||||
# Sentry configuration
|
||||
SENTRY_DSN=
|
||||
|
||||
# DEBUG
|
||||
DEBUG=false
|
||||
ENABLE_REQUEST_LOGGING=False
|
||||
SQLALCHEMY_ECHO=false
|
||||
|
||||
# Notion import configuration, support public and internal
|
||||
@ -99,30 +421,220 @@ NOTION_CLIENT_SECRET=you-client-secret
|
||||
NOTION_CLIENT_ID=you-client-id
|
||||
NOTION_INTERNAL_SECRET=you-internal-secret
|
||||
|
||||
# Hosted Model Credentials
|
||||
HOSTED_OPENAI_ENABLED=false
|
||||
HOSTED_OPENAI_API_KEY=
|
||||
HOSTED_OPENAI_API_BASE=
|
||||
HOSTED_OPENAI_API_ORGANIZATION=
|
||||
HOSTED_OPENAI_QUOTA_LIMIT=200
|
||||
HOSTED_OPENAI_PAID_ENABLED=false
|
||||
HOSTED_OPENAI_PAID_STRIPE_PRICE_ID=
|
||||
HOSTED_OPENAI_PAID_INCREASE_QUOTA=1
|
||||
ETL_TYPE=dify
|
||||
UNSTRUCTURED_API_URL=
|
||||
UNSTRUCTURED_API_KEY=
|
||||
SCARF_NO_ANALYTICS=true
|
||||
|
||||
HOSTED_AZURE_OPENAI_ENABLED=false
|
||||
HOSTED_AZURE_OPENAI_API_KEY=
|
||||
HOSTED_AZURE_OPENAI_API_BASE=
|
||||
HOSTED_AZURE_OPENAI_QUOTA_LIMIT=200
|
||||
#ssrf
|
||||
SSRF_PROXY_HTTP_URL=
|
||||
SSRF_PROXY_HTTPS_URL=
|
||||
SSRF_DEFAULT_MAX_RETRIES=3
|
||||
SSRF_DEFAULT_TIME_OUT=5
|
||||
SSRF_DEFAULT_CONNECT_TIME_OUT=5
|
||||
SSRF_DEFAULT_READ_TIME_OUT=5
|
||||
SSRF_DEFAULT_WRITE_TIME_OUT=5
|
||||
SSRF_POOL_MAX_CONNECTIONS=100
|
||||
SSRF_POOL_MAX_KEEPALIVE_CONNECTIONS=20
|
||||
SSRF_POOL_KEEPALIVE_EXPIRY=5.0
|
||||
|
||||
HOSTED_ANTHROPIC_ENABLED=false
|
||||
HOSTED_ANTHROPIC_API_BASE=
|
||||
HOSTED_ANTHROPIC_API_KEY=
|
||||
HOSTED_ANTHROPIC_QUOTA_LIMIT=600000
|
||||
HOSTED_ANTHROPIC_PAID_ENABLED=false
|
||||
HOSTED_ANTHROPIC_PAID_STRIPE_PRICE_ID=
|
||||
HOSTED_ANTHROPIC_PAID_INCREASE_QUOTA=1000000
|
||||
HOSTED_ANTHROPIC_PAID_MIN_QUANTITY=20
|
||||
HOSTED_ANTHROPIC_PAID_MAX_QUANTITY=100
|
||||
BATCH_UPLOAD_LIMIT=10
|
||||
KEYWORD_DATA_SOURCE_TYPE=database
|
||||
|
||||
STRIPE_API_KEY=
|
||||
STRIPE_WEBHOOK_SECRET=
|
||||
# Workflow file upload limit
|
||||
WORKFLOW_FILE_UPLOAD_LIMIT=10
|
||||
|
||||
# CODE EXECUTION CONFIGURATION
|
||||
CODE_EXECUTION_ENDPOINT=http://127.0.0.1:8194
|
||||
CODE_EXECUTION_API_KEY=dify-sandbox
|
||||
CODE_EXECUTION_SSL_VERIFY=True
|
||||
CODE_EXECUTION_POOL_MAX_CONNECTIONS=100
|
||||
CODE_EXECUTION_POOL_MAX_KEEPALIVE_CONNECTIONS=20
|
||||
CODE_EXECUTION_POOL_KEEPALIVE_EXPIRY=5.0
|
||||
CODE_EXECUTION_CONNECT_TIMEOUT=10
|
||||
CODE_EXECUTION_READ_TIMEOUT=60
|
||||
CODE_EXECUTION_WRITE_TIMEOUT=10
|
||||
CODE_MAX_NUMBER=9223372036854775807
|
||||
CODE_MIN_NUMBER=-9223372036854775808
|
||||
CODE_MAX_STRING_LENGTH=400000
|
||||
TEMPLATE_TRANSFORM_MAX_LENGTH=400000
|
||||
CODE_MAX_STRING_ARRAY_LENGTH=30
|
||||
CODE_MAX_OBJECT_ARRAY_LENGTH=30
|
||||
CODE_MAX_NUMBER_ARRAY_LENGTH=1000
|
||||
|
||||
# API Tool configuration
|
||||
API_TOOL_DEFAULT_CONNECT_TIMEOUT=10
|
||||
API_TOOL_DEFAULT_READ_TIMEOUT=60
|
||||
|
||||
# HTTP Node configuration
|
||||
HTTP_REQUEST_MAX_CONNECT_TIMEOUT=300
|
||||
HTTP_REQUEST_MAX_READ_TIMEOUT=600
|
||||
HTTP_REQUEST_MAX_WRITE_TIMEOUT=600
|
||||
HTTP_REQUEST_NODE_MAX_BINARY_SIZE=10485760
|
||||
HTTP_REQUEST_NODE_MAX_TEXT_SIZE=1048576
|
||||
HTTP_REQUEST_NODE_SSL_VERIFY=True
|
||||
|
||||
# Webhook request configuration
|
||||
WEBHOOK_REQUEST_BODY_MAX_SIZE=10485760
|
||||
|
||||
# Respect X-* headers to redirect clients
|
||||
RESPECT_XFORWARD_HEADERS_ENABLED=false
|
||||
|
||||
# Log file path
|
||||
LOG_FILE=
|
||||
# Log file max size, the unit is MB
|
||||
LOG_FILE_MAX_SIZE=20
|
||||
# Log file max backup count
|
||||
LOG_FILE_BACKUP_COUNT=5
|
||||
# Log dateformat
|
||||
LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S
|
||||
# Log Timezone
|
||||
LOG_TZ=UTC
|
||||
# Log format
|
||||
LOG_FORMAT=%(asctime)s,%(msecs)d %(levelname)-2s [%(filename)s:%(lineno)d] %(req_id)s %(message)s
|
||||
|
||||
# Indexing configuration
|
||||
INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH=4000
|
||||
|
||||
# Workflow runtime configuration
|
||||
WORKFLOW_MAX_EXECUTION_STEPS=500
|
||||
WORKFLOW_MAX_EXECUTION_TIME=1200
|
||||
WORKFLOW_CALL_MAX_DEPTH=5
|
||||
MAX_VARIABLE_SIZE=204800
|
||||
|
||||
# GraphEngine Worker Pool Configuration
|
||||
# Minimum number of workers per GraphEngine instance (default: 1)
|
||||
GRAPH_ENGINE_MIN_WORKERS=1
|
||||
# Maximum number of workers per GraphEngine instance (default: 10)
|
||||
GRAPH_ENGINE_MAX_WORKERS=10
|
||||
# Queue depth threshold that triggers worker scale up (default: 3)
|
||||
GRAPH_ENGINE_SCALE_UP_THRESHOLD=3
|
||||
# Seconds of idle time before scaling down workers (default: 5.0)
|
||||
GRAPH_ENGINE_SCALE_DOWN_IDLE_TIME=5.0
|
||||
|
||||
# Workflow storage configuration
|
||||
# Options: rdbms, hybrid
|
||||
# rdbms: Use only the relational database (default)
|
||||
# hybrid: Save new data to object storage, read from both object storage and RDBMS
|
||||
WORKFLOW_NODE_EXECUTION_STORAGE=rdbms
|
||||
|
||||
# Repository configuration
|
||||
# Core workflow execution repository implementation
|
||||
CORE_WORKFLOW_EXECUTION_REPOSITORY=core.repositories.sqlalchemy_workflow_execution_repository.SQLAlchemyWorkflowExecutionRepository
|
||||
|
||||
# Core workflow node execution repository implementation
|
||||
CORE_WORKFLOW_NODE_EXECUTION_REPOSITORY=core.repositories.sqlalchemy_workflow_node_execution_repository.SQLAlchemyWorkflowNodeExecutionRepository
|
||||
|
||||
# API workflow node execution repository implementation
|
||||
API_WORKFLOW_NODE_EXECUTION_REPOSITORY=repositories.sqlalchemy_api_workflow_node_execution_repository.DifyAPISQLAlchemyWorkflowNodeExecutionRepository
|
||||
|
||||
# API workflow run repository implementation
|
||||
API_WORKFLOW_RUN_REPOSITORY=repositories.sqlalchemy_api_workflow_run_repository.DifyAPISQLAlchemyWorkflowRunRepository
|
||||
# Workflow log cleanup configuration
|
||||
# Enable automatic cleanup of workflow run logs to manage database size
|
||||
WORKFLOW_LOG_CLEANUP_ENABLED=false
|
||||
# Number of days to retain workflow run logs (default: 30 days)
|
||||
WORKFLOW_LOG_RETENTION_DAYS=30
|
||||
# Batch size for workflow log cleanup operations (default: 100)
|
||||
WORKFLOW_LOG_CLEANUP_BATCH_SIZE=100
|
||||
|
||||
# App configuration
|
||||
APP_MAX_EXECUTION_TIME=1200
|
||||
APP_DEFAULT_ACTIVE_REQUESTS=0
|
||||
APP_MAX_ACTIVE_REQUESTS=0
|
||||
|
||||
# Celery beat configuration
|
||||
CELERY_BEAT_SCHEDULER_TIME=1
|
||||
|
||||
# Celery schedule tasks configuration
|
||||
ENABLE_CLEAN_EMBEDDING_CACHE_TASK=false
|
||||
ENABLE_CLEAN_UNUSED_DATASETS_TASK=false
|
||||
ENABLE_CREATE_TIDB_SERVERLESS_TASK=false
|
||||
ENABLE_UPDATE_TIDB_SERVERLESS_STATUS_TASK=false
|
||||
ENABLE_CLEAN_MESSAGES=false
|
||||
ENABLE_MAIL_CLEAN_DOCUMENT_NOTIFY_TASK=false
|
||||
ENABLE_DATASETS_QUEUE_MONITOR=false
|
||||
ENABLE_CHECK_UPGRADABLE_PLUGIN_TASK=true
|
||||
ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK=true
|
||||
# Interval time in minutes for polling scheduled workflows(default: 1 min)
|
||||
WORKFLOW_SCHEDULE_POLLER_INTERVAL=1
|
||||
WORKFLOW_SCHEDULE_POLLER_BATCH_SIZE=100
|
||||
# Maximum number of scheduled workflows to dispatch per tick (0 for unlimited)
|
||||
WORKFLOW_SCHEDULE_MAX_DISPATCH_PER_TICK=0
|
||||
|
||||
# Position configuration
|
||||
POSITION_TOOL_PINS=
|
||||
POSITION_TOOL_INCLUDES=
|
||||
POSITION_TOOL_EXCLUDES=
|
||||
|
||||
POSITION_PROVIDER_PINS=
|
||||
POSITION_PROVIDER_INCLUDES=
|
||||
POSITION_PROVIDER_EXCLUDES=
|
||||
|
||||
# Plugin configuration
|
||||
PLUGIN_DAEMON_KEY=lYkiYYT6owG+71oLerGzA7GXCgOT++6ovaezWAjpCjf+Sjc3ZtU+qUEi
|
||||
PLUGIN_DAEMON_URL=http://127.0.0.1:5002
|
||||
PLUGIN_REMOTE_INSTALL_PORT=5003
|
||||
PLUGIN_REMOTE_INSTALL_HOST=localhost
|
||||
PLUGIN_MAX_PACKAGE_SIZE=15728640
|
||||
INNER_API_KEY_FOR_PLUGIN=QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1
|
||||
|
||||
# Marketplace configuration
|
||||
MARKETPLACE_ENABLED=true
|
||||
MARKETPLACE_API_URL=https://marketplace.dify.ai
|
||||
|
||||
# Endpoint configuration
|
||||
ENDPOINT_URL_TEMPLATE=http://localhost:5002/e/{hook_id}
|
||||
|
||||
# Reset password token expiry minutes
|
||||
RESET_PASSWORD_TOKEN_EXPIRY_MINUTES=5
|
||||
EMAIL_REGISTER_TOKEN_EXPIRY_MINUTES=5
|
||||
CHANGE_EMAIL_TOKEN_EXPIRY_MINUTES=5
|
||||
OWNER_TRANSFER_TOKEN_EXPIRY_MINUTES=5
|
||||
|
||||
CREATE_TIDB_SERVICE_JOB_ENABLED=false
|
||||
|
||||
# Maximum number of submitted thread count in a ThreadPool for parallel node execution
|
||||
MAX_SUBMIT_COUNT=100
|
||||
# Lockout duration in seconds
|
||||
LOGIN_LOCKOUT_DURATION=86400
|
||||
|
||||
# Enable OpenTelemetry
|
||||
ENABLE_OTEL=false
|
||||
OTLP_TRACE_ENDPOINT=
|
||||
OTLP_METRIC_ENDPOINT=
|
||||
OTLP_BASE_ENDPOINT=http://localhost:4318
|
||||
OTLP_API_KEY=
|
||||
OTEL_EXPORTER_OTLP_PROTOCOL=
|
||||
OTEL_EXPORTER_TYPE=otlp
|
||||
OTEL_SAMPLING_RATE=0.1
|
||||
OTEL_BATCH_EXPORT_SCHEDULE_DELAY=5000
|
||||
OTEL_MAX_QUEUE_SIZE=2048
|
||||
OTEL_MAX_EXPORT_BATCH_SIZE=512
|
||||
OTEL_METRIC_EXPORT_INTERVAL=60000
|
||||
OTEL_BATCH_EXPORT_TIMEOUT=10000
|
||||
OTEL_METRIC_EXPORT_TIMEOUT=30000
|
||||
|
||||
# Prevent Clickjacking
|
||||
ALLOW_EMBED=false
|
||||
|
||||
# Dataset queue monitor configuration
|
||||
QUEUE_MONITOR_THRESHOLD=200
|
||||
# You can configure multiple ones, separated by commas. eg: test1@dify.ai,test2@dify.ai
|
||||
QUEUE_MONITOR_ALERT_EMAILS=
|
||||
# Monitor interval in minutes, default is 30 minutes
|
||||
QUEUE_MONITOR_INTERVAL=30
|
||||
|
||||
# Swagger UI configuration
|
||||
SWAGGER_UI_ENABLED=true
|
||||
SWAGGER_UI_PATH=/swagger-ui.html
|
||||
|
||||
# Whether to encrypt dataset IDs when exporting DSL files (default: true)
|
||||
# Set to false to export dataset IDs as plain text for easier cross-environment import
|
||||
DSL_EXPORT_ENCRYPT_DATASET_ID=true
|
||||
|
||||
# Tenant isolated task queue configuration
|
||||
TENANT_ISOLATED_TASK_CONCURRENCY=1
|
||||
|
||||
# Maximum number of segments for dataset segments API (0 for unlimited)
|
||||
DATASET_MAX_SEGMENTS_PER_REQUEST=0
|
||||
|
||||
BIN
api/.idea/icon.png
generated
Normal file
BIN
api/.idea/icon.png
generated
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
17
api/.idea/vcs.xml
generated
Normal file
17
api/.idea/vcs.xml
generated
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="IssueNavigationConfiguration">
|
||||
<option name="links">
|
||||
<list>
|
||||
<IssueNavigationLink>
|
||||
<option name="issueRegexp" value="#(\d+)" />
|
||||
<option name="linkRegexp" value="https://github.com/langgenius/dify/issues/$1" />
|
||||
</IssueNavigationLink>
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
106
api/.importlinter
Normal file
106
api/.importlinter
Normal file
@ -0,0 +1,106 @@
|
||||
[importlinter]
|
||||
root_packages =
|
||||
core
|
||||
configs
|
||||
controllers
|
||||
models
|
||||
tasks
|
||||
services
|
||||
|
||||
[importlinter:contract:workflow]
|
||||
name = Workflow
|
||||
type=layers
|
||||
layers =
|
||||
graph_engine
|
||||
graph_events
|
||||
graph
|
||||
nodes
|
||||
node_events
|
||||
runtime
|
||||
entities
|
||||
containers =
|
||||
core.workflow
|
||||
ignore_imports =
|
||||
core.workflow.nodes.base.node -> core.workflow.graph_events
|
||||
core.workflow.nodes.iteration.iteration_node -> core.workflow.graph_events
|
||||
core.workflow.nodes.loop.loop_node -> core.workflow.graph_events
|
||||
|
||||
core.workflow.nodes.node_factory -> core.workflow.graph
|
||||
core.workflow.nodes.iteration.iteration_node -> core.workflow.graph_engine
|
||||
core.workflow.nodes.iteration.iteration_node -> core.workflow.graph
|
||||
core.workflow.nodes.iteration.iteration_node -> core.workflow.graph_engine.command_channels
|
||||
core.workflow.nodes.loop.loop_node -> core.workflow.graph_engine
|
||||
core.workflow.nodes.loop.loop_node -> core.workflow.graph
|
||||
core.workflow.nodes.loop.loop_node -> core.workflow.graph_engine.command_channels
|
||||
|
||||
[importlinter:contract:rsc]
|
||||
name = RSC
|
||||
type = layers
|
||||
layers =
|
||||
graph_engine
|
||||
response_coordinator
|
||||
containers =
|
||||
core.workflow.graph_engine
|
||||
|
||||
[importlinter:contract:worker]
|
||||
name = Worker
|
||||
type = layers
|
||||
layers =
|
||||
graph_engine
|
||||
worker
|
||||
containers =
|
||||
core.workflow.graph_engine
|
||||
|
||||
[importlinter:contract:graph-engine-architecture]
|
||||
name = Graph Engine Architecture
|
||||
type = layers
|
||||
layers =
|
||||
graph_engine
|
||||
orchestration
|
||||
command_processing
|
||||
event_management
|
||||
error_handler
|
||||
graph_traversal
|
||||
graph_state_manager
|
||||
worker_management
|
||||
domain
|
||||
containers =
|
||||
core.workflow.graph_engine
|
||||
|
||||
[importlinter:contract:domain-isolation]
|
||||
name = Domain Model Isolation
|
||||
type = forbidden
|
||||
source_modules =
|
||||
core.workflow.graph_engine.domain
|
||||
forbidden_modules =
|
||||
core.workflow.graph_engine.worker_management
|
||||
core.workflow.graph_engine.command_channels
|
||||
core.workflow.graph_engine.layers
|
||||
core.workflow.graph_engine.protocols
|
||||
|
||||
[importlinter:contract:worker-management]
|
||||
name = Worker Management
|
||||
type = forbidden
|
||||
source_modules =
|
||||
core.workflow.graph_engine.worker_management
|
||||
forbidden_modules =
|
||||
core.workflow.graph_engine.orchestration
|
||||
core.workflow.graph_engine.command_processing
|
||||
core.workflow.graph_engine.event_management
|
||||
|
||||
|
||||
[importlinter:contract:graph-traversal-components]
|
||||
name = Graph Traversal Components
|
||||
type = layers
|
||||
layers =
|
||||
edge_processor
|
||||
skip_propagator
|
||||
containers =
|
||||
core.workflow.graph_engine.graph_traversal
|
||||
|
||||
[importlinter:contract:command-channels]
|
||||
name = Command Channels Independence
|
||||
type = independence
|
||||
modules =
|
||||
core.workflow.graph_engine.command_channels.in_memory_channel
|
||||
core.workflow.graph_engine.command_channels.redis_channel
|
||||
113
api/.ruff.toml
Normal file
113
api/.ruff.toml
Normal file
@ -0,0 +1,113 @@
|
||||
exclude = ["migrations/*"]
|
||||
line-length = 120
|
||||
|
||||
[format]
|
||||
quote-style = "double"
|
||||
|
||||
[lint]
|
||||
preview = true
|
||||
select = [
|
||||
"B", # flake8-bugbear rules
|
||||
"C4", # flake8-comprehensions
|
||||
"E", # pycodestyle E rules
|
||||
"F", # pyflakes rules
|
||||
"FURB", # refurb rules
|
||||
"I", # isort rules
|
||||
"N", # pep8-naming
|
||||
"PT", # flake8-pytest-style rules
|
||||
"PLC0208", # iteration-over-set
|
||||
"PLC0414", # useless-import-alias
|
||||
"PLE0604", # invalid-all-object
|
||||
"PLE0605", # invalid-all-format
|
||||
"PLR0402", # manual-from-import
|
||||
"PLR1711", # useless-return
|
||||
"PLR1714", # repeated-equality-comparison
|
||||
"RUF013", # implicit-optional
|
||||
"RUF019", # unnecessary-key-check
|
||||
"RUF100", # unused-noqa
|
||||
"RUF101", # redirected-noqa
|
||||
"RUF200", # invalid-pyproject-toml
|
||||
"RUF022", # unsorted-dunder-all
|
||||
"S506", # unsafe-yaml-load
|
||||
"SIM", # flake8-simplify rules
|
||||
"T201", # print-found
|
||||
"TRY400", # error-instead-of-exception
|
||||
"TRY401", # verbose-log-message
|
||||
"UP", # pyupgrade rules
|
||||
"W191", # tab-indentation
|
||||
"W605", # invalid-escape-sequence
|
||||
# security related linting rules
|
||||
# RCE proctection (sort of)
|
||||
"S102", # exec-builtin, disallow use of `exec`
|
||||
"S307", # suspicious-eval-usage, disallow use of `eval` and `ast.literal_eval`
|
||||
"S301", # suspicious-pickle-usage, disallow use of `pickle` and its wrappers.
|
||||
"S302", # suspicious-marshal-usage, disallow use of `marshal` module
|
||||
"S311", # suspicious-non-cryptographic-random-usage
|
||||
"G001", # don't use str format to logging messages
|
||||
"G003", # don't use + in logging messages
|
||||
"G004", # don't use f-strings to format logging messages
|
||||
"UP042", # use StrEnum
|
||||
]
|
||||
|
||||
ignore = [
|
||||
"E402", # module-import-not-at-top-of-file
|
||||
"E711", # none-comparison
|
||||
"E712", # true-false-comparison
|
||||
"E721", # type-comparison
|
||||
"E722", # bare-except
|
||||
"F821", # undefined-name
|
||||
"F841", # unused-variable
|
||||
"FURB113", # repeated-append
|
||||
"FURB152", # math-constant
|
||||
"UP007", # non-pep604-annotation
|
||||
"UP032", # f-string
|
||||
"UP045", # non-pep604-annotation-optional
|
||||
"B005", # strip-with-multi-characters
|
||||
"B006", # mutable-argument-default
|
||||
"B007", # unused-loop-control-variable
|
||||
"B026", # star-arg-unpacking-after-keyword-arg
|
||||
"B901", # allow return in yield
|
||||
"B903", # class-as-data-structure
|
||||
"B904", # raise-without-from-inside-except
|
||||
"B905", # zip-without-explicit-strict
|
||||
"N806", # non-lowercase-variable-in-function
|
||||
"N815", # mixed-case-variable-in-class-scope
|
||||
"PT011", # pytest-raises-too-broad
|
||||
"SIM102", # collapsible-if
|
||||
"SIM103", # needless-bool
|
||||
"SIM105", # suppressible-exception
|
||||
"SIM107", # return-in-try-except-finally
|
||||
"SIM108", # if-else-block-instead-of-if-exp
|
||||
"SIM113", # enumerate-for-loop
|
||||
"SIM117", # multiple-with-statements
|
||||
"SIM210", # if-expr-with-true-false
|
||||
]
|
||||
|
||||
[lint.per-file-ignores]
|
||||
"__init__.py" = [
|
||||
"F401", # unused-import
|
||||
"F811", # redefined-while-unused
|
||||
]
|
||||
"configs/*" = [
|
||||
"N802", # invalid-function-name
|
||||
]
|
||||
"core/model_runtime/callbacks/base_callback.py" = [
|
||||
"T201",
|
||||
]
|
||||
"core/workflow/callbacks/workflow_logging_callback.py" = [
|
||||
"T201",
|
||||
]
|
||||
"libs/gmpy2_pkcs10aep_cipher.py" = [
|
||||
"N803", # invalid-argument-name
|
||||
]
|
||||
"tests/*" = [
|
||||
"F811", # redefined-while-unused
|
||||
"T201", # allow print in tests
|
||||
]
|
||||
|
||||
[lint.pyflakes]
|
||||
allowed-unused-imports = [
|
||||
"_pytest.monkeypatch",
|
||||
"tests.integration_tests",
|
||||
"tests.unit_tests",
|
||||
]
|
||||
61
api/.vscode/launch.json.example
vendored
Normal file
61
api/.vscode/launch.json.example
vendored
Normal file
@ -0,0 +1,61 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"compounds": [
|
||||
{
|
||||
"name": "Launch Flask and Celery",
|
||||
"configurations": ["Python: Flask", "Python: Celery"]
|
||||
}
|
||||
],
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Python: Flask",
|
||||
"consoleName": "Flask",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"python": "${workspaceFolder}/.venv/bin/python",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"envFile": ".env",
|
||||
"module": "flask",
|
||||
"justMyCode": true,
|
||||
"jinja": true,
|
||||
"env": {
|
||||
"FLASK_APP": "app.py",
|
||||
"GEVENT_SUPPORT": "True"
|
||||
},
|
||||
"args": [
|
||||
"run",
|
||||
"--port=5001"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Python: Celery",
|
||||
"consoleName": "Celery",
|
||||
"type": "debugpy",
|
||||
"request": "launch",
|
||||
"python": "${workspaceFolder}/.venv/bin/python",
|
||||
"cwd": "${workspaceFolder}",
|
||||
"module": "celery",
|
||||
"justMyCode": true,
|
||||
"envFile": ".env",
|
||||
"console": "integratedTerminal",
|
||||
"env": {
|
||||
"FLASK_APP": "app.py",
|
||||
"FLASK_DEBUG": "1",
|
||||
"GEVENT_SUPPORT": "True"
|
||||
},
|
||||
"args": [
|
||||
"-A",
|
||||
"app.celery",
|
||||
"worker",
|
||||
"-P",
|
||||
"gevent",
|
||||
"-c",
|
||||
"1",
|
||||
"--loglevel",
|
||||
"DEBUG",
|
||||
"-Q",
|
||||
"dataset,priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
62
api/AGENTS.md
Normal file
62
api/AGENTS.md
Normal file
@ -0,0 +1,62 @@
|
||||
# Agent Skill Index
|
||||
|
||||
Start with the section that best matches your need. Each entry lists the problems it solves plus key files/concepts so you know what to expect before opening it.
|
||||
|
||||
______________________________________________________________________
|
||||
|
||||
## Platform Foundations
|
||||
|
||||
- **[Infrastructure Overview](agent_skills/infra.md)**\
|
||||
When to read this:
|
||||
|
||||
- You need to understand where a feature belongs in the architecture.
|
||||
- You’re wiring storage, Redis, vector stores, or OTEL.
|
||||
- You’re about to add CLI commands or async jobs.\
|
||||
What it covers: configuration stack (`configs/app_config.py`, remote settings), storage entry points (`extensions/ext_storage.py`, `core/file/file_manager.py`), Redis conventions (`extensions/ext_redis.py`), plugin runtime topology, vector-store factory (`core/rag/datasource/vdb/*`), observability hooks, SSRF proxy usage, and core CLI commands.
|
||||
|
||||
- **[Coding Style](agent_skills/coding_style.md)**\
|
||||
When to read this:
|
||||
|
||||
- You’re writing or reviewing backend code and need the authoritative checklist.
|
||||
- You’re unsure about Pydantic validators, SQLAlchemy session usage, or logging patterns.
|
||||
- You want the exact lint/type/test commands used in PRs.\
|
||||
Includes: Ruff & BasedPyright commands, no-annotation policy, session examples (`with Session(db.engine, ...)`), `@field_validator` usage, logging expectations, and the rule set for file size, helpers, and package management.
|
||||
|
||||
______________________________________________________________________
|
||||
|
||||
## Plugin & Extension Development
|
||||
|
||||
- **[Plugin Systems](agent_skills/plugin.md)**\
|
||||
When to read this:
|
||||
|
||||
- You’re building or debugging a marketplace plugin.
|
||||
- You need to know how manifests, providers, daemons, and migrations fit together.\
|
||||
What it covers: plugin manifests (`core/plugin/entities/plugin.py`), installation/upgrade flows (`services/plugin/plugin_service.py`, CLI commands), runtime adapters (`core/plugin/impl/*` for tool/model/datasource/trigger/endpoint/agent), daemon coordination (`core/plugin/entities/plugin_daemon.py`), and how provider registries surface capabilities to the rest of the platform.
|
||||
|
||||
- **[Plugin OAuth](agent_skills/plugin_oauth.md)**\
|
||||
When to read this:
|
||||
|
||||
- You must integrate OAuth for a plugin or datasource.
|
||||
- You’re handling credential encryption or refresh flows.\
|
||||
Topics: credential storage, encryption helpers (`core/helper/provider_encryption.py`), OAuth client bootstrap (`services/plugin/oauth_service.py`, `services/plugin/plugin_parameter_service.py`), and how console/API layers expose the flows.
|
||||
|
||||
______________________________________________________________________
|
||||
|
||||
## Workflow Entry & Execution
|
||||
|
||||
- **[Trigger Concepts](agent_skills/trigger.md)**\
|
||||
When to read this:
|
||||
- You’re debugging why a workflow didn’t start.
|
||||
- You’re adding a new trigger type or hook.
|
||||
- You need to trace async execution, draft debugging, or webhook/schedule pipelines.\
|
||||
Details: Start-node taxonomy, webhook & schedule internals (`core/workflow/nodes/trigger_*`, `services/trigger/*`), async orchestration (`services/async_workflow_service.py`, Celery queues), debug event bus, and storage/logging interactions.
|
||||
|
||||
______________________________________________________________________
|
||||
|
||||
## Additional Notes for Agents
|
||||
|
||||
- All skill docs assume you follow the coding style guide—run Ruff/BasedPyright/tests listed there before submitting changes.
|
||||
- When you cannot find an answer in these briefs, search the codebase using the paths referenced (e.g., `core/plugin/impl/tool.py`, `services/dataset_service.py`).
|
||||
- If you run into cross-cutting concerns (tenancy, configuration, storage), check the infrastructure guide first; it links to most supporting modules.
|
||||
- Keep multi-tenancy and configuration central: everything flows through `configs.dify_config` and `tenant_id`.
|
||||
- When touching plugins or triggers, consult both the system overview and the specialised doc to ensure you adjust lifecycle, storage, and observability consistently.
|
||||
116
api/Dockerfile
116
api/Dockerfile
@ -1,33 +1,103 @@
|
||||
FROM python:3.10-slim
|
||||
|
||||
LABEL maintainer="takatost@gmail.com"
|
||||
|
||||
ENV FLASK_APP app.py
|
||||
ENV EDITION SELF_HOSTED
|
||||
ENV DEPLOY_ENV PRODUCTION
|
||||
ENV CONSOLE_API_URL http://127.0.0.1:5001
|
||||
ENV CONSOLE_WEB_URL http://127.0.0.1:3000
|
||||
ENV SERVICE_API_URL http://127.0.0.1:5001
|
||||
ENV APP_API_URL http://127.0.0.1:5001
|
||||
ENV APP_WEB_URL http://127.0.0.1:3000
|
||||
|
||||
EXPOSE 5001
|
||||
# base image
|
||||
FROM python:3.12-slim-bookworm AS base
|
||||
|
||||
WORKDIR /app/api
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y bash curl wget vim gcc g++ python3-dev libc-dev libffi-dev nodejs
|
||||
# Install uv
|
||||
ENV UV_VERSION=0.8.9
|
||||
|
||||
COPY requirements.txt /app/api/requirements.txt
|
||||
RUN pip install --no-cache-dir uv==${UV_VERSION}
|
||||
|
||||
RUN pip install -r requirements.txt
|
||||
|
||||
COPY . /app/api/
|
||||
FROM base AS packages
|
||||
|
||||
# if you located in China, you can use aliyun mirror to speed up
|
||||
# RUN sed -i 's@deb.debian.org@mirrors.aliyun.com@g' /etc/apt/sources.list.d/debian.sources
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
# basic environment
|
||||
g++ \
|
||||
# for building gmpy2
|
||||
libmpfr-dev libmpc-dev
|
||||
|
||||
# Install Python dependencies
|
||||
COPY pyproject.toml uv.lock ./
|
||||
RUN uv sync --locked --no-dev
|
||||
|
||||
# production stage
|
||||
FROM base AS production
|
||||
|
||||
ENV FLASK_APP=app.py
|
||||
ENV EDITION=SELF_HOSTED
|
||||
ENV DEPLOY_ENV=PRODUCTION
|
||||
ENV CONSOLE_API_URL=http://127.0.0.1:5001
|
||||
ENV CONSOLE_WEB_URL=http://127.0.0.1:3000
|
||||
ENV SERVICE_API_URL=http://127.0.0.1:5001
|
||||
ENV APP_WEB_URL=http://127.0.0.1:3000
|
||||
|
||||
EXPOSE 5001
|
||||
|
||||
# set timezone
|
||||
ENV TZ=UTC
|
||||
|
||||
# Set UTF-8 locale
|
||||
ENV LANG=en_US.UTF-8
|
||||
ENV LC_ALL=en_US.UTF-8
|
||||
ENV PYTHONIOENCODING=utf-8
|
||||
|
||||
WORKDIR /app/api
|
||||
|
||||
# Create non-root user
|
||||
ARG dify_uid=1001
|
||||
RUN groupadd -r -g ${dify_uid} dify && \
|
||||
useradd -r -u ${dify_uid} -g ${dify_uid} -s /bin/bash dify && \
|
||||
chown -R dify:dify /app
|
||||
|
||||
RUN \
|
||||
apt-get update \
|
||||
# Install dependencies
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
# basic environment
|
||||
curl nodejs \
|
||||
# for gmpy2 \
|
||||
libgmp-dev libmpfr-dev libmpc-dev \
|
||||
# For Security
|
||||
expat libldap-2.5-0=2.5.13+dfsg-5 perl libsqlite3-0=3.40.1-2+deb12u2 zlib1g=1:1.2.13.dfsg-1 \
|
||||
# install fonts to support the use of tools like pypdfium2
|
||||
fonts-noto-cjk \
|
||||
# install a package to improve the accuracy of guessing mime type and file extension
|
||||
media-types \
|
||||
# install libmagic to support the use of python-magic guess MIMETYPE
|
||||
libmagic1 \
|
||||
&& apt-get autoremove -y \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Copy Python environment and packages
|
||||
ENV VIRTUAL_ENV=/app/api/.venv
|
||||
COPY --from=packages --chown=dify:dify ${VIRTUAL_ENV} ${VIRTUAL_ENV}
|
||||
ENV PATH="${VIRTUAL_ENV}/bin:${PATH}"
|
||||
|
||||
# Download nltk data
|
||||
RUN mkdir -p /usr/local/share/nltk_data && NLTK_DATA=/usr/local/share/nltk_data python -c "import nltk; nltk.download('punkt'); nltk.download('averaged_perceptron_tagger'); nltk.download('stopwords')" \
|
||||
&& chmod -R 755 /usr/local/share/nltk_data
|
||||
|
||||
ENV TIKTOKEN_CACHE_DIR=/app/api/.tiktoken_cache
|
||||
|
||||
RUN python -c "import tiktoken; tiktoken.encoding_for_model('gpt2')" \
|
||||
&& chown -R dify:dify ${TIKTOKEN_CACHE_DIR}
|
||||
|
||||
# Copy source code
|
||||
COPY --chown=dify:dify . /app/api/
|
||||
|
||||
# Prepare entrypoint script
|
||||
COPY --chown=dify:dify --chmod=755 docker/entrypoint.sh /entrypoint.sh
|
||||
|
||||
COPY docker/entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
ARG COMMIT_SHA
|
||||
ENV COMMIT_SHA ${COMMIT_SHA}
|
||||
ENV COMMIT_SHA=${COMMIT_SHA}
|
||||
ENV NLTK_DATA=/usr/local/share/nltk_data
|
||||
|
||||
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
|
||||
USER dify
|
||||
|
||||
ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
|
||||
|
||||
124
api/README.md
124
api/README.md
@ -2,63 +2,115 @@
|
||||
|
||||
## Usage
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> In the v1.3.0 release, `poetry` has been replaced with
|
||||
> [`uv`](https://docs.astral.sh/uv/) as the package manager
|
||||
> for Dify API backend service.
|
||||
|
||||
1. Start the docker-compose stack
|
||||
|
||||
The backend require some middleware, including PostgreSQL, Redis, and Weaviate, which can be started together using `docker-compose`.
|
||||
|
||||
```bash
|
||||
cd ../docker
|
||||
docker-compose -f docker-compose.middleware.yaml -p dify up -d
|
||||
cd ../api
|
||||
```
|
||||
2. Copy `.env.example` to `.env`
|
||||
3. Generate a `SECRET_KEY` in the `.env` file.
|
||||
|
||||
```bash
|
||||
openssl rand -base64 42
|
||||
cd ../docker
|
||||
cp middleware.env.example middleware.env
|
||||
# change the profile to mysql if you are not using postgres,change the profile to other vector database if you are not using weaviate
|
||||
docker compose -f docker-compose.middleware.yaml --profile postgresql --profile weaviate -p dify up -d
|
||||
cd ../api
|
||||
```
|
||||
3.5 If you use annaconda, create a new environment and activate it
|
||||
|
||||
1. Copy `.env.example` to `.env`
|
||||
|
||||
```cli
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> When the frontend and backend run on different subdomains, set COOKIE_DOMAIN to the site’s top-level domain (e.g., `example.com`). The frontend and backend must be under the same top-level domain in order to share authentication cookies.
|
||||
|
||||
1. Generate a `SECRET_KEY` in the `.env` file.
|
||||
|
||||
bash for Linux
|
||||
|
||||
```bash for Linux
|
||||
sed -i "/^SECRET_KEY=/c\SECRET_KEY=$(openssl rand -base64 42)" .env
|
||||
```
|
||||
|
||||
bash for Mac
|
||||
|
||||
```bash for Mac
|
||||
secret_key=$(openssl rand -base64 42)
|
||||
sed -i '' "/^SECRET_KEY=/c\\
|
||||
SECRET_KEY=${secret_key}" .env
|
||||
```
|
||||
|
||||
1. Create environment.
|
||||
|
||||
Dify API service uses [UV](https://docs.astral.sh/uv/) to manage dependencies.
|
||||
First, you need to add the uv package manager, if you don't have it already.
|
||||
|
||||
```bash
|
||||
conda create --name dify python=3.10
|
||||
conda activate dify
|
||||
pip install uv
|
||||
# Or on macOS
|
||||
brew install uv
|
||||
```
|
||||
4. Install dependencies
|
||||
|
||||
1. Install dependencies
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
uv sync --dev
|
||||
```
|
||||
5. Run migrate
|
||||
|
||||
1. Run migrate
|
||||
|
||||
Before the first launch, migrate the database to the latest version.
|
||||
|
||||
```bash
|
||||
flask db upgrade
|
||||
uv run flask db upgrade
|
||||
```
|
||||
|
||||
⚠️ If you encounter problems with jieba, for example
|
||||
1. Start backend
|
||||
|
||||
```
|
||||
> flask db upgrade
|
||||
Error: While importing 'app', an ImportError was raised:
|
||||
```
|
||||
|
||||
Please run the following command instead.
|
||||
|
||||
```
|
||||
pip install -r requirements.txt --upgrade --force-reinstall
|
||||
```
|
||||
|
||||
6. Start backend:
|
||||
```bash
|
||||
flask run --host 0.0.0.0 --port=5001 --debug
|
||||
uv run flask run --host 0.0.0.0 --port=5001 --debug
|
||||
```
|
||||
7. Setup your application by visiting http://localhost:5001/console/api/setup or other apis...
|
||||
8. If you need to debug local async processing, you can run `celery -A app.celery worker -Q dataset,generation,mail`, celery can do dataset importing and other async tasks.
|
||||
|
||||
8. Start frontend
|
||||
1. Start Dify [web](../web) service.
|
||||
|
||||
You can start the frontend by running `npm install && npm run dev` in web/ folder, or you can use docker to start the frontend, for example:
|
||||
1. Setup your application by visiting `http://localhost:3000`.
|
||||
|
||||
1. If you need to handle and debug the async tasks (e.g. dataset importing and documents indexing), please start the worker service.
|
||||
|
||||
```bash
|
||||
uv run celery -A app.celery worker -P threads -c 2 --loglevel INFO -Q dataset,priority_dataset,priority_pipeline,pipeline,mail,ops_trace,app_deletion,plugin,workflow_storage,conversation,workflow,schedule_poller,schedule_executor,triggered_workflow_dispatcher,trigger_refresh_executor
|
||||
```
|
||||
|
||||
Additionally, if you want to debug the celery scheduled tasks, you can run the following command in another terminal to start the beat service:
|
||||
|
||||
```bash
|
||||
uv run celery -A app.celery beat
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
1. Install dependencies for both the backend and the test environment
|
||||
|
||||
```bash
|
||||
uv sync --dev
|
||||
```
|
||||
docker run -it -d --platform linux/amd64 -p 3000:3000 -e EDITION=SELF_HOSTED -e CONSOLE_URL=http://127.0.0.1:5001 --name web-self-hosted langgenius/dify-web:latest
|
||||
|
||||
1. Run the tests locally with mocked system environment variables in `tool.pytest_env` section in `pyproject.toml`, more can check [Claude.md](../CLAUDE.md)
|
||||
|
||||
```bash
|
||||
uv run pytest # Run all tests
|
||||
uv run pytest tests/unit_tests/ # Unit tests only
|
||||
uv run pytest tests/integration_tests/ # Integration tests
|
||||
|
||||
# Code quality
|
||||
../dev/reformat # Run all formatters and linters
|
||||
uv run ruff check --fix ./ # Fix linting issues
|
||||
uv run ruff format ./ # Format code
|
||||
uv run basedpyright . # Type checking
|
||||
```
|
||||
This will start a dify frontend, now you are all set, happy coding!
|
||||
115
api/agent_skills/coding_style.md
Normal file
115
api/agent_skills/coding_style.md
Normal file
@ -0,0 +1,115 @@
|
||||
## Linter
|
||||
|
||||
- Always follow `.ruff.toml`.
|
||||
- Run `uv run ruff check --fix --unsafe-fixes`.
|
||||
- Keep each line under 100 characters (including spaces).
|
||||
|
||||
## Code Style
|
||||
|
||||
- `snake_case` for variables and functions.
|
||||
- `PascalCase` for classes.
|
||||
- `UPPER_CASE` for constants.
|
||||
|
||||
## Rules
|
||||
|
||||
- Use Pydantic v2 standard.
|
||||
- Use `uv` for package management.
|
||||
- Do not override dunder methods like `__init__`, `__iadd__`, etc.
|
||||
- Never launch services (`uv run app.py`, `flask run`, etc.); running tests under `tests/` is allowed.
|
||||
- Prefer simple functions over classes for lightweight helpers.
|
||||
- Keep files below 800 lines; split when necessary.
|
||||
- Keep code readable—no clever hacks.
|
||||
- Never use `print`; log with `logger = logging.getLogger(__name__)`.
|
||||
|
||||
## Guiding Principles
|
||||
|
||||
- Mirror the project’s layered architecture: controller → service → core/domain.
|
||||
- Reuse existing helpers in `core/`, `services/`, and `libs/` before creating new abstractions.
|
||||
- Optimise for observability: deterministic control flow, clear logging, actionable errors.
|
||||
|
||||
## SQLAlchemy Patterns
|
||||
|
||||
- Models inherit from `models.base.Base`; never create ad-hoc metadata or engines.
|
||||
|
||||
- Open sessions with context managers:
|
||||
|
||||
```python
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
with Session(db.engine, expire_on_commit=False) as session:
|
||||
stmt = select(Workflow).where(
|
||||
Workflow.id == workflow_id,
|
||||
Workflow.tenant_id == tenant_id,
|
||||
)
|
||||
workflow = session.execute(stmt).scalar_one_or_none()
|
||||
```
|
||||
|
||||
- Use SQLAlchemy expressions; avoid raw SQL unless necessary.
|
||||
|
||||
- Introduce repository abstractions only for very large tables (e.g., workflow executions) to support alternative storage strategies.
|
||||
|
||||
- Always scope queries by `tenant_id` and protect write paths with safeguards (`FOR UPDATE`, row counts, etc.).
|
||||
|
||||
## Storage & External IO
|
||||
|
||||
- Access storage via `extensions.ext_storage.storage`.
|
||||
- Use `core.helper.ssrf_proxy` for outbound HTTP fetches.
|
||||
- Background tasks that touch storage must be idempotent and log the relevant object identifiers.
|
||||
|
||||
## Pydantic Usage
|
||||
|
||||
- Define DTOs with Pydantic v2 models and forbid extras by default.
|
||||
|
||||
- Use `@field_validator` / `@model_validator` for domain rules.
|
||||
|
||||
- Example:
|
||||
|
||||
```python
|
||||
from pydantic import BaseModel, ConfigDict, HttpUrl, field_validator
|
||||
|
||||
class TriggerConfig(BaseModel):
|
||||
endpoint: HttpUrl
|
||||
secret: str
|
||||
|
||||
model_config = ConfigDict(extra="forbid")
|
||||
|
||||
@field_validator("secret")
|
||||
def ensure_secret_prefix(cls, value: str) -> str:
|
||||
if not value.startswith("dify_"):
|
||||
raise ValueError("secret must start with dify_")
|
||||
return value
|
||||
```
|
||||
|
||||
## Generics & Protocols
|
||||
|
||||
- Use `typing.Protocol` to define behavioural contracts (e.g., cache interfaces).
|
||||
- Apply generics (`TypeVar`, `Generic`) for reusable utilities like caches or providers.
|
||||
- Validate dynamic inputs at runtime when generics cannot enforce safety alone.
|
||||
|
||||
## Error Handling & Logging
|
||||
|
||||
- Raise domain-specific exceptions (`services/errors`, `core/errors`) and translate to HTTP responses in controllers.
|
||||
- Declare `logger = logging.getLogger(__name__)` at module top.
|
||||
- Include tenant/app/workflow identifiers in log context.
|
||||
- Log retryable events at `warning`, terminal failures at `error`.
|
||||
|
||||
## Tooling & Checks
|
||||
|
||||
- Format/lint: `uv run --project api --dev ruff format ./api` and `uv run --project api --dev ruff check --fix --unsafe-fixes ./api`.
|
||||
- Type checks: `uv run --directory api --dev basedpyright`.
|
||||
- Tests: `uv run --project api --dev dev/pytest/pytest_unit_tests.sh`.
|
||||
- Run all of the above before submitting your work.
|
||||
|
||||
## Controllers & Services
|
||||
|
||||
- Controllers: parse input via Pydantic, invoke services, return serialised responses; no business logic.
|
||||
- Services: coordinate repositories, providers, background tasks; keep side effects explicit.
|
||||
- Avoid repositories unless necessary; direct SQLAlchemy usage is preferred for typical tables.
|
||||
- Document non-obvious behaviour with concise comments.
|
||||
|
||||
## Miscellaneous
|
||||
|
||||
- Use `configs.dify_config` for configuration—never read environment variables directly.
|
||||
- Maintain tenant awareness end-to-end; `tenant_id` must flow through every layer touching shared resources.
|
||||
- Queue async work through `services/async_workflow_service`; implement tasks under `tasks/` with explicit queue selection.
|
||||
- Keep experimental scripts under `dev/`; do not ship them in production builds.
|
||||
96
api/agent_skills/infra.md
Normal file
96
api/agent_skills/infra.md
Normal file
@ -0,0 +1,96 @@
|
||||
## Configuration
|
||||
|
||||
- Import `configs.dify_config` for every runtime toggle. Do not read environment variables directly.
|
||||
- Add new settings to the proper mixin inside `configs/` (deployment, feature, middleware, etc.) so they load through `DifyConfig`.
|
||||
- Remote overrides come from the optional providers in `configs/remote_settings_sources`; keep defaults in code safe when the value is missing.
|
||||
- Example: logging pulls targets from `extensions/ext_logging.py`, and model provider URLs are assembled in `services/entities/model_provider_entities.py`.
|
||||
|
||||
## Dependencies
|
||||
|
||||
- Runtime dependencies live in `[project].dependencies` inside `pyproject.toml`. Optional clients go into the `storage`, `tools`, or `vdb` groups under `[dependency-groups]`.
|
||||
- Always pin versions and keep the list alphabetised. Shared tooling (lint, typing, pytest) belongs in the `dev` group.
|
||||
- When code needs a new package, explain why in the PR and run `uv lock` so the lockfile stays current.
|
||||
|
||||
## Storage & Files
|
||||
|
||||
- Use `extensions.ext_storage.storage` for all blob IO; it already respects the configured backend.
|
||||
- Convert files for workflows with helpers in `core/file/file_manager.py`; they handle signed URLs and multimodal payloads.
|
||||
- When writing controller logic, delegate upload quotas and metadata to `services/file_service.py` instead of touching storage directly.
|
||||
- All outbound HTTP fetches (webhooks, remote files) must go through the SSRF-safe client in `core/helper/ssrf_proxy.py`; it wraps `httpx` with the allow/deny rules configured for the platform.
|
||||
|
||||
## Redis & Shared State
|
||||
|
||||
- Access Redis through `extensions.ext_redis.redis_client`. For locking, reuse `redis_client.lock`.
|
||||
- Prefer higher-level helpers when available: rate limits use `libs.helper.RateLimiter`, provider metadata uses caches in `core/helper/provider_cache.py`.
|
||||
|
||||
## Models
|
||||
|
||||
- SQLAlchemy models sit in `models/` and inherit from the shared declarative `Base` defined in `models/base.py` (metadata configured via `models/engine.py`).
|
||||
- `models/__init__.py` exposes grouped aggregates: account/tenant models, app and conversation tables, datasets, providers, workflow runs, triggers, etc. Import from there to avoid deep path churn.
|
||||
- Follow the DDD boundary: persistence objects live in `models/`, repositories under `repositories/` translate them into domain entities, and services consume those repositories.
|
||||
- When adding a table, create the model class, register it in `models/__init__.py`, wire a repository if needed, and generate an Alembic migration as described below.
|
||||
|
||||
## Vector Stores
|
||||
|
||||
- Vector client implementations live in `core/rag/datasource/vdb/<provider>`, with a common factory in `core/rag/datasource/vdb/vector_factory.py` and enums in `core/rag/datasource/vdb/vector_type.py`.
|
||||
- Retrieval pipelines call these providers through `core/rag/datasource/retrieval_service.py` and dataset ingestion flows in `services/dataset_service.py`.
|
||||
- The CLI helper `flask vdb-migrate` orchestrates bulk migrations using routines in `commands.py`; reuse that pattern when adding new backend transitions.
|
||||
- To add another store, mirror the provider layout, register it with the factory, and include any schema changes in Alembic migrations.
|
||||
|
||||
## Observability & OTEL
|
||||
|
||||
- OpenTelemetry settings live under the observability mixin in `configs/observability`. Toggle exporters and sampling via `dify_config`, not ad-hoc env reads.
|
||||
- HTTP, Celery, Redis, SQLAlchemy, and httpx instrumentation is initialised in `extensions/ext_app_metrics.py` and `extensions/ext_request_logging.py`; reuse these hooks when adding new workers or entrypoints.
|
||||
- When creating background tasks or external calls, propagate tracing context with helpers in the existing instrumented clients (e.g. use the shared `httpx` session from `core/helper/http_client_pooling.py`).
|
||||
- If you add a new external integration, ensure spans and metrics are emitted by wiring the appropriate OTEL instrumentation package in `pyproject.toml` and configuring it in `extensions/`.
|
||||
|
||||
## Ops Integrations
|
||||
|
||||
- Langfuse support and other tracing bridges live under `core/ops/opik_trace`. Config toggles sit in `configs/observability`, while exporters are initialised in the OTEL extensions mentioned above.
|
||||
- External monitoring services should follow this pattern: keep client code in `core/ops`, expose switches via `dify_config`, and hook initialisation in `extensions/ext_app_metrics.py` or sibling modules.
|
||||
- Before instrumenting new code paths, check whether existing context helpers (e.g. `extensions/ext_request_logging.py`) already capture the necessary metadata.
|
||||
|
||||
## Controllers, Services, Core
|
||||
|
||||
- Controllers only parse HTTP input and call a service method. Keep business rules in `services/`.
|
||||
- Services enforce tenant rules, quotas, and orchestration, then call into `core/` engines (workflow execution, tools, LLMs).
|
||||
- When adding a new endpoint, search for an existing service to extend before introducing a new layer. Example: workflow APIs pipe through `services/workflow_service.py` into `core/workflow`.
|
||||
|
||||
## Plugins, Tools, Providers
|
||||
|
||||
- In Dify a plugin is a tenant-installable bundle that declares one or more providers (tool, model, datasource, trigger, endpoint, agent strategy) plus its resource needs and version metadata. The manifest (`core/plugin/entities/plugin.py`) mirrors what you see in the marketplace documentation.
|
||||
- Installation, upgrades, and migrations are orchestrated by `services/plugin/plugin_service.py` together with helpers such as `services/plugin/plugin_migration.py`.
|
||||
- Runtime loading happens through the implementations under `core/plugin/impl/*` (tool/model/datasource/trigger/endpoint/agent). These modules normalise plugin providers so that downstream systems (`core/tools/tool_manager.py`, `services/model_provider_service.py`, `services/trigger/*`) can treat builtin and plugin capabilities the same way.
|
||||
- For remote execution, plugin daemons (`core/plugin/entities/plugin_daemon.py`, `core/plugin/impl/plugin.py`) manage lifecycle hooks, credential forwarding, and background workers that keep plugin processes in sync with the main application.
|
||||
- Acquire tool implementations through `core/tools/tool_manager.py`; it resolves builtin, plugin, and workflow-as-tool providers uniformly, injecting the right context (tenant, credentials, runtime config).
|
||||
- To add a new plugin capability, extend the relevant `core/plugin/entities` schema and register the implementation in the matching `core/plugin/impl` module rather than importing the provider directly.
|
||||
|
||||
## Async Workloads
|
||||
|
||||
see `agent_skills/trigger.md` for more detailed documentation.
|
||||
|
||||
- Enqueue background work through `services/async_workflow_service.py`. It routes jobs to the tiered Celery queues defined in `tasks/`.
|
||||
- Workers boot from `celery_entrypoint.py` and execute functions in `tasks/workflow_execution_tasks.py`, `tasks/trigger_processing_tasks.py`, etc.
|
||||
- Scheduled workflows poll from `schedule/workflow_schedule_tasks.py`. Follow the same pattern if you need new periodic jobs.
|
||||
|
||||
## Database & Migrations
|
||||
|
||||
- SQLAlchemy models live under `models/` and map directly to migration files in `migrations/versions`.
|
||||
- Generate migrations with `uv run --project api flask db revision --autogenerate -m "<summary>"`, then review the diff; never hand-edit the database outside Alembic.
|
||||
- Apply migrations locally using `uv run --project api flask db upgrade`; production deploys expect the same history.
|
||||
- If you add tenant-scoped data, confirm the upgrade includes tenant filters or defaults consistent with the service logic touching those tables.
|
||||
|
||||
## CLI Commands
|
||||
|
||||
- Maintenance commands from `commands.py` are registered on the Flask CLI. Run them via `uv run --project api flask <command>`.
|
||||
- Use the built-in `db` commands from Flask-Migrate for schema operations (`flask db upgrade`, `flask db stamp`, etc.). Only fall back to custom helpers if you need their extra behaviour.
|
||||
- Custom entries such as `flask reset-password`, `flask reset-email`, and `flask vdb-migrate` handle self-hosted account recovery and vector database migrations.
|
||||
- Before adding a new command, check whether an existing service can be reused and ensure the command guards edition-specific behaviour (many enforce `SELF_HOSTED`). Document any additions in the PR.
|
||||
- Ruff helpers are run directly with `uv`: `uv run --project api --dev ruff format ./api` for formatting and `uv run --project api --dev ruff check ./api` (add `--fix` if you want automatic fixes).
|
||||
|
||||
## When You Add Features
|
||||
|
||||
- Check for an existing helper or service before writing a new util.
|
||||
- Uphold tenancy: every service method should receive the tenant ID from controller wrappers such as `controllers/console/wraps.py`.
|
||||
- Update or create tests alongside behaviour changes (`tests/unit_tests` for fast coverage, `tests/integration_tests` when touching orchestrations).
|
||||
- Run `uv run --project api --dev ruff check ./api`, `uv run --directory api --dev basedpyright`, and `uv run --project api --dev dev/pytest/pytest_unit_tests.sh` before submitting changes.
|
||||
1
api/agent_skills/plugin.md
Normal file
1
api/agent_skills/plugin.md
Normal file
@ -0,0 +1 @@
|
||||
// TBD
|
||||
1
api/agent_skills/plugin_oauth.md
Normal file
1
api/agent_skills/plugin_oauth.md
Normal file
@ -0,0 +1 @@
|
||||
// TBD
|
||||
53
api/agent_skills/trigger.md
Normal file
53
api/agent_skills/trigger.md
Normal file
@ -0,0 +1,53 @@
|
||||
## Overview
|
||||
|
||||
Trigger is a collection of nodes that we called `Start` nodes, also, the concept of `Start` is the same as `RootNode` in the workflow engine `core/workflow/graph_engine`, On the other hand, `Start` node is the entry point of workflows, every workflow run always starts from a `Start` node.
|
||||
|
||||
## Trigger nodes
|
||||
|
||||
- `UserInput`
|
||||
- `Trigger Webhook`
|
||||
- `Trigger Schedule`
|
||||
- `Trigger Plugin`
|
||||
|
||||
### UserInput
|
||||
|
||||
Before `Trigger` concept is introduced, it's what we called `Start` node, but now, to avoid confusion, it was renamed to `UserInput` node, has a strong relation with `ServiceAPI` in `controllers/service_api/app`
|
||||
|
||||
1. `UserInput` node introduces a list of arguments that need to be provided by the user, finally it will be converted into variables in the workflow variable pool.
|
||||
1. `ServiceAPI` accept those arguments, and pass through them into `UserInput` node.
|
||||
1. For its detailed implementation, please refer to `core/workflow/nodes/start`
|
||||
|
||||
### Trigger Webhook
|
||||
|
||||
Inside Webhook Node, Dify provided a UI panel that allows user define a HTTP manifest `core/workflow/nodes/trigger_webhook/entities.py`.`WebhookData`, also, Dify generates a random webhook id for each `Trigger Webhook` node, the implementation was implemented in `core/trigger/utils/endpoint.py`, as you can see, `webhook-debug` is a debug mode for webhook, you may find it in `controllers/trigger/webhook.py`.
|
||||
|
||||
Finally, requests to `webhook` endpoint will be converted into variables in workflow variable pool during workflow execution.
|
||||
|
||||
### Trigger Schedule
|
||||
|
||||
`Trigger Schedule` node is a node that allows user define a schedule to trigger the workflow, detailed manifest is here `core/workflow/nodes/trigger_schedule/entities.py`, we have a poller and executor to handle millions of schedules, see `docker/entrypoint.sh` / `schedule/workflow_schedule_task.py` for help.
|
||||
|
||||
To Achieve this, a `WorkflowSchedulePlan` model was introduced in `models/trigger.py`, and a `events/event_handlers/sync_workflow_schedule_when_app_published.py` was used to sync workflow schedule plans when app is published.
|
||||
|
||||
### Trigger Plugin
|
||||
|
||||
`Trigger Plugin` node allows user define there own distributed trigger plugin, whenever a request was received, Dify forwards it to the plugin and wait for parsed variables from it.
|
||||
|
||||
1. Requests were saved in storage by `services/trigger/trigger_request_service.py`, referenced by `services/trigger/trigger_service.py`.`TriggerService`.`process_endpoint`
|
||||
1. Plugins accept those requests and parse variables from it, see `core/plugin/impl/trigger.py` for details.
|
||||
|
||||
A `subscription` concept was out here by Dify, it means an endpoint address from Dify was bound to thirdparty webhook service like `Github` `Slack` `Linear` `GoogleDrive` `Gmail` etc. Once a subscription was created, Dify continually receives requests from the platforms and handle them one by one.
|
||||
|
||||
## Worker Pool / Async Task
|
||||
|
||||
All the events that triggered a new workflow run is always in async mode, a unified entrypoint can be found here `services/async_workflow_service.py`.`AsyncWorkflowService`.`trigger_workflow_async`.
|
||||
|
||||
The infrastructure we used is `celery`, we've already configured it in `docker/entrypoint.sh`, and the consumers are in `tasks/async_workflow_tasks.py`, 3 queues were used to handle different tiers of users, `PROFESSIONAL_QUEUE` `TEAM_QUEUE` `SANDBOX_QUEUE`.
|
||||
|
||||
## Debug Strategy
|
||||
|
||||
Dify divided users into 2 groups: builders / end users.
|
||||
|
||||
Builders are the users who create workflows, in this stage, debugging a workflow becomes a critical part of the workflow development process, as the start node in workflows, trigger nodes can `listen` to the events from `WebhookDebug` `Schedule` `Plugin`, debugging process was created in `controllers/console/app/workflow.py`.`DraftWorkflowTriggerNodeApi`.
|
||||
|
||||
A polling process can be considered as combine of few single `poll` operations, each `poll` operation fetches events cached in `Redis`, returns `None` if no event was found, more detailed implemented: `core/trigger/debug/event_bus.py` was used to handle the polling process, and `core/trigger/debug/event_selectors.py` was used to select the event poller based on the trigger type.
|
||||
276
api/app.py
276
api/app.py
@ -1,265 +1,29 @@
|
||||
# -*- coding:utf-8 -*-
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
from werkzeug.exceptions import Forbidden
|
||||
|
||||
if not os.environ.get("DEBUG") or os.environ.get("DEBUG").lower() != 'true':
|
||||
from gevent import monkey
|
||||
monkey.patch_all()
|
||||
|
||||
import logging
|
||||
import json
|
||||
import threading
|
||||
|
||||
from flask import Flask, request, Response, session
|
||||
import flask_login
|
||||
from flask_cors import CORS
|
||||
|
||||
from core.model_providers.providers import hosted
|
||||
from extensions import ext_session, ext_celery, ext_sentry, ext_redis, ext_login, ext_migrate, \
|
||||
ext_database, ext_storage, ext_mail, ext_stripe
|
||||
from extensions.ext_database import db
|
||||
from extensions.ext_login import login_manager
|
||||
|
||||
# DO NOT REMOVE BELOW
|
||||
from models import model, account, dataset, web, task, source, tool
|
||||
from events import event_handlers
|
||||
# DO NOT REMOVE ABOVE
|
||||
|
||||
import core
|
||||
from config import Config, CloudEditionConfig
|
||||
from commands import register_commands
|
||||
from models.account import TenantAccountJoin, AccountStatus
|
||||
from models.model import Account, EndUser, App
|
||||
from services.account_service import TenantService
|
||||
|
||||
import warnings
|
||||
warnings.simplefilter("ignore", ResourceWarning)
|
||||
import sys
|
||||
|
||||
|
||||
class DifyApp(Flask):
|
||||
pass
|
||||
|
||||
# -------------
|
||||
# Configuration
|
||||
# -------------
|
||||
|
||||
|
||||
config_type = os.getenv('EDITION', default='SELF_HOSTED') # ce edition first
|
||||
|
||||
# ----------------------------
|
||||
# Application Factory Function
|
||||
# ----------------------------
|
||||
|
||||
|
||||
def create_app(test_config=None) -> Flask:
|
||||
app = DifyApp(__name__)
|
||||
|
||||
if test_config:
|
||||
app.config.from_object(test_config)
|
||||
else:
|
||||
if config_type == "CLOUD":
|
||||
app.config.from_object(CloudEditionConfig())
|
||||
else:
|
||||
app.config.from_object(Config())
|
||||
|
||||
app.secret_key = app.config['SECRET_KEY']
|
||||
|
||||
logging.basicConfig(level=app.config.get('LOG_LEVEL', 'INFO'))
|
||||
|
||||
initialize_extensions(app)
|
||||
register_blueprints(app)
|
||||
register_commands(app)
|
||||
|
||||
hosted.init_app(app)
|
||||
|
||||
return app
|
||||
|
||||
|
||||
def initialize_extensions(app):
|
||||
# Since the application instance is now created, pass it to each Flask
|
||||
# extension instance to bind it to the Flask application instance (app)
|
||||
ext_database.init_app(app)
|
||||
ext_migrate.init(app, db)
|
||||
ext_redis.init_app(app)
|
||||
ext_storage.init_app(app)
|
||||
ext_celery.init_app(app)
|
||||
ext_session.init_app(app)
|
||||
ext_login.init_app(app)
|
||||
ext_mail.init_app(app)
|
||||
ext_sentry.init_app(app)
|
||||
ext_stripe.init_app(app)
|
||||
|
||||
|
||||
def _create_tenant_for_account(account):
|
||||
tenant = TenantService.create_tenant(f"{account.name}'s Workspace")
|
||||
|
||||
TenantService.create_tenant_member(tenant, account, role='owner')
|
||||
account.current_tenant = tenant
|
||||
|
||||
return tenant
|
||||
|
||||
|
||||
# Flask-Login configuration
|
||||
@login_manager.user_loader
|
||||
def load_user(user_id):
|
||||
"""Load user based on the user_id."""
|
||||
if request.blueprint == 'console':
|
||||
# Check if the user_id contains a dot, indicating the old format
|
||||
if '.' in user_id:
|
||||
tenant_id, account_id = user_id.split('.')
|
||||
else:
|
||||
account_id = user_id
|
||||
|
||||
account = db.session.query(Account).filter(Account.id == account_id).first()
|
||||
|
||||
if account:
|
||||
if account.status == AccountStatus.BANNED.value or account.status == AccountStatus.CLOSED.value:
|
||||
raise Forbidden('Account is banned or closed.')
|
||||
|
||||
workspace_id = session.get('workspace_id')
|
||||
if workspace_id:
|
||||
tenant_account_join = db.session.query(TenantAccountJoin).filter(
|
||||
TenantAccountJoin.account_id == account.id,
|
||||
TenantAccountJoin.tenant_id == workspace_id
|
||||
).first()
|
||||
|
||||
if not tenant_account_join:
|
||||
tenant_account_join = db.session.query(TenantAccountJoin).filter(
|
||||
TenantAccountJoin.account_id == account.id).first()
|
||||
|
||||
if tenant_account_join:
|
||||
account.current_tenant_id = tenant_account_join.tenant_id
|
||||
else:
|
||||
_create_tenant_for_account(account)
|
||||
session['workspace_id'] = account.current_tenant_id
|
||||
else:
|
||||
account.current_tenant_id = workspace_id
|
||||
else:
|
||||
tenant_account_join = db.session.query(TenantAccountJoin).filter(
|
||||
TenantAccountJoin.account_id == account.id).first()
|
||||
if tenant_account_join:
|
||||
account.current_tenant_id = tenant_account_join.tenant_id
|
||||
else:
|
||||
_create_tenant_for_account(account)
|
||||
session['workspace_id'] = account.current_tenant_id
|
||||
|
||||
account.last_active_at = datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
||||
# Log in the user with the updated user_id
|
||||
flask_login.login_user(account, remember=True)
|
||||
|
||||
return account
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
@login_manager.unauthorized_handler
|
||||
def unauthorized_handler():
|
||||
"""Handle unauthorized requests."""
|
||||
return Response(json.dumps({
|
||||
'code': 'unauthorized',
|
||||
'message': "Unauthorized."
|
||||
}), status=401, content_type="application/json")
|
||||
|
||||
|
||||
# register blueprint routers
|
||||
def register_blueprints(app):
|
||||
from controllers.service_api import bp as service_api_bp
|
||||
from controllers.web import bp as web_bp
|
||||
from controllers.console import bp as console_app_bp
|
||||
|
||||
CORS(service_api_bp,
|
||||
allow_headers=['Content-Type', 'Authorization', 'X-App-Code'],
|
||||
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH']
|
||||
)
|
||||
app.register_blueprint(service_api_bp)
|
||||
|
||||
CORS(web_bp,
|
||||
resources={
|
||||
r"/*": {"origins": app.config['WEB_API_CORS_ALLOW_ORIGINS']}},
|
||||
supports_credentials=True,
|
||||
allow_headers=['Content-Type', 'Authorization', 'X-App-Code'],
|
||||
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH'],
|
||||
expose_headers=['X-Version', 'X-Env']
|
||||
)
|
||||
|
||||
app.register_blueprint(web_bp)
|
||||
|
||||
CORS(console_app_bp,
|
||||
resources={
|
||||
r"/*": {"origins": app.config['CONSOLE_CORS_ALLOW_ORIGINS']}},
|
||||
supports_credentials=True,
|
||||
allow_headers=['Content-Type', 'Authorization'],
|
||||
methods=['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS', 'PATCH'],
|
||||
expose_headers=['X-Version', 'X-Env']
|
||||
)
|
||||
|
||||
app.register_blueprint(console_app_bp)
|
||||
def is_db_command() -> bool:
|
||||
if len(sys.argv) > 1 and sys.argv[0].endswith("flask") and sys.argv[1] == "db":
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
# create app
|
||||
app = create_app()
|
||||
celery = app.extensions["celery"]
|
||||
if is_db_command():
|
||||
from app_factory import create_migrations_app
|
||||
|
||||
app = create_migrations_app()
|
||||
else:
|
||||
# Gunicorn and Celery handle monkey patching automatically in production by
|
||||
# specifying the `gevent` worker class. Manual monkey patching is not required here.
|
||||
#
|
||||
# See `api/docker/entrypoint.sh` (lines 33 and 47) for details.
|
||||
#
|
||||
# For third-party library patching, refer to `gunicorn.conf.py` and `celery_entrypoint.py`.
|
||||
|
||||
if app.config['TESTING']:
|
||||
print("App is running in TESTING mode")
|
||||
from app_factory import create_app
|
||||
|
||||
app = create_app()
|
||||
celery = app.extensions["celery"]
|
||||
|
||||
@app.after_request
|
||||
def after_request(response):
|
||||
"""Add Version headers to the response."""
|
||||
response.headers.add('X-Version', app.config['CURRENT_VERSION'])
|
||||
response.headers.add('X-Env', app.config['DEPLOY_ENV'])
|
||||
return response
|
||||
|
||||
|
||||
@app.route('/health')
|
||||
def health():
|
||||
return Response(json.dumps({
|
||||
'status': 'ok',
|
||||
'version': app.config['CURRENT_VERSION']
|
||||
}), status=200, content_type="application/json")
|
||||
|
||||
|
||||
@app.route('/threads')
|
||||
def threads():
|
||||
num_threads = threading.active_count()
|
||||
threads = threading.enumerate()
|
||||
|
||||
thread_list = []
|
||||
for thread in threads:
|
||||
thread_name = thread.name
|
||||
thread_id = thread.ident
|
||||
is_alive = thread.is_alive()
|
||||
|
||||
thread_list.append({
|
||||
'name': thread_name,
|
||||
'id': thread_id,
|
||||
'is_alive': is_alive
|
||||
})
|
||||
|
||||
return {
|
||||
'thread_num': num_threads,
|
||||
'threads': thread_list
|
||||
}
|
||||
|
||||
|
||||
@app.route('/db-pool-stat')
|
||||
def pool_stat():
|
||||
engine = db.engine
|
||||
return {
|
||||
'pool_size': engine.pool.size(),
|
||||
'checked_in_connections': engine.pool.checkedin(),
|
||||
'checked_out_connections': engine.pool.checkedout(),
|
||||
'overflow_connections': engine.pool.overflow(),
|
||||
'connection_timeout': engine.pool.timeout(),
|
||||
'recycle_time': db.engine.pool._recycle
|
||||
}
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='0.0.0.0', port=5001)
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=5001)
|
||||
|
||||
120
api/app_factory.py
Normal file
120
api/app_factory.py
Normal file
@ -0,0 +1,120 @@
|
||||
import logging
|
||||
import time
|
||||
|
||||
from configs import dify_config
|
||||
from contexts.wrapper import RecyclableContextVar
|
||||
from dify_app import DifyApp
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# ----------------------------
|
||||
# Application Factory Function
|
||||
# ----------------------------
|
||||
def create_flask_app_with_configs() -> DifyApp:
|
||||
"""
|
||||
create a raw flask app
|
||||
with configs loaded from .env file
|
||||
"""
|
||||
dify_app = DifyApp(__name__)
|
||||
dify_app.config.from_mapping(dify_config.model_dump())
|
||||
dify_app.config["RESTX_INCLUDE_ALL_MODELS"] = True
|
||||
|
||||
# add before request hook
|
||||
@dify_app.before_request
|
||||
def before_request():
|
||||
# add an unique identifier to each request
|
||||
RecyclableContextVar.increment_thread_recycles()
|
||||
|
||||
# Capture the decorator's return value to avoid pyright reportUnusedFunction
|
||||
_ = before_request
|
||||
|
||||
return dify_app
|
||||
|
||||
|
||||
def create_app() -> DifyApp:
|
||||
start_time = time.perf_counter()
|
||||
app = create_flask_app_with_configs()
|
||||
initialize_extensions(app)
|
||||
end_time = time.perf_counter()
|
||||
if dify_config.DEBUG:
|
||||
logger.info("Finished create_app (%s ms)", round((end_time - start_time) * 1000, 2))
|
||||
return app
|
||||
|
||||
|
||||
def initialize_extensions(app: DifyApp):
|
||||
from extensions import (
|
||||
ext_app_metrics,
|
||||
ext_blueprints,
|
||||
ext_celery,
|
||||
ext_code_based_extension,
|
||||
ext_commands,
|
||||
ext_compress,
|
||||
ext_database,
|
||||
ext_hosting_provider,
|
||||
ext_import_modules,
|
||||
ext_logging,
|
||||
ext_login,
|
||||
ext_mail,
|
||||
ext_migrate,
|
||||
ext_orjson,
|
||||
ext_otel,
|
||||
ext_proxy_fix,
|
||||
ext_redis,
|
||||
ext_request_logging,
|
||||
ext_sentry,
|
||||
ext_set_secretkey,
|
||||
ext_storage,
|
||||
ext_timezone,
|
||||
ext_warnings,
|
||||
)
|
||||
|
||||
extensions = [
|
||||
ext_timezone,
|
||||
ext_logging,
|
||||
ext_warnings,
|
||||
ext_import_modules,
|
||||
ext_orjson,
|
||||
ext_set_secretkey,
|
||||
ext_compress,
|
||||
ext_code_based_extension,
|
||||
ext_database,
|
||||
ext_app_metrics,
|
||||
ext_migrate,
|
||||
ext_redis,
|
||||
ext_storage,
|
||||
ext_celery,
|
||||
ext_login,
|
||||
ext_mail,
|
||||
ext_hosting_provider,
|
||||
ext_sentry,
|
||||
ext_proxy_fix,
|
||||
ext_blueprints,
|
||||
ext_commands,
|
||||
ext_otel,
|
||||
ext_request_logging,
|
||||
]
|
||||
for ext in extensions:
|
||||
short_name = ext.__name__.split(".")[-1]
|
||||
is_enabled = ext.is_enabled() if hasattr(ext, "is_enabled") else True
|
||||
if not is_enabled:
|
||||
if dify_config.DEBUG:
|
||||
logger.info("Skipped %s", short_name)
|
||||
continue
|
||||
|
||||
start_time = time.perf_counter()
|
||||
ext.init_app(app)
|
||||
end_time = time.perf_counter()
|
||||
if dify_config.DEBUG:
|
||||
logger.info("Loaded %s (%s ms)", short_name, round((end_time - start_time) * 1000, 2))
|
||||
|
||||
|
||||
def create_migrations_app():
|
||||
app = create_flask_app_with_configs()
|
||||
from extensions import ext_database, ext_migrate
|
||||
|
||||
# Initialize only required extensions
|
||||
ext_database.init_app(app)
|
||||
ext_migrate.init_app(app)
|
||||
|
||||
return app
|
||||
13
api/celery_entrypoint.py
Normal file
13
api/celery_entrypoint.py
Normal file
@ -0,0 +1,13 @@
|
||||
import psycogreen.gevent as pscycogreen_gevent # type: ignore
|
||||
from grpc.experimental import gevent as grpc_gevent # type: ignore
|
||||
|
||||
# grpc gevent
|
||||
grpc_gevent.init_gevent()
|
||||
print("gRPC patched with gevent.", flush=True) # noqa: T201
|
||||
pscycogreen_gevent.patch_psycopg()
|
||||
print("psycopg2 patched with gevent.", flush=True) # noqa: T201
|
||||
|
||||
|
||||
from app import app, celery
|
||||
|
||||
__all__ = ["app", "celery"]
|
||||
7
api/cnt_base.sh
Executable file
7
api/cnt_base.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
set -euxo pipefail
|
||||
|
||||
for pattern in "Base" "TypeBase"; do
|
||||
printf "%s " "$pattern"
|
||||
grep "($pattern):" -r --include='*.py' --exclude-dir=".venv" --exclude-dir="tests" . | wc -l
|
||||
done
|
||||
2218
api/commands.py
2218
api/commands.py
File diff suppressed because it is too large
Load Diff
278
api/config.py
278
api/config.py
@ -1,278 +0,0 @@
|
||||
# -*- coding:utf-8 -*-
|
||||
import os
|
||||
from datetime import timedelta
|
||||
|
||||
import dotenv
|
||||
|
||||
from extensions.ext_database import db
|
||||
from extensions.ext_redis import redis_client
|
||||
|
||||
dotenv.load_dotenv()
|
||||
|
||||
DEFAULTS = {
|
||||
'COOKIE_HTTPONLY': 'True',
|
||||
'COOKIE_SECURE': 'True',
|
||||
'COOKIE_SAMESITE': 'None',
|
||||
'DB_USERNAME': 'postgres',
|
||||
'DB_PASSWORD': '',
|
||||
'DB_HOST': 'localhost',
|
||||
'DB_PORT': '5432',
|
||||
'DB_DATABASE': 'dify',
|
||||
'REDIS_HOST': 'localhost',
|
||||
'REDIS_PORT': '6379',
|
||||
'REDIS_DB': '0',
|
||||
'REDIS_USE_SSL': 'False',
|
||||
'SESSION_REDIS_HOST': 'localhost',
|
||||
'SESSION_REDIS_PORT': '6379',
|
||||
'SESSION_REDIS_DB': '2',
|
||||
'SESSION_REDIS_USE_SSL': 'False',
|
||||
'OAUTH_REDIRECT_PATH': '/console/api/oauth/authorize',
|
||||
'OAUTH_REDIRECT_INDEX_PATH': '/',
|
||||
'CONSOLE_WEB_URL': 'https://cloud.dify.ai',
|
||||
'CONSOLE_API_URL': 'https://cloud.dify.ai',
|
||||
'SERVICE_API_URL': 'https://api.dify.ai',
|
||||
'APP_WEB_URL': 'https://udify.app',
|
||||
'APP_API_URL': 'https://udify.app',
|
||||
'STORAGE_TYPE': 'local',
|
||||
'STORAGE_LOCAL_PATH': 'storage',
|
||||
'CHECK_UPDATE_URL': 'https://updates.dify.ai',
|
||||
'SESSION_TYPE': 'sqlalchemy',
|
||||
'SESSION_PERMANENT': 'True',
|
||||
'SESSION_USE_SIGNER': 'True',
|
||||
'DEPLOY_ENV': 'PRODUCTION',
|
||||
'SQLALCHEMY_POOL_SIZE': 30,
|
||||
'SQLALCHEMY_POOL_RECYCLE': 3600,
|
||||
'SQLALCHEMY_ECHO': 'False',
|
||||
'SENTRY_TRACES_SAMPLE_RATE': 1.0,
|
||||
'SENTRY_PROFILES_SAMPLE_RATE': 1.0,
|
||||
'WEAVIATE_GRPC_ENABLED': 'True',
|
||||
'WEAVIATE_BATCH_SIZE': 100,
|
||||
'CELERY_BACKEND': 'database',
|
||||
'LOG_LEVEL': 'INFO',
|
||||
'HOSTED_OPENAI_QUOTA_LIMIT': 200,
|
||||
'HOSTED_OPENAI_ENABLED': 'False',
|
||||
'HOSTED_OPENAI_PAID_ENABLED': 'False',
|
||||
'HOSTED_OPENAI_PAID_INCREASE_QUOTA': 1,
|
||||
'HOSTED_AZURE_OPENAI_ENABLED': 'False',
|
||||
'HOSTED_AZURE_OPENAI_QUOTA_LIMIT': 200,
|
||||
'HOSTED_ANTHROPIC_QUOTA_LIMIT': 600000,
|
||||
'HOSTED_ANTHROPIC_ENABLED': 'False',
|
||||
'HOSTED_ANTHROPIC_PAID_ENABLED': 'False',
|
||||
'HOSTED_ANTHROPIC_PAID_INCREASE_QUOTA': 1000000,
|
||||
'HOSTED_ANTHROPIC_PAID_MIN_QUANTITY': 20,
|
||||
'HOSTED_ANTHROPIC_PAID_MAX_QUANTITY': 100,
|
||||
'TENANT_DOCUMENT_COUNT': 100,
|
||||
'CLEAN_DAY_SETTING': 30,
|
||||
'UPLOAD_FILE_SIZE_LIMIT': 15,
|
||||
'UPLOAD_FILE_BATCH_LIMIT': 5,
|
||||
}
|
||||
|
||||
|
||||
def get_env(key):
|
||||
return os.environ.get(key, DEFAULTS.get(key))
|
||||
|
||||
|
||||
def get_bool_env(key):
|
||||
return get_env(key).lower() == 'true'
|
||||
|
||||
|
||||
def get_cors_allow_origins(env, default):
|
||||
cors_allow_origins = []
|
||||
if get_env(env):
|
||||
for origin in get_env(env).split(','):
|
||||
cors_allow_origins.append(origin)
|
||||
else:
|
||||
cors_allow_origins = [default]
|
||||
|
||||
return cors_allow_origins
|
||||
|
||||
|
||||
class Config:
|
||||
"""Application configuration class."""
|
||||
|
||||
def __init__(self):
|
||||
# app settings
|
||||
self.CONSOLE_API_URL = get_env('CONSOLE_URL') if get_env('CONSOLE_URL') else get_env('CONSOLE_API_URL')
|
||||
self.CONSOLE_WEB_URL = get_env('CONSOLE_URL') if get_env('CONSOLE_URL') else get_env('CONSOLE_WEB_URL')
|
||||
self.SERVICE_API_URL = get_env('API_URL') if get_env('API_URL') else get_env('SERVICE_API_URL')
|
||||
self.APP_WEB_URL = get_env('APP_URL') if get_env('APP_URL') else get_env('APP_WEB_URL')
|
||||
self.APP_API_URL = get_env('APP_URL') if get_env('APP_URL') else get_env('APP_API_URL')
|
||||
self.CONSOLE_URL = get_env('CONSOLE_URL')
|
||||
self.API_URL = get_env('API_URL')
|
||||
self.APP_URL = get_env('APP_URL')
|
||||
self.CURRENT_VERSION = "0.3.19"
|
||||
self.COMMIT_SHA = get_env('COMMIT_SHA')
|
||||
self.EDITION = "SELF_HOSTED"
|
||||
self.DEPLOY_ENV = get_env('DEPLOY_ENV')
|
||||
self.TESTING = False
|
||||
self.LOG_LEVEL = get_env('LOG_LEVEL')
|
||||
|
||||
# Your App secret key will be used for securely signing the session cookie
|
||||
# Make sure you are changing this key for your deployment with a strong key.
|
||||
# You can generate a strong key using `openssl rand -base64 42`.
|
||||
# Alternatively you can set it with `SECRET_KEY` environment variable.
|
||||
self.SECRET_KEY = get_env('SECRET_KEY')
|
||||
|
||||
# cookie settings
|
||||
self.REMEMBER_COOKIE_HTTPONLY = get_bool_env('COOKIE_HTTPONLY')
|
||||
self.SESSION_COOKIE_HTTPONLY = get_bool_env('COOKIE_HTTPONLY')
|
||||
self.REMEMBER_COOKIE_SAMESITE = get_env('COOKIE_SAMESITE')
|
||||
self.SESSION_COOKIE_SAMESITE = get_env('COOKIE_SAMESITE')
|
||||
self.REMEMBER_COOKIE_SECURE = get_bool_env('COOKIE_SECURE')
|
||||
self.SESSION_COOKIE_SECURE = get_bool_env('COOKIE_SECURE')
|
||||
self.PERMANENT_SESSION_LIFETIME = timedelta(days=7)
|
||||
|
||||
# session settings, only support sqlalchemy, redis
|
||||
self.SESSION_TYPE = get_env('SESSION_TYPE')
|
||||
self.SESSION_PERMANENT = get_bool_env('SESSION_PERMANENT')
|
||||
self.SESSION_USE_SIGNER = get_bool_env('SESSION_USE_SIGNER')
|
||||
|
||||
# redis settings
|
||||
self.REDIS_HOST = get_env('REDIS_HOST')
|
||||
self.REDIS_PORT = get_env('REDIS_PORT')
|
||||
self.REDIS_USERNAME = get_env('REDIS_USERNAME')
|
||||
self.REDIS_PASSWORD = get_env('REDIS_PASSWORD')
|
||||
self.REDIS_DB = get_env('REDIS_DB')
|
||||
self.REDIS_USE_SSL = get_bool_env('REDIS_USE_SSL')
|
||||
|
||||
# session redis settings
|
||||
self.SESSION_REDIS_HOST = get_env('SESSION_REDIS_HOST')
|
||||
self.SESSION_REDIS_PORT = get_env('SESSION_REDIS_PORT')
|
||||
self.SESSION_REDIS_USERNAME = get_env('SESSION_REDIS_USERNAME')
|
||||
self.SESSION_REDIS_PASSWORD = get_env('SESSION_REDIS_PASSWORD')
|
||||
self.SESSION_REDIS_DB = get_env('SESSION_REDIS_DB')
|
||||
self.SESSION_REDIS_USE_SSL = get_bool_env('SESSION_REDIS_USE_SSL')
|
||||
|
||||
# storage settings
|
||||
self.STORAGE_TYPE = get_env('STORAGE_TYPE')
|
||||
self.STORAGE_LOCAL_PATH = get_env('STORAGE_LOCAL_PATH')
|
||||
self.S3_ENDPOINT = get_env('S3_ENDPOINT')
|
||||
self.S3_BUCKET_NAME = get_env('S3_BUCKET_NAME')
|
||||
self.S3_ACCESS_KEY = get_env('S3_ACCESS_KEY')
|
||||
self.S3_SECRET_KEY = get_env('S3_SECRET_KEY')
|
||||
self.S3_REGION = get_env('S3_REGION')
|
||||
|
||||
# vector store settings, only support weaviate, qdrant
|
||||
self.VECTOR_STORE = get_env('VECTOR_STORE')
|
||||
|
||||
# weaviate settings
|
||||
self.WEAVIATE_ENDPOINT = get_env('WEAVIATE_ENDPOINT')
|
||||
self.WEAVIATE_API_KEY = get_env('WEAVIATE_API_KEY')
|
||||
self.WEAVIATE_GRPC_ENABLED = get_bool_env('WEAVIATE_GRPC_ENABLED')
|
||||
self.WEAVIATE_BATCH_SIZE = int(get_env('WEAVIATE_BATCH_SIZE'))
|
||||
|
||||
# qdrant settings
|
||||
self.QDRANT_URL = get_env('QDRANT_URL')
|
||||
self.QDRANT_API_KEY = get_env('QDRANT_API_KEY')
|
||||
|
||||
# cors settings
|
||||
self.CONSOLE_CORS_ALLOW_ORIGINS = get_cors_allow_origins(
|
||||
'CONSOLE_CORS_ALLOW_ORIGINS', self.CONSOLE_WEB_URL)
|
||||
self.WEB_API_CORS_ALLOW_ORIGINS = get_cors_allow_origins(
|
||||
'WEB_API_CORS_ALLOW_ORIGINS', '*')
|
||||
|
||||
# mail settings
|
||||
self.MAIL_TYPE = get_env('MAIL_TYPE')
|
||||
self.MAIL_DEFAULT_SEND_FROM = get_env('MAIL_DEFAULT_SEND_FROM')
|
||||
self.RESEND_API_KEY = get_env('RESEND_API_KEY')
|
||||
|
||||
# sentry settings
|
||||
self.SENTRY_DSN = get_env('SENTRY_DSN')
|
||||
self.SENTRY_TRACES_SAMPLE_RATE = float(get_env('SENTRY_TRACES_SAMPLE_RATE'))
|
||||
self.SENTRY_PROFILES_SAMPLE_RATE = float(get_env('SENTRY_PROFILES_SAMPLE_RATE'))
|
||||
|
||||
# check update url
|
||||
self.CHECK_UPDATE_URL = get_env('CHECK_UPDATE_URL')
|
||||
|
||||
# database settings
|
||||
db_credentials = {
|
||||
key: get_env(key) for key in
|
||||
['DB_USERNAME', 'DB_PASSWORD', 'DB_HOST', 'DB_PORT', 'DB_DATABASE']
|
||||
}
|
||||
|
||||
self.SQLALCHEMY_DATABASE_URI = f"postgresql://{db_credentials['DB_USERNAME']}:{db_credentials['DB_PASSWORD']}@{db_credentials['DB_HOST']}:{db_credentials['DB_PORT']}/{db_credentials['DB_DATABASE']}"
|
||||
self.SQLALCHEMY_ENGINE_OPTIONS = {
|
||||
'pool_size': int(get_env('SQLALCHEMY_POOL_SIZE')),
|
||||
'pool_recycle': int(get_env('SQLALCHEMY_POOL_RECYCLE'))
|
||||
}
|
||||
|
||||
self.SQLALCHEMY_ECHO = get_bool_env('SQLALCHEMY_ECHO')
|
||||
|
||||
# celery settings
|
||||
self.CELERY_BROKER_URL = get_env('CELERY_BROKER_URL')
|
||||
self.CELERY_BACKEND = get_env('CELERY_BACKEND')
|
||||
self.CELERY_RESULT_BACKEND = 'db+{}'.format(self.SQLALCHEMY_DATABASE_URI) \
|
||||
if self.CELERY_BACKEND == 'database' else self.CELERY_BROKER_URL
|
||||
self.BROKER_USE_SSL = self.CELERY_BROKER_URL.startswith('rediss://')
|
||||
|
||||
# hosted provider credentials
|
||||
self.HOSTED_OPENAI_ENABLED = get_bool_env('HOSTED_OPENAI_ENABLED')
|
||||
self.HOSTED_OPENAI_API_KEY = get_env('HOSTED_OPENAI_API_KEY')
|
||||
self.HOSTED_OPENAI_API_BASE = get_env('HOSTED_OPENAI_API_BASE')
|
||||
self.HOSTED_OPENAI_API_ORGANIZATION = get_env('HOSTED_OPENAI_API_ORGANIZATION')
|
||||
self.HOSTED_OPENAI_QUOTA_LIMIT = int(get_env('HOSTED_OPENAI_QUOTA_LIMIT'))
|
||||
self.HOSTED_OPENAI_PAID_ENABLED = get_bool_env('HOSTED_OPENAI_PAID_ENABLED')
|
||||
self.HOSTED_OPENAI_PAID_STRIPE_PRICE_ID = get_env('HOSTED_OPENAI_PAID_STRIPE_PRICE_ID')
|
||||
self.HOSTED_OPENAI_PAID_INCREASE_QUOTA = int(get_env('HOSTED_OPENAI_PAID_INCREASE_QUOTA'))
|
||||
|
||||
self.HOSTED_AZURE_OPENAI_ENABLED = get_bool_env('HOSTED_AZURE_OPENAI_ENABLED')
|
||||
self.HOSTED_AZURE_OPENAI_API_KEY = get_env('HOSTED_AZURE_OPENAI_API_KEY')
|
||||
self.HOSTED_AZURE_OPENAI_API_BASE = get_env('HOSTED_AZURE_OPENAI_API_BASE')
|
||||
self.HOSTED_AZURE_OPENAI_QUOTA_LIMIT = int(get_env('HOSTED_AZURE_OPENAI_QUOTA_LIMIT'))
|
||||
|
||||
self.HOSTED_ANTHROPIC_ENABLED = get_bool_env('HOSTED_ANTHROPIC_ENABLED')
|
||||
self.HOSTED_ANTHROPIC_API_BASE = get_env('HOSTED_ANTHROPIC_API_BASE')
|
||||
self.HOSTED_ANTHROPIC_API_KEY = get_env('HOSTED_ANTHROPIC_API_KEY')
|
||||
self.HOSTED_ANTHROPIC_QUOTA_LIMIT = int(get_env('HOSTED_ANTHROPIC_QUOTA_LIMIT'))
|
||||
self.HOSTED_ANTHROPIC_PAID_ENABLED = get_bool_env('HOSTED_ANTHROPIC_PAID_ENABLED')
|
||||
self.HOSTED_ANTHROPIC_PAID_STRIPE_PRICE_ID = get_env('HOSTED_ANTHROPIC_PAID_STRIPE_PRICE_ID')
|
||||
self.HOSTED_ANTHROPIC_PAID_INCREASE_QUOTA = int(get_env('HOSTED_ANTHROPIC_PAID_INCREASE_QUOTA'))
|
||||
self.HOSTED_ANTHROPIC_PAID_MIN_QUANTITY = int(get_env('HOSTED_ANTHROPIC_PAID_MIN_QUANTITY'))
|
||||
self.HOSTED_ANTHROPIC_PAID_MAX_QUANTITY = int(get_env('HOSTED_ANTHROPIC_PAID_MAX_QUANTITY'))
|
||||
|
||||
self.STRIPE_API_KEY = get_env('STRIPE_API_KEY')
|
||||
self.STRIPE_WEBHOOK_SECRET = get_env('STRIPE_WEBHOOK_SECRET')
|
||||
|
||||
# notion import setting
|
||||
self.NOTION_CLIENT_ID = get_env('NOTION_CLIENT_ID')
|
||||
self.NOTION_CLIENT_SECRET = get_env('NOTION_CLIENT_SECRET')
|
||||
self.NOTION_INTEGRATION_TYPE = get_env('NOTION_INTEGRATION_TYPE')
|
||||
self.NOTION_INTERNAL_SECRET = get_env('NOTION_INTERNAL_SECRET')
|
||||
self.NOTION_INTEGRATION_TOKEN = get_env('NOTION_INTEGRATION_TOKEN')
|
||||
|
||||
self.TENANT_DOCUMENT_COUNT = get_env('TENANT_DOCUMENT_COUNT')
|
||||
self.CLEAN_DAY_SETTING = get_env('CLEAN_DAY_SETTING')
|
||||
|
||||
# uploading settings
|
||||
self.UPLOAD_FILE_SIZE_LIMIT = int(get_env('UPLOAD_FILE_SIZE_LIMIT'))
|
||||
self.UPLOAD_FILE_BATCH_LIMIT = int(get_env('UPLOAD_FILE_BATCH_LIMIT'))
|
||||
|
||||
|
||||
class CloudEditionConfig(Config):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.EDITION = "CLOUD"
|
||||
|
||||
self.GITHUB_CLIENT_ID = get_env('GITHUB_CLIENT_ID')
|
||||
self.GITHUB_CLIENT_SECRET = get_env('GITHUB_CLIENT_SECRET')
|
||||
self.GOOGLE_CLIENT_ID = get_env('GOOGLE_CLIENT_ID')
|
||||
self.GOOGLE_CLIENT_SECRET = get_env('GOOGLE_CLIENT_SECRET')
|
||||
self.OAUTH_REDIRECT_PATH = get_env('OAUTH_REDIRECT_PATH')
|
||||
|
||||
|
||||
class TestConfig(Config):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.EDITION = "SELF_HOSTED"
|
||||
self.TESTING = True
|
||||
|
||||
db_credentials = {
|
||||
key: get_env(key) for key in ['DB_USERNAME', 'DB_PASSWORD', 'DB_HOST', 'DB_PORT']
|
||||
}
|
||||
|
||||
# use a different database for testing: dify_test
|
||||
self.SQLALCHEMY_DATABASE_URI = f"postgresql://{db_credentials['DB_USERNAME']}:{db_credentials['DB_PASSWORD']}@{db_credentials['DB_HOST']}:{db_credentials['DB_PORT']}/dify_test"
|
||||
3
api/configs/__init__.py
Normal file
3
api/configs/__init__.py
Normal file
@ -0,0 +1,3 @@
|
||||
from .app_config import DifyConfig
|
||||
|
||||
dify_config = DifyConfig() # type: ignore
|
||||
113
api/configs/app_config.py
Normal file
113
api/configs/app_config.py
Normal file
@ -0,0 +1,113 @@
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
from pydantic.fields import FieldInfo
|
||||
from pydantic_settings import BaseSettings, PydanticBaseSettingsSource, SettingsConfigDict, TomlConfigSettingsSource
|
||||
|
||||
from libs.file_utils import search_file_upwards
|
||||
|
||||
from .deploy import DeploymentConfig
|
||||
from .enterprise import EnterpriseFeatureConfig
|
||||
from .extra import ExtraServiceConfig
|
||||
from .feature import FeatureConfig
|
||||
from .middleware import MiddlewareConfig
|
||||
from .observability import ObservabilityConfig
|
||||
from .packaging import PackagingInfo
|
||||
from .remote_settings_sources import RemoteSettingsSource, RemoteSettingsSourceConfig, RemoteSettingsSourceName
|
||||
from .remote_settings_sources.apollo import ApolloSettingsSource
|
||||
from .remote_settings_sources.nacos import NacosSettingsSource
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class RemoteSettingsSourceFactory(PydanticBaseSettingsSource):
|
||||
def __init__(self, settings_cls: type[BaseSettings]):
|
||||
super().__init__(settings_cls)
|
||||
|
||||
def get_field_value(self, field: FieldInfo, field_name: str) -> tuple[Any, str, bool]:
|
||||
raise NotImplementedError
|
||||
|
||||
def __call__(self) -> dict[str, Any]:
|
||||
current_state = self.current_state
|
||||
remote_source_name = current_state.get("REMOTE_SETTINGS_SOURCE_NAME")
|
||||
if not remote_source_name:
|
||||
return {}
|
||||
|
||||
remote_source: RemoteSettingsSource | None = None
|
||||
match remote_source_name:
|
||||
case RemoteSettingsSourceName.APOLLO:
|
||||
remote_source = ApolloSettingsSource(current_state)
|
||||
case RemoteSettingsSourceName.NACOS:
|
||||
remote_source = NacosSettingsSource(current_state)
|
||||
case _:
|
||||
logger.warning("Unsupported remote source: %s", remote_source_name)
|
||||
return {}
|
||||
|
||||
d: dict[str, Any] = {}
|
||||
|
||||
for field_name, field in self.settings_cls.model_fields.items():
|
||||
field_value, field_key, value_is_complex = remote_source.get_field_value(field, field_name)
|
||||
field_value = remote_source.prepare_field_value(field_name, field, field_value, value_is_complex)
|
||||
if field_value is not None:
|
||||
d[field_key] = field_value
|
||||
|
||||
return d
|
||||
|
||||
|
||||
class DifyConfig(
|
||||
# Packaging info
|
||||
PackagingInfo,
|
||||
# Deployment configs
|
||||
DeploymentConfig,
|
||||
# Feature configs
|
||||
FeatureConfig,
|
||||
# Middleware configs
|
||||
MiddlewareConfig,
|
||||
# Extra service configs
|
||||
ExtraServiceConfig,
|
||||
# Observability configs
|
||||
ObservabilityConfig,
|
||||
# Remote source configs
|
||||
RemoteSettingsSourceConfig,
|
||||
# Enterprise feature configs
|
||||
# **Before using, please contact business@dify.ai by email to inquire about licensing matters.**
|
||||
EnterpriseFeatureConfig,
|
||||
):
|
||||
model_config = SettingsConfigDict(
|
||||
# read from dotenv format config file
|
||||
env_file=".env",
|
||||
env_file_encoding="utf-8",
|
||||
# ignore extra attributes
|
||||
extra="ignore",
|
||||
)
|
||||
|
||||
# Before adding any config,
|
||||
# please consider to arrange it in the proper config group of existed or added
|
||||
# for better readability and maintainability.
|
||||
# Thanks for your concentration and consideration.
|
||||
|
||||
@classmethod
|
||||
def settings_customise_sources(
|
||||
cls,
|
||||
settings_cls: type[BaseSettings],
|
||||
init_settings: PydanticBaseSettingsSource,
|
||||
env_settings: PydanticBaseSettingsSource,
|
||||
dotenv_settings: PydanticBaseSettingsSource,
|
||||
file_secret_settings: PydanticBaseSettingsSource,
|
||||
) -> tuple[PydanticBaseSettingsSource, ...]:
|
||||
return (
|
||||
init_settings,
|
||||
env_settings,
|
||||
RemoteSettingsSourceFactory(settings_cls),
|
||||
dotenv_settings,
|
||||
file_secret_settings,
|
||||
TomlConfigSettingsSource(
|
||||
settings_cls=settings_cls,
|
||||
toml_file=search_file_upwards(
|
||||
base_dir_path=Path(__file__).parent,
|
||||
target_file_name="pyproject.toml",
|
||||
max_search_parent_depth=2,
|
||||
),
|
||||
),
|
||||
)
|
||||
34
api/configs/deploy/__init__.py
Normal file
34
api/configs/deploy/__init__.py
Normal file
@ -0,0 +1,34 @@
|
||||
from pydantic import Field
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class DeploymentConfig(BaseSettings):
|
||||
"""
|
||||
Configuration settings for application deployment
|
||||
"""
|
||||
|
||||
APPLICATION_NAME: str = Field(
|
||||
description="Name of the application, used for identification and logging purposes",
|
||||
default="langgenius/dify",
|
||||
)
|
||||
|
||||
DEBUG: bool = Field(
|
||||
description="Enable debug mode for additional logging and development features",
|
||||
default=False,
|
||||
)
|
||||
|
||||
# Request logging configuration
|
||||
ENABLE_REQUEST_LOGGING: bool = Field(
|
||||
description="Enable request and response body logging",
|
||||
default=False,
|
||||
)
|
||||
|
||||
EDITION: str = Field(
|
||||
description="Deployment edition of the application (e.g., 'SELF_HOSTED', 'CLOUD')",
|
||||
default="SELF_HOSTED",
|
||||
)
|
||||
|
||||
DEPLOY_ENV: str = Field(
|
||||
description="Deployment environment (e.g., 'PRODUCTION', 'DEVELOPMENT'), default to PRODUCTION",
|
||||
default="PRODUCTION",
|
||||
)
|
||||
20
api/configs/enterprise/__init__.py
Normal file
20
api/configs/enterprise/__init__.py
Normal file
@ -0,0 +1,20 @@
|
||||
from pydantic import Field
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class EnterpriseFeatureConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for enterprise-level features.
|
||||
**Before using, please contact business@dify.ai by email to inquire about licensing matters.**
|
||||
"""
|
||||
|
||||
ENTERPRISE_ENABLED: bool = Field(
|
||||
description="Enable or disable enterprise-level features."
|
||||
"Before using, please contact business@dify.ai by email to inquire about licensing matters.",
|
||||
default=False,
|
||||
)
|
||||
|
||||
CAN_REPLACE_LOGO: bool = Field(
|
||||
description="Allow customization of the enterprise logo.",
|
||||
default=False,
|
||||
)
|
||||
10
api/configs/extra/__init__.py
Normal file
10
api/configs/extra/__init__.py
Normal file
@ -0,0 +1,10 @@
|
||||
from configs.extra.notion_config import NotionConfig
|
||||
from configs.extra.sentry_config import SentryConfig
|
||||
|
||||
|
||||
class ExtraServiceConfig(
|
||||
# place the configs in alphabet order
|
||||
NotionConfig,
|
||||
SentryConfig,
|
||||
):
|
||||
pass
|
||||
34
api/configs/extra/notion_config.py
Normal file
34
api/configs/extra/notion_config.py
Normal file
@ -0,0 +1,34 @@
|
||||
from pydantic import Field
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class NotionConfig(BaseSettings):
|
||||
"""
|
||||
Configuration settings for Notion integration
|
||||
"""
|
||||
|
||||
NOTION_CLIENT_ID: str | None = Field(
|
||||
description="Client ID for Notion API authentication. Required for OAuth 2.0 flow.",
|
||||
default=None,
|
||||
)
|
||||
|
||||
NOTION_CLIENT_SECRET: str | None = Field(
|
||||
description="Client secret for Notion API authentication. Required for OAuth 2.0 flow.",
|
||||
default=None,
|
||||
)
|
||||
|
||||
NOTION_INTEGRATION_TYPE: str | None = Field(
|
||||
description="Type of Notion integration."
|
||||
" Set to 'internal' for internal integrations, or None for public integrations.",
|
||||
default=None,
|
||||
)
|
||||
|
||||
NOTION_INTERNAL_SECRET: str | None = Field(
|
||||
description="Secret key for internal Notion integrations. Required when NOTION_INTEGRATION_TYPE is 'internal'.",
|
||||
default=None,
|
||||
)
|
||||
|
||||
NOTION_INTEGRATION_TOKEN: str | None = Field(
|
||||
description="Integration token for Notion API access. Used for direct API calls without OAuth flow.",
|
||||
default=None,
|
||||
)
|
||||
26
api/configs/extra/sentry_config.py
Normal file
26
api/configs/extra/sentry_config.py
Normal file
@ -0,0 +1,26 @@
|
||||
from pydantic import Field, NonNegativeFloat
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class SentryConfig(BaseSettings):
|
||||
"""
|
||||
Configuration settings for Sentry error tracking and performance monitoring
|
||||
"""
|
||||
|
||||
SENTRY_DSN: str | None = Field(
|
||||
description="Sentry Data Source Name (DSN)."
|
||||
" This is the unique identifier of your Sentry project, used to send events to the correct project.",
|
||||
default=None,
|
||||
)
|
||||
|
||||
SENTRY_TRACES_SAMPLE_RATE: NonNegativeFloat = Field(
|
||||
description="Sample rate for Sentry performance monitoring traces."
|
||||
" Value between 0.0 and 1.0, where 1.0 means 100% of traces are sent to Sentry.",
|
||||
default=1.0,
|
||||
)
|
||||
|
||||
SENTRY_PROFILES_SAMPLE_RATE: NonNegativeFloat = Field(
|
||||
description="Sample rate for Sentry profiling."
|
||||
" Value between 0.0 and 1.0, where 1.0 means 100% of profiles are sent to Sentry.",
|
||||
default=1.0,
|
||||
)
|
||||
1261
api/configs/feature/__init__.py
Normal file
1261
api/configs/feature/__init__.py
Normal file
File diff suppressed because it is too large
Load Diff
254
api/configs/feature/hosted_service/__init__.py
Normal file
254
api/configs/feature/hosted_service/__init__.py
Normal file
@ -0,0 +1,254 @@
|
||||
from pydantic import Field, NonNegativeInt
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class HostedCreditConfig(BaseSettings):
|
||||
HOSTED_MODEL_CREDIT_CONFIG: str = Field(
|
||||
description="Model credit configuration in format 'model:credits,model:credits', e.g., 'gpt-4:20,gpt-4o:10'",
|
||||
default="",
|
||||
)
|
||||
|
||||
def get_model_credits(self, model_name: str) -> int:
|
||||
"""
|
||||
Get credit value for a specific model name.
|
||||
Returns 1 if model is not found in configuration (default credit).
|
||||
|
||||
:param model_name: The name of the model to search for
|
||||
:return: The credit value for the model
|
||||
"""
|
||||
if not self.HOSTED_MODEL_CREDIT_CONFIG:
|
||||
return 1
|
||||
|
||||
try:
|
||||
credit_map = dict(
|
||||
item.strip().split(":", 1) for item in self.HOSTED_MODEL_CREDIT_CONFIG.split(",") if ":" in item
|
||||
)
|
||||
|
||||
# Search for matching model pattern
|
||||
for pattern, credit in credit_map.items():
|
||||
if pattern.strip() == model_name:
|
||||
return int(credit)
|
||||
return 1 # Default quota if no match found
|
||||
except (ValueError, AttributeError):
|
||||
return 1 # Return default quota if parsing fails
|
||||
|
||||
|
||||
class HostedOpenAiConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for hosted OpenAI service
|
||||
"""
|
||||
|
||||
HOSTED_OPENAI_API_KEY: str | None = Field(
|
||||
description="API key for hosted OpenAI service",
|
||||
default=None,
|
||||
)
|
||||
|
||||
HOSTED_OPENAI_API_BASE: str | None = Field(
|
||||
description="Base URL for hosted OpenAI API",
|
||||
default=None,
|
||||
)
|
||||
|
||||
HOSTED_OPENAI_API_ORGANIZATION: str | None = Field(
|
||||
description="Organization ID for hosted OpenAI service",
|
||||
default=None,
|
||||
)
|
||||
|
||||
HOSTED_OPENAI_TRIAL_ENABLED: bool = Field(
|
||||
description="Enable trial access to hosted OpenAI service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
HOSTED_OPENAI_TRIAL_MODELS: str = Field(
|
||||
description="Comma-separated list of available models for trial access",
|
||||
default="gpt-3.5-turbo,"
|
||||
"gpt-3.5-turbo-1106,"
|
||||
"gpt-3.5-turbo-instruct,"
|
||||
"gpt-3.5-turbo-16k,"
|
||||
"gpt-3.5-turbo-16k-0613,"
|
||||
"gpt-3.5-turbo-0613,"
|
||||
"gpt-3.5-turbo-0125,"
|
||||
"text-davinci-003",
|
||||
)
|
||||
|
||||
HOSTED_OPENAI_QUOTA_LIMIT: NonNegativeInt = Field(
|
||||
description="Quota limit for hosted OpenAI service usage",
|
||||
default=200,
|
||||
)
|
||||
|
||||
HOSTED_OPENAI_PAID_ENABLED: bool = Field(
|
||||
description="Enable paid access to hosted OpenAI service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
HOSTED_OPENAI_PAID_MODELS: str = Field(
|
||||
description="Comma-separated list of available models for paid access",
|
||||
default="gpt-4,"
|
||||
"gpt-4-turbo-preview,"
|
||||
"gpt-4-turbo-2024-04-09,"
|
||||
"gpt-4-1106-preview,"
|
||||
"gpt-4-0125-preview,"
|
||||
"gpt-3.5-turbo,"
|
||||
"gpt-3.5-turbo-16k,"
|
||||
"gpt-3.5-turbo-16k-0613,"
|
||||
"gpt-3.5-turbo-1106,"
|
||||
"gpt-3.5-turbo-0613,"
|
||||
"gpt-3.5-turbo-0125,"
|
||||
"gpt-3.5-turbo-instruct,"
|
||||
"text-davinci-003",
|
||||
)
|
||||
|
||||
|
||||
class HostedAzureOpenAiConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for hosted Azure OpenAI service
|
||||
"""
|
||||
|
||||
HOSTED_AZURE_OPENAI_ENABLED: bool = Field(
|
||||
description="Enable hosted Azure OpenAI service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
HOSTED_AZURE_OPENAI_API_KEY: str | None = Field(
|
||||
description="API key for hosted Azure OpenAI service",
|
||||
default=None,
|
||||
)
|
||||
|
||||
HOSTED_AZURE_OPENAI_API_BASE: str | None = Field(
|
||||
description="Base URL for hosted Azure OpenAI API",
|
||||
default=None,
|
||||
)
|
||||
|
||||
HOSTED_AZURE_OPENAI_QUOTA_LIMIT: NonNegativeInt = Field(
|
||||
description="Quota limit for hosted Azure OpenAI service usage",
|
||||
default=200,
|
||||
)
|
||||
|
||||
|
||||
class HostedAnthropicConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for hosted Anthropic service
|
||||
"""
|
||||
|
||||
HOSTED_ANTHROPIC_API_BASE: str | None = Field(
|
||||
description="Base URL for hosted Anthropic API",
|
||||
default=None,
|
||||
)
|
||||
|
||||
HOSTED_ANTHROPIC_API_KEY: str | None = Field(
|
||||
description="API key for hosted Anthropic service",
|
||||
default=None,
|
||||
)
|
||||
|
||||
HOSTED_ANTHROPIC_TRIAL_ENABLED: bool = Field(
|
||||
description="Enable trial access to hosted Anthropic service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
HOSTED_ANTHROPIC_QUOTA_LIMIT: NonNegativeInt = Field(
|
||||
description="Quota limit for hosted Anthropic service usage",
|
||||
default=600000,
|
||||
)
|
||||
|
||||
HOSTED_ANTHROPIC_PAID_ENABLED: bool = Field(
|
||||
description="Enable paid access to hosted Anthropic service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
|
||||
class HostedMinmaxConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for hosted Minmax service
|
||||
"""
|
||||
|
||||
HOSTED_MINIMAX_ENABLED: bool = Field(
|
||||
description="Enable hosted Minmax service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
|
||||
class HostedSparkConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for hosted Spark service
|
||||
"""
|
||||
|
||||
HOSTED_SPARK_ENABLED: bool = Field(
|
||||
description="Enable hosted Spark service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
|
||||
class HostedZhipuAIConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for hosted ZhipuAI service
|
||||
"""
|
||||
|
||||
HOSTED_ZHIPUAI_ENABLED: bool = Field(
|
||||
description="Enable hosted ZhipuAI service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
|
||||
class HostedModerationConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for hosted Moderation service
|
||||
"""
|
||||
|
||||
HOSTED_MODERATION_ENABLED: bool = Field(
|
||||
description="Enable hosted Moderation service",
|
||||
default=False,
|
||||
)
|
||||
|
||||
HOSTED_MODERATION_PROVIDERS: str = Field(
|
||||
description="Comma-separated list of moderation providers",
|
||||
default="",
|
||||
)
|
||||
|
||||
|
||||
class HostedFetchAppTemplateConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for fetching app templates
|
||||
"""
|
||||
|
||||
HOSTED_FETCH_APP_TEMPLATES_MODE: str = Field(
|
||||
description="Mode for fetching app templates: remote, db, or builtin default to remote,",
|
||||
default="remote",
|
||||
)
|
||||
|
||||
HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN: str = Field(
|
||||
description="Domain for fetching remote app templates",
|
||||
default="https://tmpl.dify.ai",
|
||||
)
|
||||
|
||||
|
||||
class HostedFetchPipelineTemplateConfig(BaseSettings):
|
||||
"""
|
||||
Configuration for fetching pipeline templates
|
||||
"""
|
||||
|
||||
HOSTED_FETCH_PIPELINE_TEMPLATES_MODE: str = Field(
|
||||
description="Mode for fetching pipeline templates: remote, db, or builtin default to remote,",
|
||||
default="remote",
|
||||
)
|
||||
|
||||
HOSTED_FETCH_PIPELINE_TEMPLATES_REMOTE_DOMAIN: str = Field(
|
||||
description="Domain for fetching remote pipeline templates",
|
||||
default="https://tmpl.dify.ai",
|
||||
)
|
||||
|
||||
|
||||
class HostedServiceConfig(
|
||||
# place the configs in alphabet order
|
||||
HostedAnthropicConfig,
|
||||
HostedAzureOpenAiConfig,
|
||||
HostedFetchAppTemplateConfig,
|
||||
HostedFetchPipelineTemplateConfig,
|
||||
HostedMinmaxConfig,
|
||||
HostedOpenAiConfig,
|
||||
HostedSparkConfig,
|
||||
HostedZhipuAIConfig,
|
||||
# moderation
|
||||
HostedModerationConfig,
|
||||
# credit config
|
||||
HostedCreditConfig,
|
||||
):
|
||||
pass
|
||||
366
api/configs/middleware/__init__.py
Normal file
366
api/configs/middleware/__init__.py
Normal file
@ -0,0 +1,366 @@
|
||||
import os
|
||||
from typing import Any, Literal
|
||||
from urllib.parse import parse_qsl, quote_plus
|
||||
|
||||
from pydantic import Field, NonNegativeFloat, NonNegativeInt, PositiveFloat, PositiveInt, computed_field
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
from .cache.redis_config import RedisConfig
|
||||
from .storage.aliyun_oss_storage_config import AliyunOSSStorageConfig
|
||||
from .storage.amazon_s3_storage_config import S3StorageConfig
|
||||
from .storage.azure_blob_storage_config import AzureBlobStorageConfig
|
||||
from .storage.baidu_obs_storage_config import BaiduOBSStorageConfig
|
||||
from .storage.clickzetta_volume_storage_config import ClickZettaVolumeStorageConfig
|
||||
from .storage.google_cloud_storage_config import GoogleCloudStorageConfig
|
||||
from .storage.huawei_obs_storage_config import HuaweiCloudOBSStorageConfig
|
||||
from .storage.oci_storage_config import OCIStorageConfig
|
||||
from .storage.opendal_storage_config import OpenDALStorageConfig
|
||||
from .storage.supabase_storage_config import SupabaseStorageConfig
|
||||
from .storage.tencent_cos_storage_config import TencentCloudCOSStorageConfig
|
||||
from .storage.volcengine_tos_storage_config import VolcengineTOSStorageConfig
|
||||
from .vdb.alibabacloud_mysql_config import AlibabaCloudMySQLConfig
|
||||
from .vdb.analyticdb_config import AnalyticdbConfig
|
||||
from .vdb.baidu_vector_config import BaiduVectorDBConfig
|
||||
from .vdb.chroma_config import ChromaConfig
|
||||
from .vdb.clickzetta_config import ClickzettaConfig
|
||||
from .vdb.couchbase_config import CouchbaseConfig
|
||||
from .vdb.elasticsearch_config import ElasticsearchConfig
|
||||
from .vdb.huawei_cloud_config import HuaweiCloudConfig
|
||||
from .vdb.lindorm_config import LindormConfig
|
||||
from .vdb.matrixone_config import MatrixoneConfig
|
||||
from .vdb.milvus_config import MilvusConfig
|
||||
from .vdb.myscale_config import MyScaleConfig
|
||||
from .vdb.oceanbase_config import OceanBaseVectorConfig
|
||||
from .vdb.opengauss_config import OpenGaussConfig
|
||||
from .vdb.opensearch_config import OpenSearchConfig
|
||||
from .vdb.oracle_config import OracleConfig
|
||||
from .vdb.pgvector_config import PGVectorConfig
|
||||
from .vdb.pgvectors_config import PGVectoRSConfig
|
||||
from .vdb.qdrant_config import QdrantConfig
|
||||
from .vdb.relyt_config import RelytConfig
|
||||
from .vdb.tablestore_config import TableStoreConfig
|
||||
from .vdb.tencent_vector_config import TencentVectorDBConfig
|
||||
from .vdb.tidb_on_qdrant_config import TidbOnQdrantConfig
|
||||
from .vdb.tidb_vector_config import TiDBVectorConfig
|
||||
from .vdb.upstash_config import UpstashConfig
|
||||
from .vdb.vastbase_vector_config import VastbaseVectorConfig
|
||||
from .vdb.vikingdb_config import VikingDBConfig
|
||||
from .vdb.weaviate_config import WeaviateConfig
|
||||
|
||||
|
||||
class StorageConfig(BaseSettings):
|
||||
STORAGE_TYPE: Literal[
|
||||
"opendal",
|
||||
"s3",
|
||||
"aliyun-oss",
|
||||
"azure-blob",
|
||||
"baidu-obs",
|
||||
"clickzetta-volume",
|
||||
"google-storage",
|
||||
"huawei-obs",
|
||||
"oci-storage",
|
||||
"tencent-cos",
|
||||
"volcengine-tos",
|
||||
"supabase",
|
||||
"local",
|
||||
] = Field(
|
||||
description="Type of storage to use."
|
||||
" Options: 'opendal', '(deprecated) local', 's3', 'aliyun-oss', 'azure-blob', 'baidu-obs', "
|
||||
"'clickzetta-volume', 'google-storage', 'huawei-obs', 'oci-storage', 'tencent-cos', "
|
||||
"'volcengine-tos', 'supabase'. Default is 'opendal'.",
|
||||
default="opendal",
|
||||
)
|
||||
|
||||
STORAGE_LOCAL_PATH: str = Field(
|
||||
description="Path for local storage when STORAGE_TYPE is set to 'local'.",
|
||||
default="storage",
|
||||
deprecated=True,
|
||||
)
|
||||
|
||||
|
||||
class VectorStoreConfig(BaseSettings):
|
||||
VECTOR_STORE: str | None = Field(
|
||||
description="Type of vector store to use for efficient similarity search."
|
||||
" Set to None if not using a vector store.",
|
||||
default=None,
|
||||
)
|
||||
|
||||
VECTOR_STORE_WHITELIST_ENABLE: bool | None = Field(
|
||||
description="Enable whitelist for vector store.",
|
||||
default=False,
|
||||
)
|
||||
|
||||
VECTOR_INDEX_NAME_PREFIX: str | None = Field(
|
||||
description="Prefix used to create collection name in vector database",
|
||||
default="Vector_index",
|
||||
)
|
||||
|
||||
|
||||
class KeywordStoreConfig(BaseSettings):
|
||||
KEYWORD_STORE: str = Field(
|
||||
description="Method for keyword extraction and storage."
|
||||
" Default is 'jieba', a Chinese text segmentation library.",
|
||||
default="jieba",
|
||||
)
|
||||
|
||||
|
||||
class DatabaseConfig(BaseSettings):
|
||||
# Database type selector
|
||||
DB_TYPE: Literal["postgresql", "mysql", "oceanbase"] = Field(
|
||||
description="Database type to use. OceanBase is MySQL-compatible.",
|
||||
default="postgresql",
|
||||
)
|
||||
|
||||
DB_HOST: str = Field(
|
||||
description="Hostname or IP address of the database server.",
|
||||
default="localhost",
|
||||
)
|
||||
|
||||
DB_PORT: PositiveInt = Field(
|
||||
description="Port number for database connection.",
|
||||
default=5432,
|
||||
)
|
||||
|
||||
DB_USERNAME: str = Field(
|
||||
description="Username for database authentication.",
|
||||
default="postgres",
|
||||
)
|
||||
|
||||
DB_PASSWORD: str = Field(
|
||||
description="Password for database authentication.",
|
||||
default="",
|
||||
)
|
||||
|
||||
DB_DATABASE: str = Field(
|
||||
description="Name of the database to connect to.",
|
||||
default="dify",
|
||||
)
|
||||
|
||||
DB_CHARSET: str = Field(
|
||||
description="Character set for database connection.",
|
||||
default="",
|
||||
)
|
||||
|
||||
DB_EXTRAS: str = Field(
|
||||
description="Additional database connection parameters. Example: 'keepalives_idle=60&keepalives=1'",
|
||||
default="",
|
||||
)
|
||||
|
||||
@computed_field # type: ignore[prop-decorator]
|
||||
@property
|
||||
def SQLALCHEMY_DATABASE_URI_SCHEME(self) -> str:
|
||||
return "postgresql" if self.DB_TYPE == "postgresql" else "mysql+pymysql"
|
||||
|
||||
@computed_field # type: ignore[prop-decorator]
|
||||
@property
|
||||
def SQLALCHEMY_DATABASE_URI(self) -> str:
|
||||
db_extras = (
|
||||
f"{self.DB_EXTRAS}&client_encoding={self.DB_CHARSET}" if self.DB_CHARSET else self.DB_EXTRAS
|
||||
).strip("&")
|
||||
db_extras = f"?{db_extras}" if db_extras else ""
|
||||
return (
|
||||
f"{self.SQLALCHEMY_DATABASE_URI_SCHEME}://"
|
||||
f"{quote_plus(self.DB_USERNAME)}:{quote_plus(self.DB_PASSWORD)}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_DATABASE}"
|
||||
f"{db_extras}"
|
||||
)
|
||||
|
||||
SQLALCHEMY_POOL_SIZE: NonNegativeInt = Field(
|
||||
description="Maximum number of database connections in the pool.",
|
||||
default=30,
|
||||
)
|
||||
|
||||
SQLALCHEMY_MAX_OVERFLOW: NonNegativeInt = Field(
|
||||
description="Maximum number of connections that can be created beyond the pool_size.",
|
||||
default=10,
|
||||
)
|
||||
|
||||
SQLALCHEMY_POOL_RECYCLE: NonNegativeInt = Field(
|
||||
description="Number of seconds after which a connection is automatically recycled.",
|
||||
default=3600,
|
||||
)
|
||||
|
||||
SQLALCHEMY_POOL_USE_LIFO: bool = Field(
|
||||
description="If True, SQLAlchemy will use last-in-first-out way to retrieve connections from pool.",
|
||||
default=False,
|
||||
)
|
||||
|
||||
SQLALCHEMY_POOL_PRE_PING: bool = Field(
|
||||
description="If True, enables connection pool pre-ping feature to check connections.",
|
||||
default=False,
|
||||
)
|
||||
|
||||
SQLALCHEMY_ECHO: bool | str = Field(
|
||||
description="If True, SQLAlchemy will log all SQL statements.",
|
||||
default=False,
|
||||
)
|
||||
|
||||
SQLALCHEMY_POOL_TIMEOUT: NonNegativeInt = Field(
|
||||
description="Number of seconds to wait for a connection from the pool before raising a timeout error.",
|
||||
default=30,
|
||||
)
|
||||
|
||||
RETRIEVAL_SERVICE_EXECUTORS: NonNegativeInt = Field(
|
||||
description="Number of processes for the retrieval service, default to CPU cores.",
|
||||
default=os.cpu_count() or 1,
|
||||
)
|
||||
|
||||
@computed_field # type: ignore[prop-decorator]
|
||||
@property
|
||||
def SQLALCHEMY_ENGINE_OPTIONS(self) -> dict[str, Any]:
|
||||
# Parse DB_EXTRAS for 'options'
|
||||
db_extras_dict = dict(parse_qsl(self.DB_EXTRAS))
|
||||
options = db_extras_dict.get("options", "")
|
||||
connect_args = {}
|
||||
# Use the dynamic SQLALCHEMY_DATABASE_URI_SCHEME property
|
||||
if self.SQLALCHEMY_DATABASE_URI_SCHEME.startswith("postgresql"):
|
||||
timezone_opt = "-c timezone=UTC"
|
||||
if options:
|
||||
merged_options = f"{options} {timezone_opt}"
|
||||
else:
|
||||
merged_options = timezone_opt
|
||||
connect_args = {"options": merged_options}
|
||||
|
||||
return {
|
||||
"pool_size": self.SQLALCHEMY_POOL_SIZE,
|
||||
"max_overflow": self.SQLALCHEMY_MAX_OVERFLOW,
|
||||
"pool_recycle": self.SQLALCHEMY_POOL_RECYCLE,
|
||||
"pool_pre_ping": self.SQLALCHEMY_POOL_PRE_PING,
|
||||
"connect_args": connect_args,
|
||||
"pool_use_lifo": self.SQLALCHEMY_POOL_USE_LIFO,
|
||||
"pool_reset_on_return": None,
|
||||
"pool_timeout": self.SQLALCHEMY_POOL_TIMEOUT,
|
||||
}
|
||||
|
||||
|
||||
class CeleryConfig(DatabaseConfig):
|
||||
CELERY_BACKEND: str = Field(
|
||||
description="Backend for Celery task results. Options: 'database', 'redis', 'rabbitmq'.",
|
||||
default="redis",
|
||||
)
|
||||
|
||||
CELERY_BROKER_URL: str | None = Field(
|
||||
description="URL of the message broker for Celery tasks.",
|
||||
default=None,
|
||||
)
|
||||
|
||||
CELERY_USE_SENTINEL: bool | None = Field(
|
||||
description="Whether to use Redis Sentinel for high availability.",
|
||||
default=False,
|
||||
)
|
||||
|
||||
CELERY_SENTINEL_MASTER_NAME: str | None = Field(
|
||||
description="Name of the Redis Sentinel master.",
|
||||
default=None,
|
||||
)
|
||||
|
||||
CELERY_SENTINEL_PASSWORD: str | None = Field(
|
||||
description="Password of the Redis Sentinel master.",
|
||||
default=None,
|
||||
)
|
||||
CELERY_SENTINEL_SOCKET_TIMEOUT: PositiveFloat | None = Field(
|
||||
description="Timeout for Redis Sentinel socket operations in seconds.",
|
||||
default=0.1,
|
||||
)
|
||||
|
||||
@computed_field
|
||||
def CELERY_RESULT_BACKEND(self) -> str | None:
|
||||
if self.CELERY_BACKEND in ("database", "rabbitmq"):
|
||||
return f"db+{self.SQLALCHEMY_DATABASE_URI}"
|
||||
elif self.CELERY_BACKEND == "redis":
|
||||
return self.CELERY_BROKER_URL
|
||||
else:
|
||||
return None
|
||||
|
||||
@property
|
||||
def BROKER_USE_SSL(self) -> bool:
|
||||
return self.CELERY_BROKER_URL.startswith("rediss://") if self.CELERY_BROKER_URL else False
|
||||
|
||||
|
||||
class InternalTestConfig(BaseSettings):
|
||||
"""
|
||||
Configuration settings for Internal Test
|
||||
"""
|
||||
|
||||
AWS_SECRET_ACCESS_KEY: str | None = Field(
|
||||
description="Internal test AWS secret access key",
|
||||
default=None,
|
||||
)
|
||||
|
||||
AWS_ACCESS_KEY_ID: str | None = Field(
|
||||
description="Internal test AWS access key ID",
|
||||
default=None,
|
||||
)
|
||||
|
||||
|
||||
class DatasetQueueMonitorConfig(BaseSettings):
|
||||
"""
|
||||
Configuration settings for Dataset Queue Monitor
|
||||
"""
|
||||
|
||||
QUEUE_MONITOR_THRESHOLD: NonNegativeInt | None = Field(
|
||||
description="Threshold for dataset queue monitor",
|
||||
default=200,
|
||||
)
|
||||
QUEUE_MONITOR_ALERT_EMAILS: str | None = Field(
|
||||
description="Emails for dataset queue monitor alert, separated by commas",
|
||||
default=None,
|
||||
)
|
||||
QUEUE_MONITOR_INTERVAL: NonNegativeFloat | None = Field(
|
||||
description="Interval for dataset queue monitor in minutes",
|
||||
default=30,
|
||||
)
|
||||
|
||||
|
||||
class MiddlewareConfig(
|
||||
# place the configs in alphabet order
|
||||
CeleryConfig, # Note: CeleryConfig already inherits from DatabaseConfig
|
||||
KeywordStoreConfig,
|
||||
RedisConfig,
|
||||
# configs of storage and storage providers
|
||||
StorageConfig,
|
||||
AliyunOSSStorageConfig,
|
||||
AzureBlobStorageConfig,
|
||||
BaiduOBSStorageConfig,
|
||||
ClickZettaVolumeStorageConfig,
|
||||
GoogleCloudStorageConfig,
|
||||
HuaweiCloudOBSStorageConfig,
|
||||
OCIStorageConfig,
|
||||
OpenDALStorageConfig,
|
||||
S3StorageConfig,
|
||||
SupabaseStorageConfig,
|
||||
TencentCloudCOSStorageConfig,
|
||||
VolcengineTOSStorageConfig,
|
||||
# configs of vdb and vdb providers
|
||||
VectorStoreConfig,
|
||||
AnalyticdbConfig,
|
||||
ChromaConfig,
|
||||
ClickzettaConfig,
|
||||
HuaweiCloudConfig,
|
||||
MilvusConfig,
|
||||
AlibabaCloudMySQLConfig,
|
||||
MyScaleConfig,
|
||||
OpenSearchConfig,
|
||||
OracleConfig,
|
||||
PGVectorConfig,
|
||||
VastbaseVectorConfig,
|
||||
PGVectoRSConfig,
|
||||
QdrantConfig,
|
||||
RelytConfig,
|
||||
TencentVectorDBConfig,
|
||||
TiDBVectorConfig,
|
||||
WeaviateConfig,
|
||||
ElasticsearchConfig,
|
||||
CouchbaseConfig,
|
||||
InternalTestConfig,
|
||||
VikingDBConfig,
|
||||
UpstashConfig,
|
||||
TidbOnQdrantConfig,
|
||||
LindormConfig,
|
||||
OceanBaseVectorConfig,
|
||||
BaiduVectorDBConfig,
|
||||
OpenGaussConfig,
|
||||
TableStoreConfig,
|
||||
DatasetQueueMonitorConfig,
|
||||
MatrixoneConfig,
|
||||
):
|
||||
pass
|
||||
113
api/configs/middleware/cache/redis_config.py
vendored
Normal file
113
api/configs/middleware/cache/redis_config.py
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
from pydantic import Field, NonNegativeInt, PositiveFloat, PositiveInt
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class RedisConfig(BaseSettings):
|
||||
"""
|
||||
Configuration settings for Redis connection
|
||||
"""
|
||||
|
||||
REDIS_HOST: str = Field(
|
||||
description="Hostname or IP address of the Redis server",
|
||||
default="localhost",
|
||||
)
|
||||
|
||||
REDIS_PORT: PositiveInt = Field(
|
||||
description="Port number on which the Redis server is listening",
|
||||
default=6379,
|
||||
)
|
||||
|
||||
REDIS_USERNAME: str | None = Field(
|
||||
description="Username for Redis authentication (if required)",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_PASSWORD: str | None = Field(
|
||||
description="Password for Redis authentication (if required)",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_DB: NonNegativeInt = Field(
|
||||
description="Redis database number to use (0-15)",
|
||||
default=0,
|
||||
)
|
||||
|
||||
REDIS_USE_SSL: bool = Field(
|
||||
description="Enable SSL/TLS for the Redis connection",
|
||||
default=False,
|
||||
)
|
||||
|
||||
REDIS_SSL_CERT_REQS: str = Field(
|
||||
description="SSL certificate requirements (CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED)",
|
||||
default="CERT_NONE",
|
||||
)
|
||||
|
||||
REDIS_SSL_CA_CERTS: str | None = Field(
|
||||
description="Path to the CA certificate file for SSL verification",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_SSL_CERTFILE: str | None = Field(
|
||||
description="Path to the client certificate file for SSL authentication",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_SSL_KEYFILE: str | None = Field(
|
||||
description="Path to the client private key file for SSL authentication",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_USE_SENTINEL: bool | None = Field(
|
||||
description="Enable Redis Sentinel mode for high availability",
|
||||
default=False,
|
||||
)
|
||||
|
||||
REDIS_SENTINELS: str | None = Field(
|
||||
description="Comma-separated list of Redis Sentinel nodes (host:port)",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_SENTINEL_SERVICE_NAME: str | None = Field(
|
||||
description="Name of the Redis Sentinel service to monitor",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_SENTINEL_USERNAME: str | None = Field(
|
||||
description="Username for Redis Sentinel authentication (if required)",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_SENTINEL_PASSWORD: str | None = Field(
|
||||
description="Password for Redis Sentinel authentication (if required)",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_SENTINEL_SOCKET_TIMEOUT: PositiveFloat | None = Field(
|
||||
description="Socket timeout in seconds for Redis Sentinel connections",
|
||||
default=0.1,
|
||||
)
|
||||
|
||||
REDIS_USE_CLUSTERS: bool = Field(
|
||||
description="Enable Redis Clusters mode for high availability",
|
||||
default=False,
|
||||
)
|
||||
|
||||
REDIS_CLUSTERS: str | None = Field(
|
||||
description="Comma-separated list of Redis Clusters nodes (host:port)",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_CLUSTERS_PASSWORD: str | None = Field(
|
||||
description="Password for Redis Clusters authentication (if required)",
|
||||
default=None,
|
||||
)
|
||||
|
||||
REDIS_SERIALIZATION_PROTOCOL: int = Field(
|
||||
description="Redis serialization protocol (RESP) version",
|
||||
default=3,
|
||||
)
|
||||
|
||||
REDIS_ENABLE_CLIENT_SIDE_CACHE: bool = Field(
|
||||
description="Enable client side cache in redis",
|
||||
default=False,
|
||||
)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user