smart-bot-factory 0.2.9__tar.gz → 0.2.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of smart-bot-factory might be problematic. Click here for more details.

Files changed (104) hide show
  1. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/PKG-INFO +1 -1
  2. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/publish.py +26 -1
  3. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/pyproject.toml +1 -1
  4. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/core/bot_utils.py +11 -0
  5. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/creation/bot_builder.py +54 -5
  6. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/handlers/handlers.py +3 -2
  7. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/uv.lock +1 -1
  8. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.claude/settings.local.json +0 -0
  9. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.env.example +0 -0
  10. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.github/ISSUE_TEMPLATE//342/234/250-/320/267/320/260/320/277/321/200/320/276/321/201-/321/204/321/203/320/275/320/272/321/206/320/270/320/270.md" +0 -0
  11. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.github/ISSUE_TEMPLATE//360/237/220/233-/320/261/320/260/320/263-/321/200/320/265/320/277/320/276/321/200/321/202.md" +0 -0
  12. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.github/workflows/ci.yml +0 -0
  13. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.github/workflows/publish-private.yml +0 -0
  14. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.github/workflows/publish.yml +0 -0
  15. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.gitignore +0 -0
  16. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/.python-version +0 -0
  17. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/CLIENTS_USAGE.md +0 -0
  18. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/Dockerfile +0 -0
  19. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/LICENSE +0 -0
  20. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/README.md +0 -0
  21. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/best-valera.py +0 -0
  22. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/prompts/1sales_context.txt +0 -0
  23. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/prompts/2product_info.txt +0 -0
  24. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/prompts/3objection_handling.txt +0 -0
  25. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/prompts/final_instructions.txt +0 -0
  26. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/prompts/help_message.txt +0 -0
  27. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/prompts/welcome_message.txt +0 -0
  28. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/tests/quick_scenarios.yaml +0 -0
  29. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/tests/realistic_scenarios.yaml +0 -0
  30. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/tests/scenario_examples.yaml +0 -0
  31. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/welcome_files/welcome_file_msg.txt +0 -0
  32. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/best-valera/welcome_files//320/247/320/265/320/272 /320/273/320/270/321/201/321/202 /320/277/320/276 152/320/244/320/227 /320/270 323/320/244/320/227 /320/264/320/273/321/217 /320/274/320/265/320/264/320/270/321/206/320/270/320/275/321/213.pdf" +0 -0
  33. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/prompts/2product_info.txt +0 -0
  34. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/prompts/3objection_handling.txt +0 -0
  35. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/prompts/final_instructions.txt +0 -0
  36. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/prompts/help_message.txt +0 -0
  37. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/prompts/welcome_message.txt +0 -0
  38. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/tests/quick_scenarios.yaml +0 -0
  39. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/tests/realistic_scenarios.yaml +0 -0
  40. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/tests/scenario_examples.yaml +0 -0
  41. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/welcome_files/welcome_file_msg.txt +0 -0
  42. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/bots/valera/welcome_files//320/247/320/265/320/272 /320/273/320/270/321/201/321/202 /320/277/320/276 152/320/244/320/227 /320/270 323/320/244/320/227 /320/264/320/273/321/217 /320/274/320/265/320/264/320/270/321/206/320/270/320/275/321/213.pdf" +0 -0
  43. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/configs/valera/cats//320/224/320/276/320/263/320/276/320/262/320/276/321/200.pdf" +0 -0
  44. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/configs/valera/cats//320/272/320/276/320/275/320/270.jpg" +0 -0
  45. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/configs/valera/cats//320/272/320/276/321/202.jpg" +0 -0
  46. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/configs/valera/cats//320/273/320/265/321/201.jpg" +0 -0
  47. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/configs/valera/tests/fixes_elina.yaml +0 -0
  48. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/configs/valera/welcome_file//320/247/320/265/320/272 /320/273/320/270/321/201/321/202 /320/277/320/276 152/320/244/320/227 /320/270 323/320/244/320/227 /320/264/320/273/321/217 /320/274/320/265/320/264/320/270/321/206/320/270/320/275/321/213.pdf" +0 -0
  49. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/create_tag.sh +0 -0
  50. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/docker-compose.yml +0 -0
  51. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/env.example +0 -0
  52. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/requirements.txt +0 -0
  53. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/save_backup.sh +0 -0
  54. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/save_fixes.sh +0 -0
  55. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/__init__.py +0 -0
  56. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/admin/__init__.py +0 -0
  57. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/admin/admin_logic.py +0 -0
  58. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/admin/admin_manager.py +0 -0
  59. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/admin/admin_migration.sql +0 -0
  60. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/admin/admin_tester.py +0 -0
  61. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/admin/timeout_checker.py +0 -0
  62. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/analytics/analytics_manager.py +0 -0
  63. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/cli.py +0 -0
  64. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/config.py +0 -0
  65. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/prompts/1sales_context.txt +0 -0
  66. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/prompts/2product_info.txt +0 -0
  67. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/prompts/3objection_handling.txt +0 -0
  68. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/prompts/final_instructions.txt +0 -0
  69. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/prompts/help_message.txt +0 -0
  70. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/prompts/welcome_message.txt +0 -0
  71. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/reports/test_20250924_064229.txt +0 -0
  72. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/reports/test_20250924_064335.txt +0 -0
  73. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/reports/test_20250924_064638.txt +0 -0
  74. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/tests/quick_scenarios.yaml +0 -0
  75. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/tests/realistic_scenarios.yaml +0 -0
  76. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/tests/scenario_examples.yaml +0 -0
  77. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/welcome_file/welcome_file_msg.txt +0 -0
  78. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/configs/growthmed-october-24/welcome_file//320/247/320/265/320/272 /320/273/320/270/321/201/321/202 /320/277/320/276 152/320/244/320/227 /320/270 323/320/244/320/227 /320/264/320/273/321/217 /320/274/320/265/320/264/320/270/321/206/320/270/320/275/321/213.pdf" +0 -0
  79. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/core/conversation_manager.py +0 -0
  80. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/core/decorators.py +0 -0
  81. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/core/message_sender.py +0 -0
  82. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/core/router.py +0 -0
  83. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/core/router_manager.py +0 -0
  84. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/core/states.py +0 -0
  85. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/core/telegram_router.py +0 -0
  86. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/creation/__init__.py +0 -0
  87. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/creation/bot_testing.py +0 -0
  88. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/event/__init__.py +0 -0
  89. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/integrations/openai_client.py +0 -0
  90. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/integrations/supabase_client.py +0 -0
  91. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/message/__init__.py +0 -0
  92. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/router/__init__.py +0 -0
  93. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/setup_checker.py +0 -0
  94. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/supabase/__init__.py +0 -0
  95. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/supabase/client.py +0 -0
  96. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/table/database_structure.sql +0 -0
  97. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/table/schema.sql +0 -0
  98. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/utils/__init__.py +0 -0
  99. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/utils/debug_routing.py +0 -0
  100. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/utils/prompt_loader.py +0 -0
  101. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/utils/user_prompt_loader.py +0 -0
  102. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/smart_bot_factory/utm_link_generator.py +0 -0
  103. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/system_prompt_example.txt +0 -0
  104. {smart_bot_factory-0.2.9 → smart_bot_factory-0.2.11}/valera.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-bot-factory
