Update 9 files

- /rag/config_models.py
- /rag/utils/config_loader.py
- /rag/auth.py
- /rag/rag_server.py
- /rag/rag_api.py
- /rag/rag_orchestrator.py
- /rag/__init__.py
- /bots/xmpp/client.py
- /bots/rag_client.py
This commit is contained in:
Markov Andrey
2026-06-30 14:27:34 +00:00
parent 068504c988
commit 59feffc190
9 changed files with 180 additions and 179 deletions

View File

@@ -14,6 +14,7 @@ HTTP-клиент для взаимодействия с RAG-сервером.
ДОБАВЛЕНО:
- Метод vision() для распознавания текста на изображениях
- Метод transcribe() для транскрибации аудио
- Аутентификация через API-ключ (заголовок X-API-Key)
"""
import os
@@ -33,6 +34,7 @@ class RAGClient:
def __init__(
self,
server_url: str,
api_key: Optional[str] = None, # <-- добавлен API-ключ
timeout: int = 60,
max_retries: int = 3,
retry_delay: float = 1.0
@@ -42,16 +44,22 @@ class RAGClient:
Аргументы:
server_url (str): базовый URL RAG-сервера (например, http://localhost:8080)
api_key (Optional[str]): API-ключ для аутентификации (передаётся в заголовке X-API-Key)
timeout (int): таймаут на запрос в секундах
max_retries (int): максимальное количество повторных попыток при ошибке
retry_delay (float): базовая задержка между попытками (секунды)
"""
self.server_url = server_url.rstrip('/')
self.api_key = api_key # <-- сохраняем ключ
self.timeout = timeout
self.max_retries = max_retries
self.retry_delay = retry_delay
self._session: Optional[aiohttp.ClientSession] = None
logger.info(f"RAGClient инициализирован с сервером {server_url}, таймаут={timeout}с, макс. попыток={max_retries}")
logger.info(
f"RAGClient инициализирован с сервером {server_url}, "
f"таймаут={timeout}с, макс. попыток={max_retries}, "
f"API-ключ {'задан' if api_key else 'не задан'}"
)
async def _get_session(self) -> aiohttp.ClientSession:
"""
@@ -75,6 +83,7 @@ class RAGClient:
async def _post(self, endpoint: str, payload: Dict[str, Any]) -> Dict[str, Any]:
"""
Внутренний метод для отправки POST-запроса с повторными попытками.
Автоматически добавляет заголовок X-API-Key, если ключ задан.
Аргументы:
endpoint (str): путь эндпоинта (например, '/rag/query')
@@ -90,12 +99,17 @@ class RAGClient:
url = f"{self.server_url}{endpoint}"
session = await self._get_session()
# Подготавливаем заголовки
headers = {}
if self.api_key:
headers['X-API-Key'] = self.api_key
last_exception = None
for attempt in range(self.max_retries):
try:
logger.debug(f"Попытка {attempt + 1}/{self.max_retries} к {endpoint}")
async with session.post(url, json=payload) as resp:
async with session.post(url, json=payload, headers=headers) as resp:
if resp.status == 200:
return await resp.json()
else:
@@ -190,7 +204,10 @@ class RAGClient:
"""
try:
session = await self._get_session()
async with session.get(f"{self.server_url}/health", timeout=10) as resp:
headers = {}
if self.api_key:
headers['X-API-Key'] = self.api_key
async with session.get(f"{self.server_url}/health", timeout=10, headers=headers) as resp:
if resp.status == 200:
data = await resp.json()
if data.get('status') == 'healthy':
@@ -308,10 +325,15 @@ class RAGClient:
session = await self._get_session()
url = f"{self.server_url}/rag/vision"
# Добавляем заголовок с ключом
headers = {}
if self.api_key:
headers['X-API-Key'] = self.api_key
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:
async with session.post(url, data=files, headers=headers) as resp:
if resp.status == 200:
return await resp.json()
else:
@@ -338,10 +360,14 @@ class RAGClient:
session = await self._get_session()
url = f"{self.server_url}/rag/transcribe"
headers = {}
if self.api_key:
headers['X-API-Key'] = self.api_key
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:
async with session.post(url, data=files, headers=headers) as resp:
if resp.status == 200:
return await resp.json()
else: