From 7e995866ffdf5f0ee2bdac7b3f86bb5d6d028c15 Mon Sep 17 00:00:00 2001 From: Dmitry Afanasyev <71835315+Balshgit@users.noreply.github.com> Date: Sun, 24 Sep 2023 06:32:49 +0300 Subject: [PATCH] microservices are able to run (#5) --- .github/workflows/check-lint.yml | 6 +- .github/workflows/poetry-test.yml | 4 +- Makefile | 4 +- README.md | 26 +- .../.github/workflows/docker-build-push.yml | 33 -- .../.github/workflows/sync-hugging.yml | 19 -- app/chat-gpt/Caddyfile | 11 - app/chat-gpt/Dockerfile | 18 -- app/constants.py | 1 - app/core/commands.py | 14 - {app => bot_microservice/api}/__init__.py | 0 .../api/bot}/__init__.py | 0 .../api/bot}/controllers.py | 13 +- .../api/system/__init__.py | 0 bot_microservice/api/system/controllers.py | 15 + bot_microservice/constants.py | 13 + .../core}/__init__.py | 0 {app => bot_microservice}/core/bot.py | 5 +- bot_microservice/core/commands.py | 74 +++++ {app => bot_microservice}/core/handlers.py | 8 +- bot_microservice/core/logging.py | 102 ++++++ {app => bot_microservice}/core/utils.py | 26 +- {app => bot_microservice}/main.py | 18 +- {app => bot_microservice}/routers.py | 5 +- .../settings}/.env.ci.runtests | 1 + .../settings}/.env.local.runtests | 1 + .../settings}/.env.template | 4 + .../settings}/__init__.py | 0 .../settings}/config.py | 12 +- .../tests}/__init__.py | 0 .../tests/integration}/__init__.py | 0 .../tests/integration/bot}/__init__.py | 0 .../tests}/integration/bot/conftest.py | 9 +- .../tests}/integration/bot/networking.py | 0 .../integration/bot/test_bot_updates.py | 5 +- .../tests/integration/factories}/__init__.py | 0 .../tests}/integration/factories/bot.py | 1 - .../tests}/integration/factories/models.py | 0 .../README.md | 0 .../__init__.py | 0 .../babel.cfg | 0 .../client/css/button.css | 0 .../client/css/buttons.css | 0 .../client/css/checkbox.css | 0 .../client/css/conversation.css | 0 .../client/css/dropdown.css | 0 .../client/css/field.css | 0 .../client/css/global.css | 0 .../client/css/hljs.css | 0 .../client/css/label.css | 0 .../client/css/main.css | 0 .../client/css/message-input.css | 0 .../client/css/message.css | 0 .../client/css/options.css | 0 .../client/css/select.css | 0 .../client/css/settings.css | 0 .../client/css/sidebar.css | 0 .../client/css/stop-generating.css | 0 .../client/css/style.css | 0 .../client/css/typing.css | 0 .../client/html/index.html | 0 .../client/img/android-chrome-192x192.png | Bin .../client/img/android-chrome-512x512.png | Bin .../client/img/apple-touch-icon.png | Bin .../client/img/favicon-16x16.png | Bin .../client/img/favicon-32x32.png | Bin .../client/img/favicon.ico | Bin .../client/img/gpt.png | Bin .../client/img/site.webmanifest | 0 .../client/img/user.png | Bin .../client/js/change-language.js | 0 .../client/js/chat.js | 0 .../client/js/highlight.min.js | 0 .../client/js/highlightjs-copy.min.js | 0 .../client/js/icons.js | 0 .../client/js/sidebar-toggler.js | 0 .../client/js/theme-toggler.js | 0 .../config.json | 2 +- .../docker-compose.yml | 0 .../g4f/Provider/Provider.py | 3 +- .../g4f/Provider/Providers/AiService.py | 3 +- .../g4f/Provider/Providers/Aichat.py | 3 +- .../g4f/Provider/Providers/Ails.py | 4 +- .../g4f/Provider/Providers/Bard.py | 3 +- .../g4f/Provider/Providers/Better.py | 0 .../g4f/Provider/Providers/Bing.py | 3 +- .../g4f/Provider/Providers/ChatFree.py | 3 +- .../g4f/Provider/Providers/ChatgptAi.py | 3 +- .../g4f/Provider/Providers/ChatgptLogin.py | 3 +- .../g4f/Provider/Providers/DeepAi.py | 3 +- .../g4f/Provider/Providers/Easychat.py | 3 +- .../g4f/Provider/Providers/Ezcht.py | 3 +- .../g4f/Provider/Providers/Fakeopen.py | 0 .../g4f/Provider/Providers/Forefront.py | 3 +- .../g4f/Provider/Providers/GetGpt.py | 3 +- .../g4f/Provider/Providers/Gravityengine.py | 3 +- .../g4f/Provider/Providers/H2o.py | 3 +- .../g4f/Provider/Providers/Liaobots.py | 3 +- .../g4f/Provider/Providers/Lockchat.py | 3 +- .../g4f/Provider/Providers/Mishalsgpt.py | 3 +- .../g4f/Provider/Providers/Phind.py | 3 +- .../g4f/Provider/Providers/Theb.py | 3 +- .../g4f/Provider/Providers/Vercel.py | 3 +- .../g4f/Provider/Providers/Weuseing.py | 3 +- .../g4f/Provider/Providers/Wewordle.py | 3 +- .../g4f/Provider/Providers/Xiaor.py | 3 +- .../g4f/Provider/Providers/You.py | 0 .../g4f/Provider/Providers/Yqcloud.py | 3 +- .../g4f/Provider/Providers/Zeabur.py | 3 +- .../g4f/Provider/Providers}/__init__.py | 0 .../Provider/Providers/helpers}/__init__.py | 0 .../Provider/Providers/helpers/gpt4love.py | 0 .../g4f/Provider/Providers/helpers/phind.py | 0 .../g4f/Provider/Providers/helpers/theb.py | 0 .../g4f/Provider/Providers/helpers/you.py | 0 .../g4f/Provider/Providers/hteyun.py | 3 +- .../g4f/Provider/__init__.py | 0 .../g4f/README.md | 0 .../g4f/__init__.py | 0 .../g4f/active_providers.py | 0 .../g4f/models.py | 0 .../g4f/typing.py | 0 .../g4f/utils.py | 0 .../get_working_providers.py | 0 .../chat-gpt => chat_gpt_microservice}/run.py | 26 +- chat_gpt_microservice/server/__init__.py | 0 .../server/babel.py | 0 .../server/backend.py | 0 .../server/bp.py | 0 .../server/config.py | 0 .../server/website.py | 0 .../translations/README.md | 0 .../ar_SA/LC_MESSAGES/messages.po | 0 .../cs_CZ/LC_MESSAGES/messages.po | 0 .../da_DK/LC_MESSAGES/messages.po | 0 .../de_DE/LC_MESSAGES/messages.po | 0 .../el_GR/LC_MESSAGES/messages.po | 0 .../en_US/LC_MESSAGES/messages.po | 0 .../es_ES/LC_MESSAGES/messages.po | 0 .../es_MX/LC_MESSAGES/messages.po | 0 .../fi_FI/LC_MESSAGES/messages.po | 0 .../fr_FR/LC_MESSAGES/messages.po | 0 .../he_IL/LC_MESSAGES/messages.po | 0 .../hi_IN/LC_MESSAGES/messages.po | 0 .../hu_HU/LC_MESSAGES/messages.po | 0 .../id_ID/LC_MESSAGES/messages.po | 0 .../it_IT/LC_MESSAGES/messages.po | 0 .../ja_JP/LC_MESSAGES/messages.po | 0 .../ko_KR/LC_MESSAGES/messages.po | 0 .../nb_NO/LC_MESSAGES/messages.po | 0 .../nl_NL/LC_MESSAGES/messages.po | 0 .../pl_PL/LC_MESSAGES/messages.po | 0 .../pt_BR/LC_MESSAGES/messages.po | 0 .../ro_RO/LC_MESSAGES/messages.po | 0 .../ru_RU/LC_MESSAGES/messages.po | 0 .../sk_SK/LC_MESSAGES/messages.po | 0 .../sv_SE/LC_MESSAGES/messages.po | 0 .../th_TH/LC_MESSAGES/messages.po | 0 .../tr_TR/LC_MESSAGES/messages.po | 0 .../uk_UA/LC_MESSAGES/messages.po | 0 .../vi_VN/LC_MESSAGES/messages.po | 0 .../zh_Hans_CN/LC_MESSAGES/messages.po | 0 .../zh_Hant_TW/LC_MESSAGES/messages.po | 0 deploy/Caddyfile | 18 ++ deploy/Dockerfile | 97 +++--- docker-compose.yml | 76 +++-- lefthook.yml | 6 +- poetry.lock | 306 +++++++++++------- pyproject.toml | 21 +- scripts/start-bot.sh | 5 +- scripts/start-chat.sh | 11 + 171 files changed, 676 insertions(+), 425 deletions(-) delete mode 100644 app/chat-gpt/.github/workflows/docker-build-push.yml delete mode 100644 app/chat-gpt/.github/workflows/sync-hugging.yml delete mode 100644 app/chat-gpt/Caddyfile delete mode 100644 app/chat-gpt/Dockerfile delete mode 100644 app/constants.py delete mode 100644 app/core/commands.py rename {app => bot_microservice/api}/__init__.py (100%) rename {app/api => bot_microservice/api/bot}/__init__.py (100%) rename {app/api/system => bot_microservice/api/bot}/controllers.py (70%) rename {app => bot_microservice}/api/system/__init__.py (100%) create mode 100644 bot_microservice/api/system/controllers.py create mode 100644 bot_microservice/constants.py rename {app/chat-gpt/g4f/Provider/Providers => bot_microservice/core}/__init__.py (100%) rename {app => bot_microservice}/core/bot.py (98%) create mode 100644 bot_microservice/core/commands.py rename {app => bot_microservice}/core/handlers.py (52%) create mode 100644 bot_microservice/core/logging.py rename {app => bot_microservice}/core/utils.py (66%) rename {app => bot_microservice}/main.py (82%) rename {app => bot_microservice}/routers.py (65%) rename {settings => bot_microservice/settings}/.env.ci.runtests (95%) rename {settings => bot_microservice/settings}/.env.local.runtests (95%) rename {settings => bot_microservice/settings}/.env.template (85%) rename {app/chat-gpt/g4f/Provider/Providers/helpers => bot_microservice/settings}/__init__.py (100%) rename {settings => bot_microservice/settings}/config.py (85%) rename {app/chat-gpt/server => bot_microservice/tests}/__init__.py (100%) rename {app/core => bot_microservice/tests/integration}/__init__.py (100%) rename {settings => bot_microservice/tests/integration/bot}/__init__.py (100%) rename {tests => bot_microservice/tests}/integration/bot/conftest.py (98%) rename {tests => bot_microservice/tests}/integration/bot/networking.py (100%) rename {tests => bot_microservice/tests}/integration/bot/test_bot_updates.py (96%) rename {tests => bot_microservice/tests/integration/factories}/__init__.py (100%) rename {tests => bot_microservice/tests}/integration/factories/bot.py (99%) rename {tests => bot_microservice/tests}/integration/factories/models.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/README.md (100%) rename {tests/integration => chat_gpt_microservice}/__init__.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/babel.cfg (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/button.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/buttons.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/checkbox.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/conversation.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/dropdown.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/field.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/global.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/hljs.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/label.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/main.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/message-input.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/message.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/options.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/select.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/settings.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/sidebar.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/stop-generating.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/style.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/css/typing.css (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/html/index.html (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/android-chrome-192x192.png (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/android-chrome-512x512.png (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/apple-touch-icon.png (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/favicon-16x16.png (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/favicon-32x32.png (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/favicon.ico (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/gpt.png (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/site.webmanifest (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/img/user.png (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/js/change-language.js (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/js/chat.js (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/js/highlight.min.js (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/js/highlightjs-copy.min.js (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/js/icons.js (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/js/sidebar-toggler.js (100%) rename {app/chat-gpt => chat_gpt_microservice}/client/js/theme-toggler.js (100%) rename {app/chat-gpt => chat_gpt_microservice}/config.json (78%) rename {app/chat-gpt => chat_gpt_microservice}/docker-compose.yml (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Provider.py (92%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/AiService.py (96%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Aichat.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Ails.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Bard.py (98%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Better.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Bing.py (99%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/ChatFree.py (98%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/ChatgptAi.py (98%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/ChatgptLogin.py (99%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/DeepAi.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Easychat.py (98%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Ezcht.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Fakeopen.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Forefront.py (96%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/GetGpt.py (98%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Gravityengine.py (95%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/H2o.py (99%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Liaobots.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Lockchat.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Mishalsgpt.py (95%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Phind.py (96%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Theb.py (95%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Vercel.py (99%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Weuseing.py (96%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Wewordle.py (98%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Xiaor.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/You.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Yqcloud.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/Zeabur.py (98%) rename {tests/integration/bot => chat_gpt_microservice/g4f/Provider/Providers}/__init__.py (100%) rename {tests/integration/factories => chat_gpt_microservice/g4f/Provider/Providers/helpers}/__init__.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/helpers/gpt4love.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/helpers/phind.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/helpers/theb.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/helpers/you.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/Providers/hteyun.py (97%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/Provider/__init__.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/README.md (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/__init__.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/active_providers.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/models.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/typing.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/g4f/utils.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/get_working_providers.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/run.py (75%) create mode 100644 chat_gpt_microservice/server/__init__.py rename {app/chat-gpt => chat_gpt_microservice}/server/babel.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/server/backend.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/server/bp.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/server/config.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/server/website.py (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/README.md (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/ar_SA/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/cs_CZ/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/da_DK/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/de_DE/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/el_GR/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/en_US/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/es_ES/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/es_MX/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/fi_FI/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/fr_FR/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/he_IL/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/hi_IN/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/hu_HU/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/id_ID/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/it_IT/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/ja_JP/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/ko_KR/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/nb_NO/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/nl_NL/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/pl_PL/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/pt_BR/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/ro_RO/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/ru_RU/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/sk_SK/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/sv_SE/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/th_TH/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/tr_TR/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/uk_UA/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/vi_VN/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/zh_Hans_CN/LC_MESSAGES/messages.po (100%) rename {app/chat-gpt => chat_gpt_microservice}/translations/zh_Hant_TW/LC_MESSAGES/messages.po (100%) create mode 100644 deploy/Caddyfile create mode 100644 scripts/start-chat.sh diff --git a/.github/workflows/check-lint.yml b/.github/workflows/check-lint.yml index 5a1bbae..09c1988 100644 --- a/.github/workflows/check-lint.yml +++ b/.github/workflows/check-lint.yml @@ -62,10 +62,10 @@ jobs: - name: Analysing the code with mypy run: | source .venv/bin/activate - poetry run mypy app + poetry run mypy bot_microservice - name: Analysing the code with flake8 run: | - poetry run flake8 app + poetry run flake8 bot_microservice - name: Analysing code with isort run: | - poetry run isort --check-only app \ No newline at end of file + poetry run isort --check-only bot_microservice \ No newline at end of file diff --git a/.github/workflows/poetry-test.yml b/.github/workflows/poetry-test.yml index 7ec3794..f80e027 100644 --- a/.github/workflows/poetry-test.yml +++ b/.github/workflows/poetry-test.yml @@ -66,10 +66,10 @@ jobs: - name: Run tests run: | source .venv/bin/activate - poetry run pytest -vv --exitfirst + poetry run pytest bot_microservice/ -vv --exitfirst - name: Coverage report run: | - poetry run coverage run -m pytest + poetry run coverage run -m pytest bot_microservice/ poetry run coverage report - name: Extended checks run: | diff --git a/Makefile b/Makefile index 74922ed..ff3958d 100644 --- a/Makefile +++ b/Makefile @@ -7,12 +7,12 @@ RESET := $(shell tput -Txterm sgr0) .DEFAULT_GOAL := help .PHONY: help app format lint check-style check-import-sorting lint-typing lint-imports lint-complexity lint-deps -PY_TARGET_DIRS=app settings tests +PY_TARGET_DIRS=bot_microservice PORT=8000 ## Запустить приложение app: - poetry run uvicorn --host 0.0.0.0 --factory app.main:create_app --port $(PORT) --reload --reload-dir=app --reload-dir=settings + poetry run uvicorn --host 0.0.0.0 --factory bot_microservice.main:create_app --port $(PORT) --reload --reload-dir=bot_microservice --reload-dir=settings ## Отформатировать код format: diff --git a/README.md b/README.md index cab2c5d..a18c616 100644 --- a/README.md +++ b/README.md @@ -18,17 +18,23 @@ sudo systemctl start chat_gpt_bot.service ``` ## Local start + +### Bot: + ```bash +cd bot_microservice python main.py ``` ```shell - poetry run uvicorn --host 0.0.0.0 --factory app.main:create_app --port 8000 --reload --reload-dir=app --reload-dir=settings +cd bot_microservice + poetry run uvicorn --host 0.0.0.0 --factory main:create_app --port 8000 --reload ``` -- set `START_WITH_WEBHOOK` to blank +To start on polling mode set `START_WITH_WEBHOOK` to blank -## Delete or set webhook manually + +### Delete or set webhook manually url: https://api.telegram.org/bot{TELEGRAM_TOKEN}/{method}Webhook?url={WEBHOOK_URL} @@ -37,6 +43,20 @@ methods: - set +## Chat: + +```shell +cd chat_gpt_microservice +python3 run.py +``` + + +```bash +cd chat_gpt_microservice +poetry run uvicorn --host 0.0.0.0 --factory run:create_app --port 1338 --reload +``` + + ## Tests ```bash diff --git a/app/chat-gpt/.github/workflows/docker-build-push.yml b/app/chat-gpt/.github/workflows/docker-build-push.yml deleted file mode 100644 index 8c62399..0000000 --- a/app/chat-gpt/.github/workflows/docker-build-push.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Docker Build and Push -on: - push: - branches: - - main -jobs: - build-and-push: - runs-on: ubuntu-latest - steps: - - - name: Checkout code - uses: actions/checkout@v2 - - - name: Set up QEMU - Support for more platforms - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Login to Docker Hub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - - name: Build and push Docker image - uses: docker/build-push-action@v2 - with: - context: . - file: Dockerfile - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ secrets.DOCKER_USERNAME }}/freegpt-webui:latest diff --git a/app/chat-gpt/.github/workflows/sync-hugging.yml b/app/chat-gpt/.github/workflows/sync-hugging.yml deleted file mode 100644 index 63967cc..0000000 --- a/app/chat-gpt/.github/workflows/sync-hugging.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Sync with Hugging Face Hub - -on: - push: - branches: - - main - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Sync with Hugging Face - uses: ramonvc/huggingface-sync-action@v0.0.1 - with: - github_repo_id: ramonvc/freegpt-webui - huggingface_repo_id: monra/freegpt-webui - repo_type: space - space_sdk: docker - hf_token: ${{ secrets.HF_TOKEN }} \ No newline at end of file diff --git a/app/chat-gpt/Caddyfile b/app/chat-gpt/Caddyfile deleted file mode 100644 index f337821..0000000 --- a/app/chat-gpt/Caddyfile +++ /dev/null @@ -1,11 +0,0 @@ -:8080 { - - # Serving dynamic requests: - reverse_proxy chat_gpt:1338 - - # Logs: - log { - output stdout - } - -} diff --git a/app/chat-gpt/Dockerfile b/app/chat-gpt/Dockerfile deleted file mode 100644 index 2b931be..0000000 --- a/app/chat-gpt/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM python:3.11-slim - -WORKDIR /app - -COPY requirements.txt requirements.txt - -RUN python -m venv venv -ENV PATH="/app/venv/bin:$PATH" - -RUN apt-get update \ - && apt-get install -y --no-install-recommends build-essential libffi-dev cmake libcurl4-openssl-dev \ - && pip install --upgrade pip && pip3 install --no-cache-dir -r requirements.txt - -COPY . . - -RUN chmod -R 777 translations - -CMD ["python3", "./run.py"] diff --git a/app/constants.py b/app/constants.py deleted file mode 100644 index ad8bfb3..0000000 --- a/app/constants.py +++ /dev/null @@ -1 +0,0 @@ -API_PREFIX = "/api" diff --git a/app/core/commands.py b/app/core/commands.py deleted file mode 100644 index 962ad4c..0000000 --- a/app/core/commands.py +++ /dev/null @@ -1,14 +0,0 @@ -from telegram import Update -from telegram.ext import ContextTypes - - -async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: - """Send a message when the command /help is issued.""" - - if update.message: - await update.message.reply_text( - "Help!", - disable_notification=True, - api_kwargs={"text": "Hello World"}, - ) - return None diff --git a/app/__init__.py b/bot_microservice/api/__init__.py similarity index 100% rename from app/__init__.py rename to bot_microservice/api/__init__.py diff --git a/app/api/__init__.py b/bot_microservice/api/bot/__init__.py similarity index 100% rename from app/api/__init__.py rename to bot_microservice/api/bot/__init__.py diff --git a/app/api/system/controllers.py b/bot_microservice/api/bot/controllers.py similarity index 70% rename from app/api/system/controllers.py rename to bot_microservice/api/bot/controllers.py index 33c5a95..8c9e0d3 100644 --- a/app/api/system/controllers.py +++ b/bot_microservice/api/bot/controllers.py @@ -1,23 +1,12 @@ from fastapi import APIRouter, Request from fastapi.responses import ORJSONResponse -from starlette import status - from settings.config import get_settings +from starlette import status router = APIRouter() settings = get_settings() -@router.get( - "/healthcheck", - name="system:healthcheck", - status_code=status.HTTP_200_OK, - summary="Healthcheck service", -) -async def healthcheck() -> ORJSONResponse: - return ORJSONResponse(content=None, status_code=status.HTTP_200_OK) - - @router.post( f"/{settings.TELEGRAM_API_TOKEN}", name="system:process_bot_updates", diff --git a/app/api/system/__init__.py b/bot_microservice/api/system/__init__.py similarity index 100% rename from app/api/system/__init__.py rename to bot_microservice/api/system/__init__.py diff --git a/bot_microservice/api/system/controllers.py b/bot_microservice/api/system/controllers.py new file mode 100644 index 0000000..16a3204 --- /dev/null +++ b/bot_microservice/api/system/controllers.py @@ -0,0 +1,15 @@ +from fastapi import APIRouter +from fastapi.responses import ORJSONResponse +from starlette import status + +router = APIRouter() + + +@router.get( + "/healthcheck", + name="system:healthcheck", + status_code=status.HTTP_200_OK, + summary="Healthcheck service", +) +async def healthcheck() -> ORJSONResponse: + return ORJSONResponse(content=None, status_code=status.HTTP_200_OK) diff --git a/bot_microservice/constants.py b/bot_microservice/constants.py new file mode 100644 index 0000000..425fcb6 --- /dev/null +++ b/bot_microservice/constants.py @@ -0,0 +1,13 @@ +from enum import StrEnum + +API_PREFIX = "/api" +CHAT_GPT_BASE_URL = "http://chat_service:1338/backend-api/v2/conversation" + + +class LogLevelEnum(StrEnum): + CRITICAL = "critical" + ERROR = "error" + WARNING = "warning" + INFO = "info" + DEBUG = "debug" + NOTSET = "" diff --git a/app/chat-gpt/g4f/Provider/Providers/__init__.py b/bot_microservice/core/__init__.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/__init__.py rename to bot_microservice/core/__init__.py diff --git a/app/core/bot.py b/bot_microservice/core/bot.py similarity index 98% rename from app/core/bot.py rename to bot_microservice/core/bot.py index 9ea91bc..8544387 100644 --- a/app/core/bot.py +++ b/bot_microservice/core/bot.py @@ -7,12 +7,11 @@ from http import HTTPStatus from typing import Any from fastapi import Request, Response +from loguru import logger +from settings.config import AppSettings from telegram import Update from telegram.ext import Application -from app.core.utils import logger -from settings.config import AppSettings - class BotApplication: def __init__( diff --git a/bot_microservice/core/commands.py b/bot_microservice/core/commands.py new file mode 100644 index 0000000..4a9ccc4 --- /dev/null +++ b/bot_microservice/core/commands.py @@ -0,0 +1,74 @@ +import random +import tempfile +from uuid import uuid4 + +import httpx +from constants import CHAT_GPT_BASE_URL +from core.utils import convert_file_to_wav +from httpx import AsyncClient, AsyncHTTPTransport +from loguru import logger +from telegram import Update +from telegram.ext import ContextTypes + + +async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + """Send a message when the command /help is issued.""" + + if update.message: + await update.message.reply_text( + "Help!", + disable_notification=True, + api_kwargs={"text": "Hello World"}, + ) + return None + + +async def ask_question(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + await update.message.reply_text( # type: ignore[union-attr] + "Пожалуйста подождите, ответ в среднем занимает 10-15 секунд" + ) + + chat_gpt_request = { + "conversation_id": str(uuid4()), + "action": "_ask", + "model": "gpt-3.5-turbo", + "jailbreak": "default", + "meta": { + "id": random.randint(10**18, 10**19 - 1), # noqa: S311 + "content": { + "conversation": [], + "internet_access": False, + "content_type": "text", + "parts": [{"content": update.message.text, "role": "user"}], # type: ignore[union-attr] + }, + }, + } + + transport = AsyncHTTPTransport(retries=1) + async with AsyncClient(transport=transport) as client: + try: + response = await client.post(CHAT_GPT_BASE_URL, json=chat_gpt_request) + status = response.status_code + if status != httpx.codes.OK: + logger.info(f'got response status: {status} from chat api', data=chat_gpt_request) + await update.message.reply_text( # type: ignore[union-attr] + "Что-то пошло не так, попробуйте еще раз или обратитесь к администратору" + ) + return + + data = response.json() + await update.message.reply_text(data) # type: ignore[union-attr] + except Exception as error: + logger.error("error get data from chat api", error=error) + await update.message.reply_text("Вообще всё сломалось :(") # type: ignore[union-attr] + + +async def voice_recognize(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + await update.message.reply_text( # type: ignore[union-attr] + "Пожалуйста, ожидайте :)\nТрехминутная запись обрабатывается примерно 30 секунд" + ) + sound_bytes = await update.message.voice.get_file() # type: ignore[union-attr] + sound_bytes = await sound_bytes.download_as_bytearray() + with tempfile.NamedTemporaryFile(delete=False) as tmpfile: + tmpfile.write(sound_bytes) + convert_file_to_wav(tmpfile.name) diff --git a/app/core/handlers.py b/bot_microservice/core/handlers.py similarity index 52% rename from app/core/handlers.py rename to bot_microservice/core/handlers.py index bda9288..0174b98 100644 --- a/app/core/handlers.py +++ b/bot_microservice/core/handlers.py @@ -1,9 +1,8 @@ from dataclasses import dataclass, field from typing import Any -from telegram.ext import CommandHandler - -from app.core.commands import help_command +from core.commands import ask_question, help_command, voice_recognize +from telegram.ext import CommandHandler, MessageHandler, filters @dataclass @@ -16,5 +15,6 @@ class CommandHandlers: command_handlers = CommandHandlers() - command_handlers.add_handler(CommandHandler("help", help_command)) +command_handlers.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, ask_question)) +command_handlers.add_handler(MessageHandler(filters.VOICE | filters.AUDIO, voice_recognize)) diff --git a/bot_microservice/core/logging.py b/bot_microservice/core/logging.py new file mode 100644 index 0000000..a18d174 --- /dev/null +++ b/bot_microservice/core/logging.py @@ -0,0 +1,102 @@ +import logging +import sys +from types import FrameType +from typing import TYPE_CHECKING, Any, cast + +from constants import LogLevelEnum +from loguru import logger +from sentry_sdk.integrations.logging import EventHandler + +if TYPE_CHECKING: + from loguru import Record +else: + Record = dict[str, Any] + + +class InterceptHandler(logging.Handler): + def emit(self, record: logging.LogRecord) -> None: + # Get corresponding Loguru level if it exists + try: + level = logger.level(record.levelname).name + except ValueError: + level = str(record.levelno) + + # Find caller from where originated the logged message + frame, depth = logging.currentframe(), 2 + while frame.f_code.co_filename == logging.__file__: + frame = cast(FrameType, frame.f_back) + depth += 1 + + logger.opt(depth=depth, exception=record.exc_info).log( + level, + record.getMessage(), + ) + + +def configure_logging(*, level: LogLevelEnum, enable_json_logs: bool, enable_sentry_logs: bool) -> None: + logging_level = level.name + + intercept_handler = InterceptHandler() + + logging.basicConfig(handlers=[intercept_handler], level=logging_level) + + formatter = _json_formatter if enable_json_logs else _text_formatter + logger.configure( + handlers=[ + { + "sink": sys.stdout, + "level": logging_level, + "serialize": enable_json_logs, + "format": formatter, + "colorize": True, + } + ], + ) + + # sentry sdk не умеет из коробки работать с loguru, нужно добавлять хандлер + # https://github.com/getsentry/sentry-python/issues/653#issuecomment-788854865 + # https://forum.sentry.io/t/changing-issue-title-when-logging-with-traceback/446 + if enable_sentry_logs: + handler = EventHandler(level=logging.WARNING) + logger.add(handler, diagnose=True, level=logging.WARNING, format=_sentry_formatter) + + +def _json_formatter(record: Record) -> str: + # Обрезаем `\n` в конце логов, т.к. в json формате переносы не нужны + return record.get("message", "").strip() + + +def _sentry_formatter(record: Record) -> str: + return "{name}:{function} {message}" + + +def _text_formatter(record: Record) -> str: + # WARNING !!! + # Функция должна возвращать строку, которая содержит только шаблоны для форматирования. + # Если в строку прокидывать значения из record (или еще откуда-либо), + # то loguru может принять их за f-строки и попытается обработать, что приведет к ошибке. + # Например, если нужно достать какое-то значение из поля extra, вместо того чтобы прокидывать его в строку формата, + # нужно прокидывать подстроку вида {extra[тут_ключ]} + + # Стандартный формат loguru. Задается через env LOGURU_FORMAT + format_ = ( + "{time:YYYY-MM-DD HH:mm:ss.SSS} | " + "{level: <8} | " + "{name}:{function}:{line} - {message}" + ) + + # Добавляем мета параметры по типу user_id, art_id, которые передаются через logger.bind(...) + extra = record["extra"] + if extra: + formatted = ", ".join(f"{key}" + "={extra[" + str(key) + "]}" for key, value in extra.items()) + format_ += f" - {formatted}" + + format_ += "\n" + + if record["exception"] is not None: + format_ += "{exception}\n" + + return format_ + + +configure_logging(level=LogLevelEnum.DEBUG, enable_json_logs=True, enable_sentry_logs=True) diff --git a/app/core/utils.py b/bot_microservice/core/utils.py similarity index 66% rename from app/core/utils.py rename to bot_microservice/core/utils.py index ab75eb6..d019d57 100644 --- a/app/core/utils.py +++ b/bot_microservice/core/utils.py @@ -1,19 +1,9 @@ -import sys +import subprocess # noqa from datetime import datetime, timedelta from functools import lru_cache, wraps from typing import Any -from loguru import logger as loguru_logger - -logger = loguru_logger - -logger.remove() -logger.add( - sink=sys.stdout, - colorize=True, - level='DEBUG', - format="{time:DD.MM.YYYY HH:mm:ss} | {level} | {message}", -) +from loguru import logger def timed_cache(**timedelta_kwargs: Any) -> Any: @@ -35,3 +25,15 @@ def timed_cache(**timedelta_kwargs: Any) -> Any: return _wrapped return _wrapper + + +def convert_file_to_wav(filename: str) -> str: + new_filename = filename + '.wav' + + cmd = ['ffmpeg', '-loglevel', 'quiet', '-i', filename, '-vn', new_filename] + + try: + subprocess.run(args=cmd) # noqa: S603 + except Exception as error: + logger.error("cant convert voice: reason", error=error) + return new_filename diff --git a/app/main.py b/bot_microservice/main.py similarity index 82% rename from app/main.py rename to bot_microservice/main.py index 1c4b598..e6144ff 100644 --- a/app/main.py +++ b/bot_microservice/main.py @@ -1,12 +1,12 @@ import asyncio from functools import cached_property +import sentry_sdk +from core.bot import BotApplication, BotQueue +from core.handlers import command_handlers from fastapi import FastAPI from fastapi.responses import UJSONResponse - -from app.core.bot import BotApplication, BotQueue -from app.core.handlers import command_handlers -from app.routers import api_router +from routers import api_router from settings.config import AppSettings, get_settings @@ -28,6 +28,14 @@ class Application: self.app.include_router(api_router) self.configure_hooks() + if settings.SENTRY_DSN is not None: + sentry_sdk.init( + dsn=settings.SENTRY_DSN, # type: ignore[arg-type] + environment=settings.DEPLOY_ENVIRONMENT, + traces_sample_rate=settings.SENTRY_TRACES_SAMPLE_RATE, + send_client_reports=False, + ) + @cached_property def fastapi_app(self) -> FastAPI: return self.app @@ -63,7 +71,7 @@ def main() -> None: """Entrypoint of the application.""" uvicorn.run( - "app.main:create_app", + "main:create_app", workers=app.state.settings.WORKERS_COUNT, host=app.state.settings.APP_HOST, port=app.state.settings.APP_PORT, diff --git a/app/routers.py b/bot_microservice/routers.py similarity index 65% rename from app/routers.py rename to bot_microservice/routers.py index 9866cc0..664a75a 100644 --- a/app/routers.py +++ b/bot_microservice/routers.py @@ -1,7 +1,7 @@ +from api.bot.controllers import router as bot_router +from api.system.controllers import router as system_router from fastapi import APIRouter from fastapi.responses import ORJSONResponse - -from app.api.system.controllers import router as system_router from settings.config import get_settings settings = get_settings() @@ -13,3 +13,4 @@ api_router = APIRouter( api_router.include_router(system_router, tags=["system"]) +api_router.include_router(bot_router, tags=["bot"]) diff --git a/settings/.env.ci.runtests b/bot_microservice/settings/.env.ci.runtests similarity index 95% rename from settings/.env.ci.runtests rename to bot_microservice/settings/.env.ci.runtests index c821656..60e125f 100644 --- a/settings/.env.ci.runtests +++ b/bot_microservice/settings/.env.ci.runtests @@ -4,6 +4,7 @@ APP_HOST="0.0.0.0" APP_PORT="8000" USER="web" +TZ="Europe/Moscow" TELEGRAM_API_TOKEN="123456789:AABBCCDDEEFFaabbccddeeff-1234567890" diff --git a/settings/.env.local.runtests b/bot_microservice/settings/.env.local.runtests similarity index 95% rename from settings/.env.local.runtests rename to bot_microservice/settings/.env.local.runtests index c821656..60e125f 100644 --- a/settings/.env.local.runtests +++ b/bot_microservice/settings/.env.local.runtests @@ -4,6 +4,7 @@ APP_HOST="0.0.0.0" APP_PORT="8000" USER="web" +TZ="Europe/Moscow" TELEGRAM_API_TOKEN="123456789:AABBCCDDEEFFaabbccddeeff-1234567890" diff --git a/settings/.env.template b/bot_microservice/settings/.env.template similarity index 85% rename from settings/.env.template rename to bot_microservice/settings/.env.template index aad5cd4..fb48762 100644 --- a/settings/.env.template +++ b/bot_microservice/settings/.env.template @@ -3,7 +3,11 @@ STAGE="dev" APP_HOST="0.0.0.0" APP_PORT="8000" +# SENTRY_DSN= +SENTRY_TRACES_SAMPLE_RATE="0.95" + USER="web" +TZ="Europe/Moscow" TELEGRAM_API_TOKEN="123456789:AABBCCDDEEFFaabbccddeeff-1234567890" diff --git a/app/chat-gpt/g4f/Provider/Providers/helpers/__init__.py b/bot_microservice/settings/__init__.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/helpers/__init__.py rename to bot_microservice/settings/__init__.py diff --git a/settings/config.py b/bot_microservice/settings/config.py similarity index 85% rename from settings/config.py rename to bot_microservice/settings/config.py index 97ade5a..c446e78 100644 --- a/settings/config.py +++ b/bot_microservice/settings/config.py @@ -2,11 +2,11 @@ from functools import cached_property from os import environ from pathlib import Path +from constants import API_PREFIX from dotenv import load_dotenv +from pydantic import HttpUrl from pydantic_settings import BaseSettings -from app.constants import API_PREFIX - BASE_DIR = Path(__file__).parent.parent SHARED_DIR = BASE_DIR.resolve().joinpath("shared") SHARED_DIR.mkdir(exist_ok=True) @@ -25,7 +25,13 @@ if environ.get("STAGE") == "runtests": load_dotenv(env_path, override=True) -class AppSettings(BaseSettings): +class SentrySettings(BaseSettings): + SENTRY_DSN: HttpUrl | None = None + DEPLOY_ENVIRONMENT: str | None = None + SENTRY_TRACES_SAMPLE_RATE: float = 0.95 + + +class AppSettings(SentrySettings, BaseSettings): """Application settings.""" PROJECT_NAME: str = "chat gpt bot" diff --git a/app/chat-gpt/server/__init__.py b/bot_microservice/tests/__init__.py similarity index 100% rename from app/chat-gpt/server/__init__.py rename to bot_microservice/tests/__init__.py diff --git a/app/core/__init__.py b/bot_microservice/tests/integration/__init__.py similarity index 100% rename from app/core/__init__.py rename to bot_microservice/tests/integration/__init__.py diff --git a/settings/__init__.py b/bot_microservice/tests/integration/bot/__init__.py similarity index 100% rename from settings/__init__.py rename to bot_microservice/tests/integration/bot/__init__.py diff --git a/tests/integration/bot/conftest.py b/bot_microservice/tests/integration/bot/conftest.py similarity index 98% rename from tests/integration/bot/conftest.py rename to bot_microservice/tests/integration/bot/conftest.py index 1e16f15..e2afffe 100644 --- a/tests/integration/bot/conftest.py +++ b/bot_microservice/tests/integration/bot/conftest.py @@ -9,16 +9,15 @@ from typing import Any, AsyncGenerator import pytest import pytest_asyncio +from core.bot import BotApplication +from core.handlers import command_handlers from fastapi import FastAPI from httpx import AsyncClient +from main import Application as AppApplication from pytest_asyncio.plugin import SubRequest +from settings.config import AppSettings, get_settings from telegram import Bot, User from telegram.ext import Application, ApplicationBuilder, Defaults, ExtBot - -from app.core.bot import BotApplication -from app.core.handlers import command_handlers -from app.main import Application as AppApplication -from settings.config import AppSettings, get_settings from tests.integration.bot.networking import NonchalantHttpxRequest from tests.integration.factories.bot import BotInfoFactory diff --git a/tests/integration/bot/networking.py b/bot_microservice/tests/integration/bot/networking.py similarity index 100% rename from tests/integration/bot/networking.py rename to bot_microservice/tests/integration/bot/networking.py diff --git a/tests/integration/bot/test_bot_updates.py b/bot_microservice/tests/integration/bot/test_bot_updates.py similarity index 96% rename from tests/integration/bot/test_bot_updates.py rename to bot_microservice/tests/integration/bot/test_bot_updates.py index 634c477..68bd088 100644 --- a/tests/integration/bot/test_bot_updates.py +++ b/bot_microservice/tests/integration/bot/test_bot_updates.py @@ -5,11 +5,10 @@ from typing import Any import pytest from assertpy import assert_that +from core.bot import BotApplication, BotQueue from faker import Faker from httpx import AsyncClient - -from app.core.bot import BotApplication, BotQueue -from app.main import Application +from main import Application from tests.integration.bot.networking import MockedRequest from tests.integration.factories.bot import ( BotChatFactory, diff --git a/tests/__init__.py b/bot_microservice/tests/integration/factories/__init__.py similarity index 100% rename from tests/__init__.py rename to bot_microservice/tests/integration/factories/__init__.py diff --git a/tests/integration/factories/bot.py b/bot_microservice/tests/integration/factories/bot.py similarity index 99% rename from tests/integration/factories/bot.py rename to bot_microservice/tests/integration/factories/bot.py index be0d25f..3704730 100644 --- a/tests/integration/factories/bot.py +++ b/bot_microservice/tests/integration/factories/bot.py @@ -2,7 +2,6 @@ import string import factory from faker import Faker - from tests.integration.factories.models import Chat, User faker = Faker("ru_RU") diff --git a/tests/integration/factories/models.py b/bot_microservice/tests/integration/factories/models.py similarity index 100% rename from tests/integration/factories/models.py rename to bot_microservice/tests/integration/factories/models.py diff --git a/app/chat-gpt/README.md b/chat_gpt_microservice/README.md similarity index 100% rename from app/chat-gpt/README.md rename to chat_gpt_microservice/README.md diff --git a/tests/integration/__init__.py b/chat_gpt_microservice/__init__.py similarity index 100% rename from tests/integration/__init__.py rename to chat_gpt_microservice/__init__.py diff --git a/app/chat-gpt/babel.cfg b/chat_gpt_microservice/babel.cfg similarity index 100% rename from app/chat-gpt/babel.cfg rename to chat_gpt_microservice/babel.cfg diff --git a/app/chat-gpt/client/css/button.css b/chat_gpt_microservice/client/css/button.css similarity index 100% rename from app/chat-gpt/client/css/button.css rename to chat_gpt_microservice/client/css/button.css diff --git a/app/chat-gpt/client/css/buttons.css b/chat_gpt_microservice/client/css/buttons.css similarity index 100% rename from app/chat-gpt/client/css/buttons.css rename to chat_gpt_microservice/client/css/buttons.css diff --git a/app/chat-gpt/client/css/checkbox.css b/chat_gpt_microservice/client/css/checkbox.css similarity index 100% rename from app/chat-gpt/client/css/checkbox.css rename to chat_gpt_microservice/client/css/checkbox.css diff --git a/app/chat-gpt/client/css/conversation.css b/chat_gpt_microservice/client/css/conversation.css similarity index 100% rename from app/chat-gpt/client/css/conversation.css rename to chat_gpt_microservice/client/css/conversation.css diff --git a/app/chat-gpt/client/css/dropdown.css b/chat_gpt_microservice/client/css/dropdown.css similarity index 100% rename from app/chat-gpt/client/css/dropdown.css rename to chat_gpt_microservice/client/css/dropdown.css diff --git a/app/chat-gpt/client/css/field.css b/chat_gpt_microservice/client/css/field.css similarity index 100% rename from app/chat-gpt/client/css/field.css rename to chat_gpt_microservice/client/css/field.css diff --git a/app/chat-gpt/client/css/global.css b/chat_gpt_microservice/client/css/global.css similarity index 100% rename from app/chat-gpt/client/css/global.css rename to chat_gpt_microservice/client/css/global.css diff --git a/app/chat-gpt/client/css/hljs.css b/chat_gpt_microservice/client/css/hljs.css similarity index 100% rename from app/chat-gpt/client/css/hljs.css rename to chat_gpt_microservice/client/css/hljs.css diff --git a/app/chat-gpt/client/css/label.css b/chat_gpt_microservice/client/css/label.css similarity index 100% rename from app/chat-gpt/client/css/label.css rename to chat_gpt_microservice/client/css/label.css diff --git a/app/chat-gpt/client/css/main.css b/chat_gpt_microservice/client/css/main.css similarity index 100% rename from app/chat-gpt/client/css/main.css rename to chat_gpt_microservice/client/css/main.css diff --git a/app/chat-gpt/client/css/message-input.css b/chat_gpt_microservice/client/css/message-input.css similarity index 100% rename from app/chat-gpt/client/css/message-input.css rename to chat_gpt_microservice/client/css/message-input.css diff --git a/app/chat-gpt/client/css/message.css b/chat_gpt_microservice/client/css/message.css similarity index 100% rename from app/chat-gpt/client/css/message.css rename to chat_gpt_microservice/client/css/message.css diff --git a/app/chat-gpt/client/css/options.css b/chat_gpt_microservice/client/css/options.css similarity index 100% rename from app/chat-gpt/client/css/options.css rename to chat_gpt_microservice/client/css/options.css diff --git a/app/chat-gpt/client/css/select.css b/chat_gpt_microservice/client/css/select.css similarity index 100% rename from app/chat-gpt/client/css/select.css rename to chat_gpt_microservice/client/css/select.css diff --git a/app/chat-gpt/client/css/settings.css b/chat_gpt_microservice/client/css/settings.css similarity index 100% rename from app/chat-gpt/client/css/settings.css rename to chat_gpt_microservice/client/css/settings.css diff --git a/app/chat-gpt/client/css/sidebar.css b/chat_gpt_microservice/client/css/sidebar.css similarity index 100% rename from app/chat-gpt/client/css/sidebar.css rename to chat_gpt_microservice/client/css/sidebar.css diff --git a/app/chat-gpt/client/css/stop-generating.css b/chat_gpt_microservice/client/css/stop-generating.css similarity index 100% rename from app/chat-gpt/client/css/stop-generating.css rename to chat_gpt_microservice/client/css/stop-generating.css diff --git a/app/chat-gpt/client/css/style.css b/chat_gpt_microservice/client/css/style.css similarity index 100% rename from app/chat-gpt/client/css/style.css rename to chat_gpt_microservice/client/css/style.css diff --git a/app/chat-gpt/client/css/typing.css b/chat_gpt_microservice/client/css/typing.css similarity index 100% rename from app/chat-gpt/client/css/typing.css rename to chat_gpt_microservice/client/css/typing.css diff --git a/app/chat-gpt/client/html/index.html b/chat_gpt_microservice/client/html/index.html similarity index 100% rename from app/chat-gpt/client/html/index.html rename to chat_gpt_microservice/client/html/index.html diff --git a/app/chat-gpt/client/img/android-chrome-192x192.png b/chat_gpt_microservice/client/img/android-chrome-192x192.png similarity index 100% rename from app/chat-gpt/client/img/android-chrome-192x192.png rename to chat_gpt_microservice/client/img/android-chrome-192x192.png diff --git a/app/chat-gpt/client/img/android-chrome-512x512.png b/chat_gpt_microservice/client/img/android-chrome-512x512.png similarity index 100% rename from app/chat-gpt/client/img/android-chrome-512x512.png rename to chat_gpt_microservice/client/img/android-chrome-512x512.png diff --git a/app/chat-gpt/client/img/apple-touch-icon.png b/chat_gpt_microservice/client/img/apple-touch-icon.png similarity index 100% rename from app/chat-gpt/client/img/apple-touch-icon.png rename to chat_gpt_microservice/client/img/apple-touch-icon.png diff --git a/app/chat-gpt/client/img/favicon-16x16.png b/chat_gpt_microservice/client/img/favicon-16x16.png similarity index 100% rename from app/chat-gpt/client/img/favicon-16x16.png rename to chat_gpt_microservice/client/img/favicon-16x16.png diff --git a/app/chat-gpt/client/img/favicon-32x32.png b/chat_gpt_microservice/client/img/favicon-32x32.png similarity index 100% rename from app/chat-gpt/client/img/favicon-32x32.png rename to chat_gpt_microservice/client/img/favicon-32x32.png diff --git a/app/chat-gpt/client/img/favicon.ico b/chat_gpt_microservice/client/img/favicon.ico similarity index 100% rename from app/chat-gpt/client/img/favicon.ico rename to chat_gpt_microservice/client/img/favicon.ico diff --git a/app/chat-gpt/client/img/gpt.png b/chat_gpt_microservice/client/img/gpt.png similarity index 100% rename from app/chat-gpt/client/img/gpt.png rename to chat_gpt_microservice/client/img/gpt.png diff --git a/app/chat-gpt/client/img/site.webmanifest b/chat_gpt_microservice/client/img/site.webmanifest similarity index 100% rename from app/chat-gpt/client/img/site.webmanifest rename to chat_gpt_microservice/client/img/site.webmanifest diff --git a/app/chat-gpt/client/img/user.png b/chat_gpt_microservice/client/img/user.png similarity index 100% rename from app/chat-gpt/client/img/user.png rename to chat_gpt_microservice/client/img/user.png diff --git a/app/chat-gpt/client/js/change-language.js b/chat_gpt_microservice/client/js/change-language.js similarity index 100% rename from app/chat-gpt/client/js/change-language.js rename to chat_gpt_microservice/client/js/change-language.js diff --git a/app/chat-gpt/client/js/chat.js b/chat_gpt_microservice/client/js/chat.js similarity index 100% rename from app/chat-gpt/client/js/chat.js rename to chat_gpt_microservice/client/js/chat.js diff --git a/app/chat-gpt/client/js/highlight.min.js b/chat_gpt_microservice/client/js/highlight.min.js similarity index 100% rename from app/chat-gpt/client/js/highlight.min.js rename to chat_gpt_microservice/client/js/highlight.min.js diff --git a/app/chat-gpt/client/js/highlightjs-copy.min.js b/chat_gpt_microservice/client/js/highlightjs-copy.min.js similarity index 100% rename from app/chat-gpt/client/js/highlightjs-copy.min.js rename to chat_gpt_microservice/client/js/highlightjs-copy.min.js diff --git a/app/chat-gpt/client/js/icons.js b/chat_gpt_microservice/client/js/icons.js similarity index 100% rename from app/chat-gpt/client/js/icons.js rename to chat_gpt_microservice/client/js/icons.js diff --git a/app/chat-gpt/client/js/sidebar-toggler.js b/chat_gpt_microservice/client/js/sidebar-toggler.js similarity index 100% rename from app/chat-gpt/client/js/sidebar-toggler.js rename to chat_gpt_microservice/client/js/sidebar-toggler.js diff --git a/app/chat-gpt/client/js/theme-toggler.js b/chat_gpt_microservice/client/js/theme-toggler.js similarity index 100% rename from app/chat-gpt/client/js/theme-toggler.js rename to chat_gpt_microservice/client/js/theme-toggler.js diff --git a/app/chat-gpt/config.json b/chat_gpt_microservice/config.json similarity index 78% rename from app/chat-gpt/config.json rename to chat_gpt_microservice/config.json index d197229..31863e9 100644 --- a/app/chat-gpt/config.json +++ b/chat_gpt_microservice/config.json @@ -4,5 +4,5 @@ "port": 1338, "debug": false }, - "url_prefix": "" + "url_prefix": "/gpt" } diff --git a/app/chat-gpt/docker-compose.yml b/chat_gpt_microservice/docker-compose.yml similarity index 100% rename from app/chat-gpt/docker-compose.yml rename to chat_gpt_microservice/docker-compose.yml diff --git a/app/chat-gpt/g4f/Provider/Provider.py b/chat_gpt_microservice/g4f/Provider/Provider.py similarity index 92% rename from app/chat-gpt/g4f/Provider/Provider.py rename to chat_gpt_microservice/g4f/Provider/Provider.py index 59b9965..59f63d5 100644 --- a/app/chat-gpt/g4f/Provider/Provider.py +++ b/chat_gpt_microservice/g4f/Provider/Provider.py @@ -1,6 +1,5 @@ import os - -from ..typing import get_type_hints +from typing import get_type_hints url = None model = None diff --git a/app/chat-gpt/g4f/Provider/Providers/AiService.py b/chat_gpt_microservice/g4f/Provider/Providers/AiService.py similarity index 96% rename from app/chat-gpt/g4f/Provider/Providers/AiService.py rename to chat_gpt_microservice/g4f/Provider/Providers/AiService.py index 6f7e818..3b258e7 100644 --- a/app/chat-gpt/g4f/Provider/Providers/AiService.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/AiService.py @@ -1,9 +1,8 @@ import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://aiservice.vercel.app/api/chat/answer" model = ["gpt-3.5-turbo"] supports_stream = False diff --git a/app/chat-gpt/g4f/Provider/Providers/Aichat.py b/chat_gpt_microservice/g4f/Provider/Providers/Aichat.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/Aichat.py rename to chat_gpt_microservice/g4f/Provider/Providers/Aichat.py index 9342e3e..99ed232 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Aichat.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Aichat.py @@ -1,10 +1,9 @@ import json import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://hteyun.com" model = [ "gpt-3.5-turbo", diff --git a/app/chat-gpt/g4f/Provider/Providers/Ails.py b/chat_gpt_microservice/g4f/Provider/Providers/Ails.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/Ails.py rename to chat_gpt_microservice/g4f/Provider/Providers/Ails.py index c3ed314..c349715 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Ails.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Ails.py @@ -4,10 +4,10 @@ import os import time import uuid from datetime import datetime +from typing import Dict, get_type_hints import requests - -from ...typing import Dict, get_type_hints, sha256 +from g4f.typing import sha256 url: str = "https://ai.ls" model: str = "gpt-3.5-turbo" diff --git a/app/chat-gpt/g4f/Provider/Providers/Bard.py b/chat_gpt_microservice/g4f/Provider/Providers/Bard.py similarity index 98% rename from app/chat-gpt/g4f/Provider/Providers/Bard.py rename to chat_gpt_microservice/g4f/Provider/Providers/Bard.py index 23c801e..68db84c 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Bard.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Bard.py @@ -2,12 +2,11 @@ import json import os import random import re +from typing import get_type_hints import browser_cookie3 import requests -from ...typing import get_type_hints - url = "https://bard.google.com" model = ["Palm2"] supports_stream = False diff --git a/app/chat-gpt/g4f/Provider/Providers/Better.py b/chat_gpt_microservice/g4f/Provider/Providers/Better.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/Better.py rename to chat_gpt_microservice/g4f/Provider/Providers/Better.py diff --git a/app/chat-gpt/g4f/Provider/Providers/Bing.py b/chat_gpt_microservice/g4f/Provider/Providers/Bing.py similarity index 99% rename from app/chat-gpt/g4f/Provider/Providers/Bing.py rename to chat_gpt_microservice/g4f/Provider/Providers/Bing.py index 34cb683..7eefdbf 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Bing.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Bing.py @@ -4,13 +4,12 @@ import os import random import ssl import uuid +from typing import get_type_hints import aiohttp import certifi import requests -from ...typing import get_type_hints - url = "https://bing.com/chat" model = ["gpt-4"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/ChatFree.py b/chat_gpt_microservice/g4f/Provider/Providers/ChatFree.py similarity index 98% rename from app/chat-gpt/g4f/Provider/Providers/ChatFree.py rename to chat_gpt_microservice/g4f/Provider/Providers/ChatFree.py index 78c4e14..fbb72b2 100644 --- a/app/chat-gpt/g4f/Provider/Providers/ChatFree.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/ChatFree.py @@ -1,10 +1,9 @@ import json import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://v.chatfree.cc" model = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k"] supports_stream = False diff --git a/app/chat-gpt/g4f/Provider/Providers/ChatgptAi.py b/chat_gpt_microservice/g4f/Provider/Providers/ChatgptAi.py similarity index 98% rename from app/chat-gpt/g4f/Provider/Providers/ChatgptAi.py rename to chat_gpt_microservice/g4f/Provider/Providers/ChatgptAi.py index 62cd246..cb35ac9 100644 --- a/app/chat-gpt/g4f/Provider/Providers/ChatgptAi.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/ChatgptAi.py @@ -1,10 +1,9 @@ import os import re +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://chatgpt.ai/gpt-4/" model = ["gpt-4"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/ChatgptLogin.py b/chat_gpt_microservice/g4f/Provider/Providers/ChatgptLogin.py similarity index 99% rename from app/chat-gpt/g4f/Provider/Providers/ChatgptLogin.py rename to chat_gpt_microservice/g4f/Provider/Providers/ChatgptLogin.py index 0b11d55..a8fe785 100644 --- a/app/chat-gpt/g4f/Provider/Providers/ChatgptLogin.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/ChatgptLogin.py @@ -1,11 +1,10 @@ import base64 import os import re +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://chatgptlogin.ac" model = ["gpt-3.5-turbo"] supports_stream = False diff --git a/app/chat-gpt/g4f/Provider/Providers/DeepAi.py b/chat_gpt_microservice/g4f/Provider/Providers/DeepAi.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/DeepAi.py rename to chat_gpt_microservice/g4f/Provider/Providers/DeepAi.py index 9c0c558..0f95cf4 100644 --- a/app/chat-gpt/g4f/Provider/Providers/DeepAi.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/DeepAi.py @@ -2,11 +2,10 @@ import hashlib import json import os import random +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://deepai.org" model = ["gpt-3.5-turbo"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/Easychat.py b/chat_gpt_microservice/g4f/Provider/Providers/Easychat.py similarity index 98% rename from app/chat-gpt/g4f/Provider/Providers/Easychat.py rename to chat_gpt_microservice/g4f/Provider/Providers/Easychat.py index d09f5b1..2754c4d 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Easychat.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Easychat.py @@ -1,10 +1,9 @@ import json import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://free.easychat.work" model = [ "gpt-3.5-turbo", diff --git a/app/chat-gpt/g4f/Provider/Providers/Ezcht.py b/chat_gpt_microservice/g4f/Provider/Providers/Ezcht.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/Ezcht.py rename to chat_gpt_microservice/g4f/Provider/Providers/Ezcht.py index 998b8d4..22e4be0 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Ezcht.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Ezcht.py @@ -1,10 +1,9 @@ import json import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://gpt4.ezchat.top" model = [ "gpt-3.5-turbo", diff --git a/app/chat-gpt/g4f/Provider/Providers/Fakeopen.py b/chat_gpt_microservice/g4f/Provider/Providers/Fakeopen.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/Fakeopen.py rename to chat_gpt_microservice/g4f/Provider/Providers/Fakeopen.py diff --git a/app/chat-gpt/g4f/Provider/Providers/Forefront.py b/chat_gpt_microservice/g4f/Provider/Providers/Forefront.py similarity index 96% rename from app/chat-gpt/g4f/Provider/Providers/Forefront.py rename to chat_gpt_microservice/g4f/Provider/Providers/Forefront.py index d65ef57..ef8e66a 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Forefront.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Forefront.py @@ -1,10 +1,9 @@ import json import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://forefront.com" model = ["gpt-3.5-turbo"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/GetGpt.py b/chat_gpt_microservice/g4f/Provider/Providers/GetGpt.py similarity index 98% rename from app/chat-gpt/g4f/Provider/Providers/GetGpt.py rename to chat_gpt_microservice/g4f/Provider/Providers/GetGpt.py index f4da7aa..37aaf12 100644 --- a/app/chat-gpt/g4f/Provider/Providers/GetGpt.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/GetGpt.py @@ -1,12 +1,11 @@ import json import os import uuid +from typing import get_type_hints import requests from Crypto.Cipher import AES -from ...typing import get_type_hints - url = "https://chat.getgpt.world/" model = ["gpt-3.5-turbo"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/Gravityengine.py b/chat_gpt_microservice/g4f/Provider/Providers/Gravityengine.py similarity index 95% rename from app/chat-gpt/g4f/Provider/Providers/Gravityengine.py rename to chat_gpt_microservice/g4f/Provider/Providers/Gravityengine.py index 1526b47..170bc4b 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Gravityengine.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Gravityengine.py @@ -1,9 +1,8 @@ import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://gpt4.xunika.uk/" model = ["gpt-3.5-turbo-16k", "gpt-3.5-turbo-0613"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/H2o.py b/chat_gpt_microservice/g4f/Provider/Providers/H2o.py similarity index 99% rename from app/chat-gpt/g4f/Provider/Providers/H2o.py rename to chat_gpt_microservice/g4f/Provider/Providers/H2o.py index 42af1cb..a11569c 100644 --- a/app/chat-gpt/g4f/Provider/Providers/H2o.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/H2o.py @@ -1,11 +1,10 @@ import os from json import loads +from typing import get_type_hints from uuid import uuid4 from requests import Session -from ...typing import get_type_hints - url = "https://gpt-gm.h2o.ai" model = ["falcon-40b", "falcon-7b", "llama-13b"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/Liaobots.py b/chat_gpt_microservice/g4f/Provider/Providers/Liaobots.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/Liaobots.py rename to chat_gpt_microservice/g4f/Provider/Providers/Liaobots.py index 5b8b431..e07b070 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Liaobots.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Liaobots.py @@ -1,9 +1,8 @@ import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://liaobots.com" model = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-4"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/Lockchat.py b/chat_gpt_microservice/g4f/Provider/Providers/Lockchat.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/Lockchat.py rename to chat_gpt_microservice/g4f/Provider/Providers/Lockchat.py index 6daef5d..eead499 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Lockchat.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Lockchat.py @@ -1,10 +1,9 @@ import json import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "http://supertest.lockchat.app" model = ["gpt-4", "gpt-3.5-turbo"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/Mishalsgpt.py b/chat_gpt_microservice/g4f/Provider/Providers/Mishalsgpt.py similarity index 95% rename from app/chat-gpt/g4f/Provider/Providers/Mishalsgpt.py rename to chat_gpt_microservice/g4f/Provider/Providers/Mishalsgpt.py index ff4175e..4ea89bb 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Mishalsgpt.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Mishalsgpt.py @@ -1,9 +1,8 @@ import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://mishalsgpt.vercel.app" model = ["gpt-3.5-turbo-16k-0613", "gpt-3.5-turbo"] supports_stream = True diff --git a/app/chat-gpt/g4f/Provider/Providers/Phind.py b/chat_gpt_microservice/g4f/Provider/Providers/Phind.py similarity index 96% rename from app/chat-gpt/g4f/Provider/Providers/Phind.py rename to chat_gpt_microservice/g4f/Provider/Providers/Phind.py index 96904ae..f8c2fec 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Phind.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Phind.py @@ -1,8 +1,7 @@ import json import os import subprocess - -from ...typing import get_type_hints +from typing import get_type_hints url = "https://phind.com" model = ["gpt-4"] diff --git a/app/chat-gpt/g4f/Provider/Providers/Theb.py b/chat_gpt_microservice/g4f/Provider/Providers/Theb.py similarity index 95% rename from app/chat-gpt/g4f/Provider/Providers/Theb.py rename to chat_gpt_microservice/g4f/Provider/Providers/Theb.py index 901c620..9f30ff7 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Theb.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Theb.py @@ -1,8 +1,7 @@ import json import os import subprocess - -from ...typing import get_type_hints +from typing import get_type_hints url = "https://theb.ai" model = ["gpt-3.5-turbo"] diff --git a/app/chat-gpt/g4f/Provider/Providers/Vercel.py b/chat_gpt_microservice/g4f/Provider/Providers/Vercel.py similarity index 99% rename from app/chat-gpt/g4f/Provider/Providers/Vercel.py rename to chat_gpt_microservice/g4f/Provider/Providers/Vercel.py index 54b88d5..0560d5c 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Vercel.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Vercel.py @@ -3,12 +3,11 @@ import json import os import queue import threading +from typing import get_type_hints import execjs from curl_cffi import requests -from ...typing import get_type_hints - url = "https://play.vercel.ai" supports_stream = True needs_auth = False diff --git a/app/chat-gpt/g4f/Provider/Providers/Weuseing.py b/chat_gpt_microservice/g4f/Provider/Providers/Weuseing.py similarity index 96% rename from app/chat-gpt/g4f/Provider/Providers/Weuseing.py rename to chat_gpt_microservice/g4f/Provider/Providers/Weuseing.py index dd3ebdb..fda4afa 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Weuseing.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Weuseing.py @@ -1,9 +1,8 @@ import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://api.gptplus.one" model = [ "gpt-3.5-turbo", diff --git a/app/chat-gpt/g4f/Provider/Providers/Wewordle.py b/chat_gpt_microservice/g4f/Provider/Providers/Wewordle.py similarity index 98% rename from app/chat-gpt/g4f/Provider/Providers/Wewordle.py rename to chat_gpt_microservice/g4f/Provider/Providers/Wewordle.py index 9ea818a..e4efca5 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Wewordle.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Wewordle.py @@ -3,11 +3,10 @@ import os import random import string import time +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://wewordle.org/gptapi/v1/android/turbo" model = ["gpt-3.5-turbo"] supports_stream = False diff --git a/app/chat-gpt/g4f/Provider/Providers/Xiaor.py b/chat_gpt_microservice/g4f/Provider/Providers/Xiaor.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/Xiaor.py rename to chat_gpt_microservice/g4f/Provider/Providers/Xiaor.py index 5562322..dec9214 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Xiaor.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Xiaor.py @@ -1,10 +1,9 @@ import json import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://xiaor.eu.org" model = [ "gpt-3.5-turbo", diff --git a/app/chat-gpt/g4f/Provider/Providers/You.py b/chat_gpt_microservice/g4f/Provider/Providers/You.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/You.py rename to chat_gpt_microservice/g4f/Provider/Providers/You.py diff --git a/app/chat-gpt/g4f/Provider/Providers/Yqcloud.py b/chat_gpt_microservice/g4f/Provider/Providers/Yqcloud.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/Yqcloud.py rename to chat_gpt_microservice/g4f/Provider/Providers/Yqcloud.py index 3ee45c8..fd86f66 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Yqcloud.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Yqcloud.py @@ -1,9 +1,8 @@ import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://chat9.yqcloud.top/" model = [ "gpt-3.5-turbo", diff --git a/app/chat-gpt/g4f/Provider/Providers/Zeabur.py b/chat_gpt_microservice/g4f/Provider/Providers/Zeabur.py similarity index 98% rename from app/chat-gpt/g4f/Provider/Providers/Zeabur.py rename to chat_gpt_microservice/g4f/Provider/Providers/Zeabur.py index b031a9b..a70536e 100644 --- a/app/chat-gpt/g4f/Provider/Providers/Zeabur.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/Zeabur.py @@ -1,9 +1,8 @@ import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://gptleg.zeabur.app" model = [ "gpt-3.5-turbo", diff --git a/tests/integration/bot/__init__.py b/chat_gpt_microservice/g4f/Provider/Providers/__init__.py similarity index 100% rename from tests/integration/bot/__init__.py rename to chat_gpt_microservice/g4f/Provider/Providers/__init__.py diff --git a/tests/integration/factories/__init__.py b/chat_gpt_microservice/g4f/Provider/Providers/helpers/__init__.py similarity index 100% rename from tests/integration/factories/__init__.py rename to chat_gpt_microservice/g4f/Provider/Providers/helpers/__init__.py diff --git a/app/chat-gpt/g4f/Provider/Providers/helpers/gpt4love.py b/chat_gpt_microservice/g4f/Provider/Providers/helpers/gpt4love.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/helpers/gpt4love.py rename to chat_gpt_microservice/g4f/Provider/Providers/helpers/gpt4love.py diff --git a/app/chat-gpt/g4f/Provider/Providers/helpers/phind.py b/chat_gpt_microservice/g4f/Provider/Providers/helpers/phind.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/helpers/phind.py rename to chat_gpt_microservice/g4f/Provider/Providers/helpers/phind.py diff --git a/app/chat-gpt/g4f/Provider/Providers/helpers/theb.py b/chat_gpt_microservice/g4f/Provider/Providers/helpers/theb.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/helpers/theb.py rename to chat_gpt_microservice/g4f/Provider/Providers/helpers/theb.py diff --git a/app/chat-gpt/g4f/Provider/Providers/helpers/you.py b/chat_gpt_microservice/g4f/Provider/Providers/helpers/you.py similarity index 100% rename from app/chat-gpt/g4f/Provider/Providers/helpers/you.py rename to chat_gpt_microservice/g4f/Provider/Providers/helpers/you.py diff --git a/app/chat-gpt/g4f/Provider/Providers/hteyun.py b/chat_gpt_microservice/g4f/Provider/Providers/hteyun.py similarity index 97% rename from app/chat-gpt/g4f/Provider/Providers/hteyun.py rename to chat_gpt_microservice/g4f/Provider/Providers/hteyun.py index 497eb62..c119e37 100644 --- a/app/chat-gpt/g4f/Provider/Providers/hteyun.py +++ b/chat_gpt_microservice/g4f/Provider/Providers/hteyun.py @@ -1,9 +1,8 @@ import os +from typing import get_type_hints import requests -from ...typing import get_type_hints - url = "https://hteyun.com" model = [ "gpt-3.5-turbo", diff --git a/app/chat-gpt/g4f/Provider/__init__.py b/chat_gpt_microservice/g4f/Provider/__init__.py similarity index 100% rename from app/chat-gpt/g4f/Provider/__init__.py rename to chat_gpt_microservice/g4f/Provider/__init__.py diff --git a/app/chat-gpt/g4f/README.md b/chat_gpt_microservice/g4f/README.md similarity index 100% rename from app/chat-gpt/g4f/README.md rename to chat_gpt_microservice/g4f/README.md diff --git a/app/chat-gpt/g4f/__init__.py b/chat_gpt_microservice/g4f/__init__.py similarity index 100% rename from app/chat-gpt/g4f/__init__.py rename to chat_gpt_microservice/g4f/__init__.py diff --git a/app/chat-gpt/g4f/active_providers.py b/chat_gpt_microservice/g4f/active_providers.py similarity index 100% rename from app/chat-gpt/g4f/active_providers.py rename to chat_gpt_microservice/g4f/active_providers.py diff --git a/app/chat-gpt/g4f/models.py b/chat_gpt_microservice/g4f/models.py similarity index 100% rename from app/chat-gpt/g4f/models.py rename to chat_gpt_microservice/g4f/models.py diff --git a/app/chat-gpt/g4f/typing.py b/chat_gpt_microservice/g4f/typing.py similarity index 100% rename from app/chat-gpt/g4f/typing.py rename to chat_gpt_microservice/g4f/typing.py diff --git a/app/chat-gpt/g4f/utils.py b/chat_gpt_microservice/g4f/utils.py similarity index 100% rename from app/chat-gpt/g4f/utils.py rename to chat_gpt_microservice/g4f/utils.py diff --git a/app/chat-gpt/get_working_providers.py b/chat_gpt_microservice/get_working_providers.py similarity index 100% rename from app/chat-gpt/get_working_providers.py rename to chat_gpt_microservice/get_working_providers.py diff --git a/app/chat-gpt/run.py b/chat_gpt_microservice/run.py similarity index 75% rename from app/chat-gpt/run.py rename to chat_gpt_microservice/run.py index e6499ab..306047d 100644 --- a/app/chat-gpt/run.py +++ b/chat_gpt_microservice/run.py @@ -1,5 +1,7 @@ import secrets +from functools import lru_cache from json import load +from typing import Any from flask import Flask from server.babel import create_babel @@ -7,12 +9,18 @@ from server.backend import Backend_Api from server.bp import bp from server.website import Website -if __name__ == "__main__": - # Load configuration from config.json - config = load(open("config.json", "r")) - site_config = config["site_config"] - url_prefix = config.pop("url_prefix") +@lru_cache(maxsize=None) +def get_config() -> dict[str, Any]: + # Load configuration from config.json + with open("config.json", "r") as config_file: + return load(config_file) + + +def create_app() -> Flask: + config = get_config() + + url_prefix = config["url_prefix"] # Create the app app = Flask(__name__) app.secret_key = secrets.token_hex(16) @@ -41,6 +49,14 @@ if __name__ == "__main__": # Register the blueprint app.register_blueprint(bp, url_prefix=url_prefix) + return app + + +if __name__ == "__main__": + config = get_config() + site_config = config["site_config"] + url_prefix = config["url_prefix"] + app = create_app() # Run the Flask server print(f"Running on {site_config['port']}{url_prefix}") app.run(**site_config) diff --git a/chat_gpt_microservice/server/__init__.py b/chat_gpt_microservice/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/chat-gpt/server/babel.py b/chat_gpt_microservice/server/babel.py similarity index 100% rename from app/chat-gpt/server/babel.py rename to chat_gpt_microservice/server/babel.py diff --git a/app/chat-gpt/server/backend.py b/chat_gpt_microservice/server/backend.py similarity index 100% rename from app/chat-gpt/server/backend.py rename to chat_gpt_microservice/server/backend.py diff --git a/app/chat-gpt/server/bp.py b/chat_gpt_microservice/server/bp.py similarity index 100% rename from app/chat-gpt/server/bp.py rename to chat_gpt_microservice/server/bp.py diff --git a/app/chat-gpt/server/config.py b/chat_gpt_microservice/server/config.py similarity index 100% rename from app/chat-gpt/server/config.py rename to chat_gpt_microservice/server/config.py diff --git a/app/chat-gpt/server/website.py b/chat_gpt_microservice/server/website.py similarity index 100% rename from app/chat-gpt/server/website.py rename to chat_gpt_microservice/server/website.py diff --git a/app/chat-gpt/translations/README.md b/chat_gpt_microservice/translations/README.md similarity index 100% rename from app/chat-gpt/translations/README.md rename to chat_gpt_microservice/translations/README.md diff --git a/app/chat-gpt/translations/ar_SA/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/ar_SA/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/ar_SA/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/ar_SA/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/cs_CZ/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/cs_CZ/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/cs_CZ/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/cs_CZ/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/da_DK/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/da_DK/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/da_DK/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/da_DK/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/de_DE/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/de_DE/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/de_DE/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/de_DE/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/el_GR/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/el_GR/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/el_GR/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/el_GR/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/en_US/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/en_US/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/en_US/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/en_US/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/es_ES/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/es_ES/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/es_ES/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/es_ES/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/es_MX/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/es_MX/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/es_MX/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/es_MX/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/fi_FI/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/fi_FI/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/fi_FI/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/fi_FI/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/fr_FR/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/fr_FR/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/fr_FR/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/fr_FR/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/he_IL/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/he_IL/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/he_IL/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/he_IL/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/hi_IN/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/hi_IN/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/hi_IN/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/hi_IN/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/hu_HU/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/hu_HU/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/hu_HU/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/hu_HU/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/id_ID/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/id_ID/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/id_ID/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/id_ID/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/it_IT/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/it_IT/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/it_IT/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/it_IT/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/ja_JP/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/ja_JP/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/ja_JP/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/ja_JP/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/ko_KR/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/ko_KR/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/ko_KR/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/ko_KR/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/nb_NO/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/nb_NO/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/nb_NO/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/nb_NO/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/nl_NL/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/nl_NL/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/nl_NL/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/nl_NL/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/pl_PL/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/pl_PL/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/pl_PL/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/pl_PL/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/pt_BR/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/pt_BR/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/pt_BR/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/pt_BR/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/ro_RO/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/ro_RO/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/ro_RO/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/ro_RO/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/ru_RU/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/ru_RU/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/ru_RU/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/ru_RU/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/sk_SK/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/sk_SK/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/sk_SK/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/sk_SK/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/sv_SE/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/sv_SE/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/sv_SE/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/sv_SE/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/th_TH/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/th_TH/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/th_TH/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/th_TH/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/tr_TR/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/tr_TR/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/tr_TR/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/tr_TR/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/uk_UA/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/uk_UA/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/uk_UA/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/uk_UA/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/vi_VN/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/vi_VN/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/vi_VN/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/vi_VN/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/zh_Hans_CN/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/zh_Hans_CN/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/zh_Hans_CN/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/zh_Hans_CN/LC_MESSAGES/messages.po diff --git a/app/chat-gpt/translations/zh_Hant_TW/LC_MESSAGES/messages.po b/chat_gpt_microservice/translations/zh_Hant_TW/LC_MESSAGES/messages.po similarity index 100% rename from app/chat-gpt/translations/zh_Hant_TW/LC_MESSAGES/messages.po rename to chat_gpt_microservice/translations/zh_Hant_TW/LC_MESSAGES/messages.po diff --git a/deploy/Caddyfile b/deploy/Caddyfile new file mode 100644 index 0000000..70911d9 --- /dev/null +++ b/deploy/Caddyfile @@ -0,0 +1,18 @@ +# Telegram bot. Redirects to bot-service +:8083 { + reverse_proxy bot_service:8080 + header Strict-Transport-Security max-age=31536000; + + # Removing some headers for improved security: + header -Server +} + +# Telegram bot. Redirects to test-server ip +:8084 { + reverse_proxy chat_service:1338 + header Strict-Transport-Security max-age=31536000; + + # Removing some headers for improved security: + header -Server + +} diff --git a/deploy/Dockerfile b/deploy/Dockerfile index 83a79f6..1f40018 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -1,43 +1,31 @@ -FROM python:3.11.5 +FROM python:3.11.5 AS compile-image ARG USER -ENV USER=${USER} \ - PYTHONFAULTHANDLER=1 \ - PYTHONUNBUFFERED=1 \ - PYTHONHASHSEED=random \ - PYTHONDONTWRITEBYTECODE=1 \ - # pip: - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - POETRY_VIRTUALENVS_CREATE=false \ - POETRY_CACHE_DIR='/var/cache/pypoetry' \ - PATH="$PATH:/root/.poetry/bin" \ - DOCKER_CONTAINER=1 \ - POETRY_VERSION=1.6.1 +ENV PYTHONUNBUFFERED=1 \ + PIP_DISABLE_PIP_VERSION_CHECK=on \ + DOCKER_CONTAINER=1 \ + POETRY_VERSION=1.6.1 - -RUN printf "================\n\nStart build app. USER is: "${USER}"\n\n===============\n" \ +RUN printf "================ Start build base service. with USER: ${USER} ===============" \ && apt-get update \ && apt-get install --no-install-recommends -y \ bash \ build-essential \ - curl \ iputils-ping \ - gettext \ - git \ libpq-dev \ + libffi-dev \ + cmake \ + libcurl4-openssl-dev \ + bash \ + curl \ + git \ nano \ - && pip install --upgrade pip \ - # Installing `poetry` package manager: - && pip install poetry==$POETRY_VERSION wheel \ # Cleaning cache: && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ && apt-get clean -y && rm -rf /var/lib/apt/lists/* - -WORKDIR /app +WORKDIR /app/ RUN if [ "$USER" != "root" ]; then \ mkdir /home/"$USER" \ @@ -45,22 +33,53 @@ RUN if [ "$USER" != "root" ]; then \ && chown "$USER":"$USER" -R /home/"$USER"; \ fi -COPY --chown="$USER":"$USER" ./poetry.lock ./pyproject.toml /app/ +COPY --chown=${USER}:${USER} ../poetry.lock ../pyproject.toml /app/ -# Installing requirements -RUN poetry --version \ - && poetry run pip install -U pip \ - && poetry install \ - $(if [ "$USER" != 'root' ]; then echo '--only main'; fi) \ - --no-interaction --no-ansi \ - # Cleaning poetry installation's cache for production: - && if [ "$USER" != 'root' ]; then rm -rf "$POETRY_CACHE_DIR"; fi +RUN pip install --upgrade pip && pip install poetry==$POETRY_VERSION +RUN poetry config virtualenvs.in-project true && \ + poetry config virtualenvs.create true && \ + poetry install --only main --no-interaction --no-ansi && \ + rm -rf $POETRY_CACHE_DIR -COPY --chown="$USER":"$USER" ./app /app/ -COPY ./scripts/start-bot.sh . + +#==================== bot-service ================================= +FROM compile-image as bot-service + +RUN printf "================ Start build bot-service. with USER: ${USER} ===============" + +WORKDIR /app/ + +# Copying bot service +COPY --chown=${USER}:${USER} ../bot_microservice /app/ + +COPY ./scripts/start-bot.sh /app/ RUN chmod +x ./start-bot.sh -USER "$USER" +COPY --from=compile-image /app/.venv /app/.venv -# Copying actuall application -COPY --chown="$USER":"$USER" . /app/ +USER ${USER} + +ENV PATH="/app/.venv/bin:$PATH" + + +#===================== chat-service ================================ +FROM compile-image as chat-service + +RUN printf "================ Start build chat-service. with USER: ${USER} ===============" + +WORKDIR /app/ + +# Copying bot service +COPY --chown=${USER}:${USER} ../chat_gpt_microservice /app/ + +COPY ./scripts/start-chat.sh /app/ +RUN chmod +x ./start-chat.sh + +COPY --from=compile-image /app/.venv /app/.venv +ENV PATH="/app/.venv/bin:$PATH" + +USER ${USER} + +RUN chmod -R 777 translations + +CMD ["bash", "start-chat.sh"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 3b3c9fd..adf5a5a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,55 +1,75 @@ version: '3.9' networks: - healthcheck_bot_network: + chat-gpt-network: name: - "healthcheck_bot_network" - -volumes: - healthcheck_bot_caddy-data: - name: healthcheck_bot_caddy-data - healthcheck_bot_caddy-config: - name: healthcheck_bot_caddy-config - + "chat_gpt_network" + ipam: + config: + - subnet: 200.20.0.0/24 services: bot: - container_name: "healthcheck_bot" - hostname: "healthcheck_bot" - image: "healthcheck_bot:latest" + image: "chat_gpt_bot_service:latest" + container_name: "chat_gpt_bot_service" + hostname: "bot_service" build: context: . dockerfile: deploy/Dockerfile + target: bot-service args: - USER: ${USER} + USER: web restart: unless-stopped - env_file: - - settings/.env + environment: + APP_HOST: "0.0.0.0" + APP_PORT: "8000" + WORKERS_COUNT: "1" volumes: - /etc/localtime:/etc/localtime:ro networks: - healthcheck_bot_network: + chat-gpt-network: ipv4_address: 200.20.0.10 + depends_on: + - caddy + - chat-gpt expose: - - "8080" + - "8000" command: bash start-bot.sh + chat-gpt: + image: "chat_gpt_chat_service:latest" + container_name: "chat_gpt_chat_service" + hostname: "chat_service" + build: + context: . + dockerfile: deploy/Dockerfile + target: chat-service + args: + USER: web + restart: unless-stopped + environment: + APP_HOST: "0.0.0.0" + APP_PORT: "1338" + WORKERS_COUNT: "1" + networks: + chat-gpt-network: + ipv4_address: 200.20.0.11 + depends_on: + - caddy + expose: + - "1338" + caddy: image: "caddy:2.7.4" - container_name: healthcheck_bot_caddy - hostname: healthcheck_bot_caddy + container_name: "chat_gpt_caddy_service" + hostname: "caddy_service" restart: unless-stopped - env_file: - - settings/.env ports: - - '8085:8085' - depends_on: - - bot + - '8083:8083' + - '8084:8084' volumes: - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro - - healthcheck_bot_caddy-data:/data - - healthcheck_bot_caddy-config:/config networks: - healthcheck_bot_network: - ipv4_address: 200.20.0.11 + chat-gpt-network: + ipv4_address: 200.20.0.12 diff --git a/lefthook.yml b/lefthook.yml index 521db56..8f876f8 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -23,7 +23,7 @@ pre-push: run: black --check -S {all_files} mypy: glob: "*.py" - run: mypy app settings tests --config-file pyproject.toml + run: mypy bot_microservice --config-file pyproject.toml flake8: glob: "*.py" run: flake8 {all_files} @@ -51,10 +51,10 @@ lint: commands: mypy: glob: "*.py" - run: mypy {staged_files} --namespace-packages --config-file pyproject.toml + run: mypy bot_microservice --namespace-packages --config-file pyproject.toml flake8: glob: "*.py" - run: flake8 {staged_files} + run: flake8 bot_microservice check-format: parallel: true diff --git a/poetry.lock b/poetry.lock index 8f867b6..cf73bb1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -226,21 +226,6 @@ tornado = ["tornado (>=4.3)"] twisted = ["twisted"] zookeeper = ["kazoo"] -[[package]] -name = "aresponses" -version = "2.1.6" -description = "Asyncio response mocking. Similar to the responses library used for 'requests'" -optional = false -python-versions = ">=3.6" -files = [ - {file = "aresponses-2.1.6-py3-none-any.whl", hash = "sha256:06525f6911063f0f8d370cbc96bd273e6cddc89c7b5163ddf91e0c8abf148a32"}, - {file = "aresponses-2.1.6.tar.gz", hash = "sha256:231dfa0756e39ca9f1e82212038f98e773d1ed9c0993caf2667e25ba535697ca"}, -] - -[package.dependencies] -aiohttp = ">=3.1.0,<4.dev0" -pytest-asyncio = "*" - [[package]] name = "assertpy" version = "1.1" @@ -1444,20 +1429,20 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.36" +version = "3.1.37" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.36-py3-none-any.whl", hash = "sha256:8d22b5cfefd17c79914226982bb7851d6ade47545b1735a9d010a2a4c26d8388"}, - {file = "GitPython-3.1.36.tar.gz", hash = "sha256:4bb0c2a6995e85064140d31a33289aa5dce80133a23d36fcd372d716c54d3ebf"}, + {file = "GitPython-3.1.37-py3-none-any.whl", hash = "sha256:5f4c4187de49616d710a77e98ddf17b4782060a1788df441846bddefbb89ab33"}, + {file = "GitPython-3.1.37.tar.gz", hash = "sha256:f9b9ddc0761c125d5780eab2d64be4873fc6817c2899cbcb34b02344bdc7bc54"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" [package.extras] -test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-sugar", "virtualenv"] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-sugar"] [[package]] name = "greenlet" @@ -2230,74 +2215,67 @@ files = [ [[package]] name = "msgpack" -version = "1.0.5" +version = "1.0.6" description = "MessagePack serializer" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, - {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, - {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, - {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, - {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, - {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, - {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, - {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, - {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, - {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, - {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, - {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, - {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, - {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, - {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, - {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, - {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, - {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, + {file = "msgpack-1.0.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f4321692e7f299277e55f322329b2c972d93bb612d85f3fda8741bec5c6285ce"}, + {file = "msgpack-1.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f0e36a5fa7a182cde391a128a64f437657d2b9371dfa42eda3436245adccbf5"}, + {file = "msgpack-1.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5c8dd9a386a66e50bd7fa22b7a49fb8ead2b3574d6bd69eb1caced6caea0803"}, + {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f85200ea102276afdd3749ca94747f057bbb868d1c52921ee2446730b508d0f"}, + {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a006c300e82402c0c8f1ded11352a3ba2a61b87e7abb3054c845af2ca8d553c"}, + {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33bbf47ea5a6ff20c23426106e81863cdbb5402de1825493026ce615039cc99d"}, + {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04450e4b5e1e662e7c86b6aafb7c230af9334fd0becf5e6b80459a507884241c"}, + {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b06a5095a79384760625b5de3f83f40b3053a385fb893be8a106fbbd84c14980"}, + {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3910211b0ab20be3a38e0bb944ed45bd4265d8d9f11a3d1674b95b298e08dd5c"}, + {file = "msgpack-1.0.6-cp310-cp310-win32.whl", hash = "sha256:1dc67b40fe81217b308ab12651adba05e7300b3a2ccf84d6b35a878e308dd8d4"}, + {file = "msgpack-1.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:885de1ed5ea01c1bfe0a34c901152a264c3c1f8f1d382042b92ea354bd14bb0e"}, + {file = "msgpack-1.0.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:099c3d8a027367e1a6fc55d15336f04ff65c60c4f737b5739f7db4525c65fe9e"}, + {file = "msgpack-1.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b88dc97ba86c96b964c3745a445d9a65f76fe21955a953064fe04adb63e9367"}, + {file = "msgpack-1.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:00ce5f827d4f26fc094043e6f08b6069c1b148efa2631c47615ae14fb6cafc89"}, + {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd6af61388be65a8701f5787362cb54adae20007e0cc67ca9221a4b95115583b"}, + {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:652e4b7497825b0af6259e2c54700e6dc33d2fc4ed92b8839435090d4c9cc911"}, + {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b08676a17e3f791daad34d5fcb18479e9c85e7200d5a17cbe8de798643a7e37"}, + {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:229ccb6713c8b941eaa5cf13dc7478eba117f21513b5893c35e44483e2f0c9c8"}, + {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:95ade0bd4cf69e04e8b8f8ec2d197d9c9c4a9b6902e048dc7456bf6d82e12a80"}, + {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b16344032a27b2ccfd341f89dadf3e4ef6407d91e4b93563c14644a8abb3ad7"}, + {file = "msgpack-1.0.6-cp311-cp311-win32.whl", hash = "sha256:55bb4a1bf94e39447bc08238a2fb8a767460388a8192f67c103442eb36920887"}, + {file = "msgpack-1.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:ae97504958d0bc58c1152045c170815d5c4f8af906561ce044b6358b43d0c97e"}, + {file = "msgpack-1.0.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ecf431786019a7bfedc28281531d706627f603e3691d64eccdbce3ecd353823"}, + {file = "msgpack-1.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a635aecf1047255576dbb0927cbf9a7aa4a68e9d54110cc3c926652d18f144e0"}, + {file = "msgpack-1.0.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:102cfb54eaefa73e8ca1e784b9352c623524185c98e057e519545131a56fb0af"}, + {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c5e05e4f5756758c58a8088aa10dc70d851c89f842b611fdccfc0581c1846bc"}, + {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68569509dd015fcdd1e6b2b3ccc8c51fd27d9a97f461ccc909270e220ee09685"}, + {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf652839d16de91fe1cfb253e0a88db9a548796939533894e07f45d4bdf90a5f"}, + {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14db7e1b7a7ed362b2f94897bf2486c899c8bb50f6e34b2db92fe534cdab306f"}, + {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:159cfec18a6e125dd4723e2b1de6f202b34b87c850fb9d509acfd054c01135e9"}, + {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6a01a072b2219b65a6ff74df208f20b2cac9401c60adb676ee34e53b4c651077"}, + {file = "msgpack-1.0.6-cp312-cp312-win32.whl", hash = "sha256:e36560d001d4ba469d469b02037f2dd404421fd72277d9474efe9f03f83fced5"}, + {file = "msgpack-1.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:5e7fae9ca93258a956551708cf60dc6c8145574e32ce8c8c4d894e63bcb04341"}, + {file = "msgpack-1.0.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:40b801b768f5a765e33c68f30665d3c6ee1c8623a2d2bb78e6e59f2db4e4ceb7"}, + {file = "msgpack-1.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:da057d3652e698b00746e47f06dbb513314f847421e857e32e1dc61c46f6c052"}, + {file = "msgpack-1.0.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f75114c05ec56566da6b55122791cf5bb53d5aada96a98c016d6231e03132f76"}, + {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61213482b5a387ead9e250e9e3cb290292feca39dc83b41c3b1b7b8ffc8d8ecb"}, + {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae6c561f11b444b258b1b4be2bdd1e1cf93cd1d80766b7e869a79db4543a8a8"}, + {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:619a63753ba9e792fe3c6c0fc2b9ee2cfbd92153dd91bee029a89a71eb2942cd"}, + {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:70843788c85ca385846a2d2f836efebe7bb2687ca0734648bf5c9dc6c55602d2"}, + {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fb4571efe86545b772a4630fee578c213c91cbcfd20347806e47fd4e782a18fe"}, + {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bbb4448a05d261fae423d5c0b0974ad899f60825bc77eabad5a0c518e78448c2"}, + {file = "msgpack-1.0.6-cp38-cp38-win32.whl", hash = "sha256:5cd67674db3c73026e0a2c729b909780e88bd9cbc8184256f9567640a5d299a8"}, + {file = "msgpack-1.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:a1cf98afa7ad5e7012454ca3fde254499a13f9d92fd50cb46118118a249a1355"}, + {file = "msgpack-1.0.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d6d25b8a5c70e2334ed61a8da4c11cd9b97c6fbd980c406033f06e4463fda006"}, + {file = "msgpack-1.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88cdb1da7fdb121dbb3116910722f5acab4d6e8bfcacab8fafe27e2e7744dc6a"}, + {file = "msgpack-1.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b5658b1f9e486a2eec4c0c688f213a90085b9cf2fec76ef08f98fdf6c62f4b9"}, + {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76820f2ece3b0a7c948bbb6a599020e29574626d23a649476def023cbb026787"}, + {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c780d992f5d734432726b92a0c87bf1857c3d85082a8dea29cbf56e44a132b3"}, + {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0ed35d6d6122d0baa9a1b59ebca4ee302139f4cfb57dab85e4c73ab793ae7ed"}, + {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32c0aff31f33033f4961abc01f78497e5e07bac02a508632aef394b384d27428"}, + {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:35ad5aed9b52217d4cea739d0ea3a492a18dd86fecb4b132668a69f27fb0363b"}, + {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47275ff73005a3e5e146e50baa2378e1730cba6e292f0222bc496a8e4c4adfc8"}, + {file = "msgpack-1.0.6-cp39-cp39-win32.whl", hash = "sha256:7baf16fd8908a025c4a8d7b699103e72d41f967e2aee5a2065432bcdbd9fd06e"}, + {file = "msgpack-1.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:fc97aa4b4fb928ff4d3b74da7c30b360d0cb3ede49a5a6e1fd9705f49aea1deb"}, + {file = "msgpack-1.0.6.tar.gz", hash = "sha256:25d3746da40f3c8c59c3b1d001e49fd2aa17904438f980d9a391370366df001e"}, ] [[package]] @@ -2663,6 +2641,70 @@ sql-other = ["SQLAlchemy (>=1.4.36)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] xml = ["lxml (>=4.8.0)"] +[[package]] +name = "pandas" +version = "2.1.1" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58d997dbee0d4b64f3cb881a24f918b5f25dd64ddf31f467bb9b67ae4c63a1e4"}, + {file = "pandas-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02304e11582c5d090e5a52aec726f31fe3f42895d6bfc1f28738f9b64b6f0614"}, + {file = "pandas-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffa8f0966de2c22de408d0e322db2faed6f6e74265aa0856f3824813cf124363"}, + {file = "pandas-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1f84c144dee086fe4f04a472b5cd51e680f061adf75c1ae4fc3a9275560f8f4"}, + {file = "pandas-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:75ce97667d06d69396d72be074f0556698c7f662029322027c226fd7a26965cb"}, + {file = "pandas-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:4c3f32fd7c4dccd035f71734df39231ac1a6ff95e8bdab8d891167197b7018d2"}, + {file = "pandas-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e2959720b70e106bb1d8b6eadd8ecd7c8e99ccdbe03ee03260877184bb2877d"}, + {file = "pandas-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25e8474a8eb258e391e30c288eecec565bfed3e026f312b0cbd709a63906b6f8"}, + {file = "pandas-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8bd1685556f3374520466998929bade3076aeae77c3e67ada5ed2b90b4de7f0"}, + {file = "pandas-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc3657869c7902810f32bd072f0740487f9e030c1a3ab03e0af093db35a9d14e"}, + {file = "pandas-2.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:05674536bd477af36aa2effd4ec8f71b92234ce0cc174de34fd21e2ee99adbc2"}, + {file = "pandas-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:b407381258a667df49d58a1b637be33e514b07f9285feb27769cedb3ab3d0b3a"}, + {file = "pandas-2.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c747793c4e9dcece7bb20156179529898abf505fe32cb40c4052107a3c620b49"}, + {file = "pandas-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3bcad1e6fb34b727b016775bea407311f7721db87e5b409e6542f4546a4951ea"}, + {file = "pandas-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5ec7740f9ccb90aec64edd71434711f58ee0ea7f5ed4ac48be11cfa9abf7317"}, + {file = "pandas-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29deb61de5a8a93bdd033df328441a79fcf8dd3c12d5ed0b41a395eef9cd76f0"}, + {file = "pandas-2.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4f99bebf19b7e03cf80a4e770a3e65eee9dd4e2679039f542d7c1ace7b7b1daa"}, + {file = "pandas-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:84e7e910096416adec68075dc87b986ff202920fb8704e6d9c8c9897fe7332d6"}, + {file = "pandas-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366da7b0e540d1b908886d4feb3d951f2f1e572e655c1160f5fde28ad4abb750"}, + {file = "pandas-2.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e50e72b667415a816ac27dfcfe686dc5a0b02202e06196b943d54c4f9c7693e"}, + {file = "pandas-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc1ab6a25da197f03ebe6d8fa17273126120874386b4ac11c1d687df288542dd"}, + {file = "pandas-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0dbfea0dd3901ad4ce2306575c54348d98499c95be01b8d885a2737fe4d7a98"}, + {file = "pandas-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0489b0e6aa3d907e909aef92975edae89b1ee1654db5eafb9be633b0124abe97"}, + {file = "pandas-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:4cdb0fab0400c2cb46dafcf1a0fe084c8bb2480a1fa8d81e19d15e12e6d4ded2"}, + {file = "pandas-2.1.1.tar.gz", hash = "sha256:fecb198dc389429be557cde50a2d46da8434a17fe37d7d41ff102e3987fd947b"}, +] + +[package.dependencies] +numpy = {version = ">=1.23.2", markers = "python_version == \"3.11\""} +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.1" + +[package.extras] +all = ["PyQt5 (>=5.15.6)", "SQLAlchemy (>=1.4.36)", "beautifulsoup4 (>=4.11.1)", "bottleneck (>=1.3.4)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=0.8.1)", "fsspec (>=2022.05.0)", "gcsfs (>=2022.05.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.8.0)", "matplotlib (>=3.6.1)", "numba (>=0.55.2)", "numexpr (>=2.8.0)", "odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pandas-gbq (>=0.17.5)", "psycopg2 (>=2.9.3)", "pyarrow (>=7.0.0)", "pymysql (>=1.0.2)", "pyreadstat (>=1.1.5)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)", "pyxlsb (>=1.0.9)", "qtpy (>=2.2.0)", "s3fs (>=2022.05.0)", "scipy (>=1.8.1)", "tables (>=3.7.0)", "tabulate (>=0.8.10)", "xarray (>=2022.03.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)", "zstandard (>=0.17.0)"] +aws = ["s3fs (>=2022.05.0)"] +clipboard = ["PyQt5 (>=5.15.6)", "qtpy (>=2.2.0)"] +compression = ["zstandard (>=0.17.0)"] +computation = ["scipy (>=1.8.1)", "xarray (>=2022.03.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.0.10)", "pyxlsb (>=1.0.9)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.3)"] +feather = ["pyarrow (>=7.0.0)"] +fss = ["fsspec (>=2022.05.0)"] +gcp = ["gcsfs (>=2022.05.0)", "pandas-gbq (>=0.17.5)"] +hdf5 = ["tables (>=3.7.0)"] +html = ["beautifulsoup4 (>=4.11.1)", "html5lib (>=1.1)", "lxml (>=4.8.0)"] +mysql = ["SQLAlchemy (>=1.4.36)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.8.10)"] +parquet = ["pyarrow (>=7.0.0)"] +performance = ["bottleneck (>=1.3.4)", "numba (>=0.55.2)", "numexpr (>=2.8.0)"] +plot = ["matplotlib (>=3.6.1)"] +postgresql = ["SQLAlchemy (>=1.4.36)", "psycopg2 (>=2.9.3)"] +spss = ["pyreadstat (>=1.1.5)"] +sql-other = ["SQLAlchemy (>=1.4.36)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-asyncio (>=0.17.0)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.8.0)"] + [[package]] name = "parso" version = "0.8.3" @@ -3373,17 +3415,6 @@ pyperclip = ">=1.8.2,<2.0.0" random-username = ">=1.0.2,<2.0.0" requests = ">=2.28.1,<3.0.0" -[[package]] -name = "pympler" -version = "1.0.1" -description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." -optional = false -python-versions = ">=3.6" -files = [ - {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"}, - {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"}, -] - [[package]] name = "pyparsing" version = "3.1.1" @@ -3794,29 +3825,15 @@ files = [ {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, ] -[[package]] -name = "pytz-deprecation-shim" -version = "0.1.0.post0" -description = "Shims to make deprecation of pytz easier" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, - {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, -] - -[package.dependencies] -tzdata = {version = "*", markers = "python_version >= \"3.6\""} - [[package]] name = "pyupgrade" -version = "3.11.1" +version = "3.12.0" description = "A tool to automatically upgrade syntax for newer versions." optional = false python-versions = ">=3.8.1" files = [ - {file = "pyupgrade-3.11.1-py2.py3-none-any.whl", hash = "sha256:6e9dd362394b3068123e06ca268de5845d41e2bb29f387b38323cc1009fb3100"}, - {file = "pyupgrade-3.11.1.tar.gz", hash = "sha256:3e6c7689d2f3ae418c6a60ee981477fe9130eccaed3e33dac6c21274cf7d45f4"}, + {file = "pyupgrade-3.12.0-py2.py3-none-any.whl", hash = "sha256:c6f9c129560b9538e75b93fb0aee20508faae454714e8373d462e408985bd96a"}, + {file = "pyupgrade-3.12.0.tar.gz", hash = "sha256:defc292ffaf402942b8fccaa97491964063e343fc1993230e44890b971dc1234"}, ] [package.dependencies] @@ -4304,6 +4321,51 @@ trio = ">=0.17,<1.0" trio-websocket = ">=0.9,<1.0" urllib3 = {version = ">=1.26,<3", extras = ["socks"]} +[[package]] +name = "sentry-sdk" +version = "1.31.0" +description = "Python client for Sentry (https://sentry.io)" +optional = false +python-versions = "*" +files = [ + {file = "sentry-sdk-1.31.0.tar.gz", hash = "sha256:6de2e88304873484207fed836388e422aeff000609b104c802749fd89d56ba5b"}, + {file = "sentry_sdk-1.31.0-py2.py3-none-any.whl", hash = "sha256:64a7141005fb775b9db298a30de93e3b83e0ddd1232dc6f36eb38aebc1553291"}, +] + +[package.dependencies] +certifi = "*" +urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +fastapi = ["fastapi (>=0.79.0)"] +flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"] +grpcio = ["grpcio (>=1.21.1)"] +httpx = ["httpx (>=0.16.0)"] +huey = ["huey (>=2)"] +loguru = ["loguru (>=0.5)"] +opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] +pure-eval = ["asttokens", "executing", "pure-eval"] +pymongo = ["pymongo (>=3.1)"] +pyspark = ["pyspark (>=2.4.4)"] +quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] +tornado = ["tornado (>=5)"] + [[package]] name = "setuptools" version = "68.2.2" @@ -4426,13 +4488,13 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "streamlit" -version = "1.26.0" +version = "1.27.0" description = "A faster way to build and share data apps" optional = false python-versions = ">=3.8, !=3.9.7" files = [ - {file = "streamlit-1.26.0-py2.py3-none-any.whl", hash = "sha256:2bfdac041816e2e1ba27f061d40112afe61e0d4e72d25f354b38ba81107b4cb3"}, - {file = "streamlit-1.26.0.tar.gz", hash = "sha256:25475fb15a3cc9fb184945f3fc936f011998bd8386e0c892febe14c9625bf47a"}, + {file = "streamlit-1.27.0-py2.py3-none-any.whl", hash = "sha256:7488d4e22689d04f40449a1de521ba252ae95a5fbb5f5c606df16a4e16048b47"}, + {file = "streamlit-1.27.0.tar.gz", hash = "sha256:59a704195bbc669c794ddfcc3818480d9b9c2a282c02b48aa6e6de4b1c38d0a0"}, ] [package.dependencies] @@ -4448,8 +4510,7 @@ pandas = ">=1.3.0,<3" pillow = ">=7.1.0,<10" protobuf = ">=3.20,<5" pyarrow = ">=6.0" -pydeck = ">=0.8,<1" -pympler = ">=0.9,<2" +pydeck = ">=0.8.0b4,<1" python-dateutil = ">=2.7.3,<3" requests = ">=2.18,<3" rich = ">=10.14.0,<14" @@ -4457,7 +4518,7 @@ tenacity = ">=8.1.0,<9" toml = ">=0.10.1,<2" tornado = ">=6.0.3,<7" typing-extensions = ">=4.1.0,<5" -tzlocal = ">=1.1,<5" +tzlocal = ">=1.1,<6" validators = ">=0.2,<1" watchdog = {version = ">=2.1.5", markers = "platform_system != \"Darwin\""} @@ -4676,17 +4737,16 @@ files = [ [[package]] name = "tzlocal" -version = "4.3.1" +version = "5.0.1" description = "tzinfo object for the local timezone" optional = false python-versions = ">=3.7" files = [ - {file = "tzlocal-4.3.1-py3-none-any.whl", hash = "sha256:67d7e7f4ce0a98e9dfde2e02474c60fe846ed032d78b555c554c2e9cba472d84"}, - {file = "tzlocal-4.3.1.tar.gz", hash = "sha256:ee32ef8c20803c19a96ed366addd3d4a729ef6309cb5c7359a0cc2eeeb7fa46a"}, + {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, + {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, ] [package.dependencies] -pytz-deprecation-shim = "*" tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] @@ -5095,4 +5155,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "8410825bec6fb2d9470304c86ede01c6dff319548a471b643527832dc7114d5f" +content-hash = "04489761024940cec0ad40c33adb8e50397ee754ccacd13a1d6cbb5d80e4cd56" diff --git a/pyproject.toml b/pyproject.toml index f62a0ba..ef13550 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,11 +5,10 @@ description = "Bot to integrated with chat-gpt" authors = ["Dmitry Afanasyev "] [tool.poetry.dependencies] +python = "^3.11" fastapi = "^0.103.1" python-telegram-bot = {version = "^20.5", extras=["ext"]} - -python = "^3.11" python-dotenv = "^1.0" httpx = "^0.24" loguru = "^0.7" @@ -28,7 +27,7 @@ tls-client = "^0.2" pypasser = "^0.0.5" names = "^0.3" colorama = "^0.4" -curl_cffi = "^0.5" +curl_cffi = "0.5.7" aiohttp = "^3.8.5" flask = "^2.3" flask_cors = "^4.0" @@ -46,20 +45,19 @@ numpy = "^1.25" tornado = "^6.3" PyExecJS = "^1.5" browser_cookie3 = "^0.19" +sentry-sdk = "^1.31.0" [tool.poetry.dev-dependencies] +ipython = "^8.14" factory-boy = "^3.3" Faker = "^19" -ipython = "^8.14" - safety = "^2.3.5" pip-audit = "^2.6" yamllint = "^1.32" tomlkit = "^0.12" bandit = "^1.7" -aresponses = "^2.1" pyupgrade = "^3.10" isort = "^5.12" @@ -114,7 +112,6 @@ flake8-mock = "^0.4" flake8-comments = "^0.1" flake8-newspaper-style = "^0.4" Flake8-pyproject = "^1.2.3" - [tool.flake8] inline-quotes = "double" max-line-length = 120 @@ -124,7 +121,7 @@ ban-relative-imports = true nested-classes-whitelist = ["Config", "Meta"] pytest-parametrize-names-type = "csv" exclude = [ - "app/chat-gpt/*", + "chat_gpt_microservice/*", ".cache/*", ".pytest_cache/*", "*/__pycache__/*", @@ -137,9 +134,9 @@ ignore = [ ] per-file-ignores = [ # too complex queries - "tests/*: S101", - "tests/integration/bot/conftest.py: NEW100", - "settings/config.py: S104" + "bot_microservice/tests/*: S101", + "bot_microservice/tests/integration/bot/conftest.py: NEW100", + "bot_microservice/settings/config.py: S104" ] [tool.autoflake] @@ -180,7 +177,7 @@ warn_unused_configs = true warn_unreachable = true warn_no_return = true exclude = [ - "app/chat-gpt/" + "chat_gpt_microservice" ] [tool.black] diff --git a/scripts/start-bot.sh b/scripts/start-bot.sh index a5ab6e5..a0b3100 100644 --- a/scripts/start-bot.sh +++ b/scripts/start-bot.sh @@ -6,8 +6,9 @@ if [[ "${START_WITH_WEBHOOK}" == "true" ]] then echo "Starting bot in webhook mode..." gunicorn main:create_app \ - --bind ${WEBAPP_HOST}:${WEBAPP_PORT} \ - --worker-class aiohttp.GunicornWebWorker \ + -- workers ${WORKERS_COUNT} \ + --bind ${APP_HOST}:${APP_PORT} \ + --worker-class uvicorn.workers.UvicornWorker \ --timeout 150 \ --max-requests 2000 \ --max-requests-jitter 400 diff --git a/scripts/start-chat.sh b/scripts/start-chat.sh new file mode 100644 index 0000000..aac314d --- /dev/null +++ b/scripts/start-chat.sh @@ -0,0 +1,11 @@ +#! /bin/bash + +echo "starting chat" + +gunicorn run:create_app \ + -- workers ${WORKERS_COUNT} \ + --bind ${APP_HOST}:${APP_PORT} \ + --worker-class uvicorn.workers.UvicornWorker \ + --timeout 150 \ + --max-requests 2000 \ + --max-requests-jitter 400 \ No newline at end of file