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