From 8c42866f80f72625a368bd135e54317e68509502 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 5 Feb 2026 14:11:44 +0530 Subject: [PATCH] fix: better error handling for telephony --- .../telephony/providers/cloudonix_provider.py | 14 +++++++++----- .../telephony/providers/twilio_provider.py | 5 ++++- api/services/telephony/providers/vobiz_provider.py | 12 +++++++++--- .../telephony/providers/vonage_provider.py | 7 +++++-- pipecat | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/api/services/telephony/providers/cloudonix_provider.py b/api/services/telephony/providers/cloudonix_provider.py index ef2f329d..2b917fb3 100644 --- a/api/services/telephony/providers/cloudonix_provider.py +++ b/api/services/telephony/providers/cloudonix_provider.py @@ -7,6 +7,7 @@ import random from typing import TYPE_CHECKING, Any, Dict, List, Optional import aiohttp +from fastapi import HTTPException from loguru import logger from api.enums import WorkflowRunMode @@ -104,10 +105,12 @@ class CloudonixProvider(TelephonyProvider): "caller-id": from_number, # Required field } + # TODO: Cloudonix status callbacks are spammy, so commenting it out. Can send it to + # some persistent logging system instead of transcational database. # Add status callback if workflow_run_id provided - if workflow_run_id: - callback_url = f"{backend_endpoint}/api/v1/telephony/cloudonix/status-callback/{workflow_run_id}" - data["callback"] = callback_url + # if workflow_run_id: + # callback_url = f"{backend_endpoint}/api/v1/telephony/cloudonix/status-callback/{workflow_run_id}" + # data["callback"] = callback_url # Merge any additional kwargs data.update(kwargs) @@ -153,8 +156,9 @@ class CloudonixProvider(TelephonyProvider): f" Request: POST {endpoint}\n" f" Payload: {json.dumps(data, indent=2)}" ) - raise Exception( - f"Failed to initiate call via Cloudonix (HTTP {response_status}): {response_text}" + raise HTTPException( + status_code=response_status, + detail=f"Failed to initiate call via Cloudonix (HTTP {response_status}): {response_text}", ) response_data = await response.json() diff --git a/api/services/telephony/providers/twilio_provider.py b/api/services/telephony/providers/twilio_provider.py index bd3dab2f..9387964f 100644 --- a/api/services/telephony/providers/twilio_provider.py +++ b/api/services/telephony/providers/twilio_provider.py @@ -7,6 +7,7 @@ import random from typing import TYPE_CHECKING, Any, Dict, List, Optional import aiohttp +from fastapi import HTTPException from loguru import logger from twilio.request_validator import RequestValidator @@ -98,7 +99,9 @@ class TwilioProvider(TelephonyProvider): async with session.post(endpoint, data=data, auth=auth) as response: if response.status != 201: error_data = await response.json() - raise Exception(f"Failed to initiate call: {error_data}") + raise HTTPException( + status_code=response.status, detail=json.dumps(error_data) + ) response_data = await response.json() diff --git a/api/services/telephony/providers/vobiz_provider.py b/api/services/telephony/providers/vobiz_provider.py index 0493e3c3..5b2e5d5b 100644 --- a/api/services/telephony/providers/vobiz_provider.py +++ b/api/services/telephony/providers/vobiz_provider.py @@ -7,6 +7,7 @@ import random from typing import TYPE_CHECKING, Any, Dict, List, Optional import aiohttp +from fastapi import HTTPException from loguru import logger from api.enums import WorkflowRunMode @@ -116,7 +117,10 @@ class VobizProvider(TelephonyProvider): if response.status != 201: error_data = await response.text() logger.error(f"Vobiz API error: {error_data}") - raise Exception(f"Failed to initiate Vobiz call: {error_data}") + raise HTTPException( + status_code=response.status, + detail=f"Failed to initiate Vobiz call: {error_data}", + ) response_data = await response.json() logger.info(f"Vobiz API response: {response_data}") @@ -133,8 +137,10 @@ class VobizProvider(TelephonyProvider): logger.error( f"No call ID found in Vobiz response. Available keys: {list(response_data.keys())}" ) - raise Exception( - f"Vobiz API response missing call identifier. Response: {response_data}" + raise HTTPException( + status_code=response.status, + detail=f"Vobiz API response missing call identifier. Response: {response_data}" + f"Vobiz API response missing call identifier. Response: {response_data}", ) logger.info(f"Vobiz call initiated successfully. Call ID: {call_id}") diff --git a/api/services/telephony/providers/vonage_provider.py b/api/services/telephony/providers/vonage_provider.py index d4d9daf5..24bc9a4b 100644 --- a/api/services/telephony/providers/vonage_provider.py +++ b/api/services/telephony/providers/vonage_provider.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional import aiohttp import jwt -from fastapi import Response +from fastapi import HTTPException, Response from loguru import logger from api.enums import WorkflowRunMode @@ -127,7 +127,10 @@ class VonageProvider(TelephonyProvider): response_data = await response.json() if response.status != 201: - raise Exception(f"Failed to initiate call: {response_data}") + raise HTTPException( + status_code=response.status, + detail=f"Failed to initiate Vonage call: {response_data}", + ) return CallInitiationResult( call_id=response_data["uuid"], diff --git a/pipecat b/pipecat index f999b70f..866bf1c5 160000 --- a/pipecat +++ b/pipecat @@ -1 +1 @@ -Subproject commit f999b70ffb3ba678aec1996f85a69fe13692d067 +Subproject commit 866bf1c5685e7fadf2af012d8769ebbc35297db0