Update 4 files
- /rag/rag_server.py - /bots/rag_client.py - /bots/workers/indexing_worker.py - /bots/handlers/file_handler.py
This commit is contained in:
@@ -6,6 +6,10 @@
|
||||
- Для файлов: извлечение текста, обработка изображений/аудио, индексация через HTTP-запрос.
|
||||
|
||||
Все операции с БД и Qdrant выполняются на сервере. Воркер только отправляет данные.
|
||||
|
||||
ДОБАВЛЕНО:
|
||||
- Обработка изображений через RAG-сервер (OCR)
|
||||
- Обработка аудио через RAG-сервер (транскрибация)
|
||||
"""
|
||||
|
||||
import asyncio
|
||||
@@ -149,7 +153,7 @@ class IndexingWorker:
|
||||
"""
|
||||
Обрабатывает задачу с файлом:
|
||||
1. Извлекает текст (синхронно в потоке).
|
||||
2. Обрабатывает изображения/аудио (Vision/распознавание) – если есть.
|
||||
2. Обрабатывает изображения/аудио (Vision/распознавание) – через RAG-сервер.
|
||||
3. Сохраняет постоянную копию в data/ (локально, для истории и отладки).
|
||||
4. Отправляет текст и метаданные на RAG-сервер для индексации.
|
||||
5. Удаляет временный файл.
|
||||
@@ -210,40 +214,40 @@ class IndexingWorker:
|
||||
key = (user_jid, room_jid) if room_jid is not None else user_jid
|
||||
self.bot._last_file_path[key] = str(dest_path)
|
||||
|
||||
# --- 3. Специальная обработка: изображения (Vision API) ---
|
||||
# Если это изображение и включена опция vision, отправляем на анализ.
|
||||
# Это можно делать отдельно, не блокируя индексацию.
|
||||
# --- 3. Специальная обработка: изображения (OCR через RAG-сервер) ---
|
||||
if ext in ('.jpg', '.jpeg', '.png', '.bmp', '.tiff') and self.bot.config.vision:
|
||||
file_id = await self.bot.giga.upload_file(file_path) # giga всё ещё локально? нужно будет перенести и это.
|
||||
# Это временно, пока мы не вынесли всё на сервер. Пока оставим как есть.
|
||||
if file_id:
|
||||
answer = await self.bot.giga.chat(
|
||||
history=[],
|
||||
query="Проанализируй это изображение. Если есть текст – прочитай его.",
|
||||
system_prompt=None,
|
||||
file_id=file_id,
|
||||
temperature=self.bot.config.ai_temperature
|
||||
result = await self.bot.rag_client.vision(file_path)
|
||||
if result.get('text'):
|
||||
await self._send_message(
|
||||
user_jid,
|
||||
f"🖼️ **Текст на изображении:**\n{result['text']}",
|
||||
room_jid
|
||||
)
|
||||
await self._send_message(user_jid, answer, room_jid)
|
||||
else:
|
||||
await self._send_message(user_jid, "⚠️ Не удалось передать изображение в GigaChat.", room_jid)
|
||||
# После обработки изображения мы не индексируем его как документ (обычно OCR делает это),
|
||||
# но можно и проиндексировать текст. Здесь мы просто возвращаемся.
|
||||
error = result.get('error', 'неизвестная ошибка')
|
||||
await self._send_message(
|
||||
user_jid,
|
||||
f"⚠️ Не удалось распознать текст: {error}",
|
||||
room_jid
|
||||
)
|
||||
return
|
||||
|
||||
# --- 4. Специальная обработка: аудио (голос → текст) ---
|
||||
# Аналогично, используем локальный SaluteSpeech, пока не вынесли.
|
||||
# --- 4. Специальная обработка: аудио (транскрибация через RAG-сервер) ---
|
||||
if ext in ('.ogg', '.wav', '.mp3', '.amr', '.m4a') and self.bot.config.voice_recognition:
|
||||
first_text = files_list[0][1] if files_list else ""
|
||||
if "--- РАСПОЗНАННЫЙ ГОЛОС ---" in first_text:
|
||||
voice_text = first_text.split("--- РАСПОЗНАННЫЙ ГОЛОС ---")[1].strip()
|
||||
await self._send_message(user_jid, f"🎤 Распознано: {voice_text}", room_jid)
|
||||
# Можно также ответить на голос, но это отдельный сценарий.
|
||||
# Мы не индексируем аудио как документ (разве что текст распознавания).
|
||||
# Если хотим индексировать текст голоса, нужно передать его как документ.
|
||||
# Например, можно создать виртуальный документ с текстом.
|
||||
result = await self.bot.rag_client.transcribe(file_path)
|
||||
if result.get('text'):
|
||||
await self._send_message(
|
||||
user_jid,
|
||||
f"🎤 **Распознано:**\n{result['text']}",
|
||||
room_jid
|
||||
)
|
||||
else:
|
||||
await self._send_message(user_jid, f"⚠️ {first_text}", room_jid)
|
||||
error = result.get('error', 'неизвестная ошибка')
|
||||
await self._send_message(
|
||||
user_jid,
|
||||
f"⚠️ Не удалось распознать речь: {error}",
|
||||
room_jid
|
||||
)
|
||||
return
|
||||
|
||||
# --- 5. Индексация документов через RAG-сервер ---
|
||||
|
||||
Reference in New Issue
Block a user