3
- Version: 0.2.9
3
+ Version: 0.2.11
4
4
  Summary: Библиотека для создания умных чат-ботов
5
5
  Author-email: Kopatych <kopatych@example.com>
6
6
  License: MIT
@@ -4,13 +4,18 @@
4
4
  - Увеличивает версию на 0.0.1
5
5
  - Очищает dist/
6
6
  - Собирает пакет через uv build
7
- - Публикует через twine
7
+ - Публикует через twine (использует API токен из .env)
8
8
  """
9
9
 
10
+ import os
10
11
  import re
11
12
  import shutil
12
13
  import subprocess
13
14
  from pathlib import Path
15
+ from dotenv import load_dotenv
16
+
17
+ # Загружаем переменные из .env
18
+ load_dotenv()
14
19
 
15
20
  def increment_version(version: str) -> str:
16
21
  """Увеличивает версию на 0.0.1"""
@@ -75,9 +80,29 @@ def upload_to_pypi():
75
80
  """Загружает пакет в PyPI через twine"""
76
81
  print("\n📤 Загрузка в PyPI...")
77
82
 
83
+ # Проверяем наличие токена в .env
84
+ pypi_token = os.getenv('PYPI_API_TOKEN')
85
+
86
+ if not pypi_token:
87
+ print("⚠️ PYPI_API_TOKEN не найден в .env")
88
+ print("💡 Добавьте в .env файл:")
89
+ print(" PYPI_API_TOKEN=pypi-...")
90
+ print("\nИли введите вручную при запросе twine")
91
+ else:
92
+ print(f"✅ Используется API токен из .env (длина: {len(pypi_token)} символов)")
93
+
94
+ # Twine автоматически использует переменные окружения:
95
+ # TWINE_USERNAME (по умолчанию "__token__")
96
+ # TWINE_PASSWORD (PYPI_API_TOKEN)
97
+ env = os.environ.copy()
98
+ if pypi_token:
99
+ env['TWINE_USERNAME'] = '__token__'
100
+ env['TWINE_PASSWORD'] = pypi_token
101
+
78
102
  # Используем twine через uv run
79
103
  result = subprocess.run(
80
104
  ["uv", "run", "twine", "upload", "dist/*"],
105
+ env=env,
81
106
  check=True
82
107
  )
83
108
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "smart-bot-factory"
3
- version = "0.2.9"
3
+ version = "0.2.11"
4
4
  description = "Библиотека для создания умных чат-ботов"
5
5
  authors = [
6
6
  {name = "Kopatych", email = "kopatych@example.com"}
@@ -177,6 +177,17 @@ def parse_ai_response_method2(ai_response: str) -> tuple[str, dict]:
177
177
 
178
178
  async def process_events(session_id: str, events: list, user_id: int):
179
179
  """Обрабатывает события из ответа ИИ"""
180
+
181
+ # Проверяем кастомный процессор
182
+ custom_processor = get_global_var('custom_event_processor')
183
+
184
+ if custom_processor:
185
+ # Используем кастомную функцию обработки событий
186
+ logger.info(f"🔄 Используется кастомная обработка событий: {custom_processor.__name__}")
187
+ await custom_processor(session_id, events, user_id)
188
+ return
189
+
190
+ # Стандартная обработка
180
191
  supabase_client = get_global_var('supabase_client')
181
192
 
182
193
  for event in events:
@@ -58,6 +58,9 @@ class BotBuilder:
58
58
  # Кастомный PromptLoader
59
59
  self._custom_prompt_loader = None
60
60
 
61
+ # Кастомный процессор событий
62
+ self._custom_event_processor = None
63
+
61
64
  # Флаги инициализации
62
65
  self._initialized = False
63
66
 
@@ -402,6 +405,44 @@ class BotBuilder:
402
405
  self._custom_prompt_loader = prompt_loader
403
406
  logger.info(f"✅ Установлен кастомный PromptLoader: {type(prompt_loader).__name__}")
404
407
 
408
+ def set_event_processor(self, custom_processor):
409
+ """
410
+ Устанавливает кастомную функцию для обработки событий
411
+
412
+ Полностью заменяет стандартную process_events из bot_utils
413
+
414
+ Args:
415
+ custom_processor: async def(session_id: str, events: list, user_id: int)
416
+
417
+ Example:
418
+ from smart_bot_factory.message import get_bot
419
+ from smart_bot_factory.core.decorators import execute_event_handler
420
+
421
+ async def my_process_events(session_id, events, user_id):
422
+ '''Моя кастомная обработка событий'''
423
+ bot = get_bot()
424
+
425
+ for event in events:
426
+ event_type = event.get('тип')
427
+ event_info = event.get('инфо')
428
+
429
+ if event_type == 'запись':
430
+ # Кастомная логика для бронирования
431
+ telegram_user = await bot.get_chat(user_id)
432
+ name = telegram_user.first_name or 'Клиент'
433
+ # ... ваша обработка
434
+ else:
435
+ # Для остальных - стандартная обработка
436
+ await execute_event_handler(event_type, user_id, event_info)
437
+
438
+ bot_builder.set_event_processor(my_process_events)
439
+ """
440
+ if not callable(custom_processor):
441
+ raise TypeError(f"Процессор должен быть callable, получен {type(custom_processor)}")
442
+
443
+ self._custom_event_processor = custom_processor
444
+ logger.info(f"✅ Установлена кастомная функция обработки событий: {custom_processor.__name__}")
445
+
405
446
  # ========== ХУКИ ДЛЯ КАСТОМИЗАЦИИ ОБРАБОТКИ СООБЩЕНИЙ ==========
406
447
 
407
448
  def validate_message(self, handler):
@@ -501,17 +542,23 @@ class BotBuilder:
501
542
  """
