This commit is contained in:
Petr
2026-09-02 17:38:24 +05:00
parent 42df024940
commit d871f1fe32
+39 -29
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,39 +169,48 @@ 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}")
webhook_payload = { webhook_payload = {
"audio_id": str(audio.id), "audio_id": str(audio.id),
"filename": request.filename, "filename": request.filename,
"transcription": request.transcription, "transcription": request.transcription,
"corrected_transcription": request.corrected_transcription, "corrected_transcription": request.corrected_transcription,
"segments": request.segments, "segments": request.segments,
"processing_time_seconds": request.processing_time_seconds "processing_time_seconds": request.processing_time_seconds
} }
webhook_response = requests.post( max_retries = 5
WEBHOOK_ENDPOINT, delays = [2, 4, 8, 15, 30]
json=webhook_payload, delivered = False
headers={"X-Webhook-Key": WEBHOOK_API_KEY},
timeout=30
)
if webhook_response.status_code == 200: for attempt in range(1, max_retries + 1):
logger.info(f"✅ Webhook успешно отправлен для {request.filename}") try:
else: webhook_response = requests.post(
logger.warning(f"⚠️ Webhook вернул статус {webhook_response.status_code}") WEBHOOK_ENDPOINT,
logger.warning(f"Response: {webhook_response.text}") json=webhook_payload,
headers={"X-Webhook-Key": WEBHOOK_API_KEY},
timeout=30
)
if webhook_response.status_code in (200, 201):
logger.info(f"✅ Webhook успешно отправлен для {request.filename} (попытка {attempt}/{max_retries})")
delivered = True
break
else:
logger.warning(f"⚠️ Webhook вернул статус {webhook_response.status_code} (попытка {attempt}/{max_retries})")
logger.warning(f"Response: {webhook_response.text[:200]}")
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
logger.warning(f"⏳ Calls_WEB_Client_main временно недоступен ({type(e).__name__}), попытка {attempt}/{max_retries}...")
except Exception as e:
logger.error(f"❌ Непредвиденная ошибка при отправке webhook (попытка {attempt}): {e}")
except requests.exceptions.ConnectionError: if attempt < max_retries:
logger.error(f"❌ Не удалось подключиться к Calls_WEB_Client_main webhook: {WEBHOOK_ENDPOINT}") time.sleep(delays[attempt - 1])
except requests.exceptions.Timeout:
logger.warning(f"⚠️ Таймаут при отправке webhook для {request.filename}") if not delivered:
except Exception as e: logger.error(f"❌ Не удалось доставить webhook для {request.filename} после {max_retries} попыток")
logger.error(f"❌ Ошибка при отправке webhook: {e}")
return AiConclusionResponse( return AiConclusionResponse(
success=True, success=True,