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:
Markov Andrey
2026-06-30 12:43:27 +00:00
parent c82cb17a49
commit 8a2d5ba2ff
4 changed files with 207 additions and 30 deletions

View File

@@ -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-сервер ---