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

@@ -10,8 +10,13 @@ HTTP-клиент для взаимодействия с RAG-сервером.
ИСТОРИЯ НЕ ПЕРЕДАЁТСЯ сервер получает её из БД.
Улучшена обработка сетевых ошибок с повторными попытками.
ДОБАВЛЕНО:
- Метод vision() для распознавания текста на изображениях
- Метод transcribe() для транскрибации аудио
"""
import os
import logging
from typing import Optional, Dict, List, Any
import aiohttp
@@ -281,4 +286,68 @@ class RAGClient:
return result
except Exception as e:
logger.error(f"Ошибка в RAGClient.index_document: {e}", exc_info=True)
return {"doc_id": None, "chunk_count": 0, "error": str(e)}
return {"doc_id": None, "chunk_count": 0, "error": str(e)}
# ==========================================================
# НОВЫЕ МЕТОДЫ: OCR и транскрибация
# ==========================================================
async def vision(self, file_path: str) -> Dict[str, Any]:
"""
Отправляет изображение на RAG-сервер для распознавания текста (OCR).
Аргументы:
file_path: путь к файлу изображения
Возвращает:
Dict с ключами: text (str), status (str), error (опционально)
"""
if not os.path.exists(file_path):
return {"text": "", "status": "file_not_found", "error": "Файл не найден"}
session = await self._get_session()
url = f"{self.server_url}/rag/vision"
try:
with open(file_path, 'rb') as f:
files = {'file': (os.path.basename(file_path), f, 'image/jpeg')}
async with session.post(url, data=files) as resp:
if resp.status == 200:
return await resp.json()
else:
error_text = await resp.text()
logger.error(f"OCR ошибка: {resp.status} - {error_text[:200]}")
return {"text": "", "status": "error", "error": error_text}
except Exception as e:
logger.error(f"Ошибка вызова OCR: {e}", exc_info=True)
return {"text": "", "status": "error", "error": str(e)}
async def transcribe(self, file_path: str) -> Dict[str, Any]:
"""
Отправляет аудиофайл на RAG-сервер для транскрибации (SaluteSpeech).
Аргументы:
file_path: путь к аудиофайлу
Возвращает:
Dict с ключами: text (str), status (str), error (опционально)
"""
if not os.path.exists(file_path):
return {"text": "", "status": "file_not_found", "error": "Файл не найден"}
session = await self._get_session()
url = f"{self.server_url}/rag/transcribe"
try:
with open(file_path, 'rb') as f:
files = {'file': (os.path.basename(file_path), f, 'audio/ogg')}
async with session.post(url, data=files) as resp:
if resp.status == 200:
return await resp.json()
else:
error_text = await resp.text()
logger.error(f"Транскрибация ошибка: {resp.status} - {error_text[:200]}")
return {"text": "", "status": "error", "error": error_text}
except Exception as e:
logger.error(f"Ошибка вызова транскрибации: {e}", exc_info=True)
return {"text": "", "status": "error", "error": str(e)}