From ad71ca253d2a284848383d02f71aad740c131d2a Mon Sep 17 00:00:00 2001 From: harold Date: Sun, 2 Feb 2025 23:19:30 +0500 Subject: [PATCH] add gemni and functions --- poetry.lock | 552 ++++++++++++++++++++++- pyproject.toml | 3 +- src/advatroniks.session-journal | Bin 53864 -> 57968 bytes src/core/ai_services/__init__.py | 0 src/core/ai_services/base.py | 12 + src/core/ai_services/gemini/__init__.py | 0 src/core/ai_services/gemini/constants.py | 56 +++ src/core/ai_services/gemini/service.py | 76 ++++ src/core/ai_services/google.py | 69 +++ src/core/ai_services/groq/__init__.py | 0 src/core/ai_services/groq/constants.py | 57 +++ src/core/ai_services/groq/service.py | 78 ++++ src/core/ai_services/schemas.py | 23 + src/core/common/promt.py | 2 +- src/core/settings/base.py | 4 +- src/core/settings/gemini.py | 7 + src/core/settings/groq.py | 4 +- src/main.py | 57 ++- 18 files changed, 970 insertions(+), 30 deletions(-) create mode 100644 src/core/ai_services/__init__.py create mode 100644 src/core/ai_services/base.py create mode 100644 src/core/ai_services/gemini/__init__.py create mode 100644 src/core/ai_services/gemini/constants.py create mode 100644 src/core/ai_services/gemini/service.py create mode 100644 src/core/ai_services/google.py create mode 100644 src/core/ai_services/groq/__init__.py create mode 100644 src/core/ai_services/groq/constants.py create mode 100644 src/core/ai_services/groq/service.py create mode 100644 src/core/ai_services/schemas.py create mode 100644 src/core/settings/gemini.py diff --git a/poetry.lock b/poetry.lock index e0663e3..2677ff7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -47,6 +47,18 @@ files = [ {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] +[[package]] +name = "cachetools" +version = "5.5.1" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"}, + {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"}, +] + [[package]] name = "certifi" version = "2024.12.14" @@ -59,6 +71,121 @@ files = [ {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] +[[package]] +name = "charset-normalizer" +version = "3.4.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "platform_system == \"Windows\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + [[package]] name = "distro" version = "1.9.0" @@ -71,6 +198,159 @@ files = [ {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, ] +[[package]] +name = "google-ai-generativelanguage" +version = "0.6.15" +description = "Google Ai Generativelanguage API client library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_ai_generativelanguage-0.6.15-py3-none-any.whl", hash = "sha256:5a03ef86377aa184ffef3662ca28f19eeee158733e45d7947982eb953c6ebb6c"}, + {file = "google_ai_generativelanguage-0.6.15.tar.gz", hash = "sha256:8f6d9dc4c12b065fe2d0289026171acea5183ebf2d0b11cefe12f3821e159ec3"}, +] + +[package.dependencies] +google-api-core = {version = ">=1.34.1,<2.0.dev0 || >=2.11.dev0,<3.0.0dev", extras = ["grpc"]} +google-auth = ">=2.14.1,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0dev" +proto-plus = [ + {version = ">=1.25.0,<2.0.0dev", markers = "python_version >= \"3.13\""}, + {version = ">=1.22.3,<2.0.0dev", markers = "python_version < \"3.13\""}, +] +protobuf = ">=3.20.2,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0dev" + +[[package]] +name = "google-api-core" +version = "2.24.1" +description = "Google API client core library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_api_core-2.24.1-py3-none-any.whl", hash = "sha256:bc78d608f5a5bf853b80bd70a795f703294de656c096c0968320830a4bc280f1"}, + {file = "google_api_core-2.24.1.tar.gz", hash = "sha256:f8b36f5456ab0dd99a1b693a40a31d1e7757beea380ad1b38faaf8941eae9d8a"}, +] + +[package.dependencies] +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +grpcio-status = {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""} +proto-plus = [ + {version = ">=1.25.0,<2.0.0dev", markers = "python_version >= \"3.13\""}, + {version = ">=1.22.3,<2.0.0dev", markers = "python_version < \"3.13\""}, +] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" + +[package.extras] +async-rest = ["google-auth[aiohttp] (>=2.35.0,<3.0.dev0)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] + +[[package]] +name = "google-api-python-client" +version = "2.160.0" +description = "Google API Client Library for Python" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_api_python_client-2.160.0-py2.py3-none-any.whl", hash = "sha256:63d61fb3e4cf3fb31a70a87f45567c22f6dfe87bbfa27252317e3e2c42900db4"}, + {file = "google_api_python_client-2.160.0.tar.gz", hash = "sha256:a8ccafaecfa42d15d5b5c3134ced8de08380019717fc9fb1ed510ca58eca3b7e"}, +] + +[package.dependencies] +google-api-core = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0.dev0" +google-auth = ">=1.32.0,<2.24.0 || >2.24.0,<2.25.0 || >2.25.0,<3.0.0.dev0" +google-auth-httplib2 = ">=0.2.0,<1.0.0" +httplib2 = ">=0.19.0,<1.dev0" +uritemplate = ">=3.0.1,<5" + +[[package]] +name = "google-auth" +version = "2.38.0" +description = "Google Authentication Library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a"}, + {file = "google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4"}, +] + +[package.dependencies] +cachetools = ">=2.0.0,<6.0" +pyasn1-modules = ">=0.2.1" +rsa = ">=3.1.4,<5" + +[package.extras] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography", "pyopenssl"] +pyjwt = ["cryptography (>=38.0.3)", "pyjwt (>=2.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] + +[[package]] +name = "google-auth-httplib2" +version = "0.2.0" +description = "Google Authentication Library: httplib2 transport" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "google-auth-httplib2-0.2.0.tar.gz", hash = "sha256:38aa7badf48f974f1eb9861794e9c0cb2a0511a4ec0679b1f886d108f5640e05"}, + {file = "google_auth_httplib2-0.2.0-py2.py3-none-any.whl", hash = "sha256:b65a0a2123300dd71281a7bf6e64d65a0759287df52729bdd1ae2e47dc311a3d"}, +] + +[package.dependencies] +google-auth = "*" +httplib2 = ">=0.19.0" + +[[package]] +name = "google-generativeai" +version = "0.8.4" +description = "Google Generative AI High level API client library and tools." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "google_generativeai-0.8.4-py3-none-any.whl", hash = "sha256:e987b33ea6decde1e69191ddcaec6ef974458864d243de7191db50c21a7c5b82"}, +] + +[package.dependencies] +google-ai-generativelanguage = "0.6.15" +google-api-core = "*" +google-api-python-client = "*" +google-auth = ">=2.15.0" +protobuf = "*" +pydantic = "*" +tqdm = "*" +typing-extensions = "*" + +[package.extras] +dev = ["Pillow", "absl-py", "black", "ipython", "nose2", "pandas", "pytype", "pyyaml"] + +[[package]] +name = "googleapis-common-protos" +version = "1.66.0" +description = "Common protobufs used in Google APIs" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed"}, + {file = "googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c"}, +] + +[package.dependencies] +protobuf = ">=3.20.2,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<6.0.0.dev0" + +[package.extras] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] + [[package]] name = "greenlet" version = "3.1.1" @@ -179,6 +459,91 @@ pydantic = ">=1.9.0,<3" sniffio = "*" typing-extensions = ">=4.10,<5" +[[package]] +name = "grpcio" +version = "1.70.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "grpcio-1.70.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:95469d1977429f45fe7df441f586521361e235982a0b39e33841549143ae2851"}, + {file = "grpcio-1.70.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:ed9718f17fbdb472e33b869c77a16d0b55e166b100ec57b016dc7de9c8d236bf"}, + {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:374d014f29f9dfdb40510b041792e0e2828a1389281eb590df066e1cc2b404e5"}, + {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2af68a6f5c8f78d56c145161544ad0febbd7479524a59c16b3e25053f39c87f"}, + {file = "grpcio-1.70.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7df14b2dcd1102a2ec32f621cc9fab6695effef516efbc6b063ad749867295"}, + {file = "grpcio-1.70.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c78b339869f4dbf89881e0b6fbf376313e4f845a42840a7bdf42ee6caed4b11f"}, + {file = "grpcio-1.70.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:58ad9ba575b39edef71f4798fdb5c7b6d02ad36d47949cd381d4392a5c9cbcd3"}, + {file = "grpcio-1.70.0-cp310-cp310-win32.whl", hash = "sha256:2b0d02e4b25a5c1f9b6c7745d4fa06efc9fd6a611af0fb38d3ba956786b95199"}, + {file = "grpcio-1.70.0-cp310-cp310-win_amd64.whl", hash = "sha256:0de706c0a5bb9d841e353f6343a9defc9fc35ec61d6eb6111802f3aa9fef29e1"}, + {file = "grpcio-1.70.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:17325b0be0c068f35770f944124e8839ea3185d6d54862800fc28cc2ffad205a"}, + {file = "grpcio-1.70.0-cp311-cp311-macosx_10_14_universal2.whl", hash = "sha256:dbe41ad140df911e796d4463168e33ef80a24f5d21ef4d1e310553fcd2c4a386"}, + {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:5ea67c72101d687d44d9c56068328da39c9ccba634cabb336075fae2eab0d04b"}, + {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb5277db254ab7586769e490b7b22f4ddab3876c490da0a1a9d7c695ccf0bf77"}, + {file = "grpcio-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7831a0fc1beeeb7759f737f5acd9fdcda520e955049512d68fda03d91186eea"}, + {file = "grpcio-1.70.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:27cc75e22c5dba1fbaf5a66c778e36ca9b8ce850bf58a9db887754593080d839"}, + {file = "grpcio-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d63764963412e22f0491d0d32833d71087288f4e24cbcddbae82476bfa1d81fd"}, + {file = "grpcio-1.70.0-cp311-cp311-win32.whl", hash = "sha256:bb491125103c800ec209d84c9b51f1c60ea456038e4734688004f377cfacc113"}, + {file = "grpcio-1.70.0-cp311-cp311-win_amd64.whl", hash = "sha256:d24035d49e026353eb042bf7b058fb831db3e06d52bee75c5f2f3ab453e71aca"}, + {file = "grpcio-1.70.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:ef4c14508299b1406c32bdbb9fb7b47612ab979b04cf2b27686ea31882387cff"}, + {file = "grpcio-1.70.0-cp312-cp312-macosx_10_14_universal2.whl", hash = "sha256:aa47688a65643afd8b166928a1da6247d3f46a2784d301e48ca1cc394d2ffb40"}, + {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:880bfb43b1bb8905701b926274eafce5c70a105bc6b99e25f62e98ad59cb278e"}, + {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e654c4b17d07eab259d392e12b149c3a134ec52b11ecdc6a515b39aceeec898"}, + {file = "grpcio-1.70.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2394e3381071045a706ee2eeb6e08962dd87e8999b90ac15c55f56fa5a8c9597"}, + {file = "grpcio-1.70.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b3c76701428d2df01964bc6479422f20e62fcbc0a37d82ebd58050b86926ef8c"}, + {file = "grpcio-1.70.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac073fe1c4cd856ebcf49e9ed6240f4f84d7a4e6ee95baa5d66ea05d3dd0df7f"}, + {file = "grpcio-1.70.0-cp312-cp312-win32.whl", hash = "sha256:cd24d2d9d380fbbee7a5ac86afe9787813f285e684b0271599f95a51bce33528"}, + {file = "grpcio-1.70.0-cp312-cp312-win_amd64.whl", hash = "sha256:0495c86a55a04a874c7627fd33e5beaee771917d92c0e6d9d797628ac40e7655"}, + {file = "grpcio-1.70.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:aa573896aeb7d7ce10b1fa425ba263e8dddd83d71530d1322fd3a16f31257b4a"}, + {file = "grpcio-1.70.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:d405b005018fd516c9ac529f4b4122342f60ec1cee181788249372524e6db429"}, + {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f32090238b720eb585248654db8e3afc87b48d26ac423c8dde8334a232ff53c9"}, + {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa089a734f24ee5f6880c83d043e4f46bf812fcea5181dcb3a572db1e79e01c"}, + {file = "grpcio-1.70.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f19375f0300b96c0117aca118d400e76fede6db6e91f3c34b7b035822e06c35f"}, + {file = "grpcio-1.70.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7c73c42102e4a5ec76608d9b60227d917cea46dff4d11d372f64cbeb56d259d0"}, + {file = "grpcio-1.70.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:0a5c78d5198a1f0aa60006cd6eb1c912b4a1520b6a3968e677dbcba215fabb40"}, + {file = "grpcio-1.70.0-cp313-cp313-win32.whl", hash = "sha256:fe9dbd916df3b60e865258a8c72ac98f3ac9e2a9542dcb72b7a34d236242a5ce"}, + {file = "grpcio-1.70.0-cp313-cp313-win_amd64.whl", hash = "sha256:4119fed8abb7ff6c32e3d2255301e59c316c22d31ab812b3fbcbaf3d0d87cc68"}, + {file = "grpcio-1.70.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:8058667a755f97407fca257c844018b80004ae8035565ebc2812cc550110718d"}, + {file = "grpcio-1.70.0-cp38-cp38-macosx_10_14_universal2.whl", hash = "sha256:879a61bf52ff8ccacbedf534665bb5478ec8e86ad483e76fe4f729aaef867cab"}, + {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:0ba0a173f4feacf90ee618fbc1a27956bfd21260cd31ced9bc707ef551ff7dc7"}, + {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558c386ecb0148f4f99b1a65160f9d4b790ed3163e8610d11db47838d452512d"}, + {file = "grpcio-1.70.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:412faabcc787bbc826f51be261ae5fa996b21263de5368a55dc2cf824dc5090e"}, + {file = "grpcio-1.70.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3b0f01f6ed9994d7a0b27eeddea43ceac1b7e6f3f9d86aeec0f0064b8cf50fdb"}, + {file = "grpcio-1.70.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7385b1cb064734005204bc8994eed7dcb801ed6c2eda283f613ad8c6c75cf873"}, + {file = "grpcio-1.70.0-cp38-cp38-win32.whl", hash = "sha256:07269ff4940f6fb6710951116a04cd70284da86d0a4368fd5a3b552744511f5a"}, + {file = "grpcio-1.70.0-cp38-cp38-win_amd64.whl", hash = "sha256:aba19419aef9b254e15011b230a180e26e0f6864c90406fdbc255f01d83bc83c"}, + {file = "grpcio-1.70.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:4f1937f47c77392ccd555728f564a49128b6a197a05a5cd527b796d36f3387d0"}, + {file = "grpcio-1.70.0-cp39-cp39-macosx_10_14_universal2.whl", hash = "sha256:0cd430b9215a15c10b0e7d78f51e8a39d6cf2ea819fd635a7214fae600b1da27"}, + {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:e27585831aa6b57b9250abaf147003e126cd3a6c6ca0c531a01996f31709bed1"}, + {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1af8e15b0f0fe0eac75195992a63df17579553b0c4af9f8362cc7cc99ccddf4"}, + {file = "grpcio-1.70.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbce24409beaee911c574a3d75d12ffb8c3e3dd1b813321b1d7a96bbcac46bf4"}, + {file = "grpcio-1.70.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ff4a8112a79464919bb21c18e956c54add43ec9a4850e3949da54f61c241a4a6"}, + {file = "grpcio-1.70.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5413549fdf0b14046c545e19cfc4eb1e37e9e1ebba0ca390a8d4e9963cab44d2"}, + {file = "grpcio-1.70.0-cp39-cp39-win32.whl", hash = "sha256:b745d2c41b27650095e81dea7091668c040457483c9bdb5d0d9de8f8eb25e59f"}, + {file = "grpcio-1.70.0-cp39-cp39-win_amd64.whl", hash = "sha256:a31d7e3b529c94e930a117b2175b2efd179d96eb3c7a21ccb0289a8ab05b645c"}, + {file = "grpcio-1.70.0.tar.gz", hash = "sha256:8d1584a68d5922330025881e63a6c1b54cc8117291d382e4fa69339b6d914c56"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.70.0)"] + +[[package]] +name = "grpcio-status" +version = "1.70.0" +description = "Status proto mapping for gRPC" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "grpcio_status-1.70.0-py3-none-any.whl", hash = "sha256:fc5a2ae2b9b1c1969cc49f3262676e6854aa2398ec69cb5bd6c47cd501904a85"}, + {file = "grpcio_status-1.70.0.tar.gz", hash = "sha256:0e7b42816512433b18b9d764285ff029bde059e9d41f8fe10a60631bd8348101"}, +] + +[package.dependencies] +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.70.0" +protobuf = ">=5.26.1,<6.0dev" + [[package]] name = "h11" version = "0.14.0" @@ -213,6 +578,21 @@ http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] trio = ["trio (>=0.22.0,<1.0)"] +[[package]] +name = "httplib2" +version = "0.22.0" +description = "A comprehensive HTTP client library." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +files = [ + {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, + {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, +] + +[package.dependencies] +pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0.2,<3.0.3 || >3.0.3,<4", markers = "python_version > \"3.0\""} + [[package]] name = "httpx" version = "0.28.1" @@ -269,6 +649,45 @@ files = [ pyaes = "1.6.1" pysocks = "1.7.1" +[[package]] +name = "proto-plus" +version = "1.26.0" +description = "Beautiful, Pythonic protocol buffers" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "proto_plus-1.26.0-py3-none-any.whl", hash = "sha256:bf2dfaa3da281fc3187d12d224c707cb57214fb2c22ba854eb0c105a3fb2d4d7"}, + {file = "proto_plus-1.26.0.tar.gz", hash = "sha256:6e93d5f5ca267b54300880fff156b6a3386b3fa3f43b1da62e680fc0c586ef22"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<6.0.0dev" + +[package.extras] +testing = ["google-api-core (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "5.29.3" +description = "" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, + {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, + {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"}, + {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"}, + {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"}, + {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"}, + {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"}, + {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"}, + {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"}, + {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"}, + {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"}, +] + [[package]] name = "pyaes" version = "1.6.1" @@ -280,6 +699,33 @@ files = [ {file = "pyaes-1.6.1.tar.gz", hash = "sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f"}, ] +[[package]] +name = "pyasn1" +version = "0.6.1" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629"}, + {file = "pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034"}, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.1" +description = "A collection of ASN.1-based protocols modules" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pyasn1_modules-0.4.1-py3-none-any.whl", hash = "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd"}, + {file = "pyasn1_modules-0.4.1.tar.gz", hash = "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6,<0.7.0" + [[package]] name = "pydantic" version = "2.10.6" @@ -435,6 +881,21 @@ azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0 toml = ["tomli (>=2.0.1)"] yaml = ["pyyaml (>=6.0.1)"] +[[package]] +name = "pyparsing" +version = "3.2.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + [[package]] name = "pyrogram" version = "2.0.106" @@ -498,6 +959,43 @@ async-timeout = {version = ">=4.0.3", markers = "python_full_version < \"3.11.3\ hiredis = ["hiredis (>=3.0.0)"] ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +groups = ["main"] +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + [[package]] name = "sniffio" version = "1.3.1" @@ -672,6 +1170,28 @@ files = [ {file = "TgCrypto-1.2.5.tar.gz", hash = "sha256:9bc2cac6fb9a12ef5b08f3dd500174fe374d89b660cce981f57e3138559cb682"}, ] +[[package]] +name = "tqdm" +version = "4.67.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -684,7 +1204,37 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "uritemplate" +version = "4.1.1" +description = "Implementation of RFC 6570 URI Templates" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, + {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + [metadata] lock-version = "2.1" python-versions = ">=3.11, <4.0" -content-hash = "c9de7a98768d02152241f4e8000d6186de1c0059ba9dba65dca76ee5a6b60ee2" +content-hash = "dc59c68a2f05dcce182f7343c2fe7979ad2b654211954f9480a263cd9e128232" diff --git a/pyproject.toml b/pyproject.toml index cb33a37..346bf0a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,8 @@ dependencies = [ "groq (>=0.15.0,<0.16.0)", "sqlalchemy (>=2.0.37,<3.0.0)", "pydantic-settings (>=2.7.1,<3.0.0)", - "redis (>=5.2.1,<6.0.0)" + "redis (>=5.2.1,<6.0.0)", + "google-generativeai (>=0.8.4,<0.9.0)" ] diff --git a/src/advatroniks.session-journal b/src/advatroniks.session-journal index 8e006a4a9f6ed4920156944fa50d2346cdf2850e..dc9a95dee1b8a211a508da630f8c594fd76f78db 100644 GIT binary patch delta 6296 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 aS>MZ3`x$KFC(YACC%>=pI+~!H+5ZDCL*Ll| delta 4306 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 diff --git a/src/core/ai_services/__init__.py b/src/core/ai_services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/core/ai_services/base.py b/src/core/ai_services/base.py new file mode 100644 index 0000000..339cae0 --- /dev/null +++ b/src/core/ai_services/base.py @@ -0,0 +1,12 @@ +from abc import ABC, abstractmethod + +from src.core.ai_services.schemas import MessageFromChatSchema, ResponseFromAiSchema + + +class BaseAiService(ABC): + @abstractmethod + async def create_request_ai( + self, + messages: list[MessageFromChatSchema], + ) -> ResponseFromAiSchema: + raise NotImplementedError diff --git a/src/core/ai_services/gemini/__init__.py b/src/core/ai_services/gemini/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/core/ai_services/gemini/constants.py b/src/core/ai_services/gemini/constants.py new file mode 100644 index 0000000..a65a6eb --- /dev/null +++ b/src/core/ai_services/gemini/constants.py @@ -0,0 +1,56 @@ +ROLE = """ +Ты специалист по поиску клиентов в компании, которая занимается разработкой любого софта +на заказ. +""" + +ANALYTIC_PROMT = """ +Ты получаешь json с такими полями +{ + "messages": [ + { + "message_id": integer, + "user_id": integer, + "chat_id": integer, + "text": string, + "date": datetime + } + ] +} +messages - это срез диалога в чате телеграмма. +пользователи могут общаться на абсолютно разные темы. +Твоя задача: +Прочитать эти сообщения, понять тему текущего среза диалога. +И если ты поймешь, что мы можем какому то пользователю предложить свои услуги +например (написать интернет магазин, мобильное приложение или любой другой айти продукт) +то выведи в таком виде ответ. + +ВАЖНО: Если ты уверен на 100 процентов, что они заинтересованы в подобных услугах и им +можно предложить, то верни. + +{ + "user_id": integer, + "chat_id": integer, + "reason": string +} + +поле reason: Кратко(до 100 симоволов) почему ты решил, что это потенциальный клиент. + +Если ты хотя бы чуть чуть не уверен, то верни вот такую строку +{"user_id": null, "chat_id": null, "reason": null} + + +ВАЖНО: Ты должен вернуть ТОЛЬКО JSON и не словом больше. Иначе я разорюсь. +без ```json ``` просто так без каких либо спецсимволов + +""" + + +GEMINI_BASE_MESSAGE = [ + { + "role": "user", + "parts": [ + {"text": ROLE}, + {"text": ANALYTIC_PROMT}, + ] + } +] \ No newline at end of file diff --git a/src/core/ai_services/gemini/service.py b/src/core/ai_services/gemini/service.py new file mode 100644 index 0000000..51f0ac2 --- /dev/null +++ b/src/core/ai_services/gemini/service.py @@ -0,0 +1,76 @@ +import json + +from src.core.ai_services.base import BaseAiService + +import google.generativeai as genai + +from src.core.ai_services.gemini.constants import GEMINI_BASE_MESSAGE +from src.core.ai_services.schemas import MessageFromChatSchema, ResponseFromAiSchema +from src.core.settings.base import settings + + +class GoogleHelper(BaseAiService): + def __init__( + self, + api_key: str, + model_name: str, + ) -> None: + self.api_key = api_key + self.model = model_name + + genai.configure(api_key=api_key) + self._model = genai.GenerativeModel(model_name=model_name) + + @staticmethod + def _serialize_messages_to_promt( + messages: list[MessageFromChatSchema], + ) -> list[dict]: + messages_for_request = GEMINI_BASE_MESSAGE.copy() + dumped_messages = [msg.model_dump_with_datetime() for msg in messages] + + text_for_request = json.dumps({"messages": dumped_messages}) + + extend_message = { + "role": "user", + "parts": [ + { + "text": text_for_request, + } + ], + } + + messages_for_request.append(extend_message) + + return messages_for_request + + @staticmethod + def _serialize_response_to_json( + response_text: str, + ) -> ResponseFromAiSchema: + response = response_text.replace('\n', '') + print(response) + print(len(response)) + print("gemini") + response = response_text.replace('\n', '') + response_as_dict = json.loads(response_text) + + return ResponseFromAiSchema(**response_as_dict) + + async def create_request_ai( + self, + messages: list[MessageFromChatSchema], + ) -> ResponseFromAiSchema: + contents = self._serialize_messages_to_promt(messages) + + response = await self._model.generate_content_async( + contents=contents + ) + + return self._serialize_response_to_json(response.text) + + + +gemini_helper = GoogleHelper( + api_key=settings.GEMINI.API_KEY, + model_name=settings.GEMINI.MODEL_NAME, +) \ No newline at end of file diff --git a/src/core/ai_services/google.py b/src/core/ai_services/google.py new file mode 100644 index 0000000..0e51c80 --- /dev/null +++ b/src/core/ai_services/google.py @@ -0,0 +1,69 @@ +import asyncio +import json + +import google.generativeai as genai + +from src.core.common.promt import ANALYTIC_PROMT, ROLE + +model = genai.GenerativeModel("gemini-1.5-flash") +# model.generate_content_async( +# contents="Explain how AI works", +# ) +# response = model.generate_content("Explain how AI works") +data = { + "messages": [ + {'message_id': 116459, 'user_id': 299500769, 'chat_id': -1001412374171, + 'text': 'Это конечно круто, но не надо в питон тащить свои когнитивные искажения из джава мира))', + 'date': '29/01/2025:22:54:08'}, + {'message_id': 116460, 'user_id': 299500769, 'chat_id': -1001412374171, + 'text': 'Не говорю, что там не правильно, просто не везде применимо)', 'date': '29/01/2025:22:54:29'}, + {'message_id': 116461, 'user_id': 6295079014, 'chat_id': -1001412374171, 'text': 'ну так слоистая зато)', + 'date': '29/01/2025:22:54:35'}, + {'message_id': 116462, 'user_id': 6295079014, 'chat_id': -1001412374171, + 'text': 'линтеры, IDE, типы - ради этого если кратко', 'date': '29/01/2025:22:55:26'}, + {'message_id': 116463, 'user_id': 299500769, 'chat_id': -1001412374171, + 'text': 'Не все 1 в 1 переносится от языка к языку)', 'date': '29/01/2025:22:55:33'}, + {'message_id': 116464, 'user_id': 408922819, 'chat_id': -1001412374171, + 'text': 'в каком месте у тебя здесь циклические импорты?', 'date': '29/01/2025:22:55:39'}, + {'message_id': 116465, 'user_id': 6295079014, 'chat_id': -1001412374171, + 'text': 'chat/models.py\nuser/models.py\n\n ссылаются друг на друга ибо в каждом есть импорты друг друга\n\nuser/models.py\nfrom src.chat.models import Chat, ChatMessage\n\nchat/models.py\nfrom src.user.models import User', + 'date': '29/01/2025:22:57:45'}, + {'message_id': 116466, 'user_id': 408922819, 'chat_id': -1001412374171, + 'text': 'ах ты их еще и по аппкам разнес', 'date': '29/01/2025:22:58:34'}, + {'message_id': 116467, 'user_id': 6295079014, 'chat_id': -1001412374171, + 'text': 'если есть грамотный пример структуры приложения fastapi прошу прислать)', + 'date': '29/01/2025:22:58:55'}, + ] +} + +BASE_MESSAGE = [ + { + "role": "user", + "parts": [{"text": ROLE.strip()}] + }, + { + "role": "user", + "parts": [{"text": ANALYTIC_PROMT.strip()}] + }, + { + "role": "user", + "parts": [json.dumps(data)] + }, + +] + +async def print_response(): + res = await model.generate_content_async(BASE_MESSAGE) + print(res.text) + print(res.usage_metadata) + +async def check_limits(): + response = await model.generate_content_async("Как посмотреть сколько лимитов в gemini gemini cloude у меня осталось") + + # Вывод метаданных из ответа + print(response.text) + print("Usage metadata:", response.usage_metadata) + + +asyncio.run(check_limits()) +# asyncio.run(print_response()) diff --git a/src/core/ai_services/groq/__init__.py b/src/core/ai_services/groq/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/core/ai_services/groq/constants.py b/src/core/ai_services/groq/constants.py new file mode 100644 index 0000000..661a2ee --- /dev/null +++ b/src/core/ai_services/groq/constants.py @@ -0,0 +1,57 @@ +ROLE = """ +Ты специалист по поиску клиентов в компании, которая занимается разработкой любого софта +на заказ. +""" + +ANALYTIC_PROMT = """ +Ты получаешь json с такими полями +{ + "messages": [ + { + "message_id": integer, + "user_id": integer, + "chat_id": integer, + "text": string, + "date": datetime + } + ] +} +messages - это срез диалога в чате телеграмма. +пользователи могут общаться на абсолютно разные темы. +Твоя задача: +Прочитать эти сообщения, понять тему текущего среза диалога. +И если ты поймешь, что мы можем какому то пользователю предложить свои услуги +например (написать интернет магазин, мобильное приложение или любой другой айти продукт) +то выведи в таком виде ответ. + +ВАЖНО: Если ты уверен на 100 процентов, что они заинтересованы в подобных услугах и им +можно предложить, то верни. + +{ + "user_id": integer, + "chat_id": integer, + "reason": string +} + +поле reason: Кратко(до 100 симоволов) почему ты решил, что это потенциальный клиент. + +Если ты хотя бы чуть чуть не уверен, то верни вот такую строку +{"user_id": null, "chat_id": null, "reason": null} + +ВАЖНО: Ты должен вернуть ТОЛЬКО JSON и не словом больше. Иначе я разорюсь. +без ```json ``` просто так + + +""" + + +GROQ_BASE_MESSAGE = [ + { + "role": "system", + "content": ROLE.replace("\n", '') + }, + { + "role": "user", + "content": ANALYTIC_PROMT.replace("\n", ''), + } +] diff --git a/src/core/ai_services/groq/service.py b/src/core/ai_services/groq/service.py new file mode 100644 index 0000000..ab25447 --- /dev/null +++ b/src/core/ai_services/groq/service.py @@ -0,0 +1,78 @@ +import json + +from groq import AsyncGroq + +from src.core.ai_services.schemas import MessageFromChatSchema, ResponseFromAiSchema +from .constants import GROQ_BASE_MESSAGE +from ..base import BaseAiService +from ...settings.base import settings + + +class GroqHelper(BaseAiService): + def __init__( + self, + api_key: str, + model: str, + temperature: int, + ) -> None: + self.api_key = api_key + self.model = model + self.temperature = temperature + + self._client = AsyncGroq( + api_key=self.api_key, + ) + + @staticmethod + def _serialize_messages_to_promt( + messages: list[MessageFromChatSchema], + ) -> dict: + messages_for_request = GROQ_BASE_MESSAGE.copy() + extend_message = { + "role": "user", + "content": json.dumps( + { + "messages": [ + message.model_dump_with_datetime() for message in messages + ] + } + ), + } + + messages_for_request.append(extend_message) + + return messages_for_request + + @staticmethod + def _serialize_response_to_json( + response_text: str, + ) -> ResponseFromAiSchema: + print(response_text) + print(len(response_text)) + print("groq") + response = response_text.replace('\n', '') + response_as_dict = json.loads(response) + + return ResponseFromAiSchema(**response_as_dict) + + async def create_request_ai( + self, + messages: list[MessageFromChatSchema], + ) -> ResponseFromAiSchema: + messages_for_promt = self._serialize_messages_to_promt(messages) + response = await self._client.chat.completions.create( + messages=messages_for_promt, + model=self.model, + temperature=self.temperature, + ) + + return self._serialize_response_to_json( + response.choices[0].message.content, + ) + + +groq_helper = GroqHelper( + api_key=settings.GROQ.API_KEY, + model=settings.GROQ.MODEL, + temperature=settings.GROQ.TEMPERATURE, +) diff --git a/src/core/ai_services/schemas.py b/src/core/ai_services/schemas.py new file mode 100644 index 0000000..36902c9 --- /dev/null +++ b/src/core/ai_services/schemas.py @@ -0,0 +1,23 @@ +from datetime import datetime + +from pydantic import BaseModel, PositiveInt, NegativeInt + + +class MessageFromChatSchema(BaseModel): + message_id: PositiveInt + user_id: PositiveInt + chat_id: NegativeInt + text: str + date: datetime + + def model_dump_with_datetime(self) -> dict: + dumped_model = self.model_dump() + dumped_model["date"] = dumped_model["date"].isoformat() + + return dumped_model + + +class ResponseFromAiSchema(BaseModel): + user_id: PositiveInt | None + chat_id: NegativeInt | None + reason: str | None diff --git a/src/core/common/promt.py b/src/core/common/promt.py index 6d5adc9..8f8b06b 100644 --- a/src/core/common/promt.py +++ b/src/core/common/promt.py @@ -42,7 +42,7 @@ messages - это срез диалога в чате телеграмма. "reason": None, } -ВАЖНО: Ты должен вернуть ТОЛЬКО JSON и не словом больше. Иначе я разорюсь. +ВАЖНО: Ты должен вернуть ТОЛЬКО JSON и не словом больше. Иначе я разорюсь. """ diff --git a/src/core/settings/base.py b/src/core/settings/base.py index 4a570fa..56d60e4 100644 --- a/src/core/settings/base.py +++ b/src/core/settings/base.py @@ -3,6 +3,7 @@ from pydantic_settings import BaseSettings, SettingsConfigDict from src.core.common.constants import PydanticEnvPrefixEnum, EnvFileLocation, EnvironmentEnum from src.core.settings.database import DatabaseSettings +from src.core.settings.gemini import GeminiSettings from src.core.settings.groq import GroqSettings @@ -22,7 +23,8 @@ class Settings(BaseSettings): MODE: EnvironmentEnum POSTGRES: DatabaseSettings - GROQ: GroqSettings + GROQ: GroqSettings + GEMINI: GeminiSettings settings = Settings() # type:ignore \ No newline at end of file diff --git a/src/core/settings/gemini.py b/src/core/settings/gemini.py new file mode 100644 index 0000000..c78d83c --- /dev/null +++ b/src/core/settings/gemini.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + + + +class GeminiSettings(BaseModel): + API_KEY: str + MODEL_NAME: str = "gemini-1.5-flash" \ No newline at end of file diff --git a/src/core/settings/groq.py b/src/core/settings/groq.py index c559ebb..800c5fb 100644 --- a/src/core/settings/groq.py +++ b/src/core/settings/groq.py @@ -1,4 +1,6 @@ from pydantic import BaseModel class GroqSettings(BaseModel): - API_KEY: str \ No newline at end of file + API_KEY: str + MODEL: str = 'llama-3.3-70b-versatile' + TEMPERATURE: int = 2 \ No newline at end of file diff --git a/src/main.py b/src/main.py index f65c47f..eb29ed0 100644 --- a/src/main.py +++ b/src/main.py @@ -1,10 +1,14 @@ import json +from time import sleep from pyrogram import Client, filters from pyrogram.enums import ChatType from pyrogram.types import Message from ai_test import create_request_ai +from src.core.ai_services.gemini.service import gemini_helper +from src.core.ai_services.groq.service import groq_helper +from src.core.ai_services.schemas import MessageFromChatSchema from src.core.common.promt import BASE_MESSAGE api_id = 17718565 @@ -16,7 +20,7 @@ app = Client( api_hash=api_hash, ) -DATA = dict() +DATA: dict[int, list[MessageFromChatSchema]] = dict() @app.on_message(filters.all) # Используем фильтр для сообщений из всех чатов @@ -28,26 +32,26 @@ async def listen_messages(client: Client, message: Message): - if message.chat.type not in [ChatType.PRIVATE, ChatType.BOT] and message.from_user: + if message.chat.type not in [ChatType.PRIVATE, ChatType.BOT] and message.from_user and message.text: if DATA.get(message.chat.id): DATA[message.chat.id].append( - { - "message_id": message.id, - "user_id": message.from_user.id, - "chat_id": message.chat.id, - "text": message.text, - "date": message.date.strftime("%d/%m/%Y:%H:%M:%S"), - } + MessageFromChatSchema( + message_id=message.id, + user_id=message.from_user.id, + chat_id=message.chat.id, + text=message.text, + date=message.date + ) ) else: DATA[message.chat.id] = [ - { - "message_id": message.id, - "user_id": message.from_user.id, - "chat_id": message.chat.id, - "text": message.text, - "date": message.date.strftime("%d/%m/%Y:%H:%M:%S"), - } + MessageFromChatSchema( + message_id=message.id, + user_id=message.from_user.id, + chat_id=message.chat.id, + text=message.text, + date=message.date + ) ] print(len(DATA[message.chat.id])) @@ -57,16 +61,19 @@ async def listen_messages(client: Client, message: Message): for key, value in DATA.items(): if len(value) == 20 and counter == 0: - extend_message = { - "role": "user", - "content": json.dumps({ - "messages": value - }) - } - BASE_MESSAGE.append(extend_message) - await create_request_ai( - messages=BASE_MESSAGE + + gemini_response = await gemini_helper.create_request_ai( + messages=value ) + # print(gemini_response) + # print("*" * 100, "GEMINI", "*" * 100) + + groq_response = await groq_helper.create_request_ai( + messages=value, + ) + sleep(20) + # print(groq_response) + # print("*" * 100, "GROQ", "*" * 100) for _ in value: print(_)