Review of services (AsyncGenerator, Fatal=True)

This commit is contained in:
Mark Backman
2025-11-26 12:15:23 -05:00
parent 54ff49c4fc
commit b57a9d2546
10 changed files with 17 additions and 21 deletions

View File

@@ -472,7 +472,7 @@ class AsyncAIHttpTTSService(TTSService):
async with self._session.post(url, json=payload, headers=headers) as response:
if response.status != 200:
error_text = await response.text()
await self.push_error(error_msg=f"Async API error: {error_text}")
yield ErrorFrame(error=f"Async API error: {error_text}")
raise Exception(f"Async API returned status {response.status}: {error_text}")
audio_data = await response.read()
@@ -488,7 +488,7 @@ class AsyncAIHttpTTSService(TTSService):
yield frame
except Exception as e:
await self.push_error(exception=e)
yield ErrorFrame(error=f"{self} error: {e}")
finally:
await self.stop_ttfb_metrics()
yield TTSStoppedFrame()

View File

@@ -703,7 +703,7 @@ class CartesiaHttpTTSService(TTSService):
async with session.post(url, json=payload, headers=headers) as response:
if response.status != 200:
error_text = await response.text()
await self.push_error(error_msg=f"Cartesia API error: {error_text}")
yield ErrorFrame(error=f"Cartesia API error: {error_text}")
raise Exception(f"Cartesia API returned status {response.status}: {error_text}")
audio_data = await response.read()
@@ -719,7 +719,7 @@ class CartesiaHttpTTSService(TTSService):
yield frame
except Exception as e:
await self.push_error(exception=e)
yield ErrorFrame(error=f"{self} error: {e}")
finally:
await self.stop_ttfb_metrics()
yield TTSStoppedFrame()

View File

@@ -630,8 +630,7 @@ class GladiaSTTService(STTService):
self._reconnection_attempts += 1
if self._reconnection_attempts > self._max_reconnection_attempts:
await self.push_error(
error_msg=f"Max reconnection attempts ({self._max_reconnection_attempts}) reached",
fatal=True,
error_msg=f"Max reconnection attempts ({self._max_reconnection_attempts}) reached"
)
self._should_reconnect = False
return False

View File

@@ -1255,7 +1255,7 @@ class GeminiLiveLLMService(LLMService):
f"Max consecutive failures ({MAX_CONSECUTIVE_FAILURES}) reached, "
"treating as fatal error"
)
await self.push_error(error_msg=error_msg, exception=error, fatal=True)
await self.push_error(error_msg=error_msg, exception=error)
return False
else:
logger.info(
@@ -1742,7 +1742,7 @@ class GeminiLiveLLMService(LLMService):
# state management, and that exponential backoff for retries can have
# cost/stability implications for a service cluster, let's just treat a
# send-side error as fatal.
await self.push_error(ErrorFrame(error=f"{self} Send error: {error}", fatal=True))
await self.push_error(ErrorFrame(error=f"{self} Send error: {error}"))
def create_context_aggregator(
self,

View File

@@ -995,7 +995,7 @@ class GoogleTTSService(GoogleBaseTTSService):
yield frame
except Exception as e:
await self.push_error(exception=e)
yield ErrorFrame(error=f"{self} error: {e}")
class GeminiTTSService(GoogleBaseTTSService):

View File

@@ -287,7 +287,7 @@ class HumeTTSService(WordTTSService):
self._cumulative_time = utterance_duration
except Exception as e:
await self.push_error(exception=e)
yield ErrorFrame(error=f"{self} error: {e}")
finally:
# Ensure TTFB timer is stopped even on early failures
await self.stop_ttfb_metrics()

View File

@@ -337,7 +337,7 @@ class MiniMaxHttpTTSService(TTSService):
continue
except Exception as e:
await self.push_error(exception=e)
yield ErrorFrame(error=f"{self} error: {e}")
finally:
await self.stop_ttfb_metrics()
yield TTSStoppedFrame()

View File

@@ -275,7 +275,7 @@ class SarvamSTTService(STTService):
await self._socket_client.translate(**method_kwargs)
except Exception as e:
await self.push_error(error_msg=f"Error sending audio to Sarvam: {e}", exception=e)
yield ErrorFrame(error=f"{self} error: {e}")
yield None

View File

@@ -254,7 +254,7 @@ class SarvamHttpTTSService(TTSService):
async with self._session.post(url, json=payload, headers=headers) as response:
if response.status != 200:
error_text = await response.text()
await self.push_error(error_msg=f"Sarvam API error: {error_text}")
yield ErrorFrame(error=f"Sarvam API error: {error_text}")
return
response_data = await response.json()
@@ -263,7 +263,7 @@ class SarvamHttpTTSService(TTSService):
# Decode base64 audio data
if "audios" not in response_data or not response_data["audios"]:
await self.push_error(error_msg="No audio data received")
yield ErrorFrame(error="No audio data received")
return
# Get the first audio (there should be only one for single text input)
@@ -284,7 +284,7 @@ class SarvamHttpTTSService(TTSService):
yield frame
except Exception as e:
await self.push_error(error_msg=f"Error generating TTS: {e}", exception=e)
yield ErrorFrame(error=f"{self} error: {e}")
finally:
await self.stop_ttfb_metrics()
yield TTSStoppedFrame()

View File

@@ -174,16 +174,13 @@ class SpeechmaticsTTSService(TTSService):
except (ValueError, ArithmeticError):
yield ErrorFrame(
error=f"{self} Service unavailable [503] (attempts {attempt})",
fatal=True,
error=f"{self} Service unavailable [503] (attempts {attempt})"
)
return
# != 200 : Error
if response.status != 200:
yield ErrorFrame(
error=f"{self} Service unavailable [{response.status}]", fatal=True
)
yield ErrorFrame(error=f"{self} Service unavailable [{response.status}]")
return
# Update Pipecat metrics
@@ -225,7 +222,7 @@ class SpeechmaticsTTSService(TTSService):
break
except Exception as e:
yield ErrorFrame(error=f"{self}: Error generating TTS: {e}", fatal=True)
yield ErrorFrame(error=f"{self}: Error generating TTS: {e}")
finally:
# Emit the TTS stopped frame
yield TTSStoppedFrame()