refactor: review fixes and code improvements

- Add shared proxy module (bot/utils/proxy.py) to eliminate duplicate SOCKS5 parsing
- Fix AI client: escape HTML before Markdown→HTML conversion, unify timeouts,
  make health check optional and disabled by default, handle 429 retries
- Fix ai.py: correct forwarded message handling (aiogram 3.x forward_origin),
  pass relevant summaries via extra_system_content
- Fix dialogue.py: only respond to Astra's messages, use system context instead
  of prompt injection, answer on the limit message before phase transition
- Fix voice.py: load Whisper model in thread pool, safe WAV path generation
- Improve database.py: composite indexes, Boolean is_active, upsert file_id cache,
  add context cleanup helper
- Update weather.py and yadisk_download.py to use shared proxy connector
- Update yadisk.py: validate URL before cache clear, add download size limit,
  wrap sync file ops in to_thread
- Reuse S3 client via lru_cache
- Update setup_commands with /aiclear and /aiuser
- Update README, Dockerfile (Python 3.11), docker-compose (mount models)
- Pin dependency versions, remove unused httpx[socks]
- Add basic pytest tests for layout converter and voice normalization
This commit is contained in:
Галингер Р.С.
2026-07-07 18:42:10 +07:00
parent 76e5701eba
commit 0f674f8832
23 changed files with 894 additions and 578 deletions
View File
+23
View File
@@ -0,0 +1,23 @@
import pytest
from bot.utils.layout_converter import convert_layout
@pytest.mark.parametrize(
"input_text, expected",
[
("gbdj", "пиво"),
("rjytxyj!", "конечно!"),
("Ghbdtn", "Привет"),
("123", "123"),
("", ""),
("qwerty", "йцукен"),
],
)
def test_convert_layout(input_text: str, expected: str) -> None:
assert convert_layout(input_text) == expected
def test_convert_layout_preserves_case() -> None:
assert convert_layout("QWERTY") == "ЙЦУКЕН"
assert convert_layout("QwErTy") == "ЙцУкЕн"
+17
View File
@@ -0,0 +1,17 @@
import pytest
from bot.utils.voice import normalize_text
@pytest.mark.parametrize(
"input_text, expected",
[
("привет", "Привет."),
("Привет!", "Привет!"),
(" hello world ", "Hello world."),
("", ""),
("как дела", "Как дела."),
],
)
def test_normalize_text(input_text: str, expected: str) -> None:
assert normalize_text(input_text) == expected