502
543
  Регистрирует фильтр отправки (может блокировать отправку пользователю)
503
544
 
504
- Если фильтр возвращает False, сообщение НЕ отправляется
545
+ Если фильтр возвращает True, сообщение НЕ отправляется
505
546
 
506
547
  Args:
507
- handler: async def(user_id: int, response_text: str) -> bool
548
+ handler: async def(user_id: int) -> bool
508
549
 
509
550
  Example:
510
551
  @bot_builder.filter_send
511
- async def block_during_process(user_id, response_text):
552
+ async def block_during_process(user_id):
512
553
  if is_processing(user_id):
513
- return False # Не отправляем
514
- return True # Отправляем
554
+ return True # Блокируем отправку
555
+ return False # Разрешаем отправку
556
+
557
+ # Или совместимый с should_block_ai_response
558
+ @bot_builder.filter_send
559
+ async def should_block_ai_response(user_id):
560
+ # Ваша логика проверки
561
+ return user_is_blocked(user_id) # True = блокировать
515
562
  """
516
563
  if not callable(handler):
517
564
  raise TypeError(f"Обработчик должен быть callable, получен {type(handler)}")
@@ -580,6 +627,7 @@ class BotBuilder:
580
627
  handlers_module.conversation_manager = self.conversation_manager
581
628
  handlers_module.start_handlers = self._start_handlers # Передаем обработчики on_start
582
629
  handlers_module.message_hooks = self.get_message_hooks() # Передаем хуки для обработки сообщений
630
+ handlers_module.custom_event_processor = self._custom_event_processor # Передаем кастомный процессор событий
583
631
  logger.info("✅ Глобальные переменные установлены в handlers")
584
632
  except Exception as e:
585
633
  logger.warning(f"⚠️ Не удалось установить глобальные переменные в handlers: {e}")
@@ -611,6 +659,7 @@ class BotBuilder:
611
659
  bot_utils_module.admin_manager = self.admin_manager
612
660
  bot_utils_module.analytics_manager = self.analytics_manager
613
661
  bot_utils_module.conversation_manager = self.conversation_manager
662
+ bot_utils_module.custom_event_processor = self._custom_event_processor # Передаем кастомный процессор событий
614
663
  logger.info("✅ Глобальные переменные установлены в bot_utils")
615
664
  except Exception as e:
616
665
  logger.warning(f"⚠️ Не удалось установить глобальные переменные в bot_utils: {e}")
@@ -753,8 +753,9 @@ async def process_user_message(message: Message, state: FSMContext, session_id:
753
753
  for filter_func in send_filters:
754
754
  try:
755
755
  should_send = await filter_func(message.from_user.id)
756
- if not should_send:
757
- logger.info(f"⛔ Фильтр '{filter_func.__name__}' заблокировал отправку")
756
+ if should_send:
757
+ # True = блокируем (для совместимости с should_block_ai_response)
758
+ logger.info(f"⛔ Фильтр '{filter_func.__name__}' заблокировал отправку (вернул True)")
758
759
  return # Не отправляем
759
760
  except Exception as e:
760
761
  logger.error(f"❌ Ошибка в фильтре отправки '{filter_func.__name__}': {e}")
@@ -1637,7 +1637,7 @@ wheels = [
1637
1637
 
1638
1638
  [[package]]
1639
1639
  name = "smart-bot-factory"
1640
- version = "0.2.8"
1640
+ version = "0.2.10"
1641
1641
  source = { editable = "." }
1642
1642
  dependencies = [
1643
1643
  { name = "aiofiles" },