smart-bot-factory 0.3.3__py3-none-any.whl → 0.3.5__py3-none-any.whl

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.

@@ -1101,27 +1101,36 @@ class SupabaseClient:
1101
1101
  # МЕТОДЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ СОБЫТИЙ В SUPABASE STORAGE
1102
1102
  # =============================================================================
1103
1103
 
1104
- async def upload_event_file(self, event_name: str, file_data: bytes, file_name: str) -> Dict[str, str]:
1104
+ async def upload_event_file(
1105
+ self,
1106
+ event_id: str,
1107
+ file_data: bytes,
1108
+ original_name: str,
1109
+ file_id: str
1110
+ ) -> Dict[str, str]:
1105
1111
  """
1106
1112
  Загружает файл события в Supabase Storage
1107
1113
 
1108
1114
  Args:
1109
- event_name: Название события (используется как папка)
1115
+ event_id: ID события из БД (используется как папка)
1110
1116
  file_data: Байты файла
1111
- file_name: Имя файла
1117
+ original_name: Оригинальное имя файла (для метаданных)
1118
+ file_id: Уникальный ID файла для хранения
1112
1119
 
1113
1120
  Returns:
1114
- Dict с storage_path
1121
+ Dict с storage_path и original_name
1115
1122
  """
1116
1123
  try:
1117
1124
  bucket_name = 'admin-events'
1118
1125
 
1119
- # Формируем путь: admin-events/{event_name}/{file_name}
1120
- storage_path = f"{event_name}/{file_name}"
1126
+ # Формируем путь: admin-events/event_id/file_id.ext
1127
+ extension = original_name.split('.')[-1] if '.' in original_name else ''
1128
+ storage_name = f"{file_id}.{extension}" if extension else file_id
1129
+ storage_path = f"events/{event_id}/files/{storage_name}"
1121
1130
 
1122
- # Определяем MIME-type
1131
+ # Определяем MIME-type по оригинальному имени файла
1123
1132
  import mimetypes
1124
- content_type, _ = mimetypes.guess_type(file_name)
1133
+ content_type, _ = mimetypes.guess_type(original_name)
1125
1134
  if not content_type:
1126
1135
  content_type = 'application/octet-stream'
1127
1136
 
@@ -1142,20 +1151,19 @@ class SupabaseClient:
1142
1151
  logger.error(f"❌ Ошибка загрузки файла в Storage: {e}")
1143
1152
  raise
1144
1153
 
1145
- async def download_event_file(self, event_name: str, file_name: str) -> bytes:
1154
+ async def download_event_file(self, event_id: str, storage_path: str) -> bytes:
1146
1155
  """
1147
1156
  Скачивает файл события из Supabase Storage
1148
1157
 
1149
1158
  Args:
1150
- event_name: Название события
1151
- file_name: Имя файла
1159
+ event_id: ID события
1160
+ storage_path: Полный путь к файлу в Storage
1152
1161
 
1153
1162
  Returns:
1154
1163
  bytes: Содержимое файла
1155
1164
  """
1156
1165
  try:
1157
1166
  bucket_name = 'admin-events'
1158
- storage_path = f"{event_name}/{file_name}"
1159
1167
 
1160
1168
  # Скачиваем файл
1161
1169
  file_data = self.client.storage.from_(bucket_name).download(storage_path)
@@ -1167,30 +1175,31 @@ class SupabaseClient:
1167
1175
  logger.error(f"❌ Ошибка скачивания файла из Storage: {e}")
1168
1176
  raise
1169
1177
 
1170
- async def delete_event_files(self, event_name: str):
1178
+ async def delete_event_files(self, event_id: str):
1171
1179
  """
1172
1180
  Удаляет ВСЕ файлы события из Supabase Storage
1173
1181
 
1174
1182
  Args:
1175
- event_name: Название события (папка с файлами)
1183
+ event_id: ID события
1176
1184
  """
1177
1185
  try:
1178
1186
  bucket_name = 'admin-events'
1187
+ event_path = f"events/{event_id}/files"
1179
1188
 
1180
1189
  # Получаем список всех файлов в папке события
1181
- files_list = self.client.storage.from_(bucket_name).list(event_name)
1190
+ files_list = self.client.storage.from_(bucket_name).list(event_path)
1182
1191
 
