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.
- smart_bot_factory/admin/admin_events.py +420 -245
- smart_bot_factory/admin/admin_logic.py +5 -0
- smart_bot_factory/core/bot_utils.py +34 -9
- smart_bot_factory/core/decorators.py +41 -26
- smart_bot_factory/core/message_sender.py +11 -2
- smart_bot_factory/core/router.py +59 -8
- smart_bot_factory/handlers/handlers.py +25 -6
- smart_bot_factory/integrations/supabase_client.py +32 -23
- smart_bot_factory/utils/prompt_loader.py +12 -8
- {smart_bot_factory-0.3.3.dist-info → smart_bot_factory-0.3.5.dist-info}/METADATA +1 -2
- {smart_bot_factory-0.3.3.dist-info → smart_bot_factory-0.3.5.dist-info}/RECORD +14 -14
- {smart_bot_factory-0.3.3.dist-info → smart_bot_factory-0.3.5.dist-info}/WHEEL +0 -0
- {smart_bot_factory-0.3.3.dist-info → smart_bot_factory-0.3.5.dist-info}/entry_points.txt +0 -0
- {smart_bot_factory-0.3.3.dist-info → smart_bot_factory-0.3.5.dist-info}/licenses/LICENSE +0 -0
|
@@ -1101,27 +1101,36 @@ class SupabaseClient:
|
|
|
1101
1101
|
# МЕТОДЫ ДЛЯ РАБОТЫ С ФАЙЛАМИ СОБЫТИЙ В SUPABASE STORAGE
|
|
1102
1102
|
# =============================================================================
|
|
1103
1103
|
|
|
1104
|
-
async def upload_event_file(
|
|
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
|
-
|
|
1115
|
+
event_id: ID события из БД (используется как папка)
|
|
1110
1116
|
file_data: Байты файла
|
|
1111
|
-
|
|
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/
|
|
1120
|
-
|
|
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(
|
|
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,
|
|
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
|
-
|
|
1151
|
-
|
|
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,
|
|
1178
|
+
async def delete_event_files(self, event_id: str):
|
|
1171
1179
|
"""
|
|
1172
1180
|
Удаляет ВСЕ файлы события из Supabase Storage
|
|
1173
1181
|
|
|
1174
1182
|
Args:
|
|
1175
|
-
|
|
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(
|
|
1190
|
+
files_list = self.client.storage.from_(bucket_name).list(event_path)
|
|
1182
1191
|
|
|
1183
1192
|
if not files_list:
|
|
1184
|
-
logger.info(f"ℹ️ Нет файлов для удаления в событии '{
|
|
1193
|
+
logger.info(f"ℹ️ Нет файлов для удаления в событии '{event_id}'")
|
|
1185
1194
|
return
|
|
1186
1195
|
|
|
1187
1196
|
# Формируем пути для удаления
|
|
1188
|
-
file_paths = [f"{
|
|
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)} файлов события '{
|
|
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:
|
|
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
|
-
|
|
1245
|
+
event = response.data[0]
|
|
1237
1246
|
|
|
1238
|
-
logger.info(f"💾 Админское событие '{event_name}' сохранено в БД: {
|
|
1239
|
-
return
|
|
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
|
+
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=
|
|
8
|
-
smart_bot_factory/admin/admin_logic.py,sha256=
|
|
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=
|
|
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=
|
|
36
|
-
smart_bot_factory/core/message_sender.py,sha256=
|
|
37
|
-
smart_bot_factory/core/router.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
56
|
-
smart_bot_factory-0.3.
|
|
57
|
-
smart_bot_factory-0.3.
|
|
58
|
-
smart_bot_factory-0.3.
|
|
59
|
-
smart_bot_factory-0.3.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|