Update file indexing_worker.py
This commit is contained in:
@@ -8,8 +8,8 @@
|
|||||||
Все операции с БД и Qdrant выполняются на сервере. Воркер только отправляет данные.
|
Все операции с БД и Qdrant выполняются на сервере. Воркер только отправляет данные.
|
||||||
|
|
||||||
ДОБАВЛЕНО:
|
ДОБАВЛЕНО:
|
||||||
- Обработка изображений через RAG-сервер (OCR)
|
- Уведомления пользователя об ошибках индексации.
|
||||||
- Обработка аудио через RAG-сервер (транскрибация)
|
- Обработка ошибок с отправкой сообщений в чат.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
@@ -48,6 +48,15 @@ class IndexingWorker:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.exception(f"Ошибка в воркере при обработке задачи: {e}")
|
logger.exception(f"Ошибка в воркере при обработке задачи: {e}")
|
||||||
self.bot.metrics_handler.increment("errors_total")
|
self.bot.metrics_handler.increment("errors_total")
|
||||||
|
# Отправляем уведомление пользователю о критической ошибке
|
||||||
|
user_jid = task.get("user_jid")
|
||||||
|
room_jid = task.get("room_jid")
|
||||||
|
if user_jid:
|
||||||
|
await self._send_message(
|
||||||
|
user_jid,
|
||||||
|
f"❌ Критическая ошибка при обработке задачи: {e}",
|
||||||
|
room_jid
|
||||||
|
)
|
||||||
finally:
|
finally:
|
||||||
self.bot.indexing_queue.task_done()
|
self.bot.indexing_queue.task_done()
|
||||||
|
|
||||||
@@ -83,10 +92,10 @@ class IndexingWorker:
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
total = 0
|
total = 0
|
||||||
|
errors = []
|
||||||
for page_url, page_title, page_text in pages:
|
for page_url, page_title, page_text in pages:
|
||||||
if page_text:
|
if page_text:
|
||||||
doc_title = custom_title if custom_title else (page_title if page_title else page_url)
|
doc_title = custom_title if custom_title else (page_title if page_title else page_url)
|
||||||
# Отправляем на сервер для индексации
|
|
||||||
result = await self.bot.rag_client.index_document(
|
result = await self.bot.rag_client.index_document(
|
||||||
file_name=page_url,
|
file_name=page_url,
|
||||||
file_text=page_text,
|
file_text=page_text,
|
||||||
@@ -99,7 +108,17 @@ class IndexingWorker:
|
|||||||
if result.get('doc_id'):
|
if result.get('doc_id'):
|
||||||
total += 1
|
total += 1
|
||||||
else:
|
else:
|
||||||
logger.error(f"Ошибка индексации {page_url}: {result.get('error')}")
|
error_msg = result.get('error', 'неизвестная ошибка')
|
||||||
|
errors.append(f"{page_url}: {error_msg}")
|
||||||
|
logger.error(f"Ошибка индексации {page_url}: {error_msg}")
|
||||||
|
# Отправляем итоговое сообщение
|
||||||
|
if errors:
|
||||||
|
await self._send_message(
|
||||||
|
user_jid,
|
||||||
|
f"⚠️ Проиндексировано {total} страниц, ошибок: {len(errors)}. Первая ошибка: {errors[0]}",
|
||||||
|
room_jid
|
||||||
|
)
|
||||||
|
else:
|
||||||
await self._send_message(
|
await self._send_message(
|
||||||
user_jid,
|
user_jid,
|
||||||
f"✅ Проиндексировано {total} страниц (рекурсивно).",
|
f"✅ Проиндексировано {total} страниц (рекурсивно).",
|
||||||
@@ -126,9 +145,10 @@ class IndexingWorker:
|
|||||||
room_jid
|
room_jid
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
error_msg = result.get('error', 'неизвестная ошибка')
|
||||||
await self._send_message(
|
await self._send_message(
|
||||||
user_jid,
|
user_jid,
|
||||||
f"❌ Ошибка индексации {url}: {result.get('error')}",
|
f"❌ Ошибка индексации {url}: {error_msg}",
|
||||||
room_jid
|
room_jid
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@@ -195,8 +215,6 @@ class IndexingWorker:
|
|||||||
self.bot.last_file_texts[user_jid] = full_text
|
self.bot.last_file_texts[user_jid] = full_text
|
||||||
|
|
||||||
# --- 2. Сохранение постоянной копии в data/ (локально) ---
|
# --- 2. Сохранение постоянной копии в data/ (локально) ---
|
||||||
# Это нужно для команд !summary и хирургической замены, которые работают с файлом локально.
|
|
||||||
# В будущем можно перенести и их на сервер, но пока оставляем.
|
|
||||||
with open(file_path, 'rb') as f:
|
with open(file_path, 'rb') as f:
|
||||||
file_hash = hashlib.sha256(f.read()).hexdigest()
|
file_hash = hashlib.sha256(f.read()).hexdigest()
|
||||||
short_hash = file_hash[:12]
|
short_hash = file_hash[:12]
|
||||||
@@ -251,9 +269,9 @@ class IndexingWorker:
|
|||||||
return
|
return
|
||||||
|
|
||||||
# --- 5. Индексация документов через RAG-сервер ---
|
# --- 5. Индексация документов через RAG-сервер ---
|
||||||
# Отправляем на сервер каждый извлечённый файл (включая вложенные из архивов)
|
|
||||||
if mode in ('personal', 'global') or (mode == 'room' and room_jid):
|
if mode in ('personal', 'global') or (mode == 'room' and room_jid):
|
||||||
saved = 0
|
saved = 0
|
||||||
|
errors = []
|
||||||
for sub_name, sub_text in files_list:
|
for sub_name, sub_text in files_list:
|
||||||
if sub_text:
|
if sub_text:
|
||||||
result = await self.bot.rag_client.index_document(
|
result = await self.bot.rag_client.index_document(
|
||||||
@@ -263,29 +281,41 @@ class IndexingWorker:
|
|||||||
room_jid=room_jid,
|
room_jid=room_jid,
|
||||||
is_global=is_global,
|
is_global=is_global,
|
||||||
title=title,
|
title=title,
|
||||||
# file_hash=file_hash, # можно передать, если нужно
|
|
||||||
update_if_exists=True
|
update_if_exists=True
|
||||||
)
|
)
|
||||||
if result.get('doc_id'):
|
if result.get('doc_id'):
|
||||||
saved += 1
|
saved += 1
|
||||||
else:
|
else:
|
||||||
logger.error(f"Ошибка индексации {sub_name}: {result.get('error')}")
|
error_msg = result.get('error', 'неизвестная ошибка')
|
||||||
if saved:
|
errors.append(f"{sub_name}: {error_msg}")
|
||||||
|
logger.error(f"Ошибка индексации {sub_name}: {error_msg}")
|
||||||
|
|
||||||
|
if saved > 0:
|
||||||
if room_jid:
|
if room_jid:
|
||||||
scope = f"комнату {room_jid}"
|
scope = f"комнату {room_jid}"
|
||||||
elif is_global:
|
elif is_global:
|
||||||
scope = "глобальную"
|
scope = "глобальную"
|
||||||
else:
|
else:
|
||||||
scope = "личную"
|
scope = "личную"
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
await self._send_message(
|
||||||
|
user_jid,
|
||||||
|
f"🎓 {saved} файлов добавлено в {scope} БЗ, но возникли ошибки: {errors[0]}",
|
||||||
|
room_jid
|
||||||
|
)
|
||||||
|
else:
|
||||||
await self._send_message(
|
await self._send_message(
|
||||||
user_jid,
|
user_jid,
|
||||||
f"🎓 {saved} файлов добавлено в {scope} БЗ.",
|
f"🎓 {saved} файлов добавлено в {scope} БЗ.",
|
||||||
room_jid
|
room_jid
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
# Если ни один файл не проиндексирован
|
||||||
|
error_summary = "; ".join(errors[:3]) # покажем первые 3 ошибки
|
||||||
await self._send_message(
|
await self._send_message(
|
||||||
user_jid,
|
user_jid,
|
||||||
f"⚠️ Не удалось проиндексировать {original_fname}. Проверьте логи.",
|
f"⚠️ Не удалось проиндексировать {original_fname}. Ошибки: {error_summary}",
|
||||||
room_jid
|
room_jid
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
@@ -301,11 +331,11 @@ class IndexingWorker:
|
|||||||
self.bot.metrics_handler.increment("errors_total")
|
self.bot.metrics_handler.increment("errors_total")
|
||||||
await self._send_message(
|
await self._send_message(
|
||||||
user_jid,
|
user_jid,
|
||||||
f"❌ Ошибка при обработке файла '{original_fname}'. Проверьте логи.",
|
f"❌ Ошибка при обработке файла '{original_fname}': {e}",
|
||||||
room_jid
|
room_jid
|
||||||
)
|
)
|
||||||
finally:
|
finally:
|
||||||
# Удаляем временный файл (постоянная копия уже сохранена)
|
# Удаляем временный файл
|
||||||
try:
|
try:
|
||||||
if os.path.exists(file_path):
|
if os.path.exists(file_path):
|
||||||
os.unlink(file_path)
|
os.unlink(file_path)
|
||||||
|
|||||||
Reference in New Issue
Block a user