1183
1192
  if not files_list:
1184
- logger.info(f"ℹ️ Нет файлов для удаления в событии '{event_name}'")
1193
+ logger.info(f"ℹ️ Нет файлов для удаления в событии '{event_id}'")
1185
1194
  return
1186
1195
 
1187
1196
  # Формируем пути для удаления
1188
- file_paths = [f"{event_name}/{file['name']}" for file in files_list]
1197
+ file_paths = [f"{event_path}/{file['name']}" for file in files_list]
1189
1198
 
1190
1199
  # Удаляем файлы
1191
1200
  self.client.storage.from_(bucket_name).remove(file_paths)
1192
1201
 
1193
- logger.info(f"✅ Удалено {len(file_paths)} файлов события '{event_name}' из Storage")
1202
+ logger.info(f"✅ Удалено {len(file_paths)} файлов события '{event_id}' из Storage")
1194
1203
 
1195
1204
  except Exception as e:
1196
1205
  logger.error(f"❌ Ошибка удаления файлов события из Storage: {e}")
@@ -1201,7 +1210,7 @@ class SupabaseClient:
1201
1210
  event_name: str,
1202
1211
  event_data: Dict[str, Any],
1203
1212
  scheduled_datetime: datetime
1204
- ) -> str:
1213
+ ) -> Dict[str, Any]:
1205
1214
  """
1206
1215
  Сохраняет админское событие в таблицу scheduled_events
1207
1216
 
@@ -1211,7 +1220,7 @@ class SupabaseClient:
1211
1220
  scheduled_datetime: Дата и время отправки (должно быть в UTC с timezone info)
1212
1221
 
1213
1222
  Returns:
1214
- str: ID созданного события
1223
+ Dict[str, Any]: {'id': str, 'event_type': str, ...} - все данные созданного события
1215
1224
  """
1216
1225
  try:
1217
1226
  import json
@@ -1233,10 +1242,10 @@ class SupabaseClient:
1233
1242
  }
1234
1243
 
1235
1244
  response = self.client.table('scheduled_events').insert(event_record).execute()
1236
- event_id = response.data[0]['id']
1245
+ event = response.data[0]
1237
1246
 
1238
- logger.info(f"💾 Админское событие '{event_name}' сохранено в БД: {event_id} на {scheduled_datetime.isoformat()}")
1239
- return event_id
1247
+ logger.info(f"💾 Админское событие '{event_name}' сохранено в БД: {event['id']} на {scheduled_datetime.isoformat()}")
1248
+ return event
1240
1249
 
1241
1250
  except Exception as e:
1242
1251
  logger.error(f"❌ Ошибка сохранения админского события: {e}")
