Spaces:
Build error
Build error
Commit ·
9d1035f
1
Parent(s): 801bf2a
added translations and words
Browse files- Pipfile +1 -0
- Pipfile.lock +233 -209
- streamlit_app/chat_page.py +183 -0
- streamlit_app/graph/chains.py +2 -0
- streamlit_app/graph/state.py +3 -2
- streamlit_app/graph/workflow.py +3 -2
- streamlit_app/main.py +9 -122
- streamlit_app/pages/1_vocabulary +0 -0
- streamlit_app/translation_page.py +12 -0
- streamlit_app/util.py +28 -0
- streamlit_app/words_page.py +12 -0
Pipfile
CHANGED
|
@@ -23,6 +23,7 @@ google-cloud-aiplatform = "*"
|
|
| 23 |
langchain-groq = "*"
|
| 24 |
streamlit-chat-widget = "*"
|
| 25 |
streamlit-extras = "*"
|
|
|
|
| 26 |
|
| 27 |
[dev-packages]
|
| 28 |
|
|
|
|
| 23 |
langchain-groq = "*"
|
| 24 |
streamlit-chat-widget = "*"
|
| 25 |
streamlit-extras = "*"
|
| 26 |
+
streamlit-dynamic-filters = "*"
|
| 27 |
|
| 28 |
[dev-packages]
|
| 29 |
|
Pipfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
{
|
| 2 |
"_meta": {
|
| 3 |
"hash": {
|
| 4 |
-
"sha256": "
|
| 5 |
},
|
| 6 |
"pipfile-spec": 6,
|
| 7 |
"requires": {
|
|
@@ -256,11 +256,11 @@
|
|
| 256 |
},
|
| 257 |
"cachetools": {
|
| 258 |
"hashes": [
|
| 259 |
-
"sha256:
|
| 260 |
-
"sha256:
|
| 261 |
],
|
| 262 |
"markers": "python_version >= '3.7'",
|
| 263 |
-
"version": "==5.5.
|
| 264 |
},
|
| 265 |
"catalogue": {
|
| 266 |
"hashes": [
|
|
@@ -1006,19 +1006,19 @@
|
|
| 1006 |
},
|
| 1007 |
"google-cloud-core": {
|
| 1008 |
"hashes": [
|
| 1009 |
-
"sha256:
|
| 1010 |
-
"sha256:
|
| 1011 |
],
|
| 1012 |
"markers": "python_version >= '3.7'",
|
| 1013 |
-
"version": "==2.4.
|
| 1014 |
},
|
| 1015 |
"google-cloud-resource-manager": {
|
| 1016 |
"hashes": [
|
| 1017 |
-
"sha256:
|
| 1018 |
-
"sha256:
|
| 1019 |
],
|
| 1020 |
"markers": "python_version >= '3.7'",
|
| 1021 |
-
"version": "==1.14.
|
| 1022 |
},
|
| 1023 |
"google-cloud-storage": {
|
| 1024 |
"hashes": [
|
|
@@ -1081,11 +1081,11 @@
|
|
| 1081 |
"grpc"
|
| 1082 |
],
|
| 1083 |
"hashes": [
|
| 1084 |
-
"sha256:
|
| 1085 |
-
"sha256:
|
| 1086 |
],
|
| 1087 |
"markers": "python_version >= '3.7'",
|
| 1088 |
-
"version": "==1.
|
| 1089 |
},
|
| 1090 |
"greenlet": {
|
| 1091 |
"hashes": [
|
|
@@ -1663,12 +1663,12 @@
|
|
| 1663 |
},
|
| 1664 |
"langchain-mistralai": {
|
| 1665 |
"hashes": [
|
| 1666 |
-
"sha256:
|
| 1667 |
-
"sha256:
|
| 1668 |
],
|
| 1669 |
"index": "pypi",
|
| 1670 |
"markers": "python_version >= '3.9' and python_version < '4.0'",
|
| 1671 |
-
"version": "==0.2.
|
| 1672 |
},
|
| 1673 |
"langchain-openai": {
|
| 1674 |
"hashes": [
|
|
@@ -1722,11 +1722,11 @@
|
|
| 1722 |
},
|
| 1723 |
"langsmith": {
|
| 1724 |
"hashes": [
|
| 1725 |
-
"sha256:
|
| 1726 |
-
"sha256:
|
| 1727 |
],
|
| 1728 |
"markers": "python_version >= '3.9' and python_version < '4.0'",
|
| 1729 |
-
"version": "==0.3.
|
| 1730 |
},
|
| 1731 |
"language-data": {
|
| 1732 |
"hashes": [
|
|
@@ -2874,91 +2874,107 @@
|
|
| 2874 |
},
|
| 2875 |
"propcache": {
|
| 2876 |
"hashes": [
|
| 2877 |
-
"sha256:
|
| 2878 |
-
"sha256:
|
| 2879 |
-
"sha256:
|
| 2880 |
-
"sha256:
|
| 2881 |
-
"sha256:
|
| 2882 |
-
"sha256:
|
| 2883 |
-
"sha256:
|
| 2884 |
-
"sha256:
|
| 2885 |
-
"sha256:
|
| 2886 |
-
"sha256:
|
| 2887 |
-
"sha256:
|
| 2888 |
-
"sha256:
|
| 2889 |
-
"sha256:
|
| 2890 |
-
"sha256:
|
| 2891 |
-
"sha256:
|
| 2892 |
-
"sha256:
|
| 2893 |
-
"sha256:
|
| 2894 |
-
"sha256:
|
| 2895 |
-
"sha256:
|
| 2896 |
-
"sha256:
|
| 2897 |
-
"sha256:
|
| 2898 |
-
"sha256:
|
| 2899 |
-
"sha256:
|
| 2900 |
-
"sha256:
|
| 2901 |
-
"sha256:
|
| 2902 |
-
"sha256:
|
| 2903 |
-
"sha256:
|
| 2904 |
-
"sha256:
|
| 2905 |
-
"sha256:
|
| 2906 |
-
"sha256:
|
| 2907 |
-
"sha256:
|
| 2908 |
-
"sha256:
|
| 2909 |
-
"sha256:
|
| 2910 |
-
"sha256:
|
| 2911 |
-
"sha256:
|
| 2912 |
-
"sha256:
|
| 2913 |
-
"sha256:
|
| 2914 |
-
"sha256:
|
| 2915 |
-
"sha256:
|
| 2916 |
-
"sha256:
|
| 2917 |
-
"sha256:
|
| 2918 |
-
"sha256:
|
| 2919 |
-
"sha256:
|
| 2920 |
-
"sha256:
|
| 2921 |
-
"sha256:
|
| 2922 |
-
"sha256:
|
| 2923 |
-
"sha256:
|
| 2924 |
-
"sha256:
|
| 2925 |
-
"sha256:
|
| 2926 |
-
"sha256:
|
| 2927 |
-
"sha256:
|
| 2928 |
-
"sha256:
|
| 2929 |
-
"sha256:
|
| 2930 |
-
"sha256:
|
| 2931 |
-
"sha256:
|
| 2932 |
-
"sha256:
|
| 2933 |
-
"sha256:
|
| 2934 |
-
"sha256:
|
| 2935 |
-
"sha256:
|
| 2936 |
-
"sha256:
|
| 2937 |
-
"sha256:
|
| 2938 |
-
"sha256:
|
| 2939 |
-
"sha256:
|
| 2940 |
-
"sha256:
|
| 2941 |
-
"sha256:
|
| 2942 |
-
"sha256:
|
| 2943 |
-
"sha256:
|
| 2944 |
-
"sha256:
|
| 2945 |
-
"sha256:
|
| 2946 |
-
"sha256:
|
| 2947 |
-
"sha256:
|
| 2948 |
-
"sha256:
|
| 2949 |
-
"sha256:
|
| 2950 |
-
"sha256:
|
| 2951 |
-
"sha256:
|
| 2952 |
-
"sha256:
|
| 2953 |
-
"sha256:
|
| 2954 |
-
"sha256:
|
| 2955 |
-
"sha256:
|
| 2956 |
-
"sha256:
|
| 2957 |
-
"sha256:
|
| 2958 |
-
"sha256:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2959 |
],
|
| 2960 |
"markers": "python_version >= '3.9'",
|
| 2961 |
-
"version": "==0.
|
| 2962 |
},
|
| 2963 |
"proto-plus": {
|
| 2964 |
"hashes": [
|
|
@@ -3520,112 +3536,112 @@
|
|
| 3520 |
},
|
| 3521 |
"rpds-py": {
|
| 3522 |
"hashes": [
|
| 3523 |
-
"sha256:
|
| 3524 |
-
"sha256:
|
| 3525 |
-
"sha256:
|
| 3526 |
-
"sha256:
|
| 3527 |
-
"sha256:
|
| 3528 |
-
"sha256:
|
| 3529 |
-
"sha256:
|
| 3530 |
-
"sha256:
|
| 3531 |
-
"sha256:
|
| 3532 |
-
"sha256:
|
| 3533 |
-
"sha256:
|
| 3534 |
-
"sha256:
|
| 3535 |
-
"sha256:
|
| 3536 |
-
"sha256:
|
| 3537 |
-
"sha256:
|
| 3538 |
-
"sha256:
|
| 3539 |
-
"sha256:
|
| 3540 |
-
"sha256:
|
| 3541 |
-
"sha256:
|
| 3542 |
-
"sha256:
|
| 3543 |
-
"sha256:
|
| 3544 |
-
"sha256:
|
| 3545 |
-
"sha256:
|
| 3546 |
-
"sha256:
|
| 3547 |
-
"sha256:
|
| 3548 |
-
"sha256:
|
| 3549 |
-
"sha256:
|
| 3550 |
-
"sha256:
|
| 3551 |
-
"sha256:
|
| 3552 |
-
"sha256:
|
| 3553 |
-
"sha256:
|
| 3554 |
-
"sha256:
|
| 3555 |
-
"sha256:
|
| 3556 |
-
"sha256:
|
| 3557 |
-
"sha256:
|
| 3558 |
-
"sha256:
|
| 3559 |
-
"sha256:
|
| 3560 |
-
"sha256:
|
| 3561 |
-
"sha256:
|
| 3562 |
-
"sha256:
|
| 3563 |
-
"sha256:
|
| 3564 |
-
"sha256:
|
| 3565 |
-
"sha256:
|
| 3566 |
-
"sha256:
|
| 3567 |
-
"sha256:
|
| 3568 |
-
"sha256:
|
| 3569 |
-
"sha256:
|
| 3570 |
-
"sha256:
|
| 3571 |
-
"sha256:
|
| 3572 |
-
"sha256:
|
| 3573 |
-
"sha256:
|
| 3574 |
-
"sha256:
|
| 3575 |
-
"sha256:
|
| 3576 |
-
"sha256:
|
| 3577 |
-
"sha256:
|
| 3578 |
-
"sha256:
|
| 3579 |
-
"sha256:
|
| 3580 |
-
"sha256:
|
| 3581 |
-
"sha256:
|
| 3582 |
-
"sha256:
|
| 3583 |
-
"sha256:
|
| 3584 |
-
"sha256:
|
| 3585 |
-
"sha256:
|
| 3586 |
-
"sha256:
|
| 3587 |
-
"sha256:
|
| 3588 |
-
"sha256:
|
| 3589 |
-
"sha256:
|
| 3590 |
-
"sha256:
|
| 3591 |
-
"sha256:
|
| 3592 |
-
"sha256:
|
| 3593 |
-
"sha256:
|
| 3594 |
-
"sha256:
|
| 3595 |
-
"sha256:
|
| 3596 |
-
"sha256:
|
| 3597 |
-
"sha256:
|
| 3598 |
-
"sha256:
|
| 3599 |
-
"sha256:
|
| 3600 |
-
"sha256:
|
| 3601 |
-
"sha256:
|
| 3602 |
-
"sha256:
|
| 3603 |
-
"sha256:
|
| 3604 |
-
"sha256:
|
| 3605 |
-
"sha256:
|
| 3606 |
-
"sha256:
|
| 3607 |
-
"sha256:
|
| 3608 |
-
"sha256:
|
| 3609 |
-
"sha256:
|
| 3610 |
-
"sha256:
|
| 3611 |
-
"sha256:
|
| 3612 |
-
"sha256:
|
| 3613 |
-
"sha256:
|
| 3614 |
-
"sha256:
|
| 3615 |
-
"sha256:
|
| 3616 |
-
"sha256:
|
| 3617 |
-
"sha256:
|
| 3618 |
-
"sha256:
|
| 3619 |
-
"sha256:
|
| 3620 |
-
"sha256:
|
| 3621 |
-
"sha256:
|
| 3622 |
-
"sha256:
|
| 3623 |
-
"sha256:
|
| 3624 |
-
"sha256:
|
| 3625 |
-
"sha256:
|
| 3626 |
],
|
| 3627 |
"markers": "python_version >= '3.9'",
|
| 3628 |
-
"version": "==0.
|
| 3629 |
},
|
| 3630 |
"rsa": {
|
| 3631 |
"hashes": [
|
|
@@ -4058,12 +4074,12 @@
|
|
| 4058 |
},
|
| 4059 |
"streamlit": {
|
| 4060 |
"hashes": [
|
| 4061 |
-
"sha256:
|
| 4062 |
-
"sha256:
|
| 4063 |
],
|
| 4064 |
"index": "pypi",
|
| 4065 |
"markers": "python_version >= '3.9' and python_full_version != '3.9.7'",
|
| 4066 |
-
"version": "==1.42.
|
| 4067 |
},
|
| 4068 |
"streamlit-camera-input-live": {
|
| 4069 |
"hashes": [
|
|
@@ -4090,6 +4106,14 @@
|
|
| 4090 |
"markers": "python_version >= '3.6'",
|
| 4091 |
"version": "==0.2.0"
|
| 4092 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4093 |
"streamlit-embedcode": {
|
| 4094 |
"hashes": [
|
| 4095 |
"sha256:22a50eb43407bab3d0ed2d4b58e89819da477cd0592ef87edbd373c286712e3a",
|
|
|
|
| 1 |
{
|
| 2 |
"_meta": {
|
| 3 |
"hash": {
|
| 4 |
+
"sha256": "a3dac077dd0eef36684b3dfeec4b9e84e302e95ae8d4038442c70becdeb5a6eb"
|
| 5 |
},
|
| 6 |
"pipfile-spec": 6,
|
| 7 |
"requires": {
|
|
|
|
| 256 |
},
|
| 257 |
"cachetools": {
|
| 258 |
"hashes": [
|
| 259 |
+
"sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4",
|
| 260 |
+
"sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a"
|
| 261 |
],
|
| 262 |
"markers": "python_version >= '3.7'",
|
| 263 |
+
"version": "==5.5.2"
|
| 264 |
},
|
| 265 |
"catalogue": {
|
| 266 |
"hashes": [
|
|
|
|
| 1006 |
},
|
| 1007 |
"google-cloud-core": {
|
| 1008 |
"hashes": [
|
| 1009 |
+
"sha256:7459c3e83de7cb8b9ecfec9babc910efb4314030c56dd798eaad12c426f7d180",
|
| 1010 |
+
"sha256:a4fcb0e2fcfd4bfe963837fad6d10943754fd79c1a50097d68540b6eb3d67f35"
|
| 1011 |
],
|
| 1012 |
"markers": "python_version >= '3.7'",
|
| 1013 |
+
"version": "==2.4.2"
|
| 1014 |
},
|
| 1015 |
"google-cloud-resource-manager": {
|
| 1016 |
"hashes": [
|
| 1017 |
+
"sha256:41e9e546aaa03d5160cdfa2341dbe81ef7596706c300a89b94c429f1f3411f87",
|
| 1018 |
+
"sha256:68340599f85ebf07a6e18487e460ea07cc15e132068f6b188786d01c2cf25518"
|
| 1019 |
],
|
| 1020 |
"markers": "python_version >= '3.7'",
|
| 1021 |
+
"version": "==1.14.1"
|
| 1022 |
},
|
| 1023 |
"google-cloud-storage": {
|
| 1024 |
"hashes": [
|
|
|
|
| 1081 |
"grpc"
|
| 1082 |
],
|
| 1083 |
"hashes": [
|
| 1084 |
+
"sha256:95d38161f4f9af0d9423eed8fb7b64ffd2568c3464eb542ff02c5bfa1953ab3c",
|
| 1085 |
+
"sha256:aaf179b2f81df26dfadac95def3b16a95064c76a5f45f07e4c68a21bb371c4ac"
|
| 1086 |
],
|
| 1087 |
"markers": "python_version >= '3.7'",
|
| 1088 |
+
"version": "==1.68.0"
|
| 1089 |
},
|
| 1090 |
"greenlet": {
|
| 1091 |
"hashes": [
|
|
|
|
| 1663 |
},
|
| 1664 |
"langchain-mistralai": {
|
| 1665 |
"hashes": [
|
| 1666 |
+
"sha256:2e8fc581f6c798b63a53fb8ec389f6e559027af1f3c01dfa3e228bdc58bafa9c",
|
| 1667 |
+
"sha256:957c99104679a4fa74df28f92de50367bd9d2001572a58c522d6761aa439f04b"
|
| 1668 |
],
|
| 1669 |
"index": "pypi",
|
| 1670 |
"markers": "python_version >= '3.9' and python_version < '4.0'",
|
| 1671 |
+
"version": "==0.2.7"
|
| 1672 |
},
|
| 1673 |
"langchain-openai": {
|
| 1674 |
"hashes": [
|
|
|
|
| 1722 |
},
|
| 1723 |
"langsmith": {
|
| 1724 |
"hashes": [
|
| 1725 |
+
"sha256:0e250cca50d1142d8bb00528da573c83bef1c41d78de43b2c032f8d11a308d04",
|
| 1726 |
+
"sha256:460e70d349282cf8d7d503cdf16684db58061d12a6a512daf626257a3218e0fb"
|
| 1727 |
],
|
| 1728 |
"markers": "python_version >= '3.9' and python_version < '4.0'",
|
| 1729 |
+
"version": "==0.3.9"
|
| 1730 |
},
|
| 1731 |
"language-data": {
|
| 1732 |
"hashes": [
|
|
|
|
| 2874 |
},
|
| 2875 |
"propcache": {
|
| 2876 |
"hashes": [
|
| 2877 |
+
"sha256:02df07041e0820cacc8f739510078f2aadcfd3fc57eaeeb16d5ded85c872c89e",
|
| 2878 |
+
"sha256:03acd9ff19021bd0567582ac88f821b66883e158274183b9e5586f678984f8fe",
|
| 2879 |
+
"sha256:03c091bb752349402f23ee43bb2bff6bd80ccab7c9df6b88ad4322258d6960fc",
|
| 2880 |
+
"sha256:07700939b2cbd67bfb3b76a12e1412405d71019df00ca5697ce75e5ef789d829",
|
| 2881 |
+
"sha256:0c3e893c4464ebd751b44ae76c12c5f5c1e4f6cbd6fbf67e3783cd93ad221863",
|
| 2882 |
+
"sha256:119e244ab40f70a98c91906d4c1f4c5f2e68bd0b14e7ab0a06922038fae8a20f",
|
| 2883 |
+
"sha256:11ae6a8a01b8a4dc79093b5d3ca2c8a4436f5ee251a9840d7790dccbd96cb649",
|
| 2884 |
+
"sha256:15010f29fbed80e711db272909a074dc79858c6d28e2915704cfc487a8ac89c6",
|
| 2885 |
+
"sha256:19d36bb351ad5554ff20f2ae75f88ce205b0748c38b146c75628577020351e3c",
|
| 2886 |
+
"sha256:1c8f7d896a16da9455f882870a507567d4f58c53504dc2d4b1e1d386dfe4588a",
|
| 2887 |
+
"sha256:2383a17385d9800b6eb5855c2f05ee550f803878f344f58b6e194de08b96352c",
|
| 2888 |
+
"sha256:24c04f8fbf60094c531667b8207acbae54146661657a1b1be6d3ca7773b7a545",
|
| 2889 |
+
"sha256:2578541776769b500bada3f8a4eeaf944530516b6e90c089aa368266ed70c49e",
|
| 2890 |
+
"sha256:26a67e5c04e3119594d8cfae517f4b9330c395df07ea65eab16f3d559b7068fe",
|
| 2891 |
+
"sha256:2b975528998de037dfbc10144b8aed9b8dd5a99ec547f14d1cb7c5665a43f075",
|
| 2892 |
+
"sha256:2d15bc27163cd4df433e75f546b9ac31c1ba7b0b128bfb1b90df19082466ff57",
|
| 2893 |
+
"sha256:2d913d36bdaf368637b4f88d554fb9cb9d53d6920b9c5563846555938d5450bf",
|
| 2894 |
+
"sha256:3302c5287e504d23bb0e64d2a921d1eb4a03fb93a0a0aa3b53de059f5a5d737d",
|
| 2895 |
+
"sha256:36ca5e9a21822cc1746023e88f5c0af6fce3af3b85d4520efb1ce4221bed75cc",
|
| 2896 |
+
"sha256:3b812b3cb6caacd072276ac0492d249f210006c57726b6484a1e1805b3cfeea0",
|
| 2897 |
+
"sha256:3c6ec957025bf32b15cbc6b67afe233c65b30005e4c55fe5768e4bb518d712f1",
|
| 2898 |
+
"sha256:41de3da5458edd5678b0f6ff66691507f9885f5fe6a0fb99a5d10d10c0fd2d64",
|
| 2899 |
+
"sha256:42924dc0c9d73e49908e35bbdec87adedd651ea24c53c29cac103ede0ea1d340",
|
| 2900 |
+
"sha256:4544699674faf66fb6b4473a1518ae4999c1b614f0b8297b1cef96bac25381db",
|
| 2901 |
+
"sha256:46ed02532cb66612d42ae5c3929b5e98ae330ea0f3900bc66ec5f4862069519b",
|
| 2902 |
+
"sha256:49ea05212a529c2caffe411e25a59308b07d6e10bf2505d77da72891f9a05641",
|
| 2903 |
+
"sha256:4fa0e7c9c3cf7c276d4f6ab9af8adddc127d04e0fcabede315904d2ff76db626",
|
| 2904 |
+
"sha256:507c5357a8d8b4593b97fb669c50598f4e6cccbbf77e22fa9598aba78292b4d7",
|
| 2905 |
+
"sha256:549722908de62aa0b47a78b90531c022fa6e139f9166be634f667ff45632cc92",
|
| 2906 |
+
"sha256:58e6d2a5a7cb3e5f166fd58e71e9a4ff504be9dc61b88167e75f835da5764d07",
|
| 2907 |
+
"sha256:5a16167118677d94bb48bfcd91e420088854eb0737b76ec374b91498fb77a70e",
|
| 2908 |
+
"sha256:5d62c4f6706bff5d8a52fd51fec6069bef69e7202ed481486c0bc3874912c787",
|
| 2909 |
+
"sha256:5fa159dcee5dba00c1def3231c249cf261185189205073bde13797e57dd7540a",
|
| 2910 |
+
"sha256:6032231d4a5abd67c7f71168fd64a47b6b451fbcb91c8397c2f7610e67683810",
|
| 2911 |
+
"sha256:63f26258a163c34542c24808f03d734b338da66ba91f410a703e505c8485791d",
|
| 2912 |
+
"sha256:65a37714b8ad9aba5780325228598a5b16c47ba0f8aeb3dc0514701e4413d7c0",
|
| 2913 |
+
"sha256:67054e47c01b7b349b94ed0840ccae075449503cf1fdd0a1fdd98ab5ddc2667b",
|
| 2914 |
+
"sha256:67dda3c7325691c2081510e92c561f465ba61b975f481735aefdfc845d2cd043",
|
| 2915 |
+
"sha256:6985a593417cdbc94c7f9c3403747335e450c1599da1647a5af76539672464d3",
|
| 2916 |
+
"sha256:6a1948df1bb1d56b5e7b0553c0fa04fd0e320997ae99689488201f19fa90d2e7",
|
| 2917 |
+
"sha256:6b5b7fd6ee7b54e01759f2044f936dcf7dea6e7585f35490f7ca0420fe723c0d",
|
| 2918 |
+
"sha256:6c929916cbdb540d3407c66f19f73387f43e7c12fa318a66f64ac99da601bcdf",
|
| 2919 |
+
"sha256:6f4d7a7c0aff92e8354cceca6fe223973ddf08401047920df0fcb24be2bd5138",
|
| 2920 |
+
"sha256:728af36011bb5d344c4fe4af79cfe186729efb649d2f8b395d1572fb088a996c",
|
| 2921 |
+
"sha256:742840d1d0438eb7ea4280f3347598f507a199a35a08294afdcc560c3739989d",
|
| 2922 |
+
"sha256:75e872573220d1ee2305b35c9813626e620768248425f58798413e9c39741f46",
|
| 2923 |
+
"sha256:794c3dd744fad478b6232289c866c25406ecdfc47e294618bdf1697e69bd64a6",
|
| 2924 |
+
"sha256:7c0fdbdf6983526e269e5a8d53b7ae3622dd6998468821d660d0daf72779aefa",
|
| 2925 |
+
"sha256:7c5f5290799a3f6539cc5e6f474c3e5c5fbeba74a5e1e5be75587746a940d51e",
|
| 2926 |
+
"sha256:7c6e7e4f9167fddc438cd653d826f2222222564daed4116a02a184b464d3ef05",
|
| 2927 |
+
"sha256:7cedd25e5f678f7738da38037435b340694ab34d424938041aa630d8bac42663",
|
| 2928 |
+
"sha256:7e2e068a83552ddf7a39a99488bcba05ac13454fb205c847674da0352602082f",
|
| 2929 |
+
"sha256:8319293e85feadbbfe2150a5659dbc2ebc4afdeaf7d98936fb9a2f2ba0d4c35c",
|
| 2930 |
+
"sha256:8526b0941ec5a40220fc4dfde76aed58808e2b309c03e9fa8e2260083ef7157f",
|
| 2931 |
+
"sha256:8884ba1a0fe7210b775106b25850f5e5a9dc3c840d1ae9924ee6ea2eb3acbfe7",
|
| 2932 |
+
"sha256:8cb625bcb5add899cb8ba7bf716ec1d3e8f7cdea9b0713fa99eadf73b6d4986f",
|
| 2933 |
+
"sha256:8d663fd71491dde7dfdfc899d13a067a94198e90695b4321084c6e450743b8c7",
|
| 2934 |
+
"sha256:8ee1983728964d6070ab443399c476de93d5d741f71e8f6e7880a065f878e0b9",
|
| 2935 |
+
"sha256:997e7b8f173a391987df40f3b52c423e5850be6f6df0dcfb5376365440b56667",
|
| 2936 |
+
"sha256:9be90eebc9842a93ef8335291f57b3b7488ac24f70df96a6034a13cb58e6ff86",
|
| 2937 |
+
"sha256:9ddd49258610499aab83b4f5b61b32e11fce873586282a0e972e5ab3bcadee51",
|
| 2938 |
+
"sha256:9ecde3671e62eeb99e977f5221abcf40c208f69b5eb986b061ccec317c82ebd0",
|
| 2939 |
+
"sha256:9ff4e9ecb6e4b363430edf2c6e50173a63e0820e549918adef70515f87ced19a",
|
| 2940 |
+
"sha256:a254537b9b696ede293bfdbc0a65200e8e4507bc9f37831e2a0318a9b333c85c",
|
| 2941 |
+
"sha256:a2b9bf8c79b660d0ca1ad95e587818c30ccdb11f787657458d6f26a1ea18c568",
|
| 2942 |
+
"sha256:a61a68d630e812b67b5bf097ab84e2cd79b48c792857dc10ba8a223f5b06a2af",
|
| 2943 |
+
"sha256:a7080b0159ce05f179cfac592cda1a82898ca9cd097dacf8ea20ae33474fbb25",
|
| 2944 |
+
"sha256:a8fd93de4e1d278046345f49e2238cdb298589325849b2645d4a94c53faeffc5",
|
| 2945 |
+
"sha256:a94ffc66738da99232ddffcf7910e0f69e2bbe3a0802e54426dbf0714e1c2ffe",
|
| 2946 |
+
"sha256:aa806bbc13eac1ab6291ed21ecd2dd426063ca5417dd507e6be58de20e58dfcf",
|
| 2947 |
+
"sha256:b0c1a133d42c6fc1f5fbcf5c91331657a1ff822e87989bf4a6e2e39b818d0ee9",
|
| 2948 |
+
"sha256:b58229a844931bca61b3a20efd2be2a2acb4ad1622fc026504309a6883686fbf",
|
| 2949 |
+
"sha256:bb2f144c6d98bb5cbc94adeb0447cfd4c0f991341baa68eee3f3b0c9c0e83767",
|
| 2950 |
+
"sha256:be90c94570840939fecedf99fa72839aed70b0ced449b415c85e01ae67422c90",
|
| 2951 |
+
"sha256:bf0d9a171908f32d54f651648c7290397b8792f4303821c42a74e7805bfb813c",
|
| 2952 |
+
"sha256:bf15fc0b45914d9d1b706f7c9c4f66f2b7b053e9517e40123e137e8ca8958b3d",
|
| 2953 |
+
"sha256:bf4298f366ca7e1ad1d21bbb58300a6985015909964077afd37559084590c929",
|
| 2954 |
+
"sha256:c441c841e82c5ba7a85ad25986014be8d7849c3cfbdb6004541873505929a74e",
|
| 2955 |
+
"sha256:cacea77ef7a2195f04f9279297684955e3d1ae4241092ff0cfcef532bb7a1c32",
|
| 2956 |
+
"sha256:cd54895e4ae7d32f1e3dd91261df46ee7483a735017dc6f987904f194aa5fd14",
|
| 2957 |
+
"sha256:d1323cd04d6e92150bcc79d0174ce347ed4b349d748b9358fd2e497b121e03c8",
|
| 2958 |
+
"sha256:d383bf5e045d7f9d239b38e6acadd7b7fdf6c0087259a84ae3475d18e9a2ae8b",
|
| 2959 |
+
"sha256:d3e7420211f5a65a54675fd860ea04173cde60a7cc20ccfbafcccd155225f8bc",
|
| 2960 |
+
"sha256:d8074c5dd61c8a3e915fa8fc04754fa55cfa5978200d2daa1e2d4294c1f136aa",
|
| 2961 |
+
"sha256:df03cd88f95b1b99052b52b1bb92173229d7a674df0ab06d2b25765ee8404bce",
|
| 2962 |
+
"sha256:e45377d5d6fefe1677da2a2c07b024a6dac782088e37c0b1efea4cfe2b1be19b",
|
| 2963 |
+
"sha256:e53d19c2bf7d0d1e6998a7e693c7e87300dd971808e6618964621ccd0e01fe4e",
|
| 2964 |
+
"sha256:e560fd75aaf3e5693b91bcaddd8b314f4d57e99aef8a6c6dc692f935cc1e6bbf",
|
| 2965 |
+
"sha256:ec5060592d83454e8063e487696ac3783cc48c9a329498bafae0d972bc7816c9",
|
| 2966 |
+
"sha256:ecc2920630283e0783c22e2ac94427f8cca29a04cfdf331467d4f661f4072dac",
|
| 2967 |
+
"sha256:ed7161bccab7696a473fe7ddb619c1d75963732b37da4618ba12e60899fefe4f",
|
| 2968 |
+
"sha256:ee0bd3a7b2e184e88d25c9baa6a9dc609ba25b76daae942edfb14499ac7ec374",
|
| 2969 |
+
"sha256:ee25f1ac091def37c4b59d192bbe3a206298feeb89132a470325bf76ad122a1e",
|
| 2970 |
+
"sha256:efa44f64c37cc30c9f05932c740a8b40ce359f51882c70883cc95feac842da4d",
|
| 2971 |
+
"sha256:f47d52fd9b2ac418c4890aad2f6d21a6b96183c98021f0a48497a904199f006e",
|
| 2972 |
+
"sha256:f857034dc68d5ceb30fb60afb6ff2103087aea10a01b613985610e007053a121",
|
| 2973 |
+
"sha256:fb91d20fa2d3b13deea98a690534697742029f4fb83673a3501ae6e3746508b5",
|
| 2974 |
+
"sha256:fddb8870bdb83456a489ab67c6b3040a8d5a55069aa6f72f9d872235fbc52f54"
|
| 2975 |
],
|
| 2976 |
"markers": "python_version >= '3.9'",
|
| 2977 |
+
"version": "==0.3.0"
|
| 2978 |
},
|
| 2979 |
"proto-plus": {
|
| 2980 |
"hashes": [
|
|
|
|
| 3536 |
},
|
| 3537 |
"rpds-py": {
|
| 3538 |
"hashes": [
|
| 3539 |
+
"sha256:04882cc4adbdc2778dd49f5ed71b1d9ab43349c45cde7e461456d0432d7d323e",
|
| 3540 |
+
"sha256:048dc18eb2cc83a67bec07c6f9ffe1da83fb94d5af6cc32e333248013576dc4c",
|
| 3541 |
+
"sha256:04d7fc114ca57d25f0d8c324d2d0ddd675df92b2f7da8284f806711c25fe00f7",
|
| 3542 |
+
"sha256:06962dc9462fe97d0355e01525ebafcd317316e80e335272751a1857b7bdec97",
|
| 3543 |
+
"sha256:0b3b3553d9216153eb3f8cf0d369b0e31e83912e50835ee201794d9b410e227f",
|
| 3544 |
+
"sha256:0e1ece346395e127a8024e5c13d304bdd7dbd094e05329a2f4f27ea1fbe14aa3",
|
| 3545 |
+
"sha256:0edf94328feaae49a96caa3459784614365708c38f610316601b996e5f085be1",
|
| 3546 |
+
"sha256:0f74d8babe0139b8ee30c24c65040cdad81e00547e7eefe43d13b31da9d2bbc5",
|
| 3547 |
+
"sha256:1191bf5975a0b001c161a62d5833a6b2f838b10ff19e203910dd6210e88d89f5",
|
| 3548 |
+
"sha256:16826a5346e293bedf0acd5c2f4c8e05415b1970aa3cc448eea19f02724dd453",
|
| 3549 |
+
"sha256:174602fe067a5b622ce47a5b09022e0128c526a308354abd9cc4bf0391f3cfd2",
|
| 3550 |
+
"sha256:1b36e993b95f0744a94a5add7624cfaf77b91805819c1a960026bc452f95841e",
|
| 3551 |
+
"sha256:1bda53037dcac2465d0b2067a7129283eb823c7e0175c0991ea7e28ae7593555",
|
| 3552 |
+
"sha256:1e0fb88357f59c70b8595bc8e5887be35636e646a9ab519c1876063159812cf6",
|
| 3553 |
+
"sha256:1fa3476c9845152091f62edca5e543df77fc0fc2e83027c389fa4c4f52633369",
|
| 3554 |
+
"sha256:210aa7c699cc61320630c4be33348d9bfef4785fabd6f33ea6be711d4eb45f1f",
|
| 3555 |
+
"sha256:2e27dfcea222c81cd8bece98a73ebb8ca69870de01dc27002d433ad06e55dd8b",
|
| 3556 |
+
"sha256:312981d4da5dc463baeca3ba23a3e74dc7a48a4500d267566d8e9c0680ac54c6",
|
| 3557 |
+
"sha256:3154e132e685f907813ace8701721ad4420244f6e07afc2a61763894e8a22961",
|
| 3558 |
+
"sha256:35336790b4d70c31a59c922d7d603010fe13c5ff56a1dce14849b6bb6a2ad4b9",
|
| 3559 |
+
"sha256:374d2c0067f5ef18e73bfb2a555ef0b8f2b01f5b653a3eca68e9fbde5625c305",
|
| 3560 |
+
"sha256:377ba75ebce48d5df69b0ab2e3333cd86f6acfee8cf0a2c286af4e32e4a8b499",
|
| 3561 |
+
"sha256:37af2ee37efeb0a09463124cc1e560192cc751c2a5ae650effb36469e1f17dc8",
|
| 3562 |
+
"sha256:3adc0b2e71e62fde524389634df4b53f4d16d5f3830ab35c1e511d50b75674f6",
|
| 3563 |
+
"sha256:3b147c0d49de69dac573c8e05a5f7edf18a83136bf8c98e2cd3e87dafee184e5",
|
| 3564 |
+
"sha256:3cb0ddf0ecc705f8f6dfe858e703c1b9b3ea240b1f56e33316e89dc6c2994ac0",
|
| 3565 |
+
"sha256:41f6bb731bfcbd886bd6399717971dd881d759ea831b9f513bc57a10f52c7d53",
|
| 3566 |
+
"sha256:516cec4c1a45bed3c417c402a2f52515561a1d8e578ff675347dcf4180636cca",
|
| 3567 |
+
"sha256:5211b646a0beb1f8f4b1cde8c7c073f9d6ca3439d5a93ea0874c8ece6cab66a9",
|
| 3568 |
+
"sha256:55fe404f2826c5821661e787dffcb113e682d9ff011d9d39a28c992312d7029b",
|
| 3569 |
+
"sha256:56bbf34e129551004e4952db16087bb4912e8cf4fa335ad5c70e126666f97788",
|
| 3570 |
+
"sha256:5bc79d528e65c877a5e254ddad394d51797bc6bba44c9aa436f61b94448d5f87",
|
| 3571 |
+
"sha256:5e549c7ef1ae42b79878bff27c33363b2de77f23de2f4c19541ef69ae4c11ac7",
|
| 3572 |
+
"sha256:5ff50d7a5b206af7ac8342255ae3ab6c6c86d86520f4413bf9d2561bf4f1ffa1",
|
| 3573 |
+
"sha256:6097538c81a94d4432de645a20bbbbfa7a0eb52c6dcb7370feda18eb8eed61de",
|
| 3574 |
+
"sha256:62d8fe953110a98a118cacdc1ca79fe344a946c72a2d19fa7d17d0b2ace58f3d",
|
| 3575 |
+
"sha256:64ba22924340d7e200b48befcc75ff2379301902381ca4ebbfec81d80c5216b5",
|
| 3576 |
+
"sha256:6593dc9b225f8fc900df43c40625c998b8fa99ba78ec69bcd073fe3fb1018a5d",
|
| 3577 |
+
"sha256:670c29a74f8e632aa58b48425b12d026703af1ea5e3b131adbb2601c7ae03108",
|
| 3578 |
+
"sha256:6893a88925972635c843eb02a113d7aabacd386c05d54f2fda29125befbc1b05",
|
| 3579 |
+
"sha256:72a0dd4d599fadaf519d4e4b8092e5d7940057c61e70f9f06c1d004a47895204",
|
| 3580 |
+
"sha256:75d5a2c5629e3582aa73c3a11ac0a3dd454e86cc70188a9b6e2ed51889c331dd",
|
| 3581 |
+
"sha256:7730442bb642748dddfbe1de24275bf0cdbae938c68e1c38e0a9d285a056e17d",
|
| 3582 |
+
"sha256:77c3e51d994c39227facc742001b7be98c2ad634f8a0cf2ed08c30cf2f7f9249",
|
| 3583 |
+
"sha256:784a79474675ee12cab90241f3df328129e15443acfea618df069a7d67d12abb",
|
| 3584 |
+
"sha256:784d2ef454b42451a1efca40f888105536b6d2374d155c14f51831980c384461",
|
| 3585 |
+
"sha256:7c2ba6b0f4eccf3738a03878c13f18037931c947d70a75231448954e42884feb",
|
| 3586 |
+
"sha256:7cca21adfefe5a2237f1e64d769c1ed7ccdc2515d376d1774e7fbe918e03cd8c",
|
| 3587 |
+
"sha256:7cd550ee493adab33e95ce00cb42529b0435c916ed949d298887ee9acdcd3f2f",
|
| 3588 |
+
"sha256:8212c5d25514386a14a032fde7f7f0383a88355f93a1d0fde453f38ebdc43a1b",
|
| 3589 |
+
"sha256:827b334702a04df2e1b7fe85ed3784512f6fd3d3a40259180db0c8fdeb20b37f",
|
| 3590 |
+
"sha256:83f71359d81cfb3bd39522045d08a7031036fb0b1b0a43a066c094cc52a9fd00",
|
| 3591 |
+
"sha256:8529a28b0dffe7e0c56537912ab8594df7b71b24032622aadce33a2643beada5",
|
| 3592 |
+
"sha256:87b8e416f55f2be671d5dbf55e7517a8144f8b926609d2f1427f8310c95e4e13",
|
| 3593 |
+
"sha256:8c708f5c2d604e0acc9489df3ea879f4fc75030dfa590668fd959fda34fcc0b8",
|
| 3594 |
+
"sha256:903344afbc46dfb488a73a7eeb9c14d8484c6d80eb402e6737a520a55327f26c",
|
| 3595 |
+
"sha256:947db56d8ee2f567a597f7484ac6c8cb94529181eaa498bd9c196079c395c69f",
|
| 3596 |
+
"sha256:95d7ffa91b423c974fb50384561736aa16f5fb7a8592d81b2ca5fcaf8afd69a0",
|
| 3597 |
+
"sha256:96f0261ef2a45c9dc48c4105ab798e8ba1c0c912ae5c59c2d9f899242cf3ed79",
|
| 3598 |
+
"sha256:9901d57e8dc3b7245d349a255af097e309602986a604d073414a3826bc5c2cdd",
|
| 3599 |
+
"sha256:9b263adb8e54bc7a5b2b8feebe99ff79f1067037a9178989e9341ea76e935706",
|
| 3600 |
+
"sha256:9e66aaa24e0dc3cfaf63a8fc2810ae296792c18fb4cfb99868f52e7c598911b6",
|
| 3601 |
+
"sha256:a20fa5cd1cb074c145c3955732cfc3eca19bef16d425b32f14c3d275230110fb",
|
| 3602 |
+
"sha256:a49aeb989ee5e057137910059610bfa8f571a4af674404ce05c59862bbeeecbe",
|
| 3603 |
+
"sha256:a8983725590ddeb62acf7e585badb7354fa71e3d08d3326eaac6886aa91e526c",
|
| 3604 |
+
"sha256:aa9d67acbcf2cb11acd44da7d41a0495b7799a32fb7ec9a6bc0b14d8552e00fb",
|
| 3605 |
+
"sha256:aae64cb7faaecd5d36ebcb99dc3f0196f4357586e095630207047f35183431fb",
|
| 3606 |
+
"sha256:ac766c8127ee9c9a72f1a6ad6b4291e5acfd14d9685964b771bf8820fe65aeed",
|
| 3607 |
+
"sha256:aef4f05059aa6f5f22c76f23f45b6908da4871589c9efb882e58c33ebf8f4c4f",
|
| 3608 |
+
"sha256:b1eb4757f9c9f96e26a420db97c3ecaa97568961ce718f1f89e03ce1f59ec12e",
|
| 3609 |
+
"sha256:b233a2bdb15dbb4c05b0c79c94d2367a05d0c54351b76c74fdc81aae023a2df8",
|
| 3610 |
+
"sha256:b8b7b4e5cc5a981a147e1602cf4bd517e57617f9a4c7e96a22a27e4d18de2523",
|
| 3611 |
+
"sha256:bba83d703c6728a3a2676a14a9649d7cc87b9e4654293f13f8d4b4d7007d6383",
|
| 3612 |
+
"sha256:c1523dae0321bf21d0e4151a7438c9bd26c0b712602fb56116efd4ee5b463b5d",
|
| 3613 |
+
"sha256:c23cbff21154951731866358e983d01d536a2c0f60f2765be85f00682eae60d9",
|
| 3614 |
+
"sha256:c46247ea1382758987417b9c47b05d32dc7f971cd2553e7b3088a76ad48c5a67",
|
| 3615 |
+
"sha256:c5e3c7d7cdbbd450acb62c5d29d39ea6d5f8584019d391947d73fb998f54acc5",
|
| 3616 |
+
"sha256:c6c98bde8ec93dd4e19c413e3ac089fb0ff731da54bab8aaf1e8263f55f01406",
|
| 3617 |
+
"sha256:c79544d0be2c7c3891fe448bc006666410bc219fdf29bf35990f0ea88ff72b64",
|
| 3618 |
+
"sha256:c7fee301c715ce2fed4c0620a65dff12686002061cd38c6f11a427f64bd0c8ff",
|
| 3619 |
+
"sha256:ce1a2fe8eea2e956a11112ba426b9be79b2da65e27a533cf152ba8e9882bf9be",
|
| 3620 |
+
"sha256:ce1c4277d7f235faa2f31f1aad82e3ab3caeb66f13c97413e738592ec7fef7e0",
|
| 3621 |
+
"sha256:cec9feef63e213ec9f9cac44d8454643983c422b318b67059da796f55780b4d4",
|
| 3622 |
+
"sha256:cf06007aca17ea31069adc8396d718b714559fd7f7db8302399b4697c4564fec",
|
| 3623 |
+
"sha256:d1f3baf652aeb91775eb3343535890156b07e0cbb2a7b72651f4bbaf7323d40f",
|
| 3624 |
+
"sha256:d2e0cace96976f4e86fc3c51cb3fba24225976e26341e958be42f3d8d0a634ee",
|
| 3625 |
+
"sha256:d5504bd1d637e7633d953418520d9b109b0d8a419153a56537938adf068da9d5",
|
| 3626 |
+
"sha256:d59582ddbeabf217d1b815b60acaec9ff5e2ded79e440c3b3e4ddc970ff59160",
|
| 3627 |
+
"sha256:d8c754d4d021a010df79e0ce10b2dbf0ed12997ff4e508274337fdceed32275f",
|
| 3628 |
+
"sha256:e17402e8f3b49a7ec22e7ef7bbbe0ac0797fcbf0f1ba844811668ef24b37fc9d",
|
| 3629 |
+
"sha256:e2c26f1e0ebbe85dc275816cd53fcbb225aaf7923a4d48b7cdf8b8eb6291e5ae",
|
| 3630 |
+
"sha256:e5305ee98053a0f0155e4e5f9fe4d196fa2e43ae7c2ecc61534babf6390511d9",
|
| 3631 |
+
"sha256:eb841a8e1c2615dfc721d3c28fe81e6300e819a01d3305ecd7f75c7d58c31b2b",
|
| 3632 |
+
"sha256:f1023b1de400ef9d3d9f8f9e88f3f5d8c66c26e48c3f83cffe83bd423def8d81",
|
| 3633 |
+
"sha256:f119176191c359cb33ff8064b242874bfb1352761379bca8e6ccb74a6141db27",
|
| 3634 |
+
"sha256:f27867c24f0a81065ef94e575dbb1846867257994ac41ebbe5e66c6a3976ac73",
|
| 3635 |
+
"sha256:f46d53a6a37383eca41a111df0e9993399a60e9e1e2110f467fddc5de4a43b68",
|
| 3636 |
+
"sha256:f482453aeebdae7774781e8c9b1884e0df0bdb1c61f330f95c63a401dfc2fc31",
|
| 3637 |
+
"sha256:f4b699830ced68db4294e2e47f25a4ff935a54244814b76fa683e0b857391e3e",
|
| 3638 |
+
"sha256:f9c49366f19c06ce31af1312ae4718292081e73f454a56705e7d56acfd25ac1e",
|
| 3639 |
+
"sha256:fa93e2460b7791872a5dd355438b854a5d9ab317107380c2143d94a1ca5b10a7",
|
| 3640 |
+
"sha256:fbeade9f0284a5c5965f8a4805ef1864e5fb4bc4c5d3d8dd60c5fd2a44f0b51a",
|
| 3641 |
+
"sha256:ffac3b13182dc1bf648cde2982148dc9caf60f3eedec7ae639e05636389ebf5d"
|
| 3642 |
],
|
| 3643 |
"markers": "python_version >= '3.9'",
|
| 3644 |
+
"version": "==0.23.0"
|
| 3645 |
},
|
| 3646 |
"rsa": {
|
| 3647 |
"hashes": [
|
|
|
|
| 4074 |
},
|
| 4075 |
"streamlit": {
|
| 4076 |
"hashes": [
|
| 4077 |
+
"sha256:62026dbdcb482790933f658b096d7dd58fa70da89c1f06fbc3658b91dcd4dab2",
|
| 4078 |
+
"sha256:e2516c7fcd17a11a85cc1999fae58ace0a6458e2b4c1a411ed3d75b1aee2eb93"
|
| 4079 |
],
|
| 4080 |
"index": "pypi",
|
| 4081 |
"markers": "python_version >= '3.9' and python_full_version != '3.9.7'",
|
| 4082 |
+
"version": "==1.42.2"
|
| 4083 |
},
|
| 4084 |
"streamlit-camera-input-live": {
|
| 4085 |
"hashes": [
|
|
|
|
| 4106 |
"markers": "python_version >= '3.6'",
|
| 4107 |
"version": "==0.2.0"
|
| 4108 |
},
|
| 4109 |
+
"streamlit-dynamic-filters": {
|
| 4110 |
+
"hashes": [
|
| 4111 |
+
"sha256:0b2d6db612f35bf10e18f19de137c65b051d38ed000a6e3bfe973370b142b42d",
|
| 4112 |
+
"sha256:ef65029ec249a3681390711b88fcad339bb3a4ce1e13857443d4553592e23cba"
|
| 4113 |
+
],
|
| 4114 |
+
"index": "pypi",
|
| 4115 |
+
"version": "==0.1.9"
|
| 4116 |
+
},
|
| 4117 |
"streamlit-embedcode": {
|
| 4118 |
"hashes": [
|
| 4119 |
"sha256:22a50eb43407bab3d0ed2d4b58e89819da477cd0592ef87edbd373c286712e3a",
|
streamlit_app/chat_page.py
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
from streamlit_chat_widget import chat_input_widget
|
| 3 |
+
from graph.workflow import create_workflow
|
| 4 |
+
import pandas as pd
|
| 5 |
+
|
| 6 |
+
def create_translation_word_dfs(result):
|
| 7 |
+
"""
|
| 8 |
+
Create translation and word dataframes from the translation options
|
| 9 |
+
Args:
|
| 10 |
+
result: The result from the workflow
|
| 11 |
+
Returns:
|
| 12 |
+
translation_df: dataframe from the translation options
|
| 13 |
+
word_df: dataframe from the words of the translation options
|
| 14 |
+
"""
|
| 15 |
+
# Extract target language
|
| 16 |
+
target_language = result["translation"]["target_language"]
|
| 17 |
+
source_language = result["translation"]["source_language"]
|
| 18 |
+
# Create list to hold rows for DataFrame
|
| 19 |
+
translation_data = []
|
| 20 |
+
word_data = []
|
| 21 |
+
for option in result["translation"]["options"]:
|
| 22 |
+
translation_data.append({
|
| 23 |
+
"Translation_Language": target_language,
|
| 24 |
+
"Source_Language": source_language,
|
| 25 |
+
"Translation": option["translation"],
|
| 26 |
+
"Context": option["description"]
|
| 27 |
+
})
|
| 28 |
+
# For each word in the translation, create a row with translation details
|
| 29 |
+
for word in option["words"]:
|
| 30 |
+
word_data.append({
|
| 31 |
+
"Translation_Language": target_language,
|
| 32 |
+
"Source_Language": source_language,
|
| 33 |
+
"Original_Word": word["original_word"],
|
| 34 |
+
"Translated_Word": word["translated_word"]
|
| 35 |
+
})
|
| 36 |
+
|
| 37 |
+
# Create DataFrame
|
| 38 |
+
df_translation = pd.DataFrame(translation_data)
|
| 39 |
+
df_words = pd.DataFrame(word_data)
|
| 40 |
+
return df_translation, df_words
|
| 41 |
+
|
| 42 |
+
def merge_translation_word_dfs(session_state, new_translation_df, new_word_df):
|
| 43 |
+
"""
|
| 44 |
+
Merge the translation and word dataframes
|
| 45 |
+
Args:
|
| 46 |
+
session_state: The session state
|
| 47 |
+
new_translation_df: The new translation dataframe
|
| 48 |
+
new_word_df: The new word dataframe
|
| 49 |
+
Returns:
|
| 50 |
+
merged_translation_df: The merged translation dataframe
|
| 51 |
+
merged_word_df: The merged word dataframe
|
| 52 |
+
"""
|
| 53 |
+
merged_translation_df = None
|
| 54 |
+
merged_word_df = None
|
| 55 |
+
# If existing dataframes exist, merge with new ones
|
| 56 |
+
if hasattr(session_state, 'translation_df') and session_state.translation_df is not None:
|
| 57 |
+
# Merge translation dataframes, dropping duplicates based on language
|
| 58 |
+
merged_translation_df = pd.concat([
|
| 59 |
+
session_state.translation_df,
|
| 60 |
+
new_translation_df
|
| 61 |
+
]).drop_duplicates(subset=['Translation_Language', 'Source_Language', 'Translation'])
|
| 62 |
+
else:
|
| 63 |
+
merged_translation_df = new_translation_df
|
| 64 |
+
|
| 65 |
+
if hasattr(st.session_state, 'word_df') and st.session_state.word_df is not None:
|
| 66 |
+
# Merge word dataframes, dropping duplicates based on language
|
| 67 |
+
merged_word_df = pd.concat([
|
| 68 |
+
session_state.word_df,
|
| 69 |
+
new_word_df
|
| 70 |
+
]).drop_duplicates(subset=['Translation_Language', 'Source_Language', 'Original_Word', 'Translated_Word'])
|
| 71 |
+
else:
|
| 72 |
+
merged_word_df = new_word_df
|
| 73 |
+
|
| 74 |
+
return merged_translation_df, merged_word_df
|
| 75 |
+
|
| 76 |
+
def display_translation_options(translation_options):
|
| 77 |
+
"""
|
| 78 |
+
Display the translation options
|
| 79 |
+
Args:
|
| 80 |
+
translation_options: The translation options
|
| 81 |
+
"""
|
| 82 |
+
for idx, option in enumerate(translation_options):
|
| 83 |
+
translation_text = option['translation']
|
| 84 |
+
audio_file_path = option['audio_file_path']
|
| 85 |
+
context_text = option['description']
|
| 86 |
+
translation_number = idx + 1
|
| 87 |
+
translation_message = f"**Translation {translation_number}:** {translation_text}\n*Context:* {context_text}"
|
| 88 |
+
st.session_state.messages.append({"role": "assistant", "content": translation_message, "audio_file_path": audio_file_path})
|
| 89 |
+
st.markdown(f"**Translation {translation_number}:** {translation_text}")
|
| 90 |
+
st.markdown(f"*Context:* {context_text}")
|
| 91 |
+
st.audio(audio_file_path)
|
| 92 |
+
# os.remove(audio_file_path)
|
| 93 |
+
|
| 94 |
+
def process_chat_message(input_text: str, is_audio: bool = False) -> None:
|
| 95 |
+
"""
|
| 96 |
+
Process a chat message and update the chat interface with the response.
|
| 97 |
+
|
| 98 |
+
Args:
|
| 99 |
+
input_text: The text to process (either direct input or transcribed audio)
|
| 100 |
+
is_audio: Boolean indicating if the input was from audio
|
| 101 |
+
"""
|
| 102 |
+
# Add user message to chat history
|
| 103 |
+
display_text = f"🎤 *Audio message*:\n{input_text}" if is_audio else input_text
|
| 104 |
+
st.session_state.messages.append({"role": "user", "content": display_text})
|
| 105 |
+
|
| 106 |
+
with st.chat_message("user"):
|
| 107 |
+
st.markdown(display_text)
|
| 108 |
+
if is_audio:
|
| 109 |
+
st.markdown(input_text) # Show transcription below audio message
|
| 110 |
+
|
| 111 |
+
# Process through workflow
|
| 112 |
+
workflow = create_workflow(llm=st.session_state.llm,tts_model=st.session_state.tts)
|
| 113 |
+
app_workflow = workflow.compile()
|
| 114 |
+
result = app_workflow.invoke({"input": input_text})
|
| 115 |
+
|
| 116 |
+
# Display assistant response
|
| 117 |
+
with st.chat_message("assistant"):
|
| 118 |
+
if "error" in result and result["error"] is not None:
|
| 119 |
+
st.markdown("An Error occurred while processing your message. Please try again.")
|
| 120 |
+
st.markdown(result["error"])
|
| 121 |
+
elif "chat_resp" in result and result["chat_resp"] is not None:
|
| 122 |
+
st.markdown(result["chat_resp"])
|
| 123 |
+
st.session_state.messages.append({"role": "assistant", "content": result["chat_resp"]})
|
| 124 |
+
elif (result["translation"] is not None):
|
| 125 |
+
# Convert translation data to DataFrame
|
| 126 |
+
new_translation_df, new_word_df = create_translation_word_dfs(result)
|
| 127 |
+
# Merge with existing dataframes
|
| 128 |
+
merged_translation_df, merged_word_df = merge_translation_word_dfs(st.session_state, new_translation_df, new_word_df)
|
| 129 |
+
# Update session state
|
| 130 |
+
st.session_state.translation_df = merged_translation_df
|
| 131 |
+
st.session_state.word_df = merged_word_df
|
| 132 |
+
display_translation_options(result["translation"]["options"])
|
| 133 |
+
|
| 134 |
+
def display_chat_interface():
|
| 135 |
+
"""
|
| 136 |
+
Display the chat interface
|
| 137 |
+
"""
|
| 138 |
+
# Display chat messages
|
| 139 |
+
for message in st.session_state.messages:
|
| 140 |
+
with st.chat_message(message["role"]):
|
| 141 |
+
st.markdown(message["content"])
|
| 142 |
+
|
| 143 |
+
# # Create columns for text and audio input
|
| 144 |
+
# col1, col2 = st.columns([4, 1])
|
| 145 |
+
|
| 146 |
+
# with col1:
|
| 147 |
+
# prompt = st.chat_input("Type your message here...")
|
| 148 |
+
|
| 149 |
+
# with col2:
|
| 150 |
+
# audio = st.audio_input("🎤")
|
| 151 |
+
# with bottom():
|
| 152 |
+
user_input = chat_input_widget()
|
| 153 |
+
# with st.chat_message("user"):
|
| 154 |
+
|
| 155 |
+
|
| 156 |
+
if user_input:
|
| 157 |
+
# Process text input
|
| 158 |
+
if "text" in user_input:
|
| 159 |
+
process_chat_message(user_input['text'])
|
| 160 |
+
elif "audioFile" in user_input: # Process audio input
|
| 161 |
+
chat_message_user= st.chat_message("user")
|
| 162 |
+
chat_message_user.markdown("🎤 *Audio message*")
|
| 163 |
+
audio =bytes(user_input["audioFile"])
|
| 164 |
+
chat_message_user.audio(audio)
|
| 165 |
+
with st.spinner("Transcribing audio..."):
|
| 166 |
+
# chat_message_user.markdown("Transcribing audio...")
|
| 167 |
+
try:
|
| 168 |
+
transcription = st.session_state.stt.transcribe(audio)
|
| 169 |
+
print(f"transcription: {transcription}")
|
| 170 |
+
if transcription and transcription["text"] and len(transcription["text"]) > 0:
|
| 171 |
+
process_chat_message(transcription["text"], is_audio=True)
|
| 172 |
+
else:
|
| 173 |
+
chat_message_user.markdown("Transcribing resulted in an empty text, try again")
|
| 174 |
+
except Exception as e:
|
| 175 |
+
chat_message_user.error(f"Error transcribing audio: {str(e)}")
|
| 176 |
+
chat_message_user.markdown("Failed to transcribe audio, try again")
|
| 177 |
+
|
| 178 |
+
# Check for API key before displaying chat interface
|
| 179 |
+
if "llm" in st.session_state:
|
| 180 |
+
# Main chat interface
|
| 181 |
+
display_chat_interface()
|
| 182 |
+
else:
|
| 183 |
+
st.info("Please configure your GROQ API key to start chatting.")
|
streamlit_app/graph/chains.py
CHANGED
|
@@ -82,6 +82,7 @@ class TranslationOption(BaseModel):
|
|
| 82 |
class TranslationResponse(BaseModel):
|
| 83 |
# source_text: str = Field(description="Original text")
|
| 84 |
target_language: str = Field(description="Target language")
|
|
|
|
| 85 |
options: List[TranslationOption] = Field(description="List of translation options")
|
| 86 |
|
| 87 |
# def parse_translation_response(result) -> TranslationResponse:
|
|
@@ -116,6 +117,7 @@ def create_translate_chain(llm):
|
|
| 116 |
<user_request> {user_request} </user_request>
|
| 117 |
In your response, provide:
|
| 118 |
- the target language.
|
|
|
|
| 119 |
- For each translation, provide:
|
| 120 |
1. The translated text
|
| 121 |
2. A description of when to use this variant
|
|
|
|
| 82 |
class TranslationResponse(BaseModel):
|
| 83 |
# source_text: str = Field(description="Original text")
|
| 84 |
target_language: str = Field(description="Target language")
|
| 85 |
+
source_language: str = Field(description="Source language")
|
| 86 |
options: List[TranslationOption] = Field(description="List of translation options")
|
| 87 |
|
| 88 |
# def parse_translation_response(result) -> TranslationResponse:
|
|
|
|
| 117 |
<user_request> {user_request} </user_request>
|
| 118 |
In your response, provide:
|
| 119 |
- the target language.
|
| 120 |
+
- the source language.
|
| 121 |
- For each translation, provide:
|
| 122 |
1. The translated text
|
| 123 |
2. A description of when to use this variant
|
streamlit_app/graph/state.py
CHANGED
|
@@ -2,7 +2,7 @@ from typing import Literal, TypedDict, Annotated, Optional
|
|
| 2 |
from operator import add
|
| 3 |
from pydantic import BaseModel
|
| 4 |
|
| 5 |
-
class Word(
|
| 6 |
translated_word: str
|
| 7 |
original_word: str
|
| 8 |
|
|
@@ -13,7 +13,8 @@ class TranslationOptions(TypedDict):
|
|
| 13 |
words: Annotated[list[Word], add]
|
| 14 |
|
| 15 |
class Translation(TypedDict):
|
| 16 |
-
|
|
|
|
| 17 |
options: Annotated[list[TranslationOptions], add]
|
| 18 |
|
| 19 |
class PolyglotState(TypedDict):
|
|
|
|
| 2 |
from operator import add
|
| 3 |
from pydantic import BaseModel
|
| 4 |
|
| 5 |
+
class Word(TypedDict):
|
| 6 |
translated_word: str
|
| 7 |
original_word: str
|
| 8 |
|
|
|
|
| 13 |
words: Annotated[list[Word], add]
|
| 14 |
|
| 15 |
class Translation(TypedDict):
|
| 16 |
+
target_language: str
|
| 17 |
+
source_language: str
|
| 18 |
options: Annotated[list[TranslationOptions], add]
|
| 19 |
|
| 20 |
class PolyglotState(TypedDict):
|
streamlit_app/graph/workflow.py
CHANGED
|
@@ -5,7 +5,7 @@ from langgraph.types import Command
|
|
| 5 |
import os
|
| 6 |
from .state import PolyglotState, Translation, TranslationOptions, Word
|
| 7 |
from langchain_core.runnables.config import RunnableConfig
|
| 8 |
-
from .configSchema import ConfigSchema
|
| 9 |
from .chains import create_detect_intent_chain, Intent, create_translate_chain, TranslationResponse, create_chat_response_chain
|
| 10 |
from stt_tts.models import TTSModel
|
| 11 |
# Load environment variables
|
|
@@ -71,7 +71,8 @@ def create_translate_node(llm)-> Callable[[PolyglotState, RunnableConfig], Polyg
|
|
| 71 |
response:TranslationResponse = translate_chain.invoke({"user_request": state["input"]})
|
| 72 |
print(f"response: {response}")
|
| 73 |
translation = Translation()
|
| 74 |
-
translation["
|
|
|
|
| 75 |
translation["options"] = []
|
| 76 |
for option in response.options:
|
| 77 |
translation_option = TranslationOptions()
|
|
|
|
| 5 |
import os
|
| 6 |
from .state import PolyglotState, Translation, TranslationOptions, Word
|
| 7 |
from langchain_core.runnables.config import RunnableConfig
|
| 8 |
+
# from .configSchema import ConfigSchema
|
| 9 |
from .chains import create_detect_intent_chain, Intent, create_translate_chain, TranslationResponse, create_chat_response_chain
|
| 10 |
from stt_tts.models import TTSModel
|
| 11 |
# Load environment variables
|
|
|
|
| 71 |
response:TranslationResponse = translate_chain.invoke({"user_request": state["input"]})
|
| 72 |
print(f"response: {response}")
|
| 73 |
translation = Translation()
|
| 74 |
+
translation["target_language"] = response.target_language
|
| 75 |
+
translation["source_language"] = response.source_language
|
| 76 |
translation["options"] = []
|
| 77 |
for option in response.options:
|
| 78 |
translation_option = TranslationOptions()
|
streamlit_app/main.py
CHANGED
|
@@ -1,17 +1,17 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
# from pathlib import Path
|
| 3 |
# import json
|
| 4 |
-
import os
|
| 5 |
# from dotenv import load_dotenv
|
| 6 |
# from streamlit_app.graph import workflow
|
| 7 |
from stt_tts.models import STTModel, TTSModel
|
| 8 |
-
from graph.workflow import create_workflow
|
| 9 |
from config import load_config
|
| 10 |
# from langchain_google_genai import ChatGoogleGenerativeAI
|
| 11 |
# from langchain_mistralai.chat_models import ChatMistralAI
|
| 12 |
from langchain_groq import ChatGroq
|
| 13 |
from config import Config
|
| 14 |
-
from streamlit_chat_widget import chat_input_widget
|
| 15 |
# from streamlit_extras.bottom_container import bottom
|
| 16 |
|
| 17 |
def has_api_key(config: Config) -> bool:
|
|
@@ -93,128 +93,15 @@ def initialize_app():
|
|
| 93 |
st.sidebar.error("Please enter GROQ API key")
|
| 94 |
else:
|
| 95 |
init_llm()
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
def create_sidebar():
|
| 99 |
-
with st.sidebar:
|
| 100 |
-
st.title("Learning Tools")
|
| 101 |
-
|
| 102 |
-
if st.button("📚 Dictionary"):
|
| 103 |
-
# TODO: Implement dictionary view
|
| 104 |
-
st.session_state.current_view = "dictionary"
|
| 105 |
-
|
| 106 |
-
if st.button("📝 Phrases"):
|
| 107 |
-
# TODO: Implement phrases view
|
| 108 |
-
st.session_state.current_view = "phrases"
|
| 109 |
-
|
| 110 |
-
st.markdown("---")
|
| 111 |
-
if st.button("⬇️ Download Progress"):
|
| 112 |
-
# TODO: Implement download functionality
|
| 113 |
-
st.text_input("Enter your email:", key="download_email")
|
| 114 |
-
|
| 115 |
-
def display_translation_options(translation_options):
|
| 116 |
-
for idx, option in enumerate(translation_options):
|
| 117 |
-
translation_text = option['translation']
|
| 118 |
-
audio_file_path = option['audio_file_path']
|
| 119 |
-
context_text = option['description']
|
| 120 |
-
translation_number = idx + 1
|
| 121 |
-
translation_message = f"**Translation {translation_number}:** {translation_text}\n*Context:* {context_text}"
|
| 122 |
-
st.session_state.messages.append({"role": "assistant", "content": translation_message, "audio_file_path": audio_file_path})
|
| 123 |
-
st.markdown(f"**Translation {translation_number}:** {translation_text}")
|
| 124 |
-
st.markdown(f"*Context:* {context_text}")
|
| 125 |
-
st.audio(audio_file_path)
|
| 126 |
-
# os.remove(audio_file_path)
|
| 127 |
-
|
| 128 |
-
def process_chat_message(input_text: str, is_audio: bool = False) -> None:
|
| 129 |
-
"""
|
| 130 |
-
Process a chat message and update the chat interface with the response.
|
| 131 |
-
|
| 132 |
-
Args:
|
| 133 |
-
input_text: The text to process (either direct input or transcribed audio)
|
| 134 |
-
is_audio: Boolean indicating if the input was from audio
|
| 135 |
-
"""
|
| 136 |
-
# Add user message to chat history
|
| 137 |
-
display_text = f"🎤 *Audio message*:\n{input_text}" if is_audio else input_text
|
| 138 |
-
st.session_state.messages.append({"role": "user", "content": display_text})
|
| 139 |
-
|
| 140 |
-
with st.chat_message("user"):
|
| 141 |
-
st.markdown(display_text)
|
| 142 |
-
if is_audio:
|
| 143 |
-
st.markdown(input_text) # Show transcription below audio message
|
| 144 |
-
|
| 145 |
-
# Process through workflow
|
| 146 |
-
workflow = create_workflow(llm=st.session_state.llm,tts_model=st.session_state.tts)
|
| 147 |
-
app_workflow = workflow.compile()
|
| 148 |
-
result = app_workflow.invoke({"input": input_text})
|
| 149 |
-
|
| 150 |
-
# Display assistant response
|
| 151 |
-
with st.chat_message("assistant"):
|
| 152 |
-
if "error" in result and result["error"] is not None:
|
| 153 |
-
st.markdown("An Error occurred while processing your message. Please try again.")
|
| 154 |
-
st.markdown(result["error"])
|
| 155 |
-
elif "chat_resp" in result and result["chat_resp"] is not None:
|
| 156 |
-
st.markdown(result["chat_resp"])
|
| 157 |
-
st.session_state.messages.append({"role": "assistant", "content": result["chat_resp"]})
|
| 158 |
-
elif (result["translation"] is not None):
|
| 159 |
-
# Display each translation option with its audio
|
| 160 |
-
# display_translation_options(result["translation"]["options"], result.get("audio_response_files", []))
|
| 161 |
-
display_translation_options(result["translation"]["options"])
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
def display_chat_interface():
|
| 166 |
-
|
| 167 |
-
# Display chat messages
|
| 168 |
-
for message in st.session_state.messages:
|
| 169 |
-
with st.chat_message(message["role"]):
|
| 170 |
-
st.markdown(message["content"])
|
| 171 |
-
|
| 172 |
-
# # Create columns for text and audio input
|
| 173 |
-
# col1, col2 = st.columns([4, 1])
|
| 174 |
-
|
| 175 |
-
# with col1:
|
| 176 |
-
# prompt = st.chat_input("Type your message here...")
|
| 177 |
|
| 178 |
-
# with col2:
|
| 179 |
-
# audio = st.audio_input("🎤")
|
| 180 |
-
# with bottom():
|
| 181 |
-
user_input = chat_input_widget()
|
| 182 |
-
# with st.chat_message("user"):
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
if user_input:
|
| 186 |
-
# Process text input
|
| 187 |
-
if "text" in user_input:
|
| 188 |
-
process_chat_message(user_input['text'])
|
| 189 |
-
elif "audioFile" in user_input: # Process audio input
|
| 190 |
-
chat_message_user= st.chat_message("user")
|
| 191 |
-
chat_message_user.markdown("🎤 *Audio message*")
|
| 192 |
-
audio =bytes(user_input["audioFile"])
|
| 193 |
-
chat_message_user.audio(audio)
|
| 194 |
-
with st.spinner("Transcribing audio..."):
|
| 195 |
-
# chat_message_user.markdown("Transcribing audio...")
|
| 196 |
-
try:
|
| 197 |
-
transcription = st.session_state.stt.transcribe(audio)
|
| 198 |
-
print(f"transcription: {transcription}")
|
| 199 |
-
if transcription and transcription["text"] and len(transcription["text"]) > 0:
|
| 200 |
-
process_chat_message(transcription["text"], is_audio=True)
|
| 201 |
-
else:
|
| 202 |
-
chat_message_user.markdown("Transcribing resulted in an empty text, try again")
|
| 203 |
-
except Exception as e:
|
| 204 |
-
chat_message_user.error(f"Error transcribing audio: {str(e)}")
|
| 205 |
-
chat_message_user.markdown("Failed to transcribe audio, try again")
|
| 206 |
-
|
| 207 |
-
|
| 208 |
def main():
|
| 209 |
initialize_app()
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
else:
|
| 217 |
-
st.info("Please configure your GROQ API key to start chatting.")
|
| 218 |
|
| 219 |
if __name__ == "__main__":
|
| 220 |
main()
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
# from pathlib import Path
|
| 3 |
# import json
|
| 4 |
+
# import os
|
| 5 |
# from dotenv import load_dotenv
|
| 6 |
# from streamlit_app.graph import workflow
|
| 7 |
from stt_tts.models import STTModel, TTSModel
|
| 8 |
+
# from graph.workflow import create_workflow
|
| 9 |
from config import load_config
|
| 10 |
# from langchain_google_genai import ChatGoogleGenerativeAI
|
| 11 |
# from langchain_mistralai.chat_models import ChatMistralAI
|
| 12 |
from langchain_groq import ChatGroq
|
| 13 |
from config import Config
|
| 14 |
+
# from streamlit_chat_widget import chat_input_widget
|
| 15 |
# from streamlit_extras.bottom_container import bottom
|
| 16 |
|
| 17 |
def has_api_key(config: Config) -> bool:
|
|
|
|
| 93 |
st.sidebar.error("Please enter GROQ API key")
|
| 94 |
else:
|
| 95 |
init_llm()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
def main():
|
| 98 |
initialize_app()
|
| 99 |
+
words_page = st.Page(page="words_page.py", title="Words", icon="📖")
|
| 100 |
+
translations_page = st.Page(page="translation_page.py", title="Translations", icon="🗣️")
|
| 101 |
+
chat_page = st.Page(page="chat_page.py", title="Chat", icon="💬")
|
| 102 |
+
|
| 103 |
+
pg = st.navigation([chat_page, translations_page, words_page])
|
| 104 |
+
pg.run()
|
|
|
|
|
|
|
| 105 |
|
| 106 |
if __name__ == "__main__":
|
| 107 |
main()
|
streamlit_app/pages/1_vocabulary
DELETED
|
File without changes
|
streamlit_app/translation_page.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
from util import display_filtered_dataframe
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
if ('translation_df' in st.session_state) and (st.session_state.translation_df is not None):
|
| 6 |
+
display_filtered_dataframe(st.session_state.translation_df, "Translations", ['Translation_Language', 'Source_Language'])
|
| 7 |
+
st.markdown("---")
|
| 8 |
+
if st.button("Download Phrases"):
|
| 9 |
+
# TODO: Implement download functionality
|
| 10 |
+
st.text_input("Enter your email:", key="download_email")
|
| 11 |
+
else:
|
| 12 |
+
st.write("No translations yet, go chat with your AI Assistant!")
|
streamlit_app/util.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import pandas as pd
|
| 3 |
+
from streamlit_dynamic_filters import DynamicFilters
|
| 4 |
+
|
| 5 |
+
# Function to create and display filtered dataframe
|
| 6 |
+
def display_filtered_dataframe(df: pd.DataFrame, title: str, filters: list[str]):
|
| 7 |
+
# Initialize DynamicFilters
|
| 8 |
+
dynamic_filters = DynamicFilters(df, filters=filters)
|
| 9 |
+
|
| 10 |
+
# Display filters in the sidebar
|
| 11 |
+
# with st.sidebar:
|
| 12 |
+
st.subheader(f"Filters for {title}")
|
| 13 |
+
dynamic_filters.display_filters(location='columns', num_columns=2, gap='large')
|
| 14 |
+
|
| 15 |
+
# Apply dynamic filters to the DataFrame
|
| 16 |
+
filtered_df = dynamic_filters.filter_df()
|
| 17 |
+
|
| 18 |
+
# Free-text search input
|
| 19 |
+
search_term = st.text_input(f"Search {title}:")
|
| 20 |
+
|
| 21 |
+
# Apply free-text search filter
|
| 22 |
+
if search_term:
|
| 23 |
+
mask = filtered_df.apply(lambda row: row.astype(str).str.contains(search_term, case=False).any(), axis=1)
|
| 24 |
+
filtered_df = filtered_df[mask]
|
| 25 |
+
|
| 26 |
+
# Display the filtered DataFrame
|
| 27 |
+
st.subheader(title)
|
| 28 |
+
st.dataframe(filtered_df)
|
streamlit_app/words_page.py
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
from util import display_filtered_dataframe
|
| 3 |
+
|
| 4 |
+
if ('word_df' in st.session_state) and (st.session_state.word_df is not None):
|
| 5 |
+
# Display both dataframes
|
| 6 |
+
display_filtered_dataframe(st.session_state.word_df, "Words", ['Translation_Language', 'Source_Language'])
|
| 7 |
+
st.markdown("---")
|
| 8 |
+
if st.button("Download Vocabulary"):
|
| 9 |
+
# TODO: Implement download functionality
|
| 10 |
+
st.text_input("Enter your email:", key="download_email")
|
| 11 |
+
else:
|
| 12 |
+
st.write("No words yet, go chat with your AI Assistant!")
|