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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user