This commit is contained in:
Petr
2026-09-02 17:38:24 +05:00
parent 42df024940
commit d871f1fe32
+23 -13
View File
@@ -9,6 +9,7 @@ from apiApp.database import get_db
from apiApp.database.Audio import Audio from apiApp.database.Audio import Audio
from apiApp.database.AiConclusion import AiConclusion from apiApp.database.AiConclusion import AiConclusion
from datetime import datetime from datetime import datetime
import time
import logging import logging
import requests import requests
from apiApp.config import WEBHOOK_ENDPOINT, WEBHOOK_API_KEY, CALLS_WEB_CLIENT_URL from apiApp.config import WEBHOOK_ENDPOINT, WEBHOOK_API_KEY, CALLS_WEB_CLIENT_URL
@@ -168,8 +169,7 @@ async def save_ai_conclusion(request: AiConclusionRequest, db: Session = Depends
if (audio.sourse or "").lower() == "external" and request.callback_url: if (audio.sourse or "").lower() == "external" and request.callback_url:
_send_callback(request.callback_url, audio, conclusion_data) _send_callback(request.callback_url, audio, conclusion_data)
# Отправляем webhook в Calls_WEB_Client_main для анализа # Отправляем webhook в Calls_WEB_Client_main для анализа (с retry при перезагрузке контейнера)
try:
if (audio.sourse or "").lower() != "external": if (audio.sourse or "").lower() != "external":
logger.info(f"📤 Отправка webhook в Calls_WEB_Client_main для {request.filename}") logger.info(f"📤 Отправка webhook в Calls_WEB_Client_main для {request.filename}")
@@ -182,25 +182,35 @@ async def save_ai_conclusion(request: AiConclusionRequest, db: Session = Depends
"processing_time_seconds": request.processing_time_seconds "processing_time_seconds": request.processing_time_seconds
} }
max_retries = 5
delays = [2, 4, 8, 15, 30]
delivered = False
for attempt in range(1, max_retries + 1):
try:
webhook_response = requests.post( webhook_response = requests.post(
WEBHOOK_ENDPOINT, WEBHOOK_ENDPOINT,
json=webhook_payload, json=webhook_payload,
headers={"X-Webhook-Key": WEBHOOK_API_KEY}, headers={"X-Webhook-Key": WEBHOOK_API_KEY},
timeout=30 timeout=30
) )
if webhook_response.status_code in (200, 201):
if webhook_response.status_code == 200: logger.info(f"✅ Webhook успешно отправлен для {request.filename} (попытка {attempt}/{max_retries})")
logger.info(f"✅ Webhook успешно отправлен для {request.filename}") delivered = True
break
else: else:
logger.warning(f"⚠️ Webhook вернул статус {webhook_response.status_code}") logger.warning(f"⚠️ Webhook вернул статус {webhook_response.status_code} (попытка {attempt}/{max_retries})")
logger.warning(f"Response: {webhook_response.text}") logger.warning(f"Response: {webhook_response.text[:200]}")
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
except requests.exceptions.ConnectionError: logger.warning(f"⏳ Calls_WEB_Client_main временно недоступен ({type(e).__name__}), попытка {attempt}/{max_retries}...")
logger.error(f"❌ Не удалось подключиться к Calls_WEB_Client_main webhook: {WEBHOOK_ENDPOINT}")
except requests.exceptions.Timeout:
logger.warning(f"⚠️ Таймаут при отправке webhook для {request.filename}")
except Exception as e: except Exception as e:
logger.error(f"Ошибка при отправке webhook: {e}") logger.error(f"Непредвиденная ошибка при отправке webhook (попытка {attempt}): {e}")
if attempt < max_retries:
time.sleep(delays[attempt - 1])
if not delivered:
logger.error(f"❌ Не удалось доставить webhook для {request.filename} после {max_retries} попыток")
return AiConclusionResponse( return AiConclusionResponse(
success=True, success=True,