@@ -107,6 +107,7 @@ class PromptLoader:
107
107
  {
108
108
  "этап": "introduction|consult|offer|contacts",
109
109
  "качество": 1-10,
110
+ "ссылка": 1,
110
111
  "события": [
111
112
  {
112
113
  "тип": "телефон|консультация|покупка|отказ",
@@ -126,9 +127,10 @@ class PromptLoader:
126
127
  СИСТЕМА ОЦЕНКИ КАЧЕСТВА (1-10):
127
128
  1-3: низкий интерес, много возражений, скептически настроен
128
129
  4-6: средний интерес, есть вопросы, обдумывает
129
- 7-8: высокий интерес, готов к покупке, активно интересуется
130
+ 7-8: высокий интерес, готов к покупке, активно интересуется
130
131
  9-10: горячий лид, предоставил контакты или готов к действию
131
132
 
133
+
132
134
  СОБЫТИЯ - добавляй ТОЛЬКО когда происходит что-то из этого:
133
135
  - "телефон": пользователь предоставил номер телефона
134
136
  - "консультация": пользователь просит живую консультацию по телефону
@@ -140,7 +142,7 @@ class PromptLoader:
140
142
 
141
143
  ПРИМЕРЫ ПРАВИЛЬНОГО ИСПОЛЬЗОВАНИЯ:
142
144
 
143
- Пример 1 - обычный диалог:
145
+ Пример 1 - обычный диалог (без ссылки):
144
146
  "Расскажу подробнее о конференции GrowthMED. Она пройдет 24-25 октября..."
145
147
 
146
148
  {
@@ -151,11 +153,11 @@ class PromptLoader:
151
153
  "каталоги": []
152
154
  }
153
155
 
154
- Пример 2 - получен телефон:
156
+ Пример 2 - получен телефон (без ссылки):
155
157
  "Отлично! Записал ваш номер. Мы перезвоним в течение 10 минут!"
156
158
 
157
159
  {
158
- "этап": "contacts",
160
+ "этап": "contacts",
159
161
  "качество": 9,
160
162
  "события": [
161
163
  {
@@ -167,7 +169,7 @@ class PromptLoader:
167
169
  "каталоги": []
168
170
  }
169
171
 
170
- Пример 3 - отправка презентации:
172
+ Пример 3 - отправка презентации (без ссылки):
171
173
  "Отправляю вам презентацию о нашей компании и прайс-лист с актуальными ценами."
172
174
 
173
175
  {
@@ -175,7 +177,7 @@ class PromptLoader:
175
177
  "качество": 7,
176
178
  "события": [
177
179
  {
178
- "тип": "консультация",
180
+ "тип": "консультация",
179
181
  "инфо": "Запросил материалы"
180
182
  }
181
183
  ],
@@ -183,7 +185,7 @@ class PromptLoader:
183
185
  "каталоги": []
184
186
  }
185
187
 
186
- Пример 4 - отправка файлов из каталога:
188
+ Пример 4 - отправка файлов из каталога (без ссылки):
187
189
  "В каталоге 'примеры_работ' вы можете посмотреть наши последние проекты."
188
190
 
189
191
  {
@@ -194,7 +196,7 @@ class PromptLoader:
194
196
  "каталоги": ["примеры_работ"]
195
197
  }
196
198
 
197
- Пример 5 - комбинированная отправка:
199
+ Пример 5 - комбинированная отправка (без ссылки):
198
200
  "Отправляю вам коммерческое предложение и примеры похожих проектов из нашего портфолио."
199
201
 
200
202
  {
@@ -210,6 +212,7 @@ class PromptLoader:
210
212
  "каталоги": ["портфолио_2023"]
211
213
  }
212
214
 
215
+
213
216
  ТРЕБОВАНИЯ К JSON:
214
217
  - JSON должен быть валидным и находиться в самом конце ответа
215
218
  - Всегда используй кавычки для строк
@@ -217,6 +220,7 @@ class PromptLoader:
217
220
  - Если событий нет - не добавляй их в массив
218
221
  - Качество должно быть числом от 1 до 10
219
222
 
223
+
220
224
  ПОМНИ: Этот JSON критически важен для работы системы администрирования и аналитики!
221
225
  """
222
226
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-bot-factory
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: Библиотека для создания умных чат-ботов
5
5
  Author-email: Kopatych <eserov73@gmail.com>
6
6
  License: MIT
@@ -25,7 +25,6 @@ Requires-Dist: aiogram>=3.4.1
25
25
  Requires-Dist: click>=8.0.0
26
26
  Requires-Dist: openai>=1.12.0
27
27
  Requires-Dist: project-root-finder>=1.9
28
- Requires-Dist: python-dateutil>=2.9.0.post0
29
28
  Requires-Dist: python-dotenv>=1.0.1
30
29
  Requires-Dist: pytz>=2023.3
31
30
  Requires-Dist: pyyaml>=6.0.2
@@ -4,8 +4,8 @@ smart_bot_factory/config.py,sha256=kB3G2hGMrrCSOAvlrddf8x43bgfgEaQqOCKOeELAzfM,1
4
4
  smart_bot_factory/setup_checker.py,sha256=fqRzyptyMzcb2I0boUaj0rWLdarqaN6ViX6suwTEeWc,20123
5
5
  smart_bot_factory/utm_link_generator.py,sha256=wYPdYYK555YfOP22eJXAcEv_D66_t50Dhg0-wkLVzVk,4502
6
6
  smart_bot_factory/admin/__init__.py,sha256=vdsMTpt_LiXkY-awFu_X9e2Zt7CV50PwmsWkFbk6whk,488
7
- smart_bot_factory/admin/admin_events.py,sha256=yU52QWc1GC-E-WAA_A3HAXpY3zMG96eGq97FtHC5ZB0,34804
8
- smart_bot_factory/admin/admin_logic.py,sha256=zyaklL-s0LihPGHVbguOB9F0NMaggHAyQGukco_kTtA,22831
7
+ smart_bot_factory/admin/admin_events.py,sha256=QCosyTbJgrU8daWSK_bQgf8UZoJSIrV6xyO0R3XV2j0,43289
8
+ smart_bot_factory/admin/admin_logic.py,sha256=vPkNk86bdPsjNUNlZ3qfKtbRr9UuJy2oG54cYUGGNmg,23107
9
9
  smart_bot_factory/admin/admin_manager.py,sha256=xlyG9mIjPmtUhS4E9lp36T7o5Kfp5PZpJ-r1QjnSn5g,6394
10
10
  smart_bot_factory/admin/admin_migration.sql,sha256=kleMPJBSe2Z7ZZz7rNyOX_yoh4GZivGesqAX90U5PGs,5667
11
11
  smart_bot_factory/admin/admin_tester.py,sha256=PGFpf7fmD5Wxea31xR2ZM_A_QpvrB73gsbxvUrHQBkg,6463
@@ -30,30 +30,30 @@ smart_bot_factory/configs/growthmed-october-24/tests/realistic_scenarios.yaml,sh
30
30
  smart_bot_factory/configs/growthmed-october-24/tests/scenario_examples.yaml,sha256=bzDulOU4a2LyWlcHzlQU8GYhOky2WTfyizGfjX4ioMY,2436
31
31
  smart_bot_factory/configs/growthmed-october-24/welcome_file/welcome_file_msg.txt,sha256=Db21Mm0r8SBWFdX9EeIF2FZtLQ2cvuwVlSRJd2KEYCg,922
32
32
  smart_bot_factory/configs/growthmed-october-24/welcome_file/Чек лист по 152ФЗ и 323ФЗ для медицины.pdf,sha256=BiAiQHNnQXJPMsks9AeL6s0beEjRFkRMJLMlAn4WorA,5284954
33
- smart_bot_factory/core/bot_utils.py,sha256=Be334BPspBgHNO9OpEiPlrCc0Gmy7_8sox5WpV8XHic,45174
33
+ smart_bot_factory/core/bot_utils.py,sha256=4c98tVPThXW4ET6XJ0FYMePrx4gYrw_HNhx3YLep9hY,46976
34
34
  smart_bot_factory/core/conversation_manager.py,sha256=eoHL7MCEz68DRvTVwRwZgf2PWwGv4T6J9D-I-thETi8,28289
35
- smart_bot_factory/core/decorators.py,sha256=gJWaJVyCoBSsy4EsaJTv4OPVK-Efv1pQLm54Odgu4Lk,93678
36
- smart_bot_factory/core/message_sender.py,sha256=J4b6n8nXVjqf-qzL6URRSvc-FVnQfShwujVSM6qv26w,32232
37
- smart_bot_factory/core/router.py,sha256=03fbysaj0LR96p4-8iiml8dTmEHCkR-AaTposSv8q8o,11898
35
+ smart_bot_factory/core/decorators.py,sha256=0fDgYNaXU3ZLhFJBxAognLWfy_Fz1F63wdUNaVziDQU,95141
36
+ smart_bot_factory/core/message_sender.py,sha256=0-SQcK4W1x__VgvyaeVRuFlXcxV56TsR_nNK07Nr4b4,32763
37
+ smart_bot_factory/core/router.py,sha256=ji7rzpuKaO8yKaxFW58WhlgG5ExXlbCgqCTONxAyqL4,15022
38
38
  smart_bot_factory/core/router_manager.py,sha256=dUwesog-oHk1U2EDdS8p0e4MTSkwtx5_qXn6nrJ9l9I,9700
39
39
  smart_bot_factory/core/states.py,sha256=L8qp1UmYFuxTN5U9tY076rDuKgxtFbpSGqBpva2eWbo,895
40
40
  smart_bot_factory/creation/__init__.py,sha256=IgDk8GDS3pg7Pw_Et41J33ZmeZIU5dRwQdTmYKXfJfE,128
41
41
  smart_bot_factory/creation/bot_builder.py,sha256=yGRmOPD7qCMbhcBiltHWISoKxWx8eqjDSnZXpwhqnUs,43115
42
42
  smart_bot_factory/creation/bot_testing.py,sha256=JDWXyJfZmbgo-DLdAPk8Sd9FiehtHHa4sLD17lBrTOc,55669
43
43
  smart_bot_factory/event/__init__.py,sha256=hPL449RULIOB-OXv1ZbGNiHctAYaOMUqhSWGPrDHYBM,212
44
- smart_bot_factory/handlers/handlers.py,sha256=jMKD04v81BbCNLl_00rAM_rgPDH1mMdHZlLI8ZhXpc8,60438
44
+ smart_bot_factory/handlers/handlers.py,sha256=v3ubszkN7ML-CXChveTdp68EdMjHl02NTJ3hMT2zXKA,61893
45
45
  smart_bot_factory/integrations/openai_client.py,sha256=fwaJpwojFdLBWChcFWpFGOHK9upG-nCIwDochkCRRlY,24291
46
- smart_bot_factory/integrations/supabase_client.py,sha256=XznvAXqcMBqHw2_-t91Exyomru-mLP6-BlYuEeoUJSY,63082
46
+ smart_bot_factory/integrations/supabase_client.py,sha256=Rv0sZHXGSfm3UWodmaR1N-X5-2JbmynPWJKY0a0k_Tk,63557
47
47
  smart_bot_factory/message/__init__.py,sha256=-ehDZweUc3uKgmLLxFVsD-KWrDtnHpHms7pCrDelWo0,1950
48
48
  smart_bot_factory/router/__init__.py,sha256=5gEbpG3eylOyow5NmidzGUy0K-AZq7RhYLVu9OaUT6c,270
49
49
  smart_bot_factory/supabase/__init__.py,sha256=XmZP6yM9ffERM5ddAWyJnrNzEhCYtMu3AcjVCi1rOf8,179
50
50
  smart_bot_factory/supabase/client.py,sha256=lWIzfOgoSvU7xPhYLoJtM5GnbWdoWsvHcRFC22sFBMU,25637
51
51
  smart_bot_factory/utils/__init__.py,sha256=UhsJXEHfrIK8h1AHsroHSwAriijk-LvnqLyvgzi2VYs,273
52
52
  smart_bot_factory/utils/debug_routing.py,sha256=BOoDhKBg7UXe5uHQxRk3TSfPfLPOFqt0N7lAo6kjCOo,4719
53
- smart_bot_factory/utils/prompt_loader.py,sha256=JSn7CsWnToSbHYtURdeuZn7ectyDqQGrPGHN2ixIGkw,19930
53
+ smart_bot_factory/utils/prompt_loader.py,sha256=HS_6Vf-qvRBkhvyzu-HNVS1swFgmqWOKNNv0F6We_AQ,20060
54
54
  smart_bot_factory/utils/user_prompt_loader.py,sha256=dk6P0X_3UcNqxjRtuIvb0LcPrp03zIIsstZwdmeCPaE,2519
55
- smart_bot_factory-0.3.3.dist-info/METADATA,sha256=kyf-bct-Sf1zvA6PwlUtTOGJ17kV7q8FuqtrjvNvXRM,31949
56
- smart_bot_factory-0.3.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
- smart_bot_factory-0.3.3.dist-info/entry_points.txt,sha256=ybKEAI0WSb7WoRiey7QE-HHfn88UGV7nxLDxXq7b7SU,50
58
- smart_bot_factory-0.3.3.dist-info/licenses/LICENSE,sha256=OrK3cwdUTzNzIhJvSPtJaVMoYIyC_sSx5EFE_FDMvGs,1092
59
- smart_bot_factory-0.3.3.dist-info/RECORD,,
55
+ smart_bot_factory-0.3.5.dist-info/METADATA,sha256=xOG5tl-e-w8yfvxuZfiyVRnQGdEvUxYLMPbKVGTcbmY,31905
56
+ smart_bot_factory-0.3.5.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
+ smart_bot_factory-0.3.5.dist-info/entry_points.txt,sha256=ybKEAI0WSb7WoRiey7QE-HHfn88UGV7nxLDxXq7b7SU,50
58
+ smart_bot_factory-0.3.5.dist-info/licenses/LICENSE,sha256=OrK3cwdUTzNzIhJvSPtJaVMoYIyC_sSx5EFE_FDMvGs,1092
59
+ smart_bot_factory-0.3.5.dist-info/RECORD,,