Make clearer the distinction between "storage-mode" and "delta-mode" usage of *Settings objects

- Storage mode: for use in `self._settings`. All fields should be specified, i.e. should not be `NOT_GIVEN`.
- Delta mode: for use in `*UpdateSettingsFrame`.

In service of this, this commit:
- Adds a runtime check that all fields are specified in storage mode
- Updates all services to specify all fields in stored settings
- Updates all services to no longer check for `is_given` in stored settings (not necessary anymore)
- Updates relevant docstrings
- Renames `update` to `delta` in `*UpdateSettingsFrame`
- Updates community integrations guide
This commit is contained in:
Paul Kompfner
2026-02-24 10:52:05 -05:00
parent 57d25c564c
commit bcc2b4def4
145 changed files with 732 additions and 587 deletions

View File

@@ -260,9 +260,11 @@ class MySTTService(STTService):
_settings: MySTTSettings
def __init__(self, *, model: str, region: str, **kwargs):
def __init__(self, *, model: str, language: str, region: str, **kwargs):
super().__init__(**kwargs)
self._settings = MySTTSettings(model=model, region=region)
# Initial value must be provided for every field in self._settings
# before service is started
self._settings = MySTTSettings(model=model, language=language, region=region)
self._sync_model_name_to_metrics()
```
@@ -298,7 +300,7 @@ async def _update_settings(self, update: STTSettings) -> dict[str, Any]:
if "language" in changed:
await self._update_language()
else:
# TODO: handle changes to other settings soon!
# TODO: this should be temporary - handle changes to other settings soon!
self._warn_unhandled_updated_settings(changed.keys() - {"language"})
return changed

View File

@@ -12,7 +12,7 @@
```python
await task.queue_frame(
STTUpdateSettingsFrame(update=DeepgramSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=DeepgramSTTSettings(language=Language.ES))
)
```

View File

@@ -1 +1 @@
- Dict-based `*UpdateSettingsFrame(settings={...})` is deprecated in favor of passing typed settings delta objects with `*UpdateSettingsFrame(update={...})`.
- Dict-based `*UpdateSettingsFrame(settings={...})` is deprecated in favor of passing typed settings delta objects with `*UpdateSettingsFrame(delta={...})`.

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Deepgram Flux STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=DeepgramFluxSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=DeepgramFluxSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -109,7 +109,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Deepgram SageMaker STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=DeepgramSageMakerSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=DeepgramSageMakerSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Deepgram STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=DeepgramSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=DeepgramSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -105,9 +105,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Azure STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=AzureSTTSettings(language=Language.ES))
)
await task.queue_frame(STTUpdateSettingsFrame(delta=AzureSTTSettings(language=Language.ES)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Google STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=GoogleSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=GoogleSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating AssemblyAI STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=AssemblyAISTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=AssemblyAISTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Gladia STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=GladiaSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=GladiaSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -106,7 +106,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating ElevenLabs Realtime STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=ElevenLabsRealtimeSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=ElevenLabsRealtimeSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -108,7 +108,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating ElevenLabs STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=ElevenLabsSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=ElevenLabsSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -110,13 +110,13 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Speechmatics STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=SpeechmaticsSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=SpeechmaticsSTTSettings(language=Language.ES))
)
await asyncio.sleep(10)
logger.info("Updating Speechmatics STT settings: focus_speakers=['S1']")
await task.queue_frame(
STTUpdateSettingsFrame(update=SpeechmaticsSTTSettings(focus_speakers=["S1"]))
STTUpdateSettingsFrame(delta=SpeechmaticsSTTSettings(focus_speakers=["S1"]))
)
await asyncio.sleep(10)
@@ -125,7 +125,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
)
await task.queue_frame(
STTUpdateSettingsFrame(
update=SpeechmaticsSTTSettings(
delta=SpeechmaticsSTTSettings(
speaker_active_format="<SPEAKER_{speaker_id}>{text}</SPEAKER_{speaker_id}>"
)
)

View File

@@ -108,7 +108,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating OpenAI STT settings: language="es"')
await task.queue_frame(STTUpdateSettingsFrame(update=BaseWhisperSTTSettings(language="es")))
await task.queue_frame(STTUpdateSettingsFrame(delta=BaseWhisperSTTSettings(language="es")))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Sarvam STT settings: language=en-IN")
await task.queue_frame(
STTUpdateSettingsFrame(update=SarvamSTTSettings(language=Language.EN_IN))
STTUpdateSettingsFrame(delta=SarvamSTTSettings(language=Language.EN_IN))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Soniox STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=SonioxSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=SonioxSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating AWS Transcribe STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=AWSTranscribeSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=AWSTranscribeSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Cartesia STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=CartesiaSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=CartesiaSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -107,7 +107,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info("Updating Cartesia HTTP TTS settings: speed increased to 1.5")
await task.queue_frame(
TTSUpdateSettingsFrame(
update=CartesiaTTSSettings(generation_config=GenerationConfig(speed=1.5))
delta=CartesiaTTSSettings(generation_config=GenerationConfig(speed=1.5))
)
)

View File

@@ -106,7 +106,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info("Updating Cartesia TTS settings: speed increased to 1.5")
await task.queue_frame(
TTSUpdateSettingsFrame(
update=CartesiaTTSSettings(generation_config=GenerationConfig(speed=1.5))
delta=CartesiaTTSSettings(generation_config=GenerationConfig(speed=1.5))
)
)

View File

@@ -107,7 +107,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating ElevenLabs TTS settings: speed=0.7")
await task.queue_frame(
TTSUpdateSettingsFrame(update=ElevenLabsHttpTTSSettings(speed=0.7))
TTSUpdateSettingsFrame(delta=ElevenLabsHttpTTSSettings(speed=0.7))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -102,13 +102,13 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating ElevenLabs TTS settings: speed=0.7")
await task.queue_frame(TTSUpdateSettingsFrame(update=ElevenLabsTTSSettings(speed=0.7)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=ElevenLabsTTSSettings(speed=0.7)))
await asyncio.sleep(10)
logger.info("Updating ElevenLabs TTS settings: switching to a different voice")
await task.queue_frame(
TTSUpdateSettingsFrame(
update=ElevenLabsTTSSettings(voice=os.getenv("ELEVENLABS_VOICE_ID_ALT"))
delta=ElevenLabsTTSSettings(voice=os.getenv("ELEVENLABS_VOICE_ID_ALT"))
)
)

View File

@@ -99,7 +99,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating OpenAI TTS settings: speed=2.0")
await task.queue_frame(TTSUpdateSettingsFrame(update=OpenAITTSSettings(speed=2.0)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=OpenAITTSSettings(speed=2.0)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -106,13 +106,13 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Deepgram TTS settings: voice="aura-2-aries-en"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=DeepgramTTSSettings(voice="aura-2-aries-en"))
TTSUpdateSettingsFrame(delta=DeepgramTTSSettings(voice="aura-2-aries-en"))
)
await asyncio.sleep(10)
logger.info('Updating Deepgram TTS settings: voice="aura-2-luna-en"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=DeepgramTTSSettings(voice="aura-2-luna-en"))
TTSUpdateSettingsFrame(delta=DeepgramTTSSettings(voice="aura-2-luna-en"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -106,13 +106,13 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Deepgram SageMaker TTS settings: voice="aura-2-aries-en"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=DeepgramSageMakerTTSSettings(voice="aura-2-aries-en"))
TTSUpdateSettingsFrame(delta=DeepgramSageMakerTTSSettings(voice="aura-2-aries-en"))
)
await asyncio.sleep(10)
logger.info('Updating Deepgram SageMaker TTS settings: voice="aura-2-luna-en"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=DeepgramSageMakerTTSSettings(voice="aura-2-luna-en"))
TTSUpdateSettingsFrame(delta=DeepgramSageMakerTTSSettings(voice="aura-2-luna-en"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -99,13 +99,13 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Deepgram TTS settings: voice="aura-2-aries-en"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=DeepgramTTSSettings(voice="aura-2-aries-en"))
TTSUpdateSettingsFrame(delta=DeepgramTTSSettings(voice="aura-2-aries-en"))
)
await asyncio.sleep(10)
logger.info('Updating Deepgram TTS settings: voice="aura-2-luna-en"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=DeepgramTTSSettings(voice="aura-2-luna-en"))
TTSUpdateSettingsFrame(delta=DeepgramTTSSettings(voice="aura-2-luna-en"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Azure TTS settings: rate="0.7", style="sad"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=AzureTTSSettings(rate="0.7", style="sad"))
TTSUpdateSettingsFrame(delta=AzureTTSSettings(rate="0.7", style="sad"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Azure TTS settings: rate="0.7", style="sad"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=AzureTTSSettings(rate="0.7", style="sad"))
TTSUpdateSettingsFrame(delta=AzureTTSSettings(rate="0.7", style="sad"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -99,7 +99,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Google HTTP TTS settings: speaking_rate=1.4")
await task.queue_frame(
TTSUpdateSettingsFrame(update=GoogleHttpTTSSettings(speaking_rate=1.4))
TTSUpdateSettingsFrame(delta=GoogleHttpTTSSettings(speaking_rate=1.4))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -99,7 +99,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Google Stream TTS settings: speaking_rate=1.4")
await task.queue_frame(
TTSUpdateSettingsFrame(update=GoogleStreamTTSSettings(speaking_rate=1.4))
TTSUpdateSettingsFrame(delta=GoogleStreamTTSSettings(speaking_rate=1.4))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating PlayHT TTS settings: speed=1.3")
await task.queue_frame(TTSUpdateSettingsFrame(update=PlayHTTTSSettings(speed=1.3)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=PlayHTTTSSettings(speed=1.3)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -104,7 +104,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Rime TTS settings: voice=rex")
await task.queue_frame(TTSUpdateSettingsFrame(update=RimeTTSSettings(voice="rex")))
await task.queue_frame(TTSUpdateSettingsFrame(delta=RimeTTSSettings(voice="rex")))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Rime TTS settings: voice=bond")
await task.queue_frame(TTSUpdateSettingsFrame(update=RimeTTSSettings(voice="bond")))
await task.queue_frame(TTSUpdateSettingsFrame(delta=RimeTTSSettings(voice="bond")))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating LMNT TTS settings: voice="tyler"')
await task.queue_frame(TTSUpdateSettingsFrame(update=LmntTTSSettings(voice="tyler")))
await task.queue_frame(TTSUpdateSettingsFrame(delta=LmntTTSSettings(voice="tyler")))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Fish Audio TTS settings: prosody_speed=1.5")
await task.queue_frame(
TTSUpdateSettingsFrame(update=FishAudioTTSSettings(prosody_speed=1.5))
TTSUpdateSettingsFrame(delta=FishAudioTTSSettings(prosody_speed=1.5))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -105,7 +105,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating MiniMax TTS settings: speed=1.5, emotion="happy"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=MiniMaxTTSSettings(speed=1.5, emotion="happy"))
TTSUpdateSettingsFrame(delta=MiniMaxTTSSettings(speed=1.5, emotion="happy"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -98,7 +98,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Groq TTS settings: speed=1.5")
await task.queue_frame(TTSUpdateSettingsFrame(update=GroqTTSSettings(speed=1.5)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=GroqTTSSettings(speed=1.5)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info('Updating Hume TTS settings: speed=2.0, description="Speak with excitement"')
await task.queue_frame(
TTSUpdateSettingsFrame(
update=HumeTTSSettings(speed=2.0, description="Speak with excitement")
delta=HumeTTSSettings(speed=2.0, description="Speak with excitement")
)
)

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Neuphonic HTTP TTS settings: speed=1.4")
await task.queue_frame(TTSUpdateSettingsFrame(update=NeuphonicTTSSettings(speed=1.4)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=NeuphonicTTSSettings(speed=1.4)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -98,7 +98,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Neuphonic TTS settings: speed=1.4")
await task.queue_frame(TTSUpdateSettingsFrame(update=NeuphonicTTSSettings(speed=1.4)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=NeuphonicTTSSettings(speed=1.4)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -103,9 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Inworld TTS settings: speaking_rate=1.5, temperature=0.8")
await task.queue_frame(
TTSUpdateSettingsFrame(
update=InworldTTSSettings(speaking_rate=1.5, temperature=0.8)
)
TTSUpdateSettingsFrame(delta=InworldTTSSettings(speaking_rate=1.5, temperature=0.8))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -99,7 +99,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Inworld TTS settings: speaking_rate=1.5, temperature=0.8")
await task.queue_frame(
TTSUpdateSettingsFrame(update=InworldTTSSettings(speaking_rate=1.5, temperature=0.8))
TTSUpdateSettingsFrame(delta=InworldTTSSettings(speaking_rate=1.5, temperature=0.8))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -108,7 +108,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Gemini TTS settings: prompt="Speak slowly and dramatically"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=GeminiTTSSettings(prompt="Speak slowly and dramatically"))
TTSUpdateSettingsFrame(delta=GeminiTTSSettings(prompt="Speak slowly and dramatically"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -98,7 +98,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating AWS Polly TTS settings: rate="fast"')
await task.queue_frame(TTSUpdateSettingsFrame(update=AWSPollyTTSSettings(rate="fast")))
await task.queue_frame(TTSUpdateSettingsFrame(delta=AWSPollyTTSSettings(rate="fast")))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Sarvam TTS settings: pace=1.5")
await task.queue_frame(TTSUpdateSettingsFrame(update=SarvamHttpTTSSettings(pace=1.5)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=SarvamHttpTTSSettings(pace=1.5)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -98,7 +98,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Sarvam TTS settings: pace=1.5")
await task.queue_frame(TTSUpdateSettingsFrame(update=SarvamTTSSettings(pace=1.5)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=SarvamTTSSettings(pace=1.5)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -99,7 +99,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Camb TTS settings: language -> Spanish")
await task.queue_frame(TTSUpdateSettingsFrame(update=CambTTSSettings(language=Language.ES)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=CambTTSSettings(language=Language.ES)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Hathora TTS settings: speed=1.3")
await task.queue_frame(TTSUpdateSettingsFrame(update=HathoraTTSSettings(speed=1.3)))
await task.queue_frame(TTSUpdateSettingsFrame(delta=HathoraTTSSettings(speed=1.3)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info("Updating ResembleAI TTS settings: voice (changed)")
await task.queue_frame(
TTSUpdateSettingsFrame(
update=ResembleAITTSSettings(voice=os.getenv("RESEMBLE_VOICE_UUID_ALT"))
delta=ResembleAITTSSettings(voice=os.getenv("RESEMBLE_VOICE_UUID_ALT"))
)
)

View File

@@ -106,7 +106,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Azure LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating OpenAI LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Anthropic LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=AnthropicLLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=AnthropicLLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Google LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=GoogleLLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=GoogleLLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -106,7 +106,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Google Vertex LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=GoogleLLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=GoogleLLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info("Updating Azure Realtime LLM settings: output_modalities=['text']")
await task.queue_frame(
LLMUpdateSettingsFrame(
update=OpenAIRealtimeLLMSettings(
delta=OpenAIRealtimeLLMSettings(
session_properties=events.SessionProperties(output_modalities=["text"])
)
)
@@ -112,7 +112,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info("Updating Azure Realtime LLM settings: output_modalities=['audio']")
await task.queue_frame(
LLMUpdateSettingsFrame(
update=OpenAIRealtimeLLMSettings(
delta=OpenAIRealtimeLLMSettings(
session_properties=events.SessionProperties(output_modalities=["audio"])
)
)

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info("Updating OpenAI Realtime LLM settings: output_modalities=['text']")
await task.queue_frame(
LLMUpdateSettingsFrame(
update=OpenAIRealtimeLLMSettings(
delta=OpenAIRealtimeLLMSettings(
session_properties=events.SessionProperties(output_modalities=["text"])
)
)
@@ -111,7 +111,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info("Updating OpenAI Realtime LLM settings: output_modalities=['audio']")
await task.queue_frame(
LLMUpdateSettingsFrame(
update=OpenAIRealtimeLLMSettings(
delta=OpenAIRealtimeLLMSettings(
session_properties=events.SessionProperties(output_modalities=["audio"])
)
)

View File

@@ -91,9 +91,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Gemini Live Vertex LLM settings: temperature=0.1")
await task.queue_frame(
LLMUpdateSettingsFrame(update=GeminiLiveLLMSettings(temperature=0.1))
)
await task.queue_frame(LLMUpdateSettingsFrame(delta=GeminiLiveLLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -89,9 +89,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Gemini Live LLM settings: temperature=0.1")
await task.queue_frame(
LLMUpdateSettingsFrame(update=GeminiLiveLLMSettings(temperature=0.1))
)
await task.queue_frame(LLMUpdateSettingsFrame(delta=GeminiLiveLLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -112,13 +112,13 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Ultravox Realtime LLM settings: output_medium=text")
await task.queue_frame(
LLMUpdateSettingsFrame(update=UltravoxRealtimeLLMSettings(output_medium="text"))
LLMUpdateSettingsFrame(delta=UltravoxRealtimeLLMSettings(output_medium="text"))
)
await asyncio.sleep(10)
logger.info("Updating Ultravox Realtime LLM settings: output_medium=voice")
await task.queue_frame(
LLMUpdateSettingsFrame(update=UltravoxRealtimeLLMSettings(output_medium="voice"))
LLMUpdateSettingsFrame(delta=UltravoxRealtimeLLMSettings(output_medium="voice"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
logger.info("Updating Grok Realtime LLM settings: voice='Rex'")
await task.queue_frame(
LLMUpdateSettingsFrame(
update=GrokRealtimeLLMSettings(
delta=GrokRealtimeLLMSettings(
session_properties=events.SessionProperties(voice="Rex")
)
)

View File

@@ -105,9 +105,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating AWS Bedrock LLM settings: temperature=0.1")
await task.queue_frame(
LLMUpdateSettingsFrame(update=AWSBedrockLLMSettings(temperature=0.1))
)
await task.queue_frame(LLMUpdateSettingsFrame(delta=AWSBedrockLLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Fal STT settings: task="translate"')
await task.queue_frame(STTUpdateSettingsFrame(update=FalSTTSettings(task="translate")))
await task.queue_frame(STTUpdateSettingsFrame(delta=FalSTTSettings(task="translate")))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -104,7 +104,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Gradium STT settings: delay_in_frames=5")
await task.queue_frame(STTUpdateSettingsFrame(update=GradiumSTTSettings(delay_in_frames=5)))
await task.queue_frame(STTUpdateSettingsFrame(delta=GradiumSTTSettings(delay_in_frames=5)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -104,7 +104,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Hathora STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=HathoraSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=HathoraSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating NVIDIA Segmented STT settings: profanity_filter=True")
await task.queue_frame(
STTUpdateSettingsFrame(update=NvidiaSegmentedSTTSettings(profanity_filter=True))
STTUpdateSettingsFrame(delta=NvidiaSegmentedSTTSettings(profanity_filter=True))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating NVIDIA STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=NvidiaSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=NvidiaSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating OpenAI Realtime STT settings: language=es")
await task.queue_frame(
STTUpdateSettingsFrame(update=OpenAIRealtimeSTTSettings(language=Language.ES))
STTUpdateSettingsFrame(delta=OpenAIRealtimeSTTSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -108,7 +108,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating AsyncAI HTTP TTS settings: language=es")
await task.queue_frame(
TTSUpdateSettingsFrame(update=AsyncAITTSSettings(language=Language.ES))
TTSUpdateSettingsFrame(delta=AsyncAITTSSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating AsyncAI TTS settings: language=es")
await task.queue_frame(
TTSUpdateSettingsFrame(update=AsyncAITTSSettings(language=Language.ES))
TTSUpdateSettingsFrame(delta=AsyncAITTSSettings(language=Language.ES))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -103,7 +103,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Gradium TTS settings: voice="LFZvm12tW_z0xfGo"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=GradiumTTSSettings(voice="LFZvm12tW_z0xfGo"))
TTSUpdateSettingsFrame(delta=GradiumTTSSettings(voice="LFZvm12tW_z0xfGo"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Cerebras LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating DeepSeek LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -105,7 +105,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Fireworks LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Grok LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -104,7 +104,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Groq LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Mistral LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -104,7 +104,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating NVIDIA LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating OLLama LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating OpenRouter LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -101,7 +101,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Perplexity LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Qwen LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -102,7 +102,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating SambaNova LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -105,7 +105,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating Together LLM settings: temperature=0.1")
await task.queue_frame(LLMUpdateSettingsFrame(update=OpenAILLMSettings(temperature=0.1)))
await task.queue_frame(LLMUpdateSettingsFrame(delta=OpenAILLMSettings(temperature=0.1)))
@transport.event_handler("on_client_disconnected")
async def on_client_disconnected(transport, client):

View File

@@ -99,7 +99,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info("Updating AWS Nova Sonic LLM settings: temperature=0.1")
await task.queue_frame(
LLMUpdateSettingsFrame(update=AWSNovaSonicLLMSettings(temperature=0.1))
LLMUpdateSettingsFrame(delta=AWSNovaSonicLLMSettings(temperature=0.1))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -100,7 +100,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating NVIDIA TTS settings: language="ES_US"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=NvidiaTTSSettings(language=Language.ES_US))
TTSUpdateSettingsFrame(delta=NvidiaTTSSettings(language=Language.ES_US))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -104,7 +104,7 @@ async def run_bot(transport: BaseTransport, runner_args: RunnerArguments):
await asyncio.sleep(10)
logger.info('Updating Speechmatics TTS settings: voice="theo"')
await task.queue_frame(
TTSUpdateSettingsFrame(update=SpeechmaticsTTSSettings(voice="theo"))
TTSUpdateSettingsFrame(delta=SpeechmaticsTTSSettings(voice="theo"))
)
@transport.event_handler("on_client_disconnected")

View File

@@ -2121,21 +2121,21 @@ class TTSStoppedFrame(ControlFrame):
class ServiceUpdateSettingsFrame(ControlFrame):
"""Base frame for updating service settings.
Supports both a ``settings`` dict (for backward compatibility) and an
``update`` object. When both are provided, ``update`` takes precedence.
Supports both a ``settings`` dict (for backward compatibility) and a
``delta`` object. When both are provided, ``delta`` takes precedence.
Parameters:
settings: Dictionary of setting name to value mappings.
.. deprecated:: 0.0.103
Use ``update`` with a typed settings object instead.
Use ``delta`` with a typed settings object instead.
update: :class:`~pipecat.services.settings.ServiceSettings` object
describing the delta to apply.
delta: :class:`~pipecat.services.settings.ServiceSettings` delta-mode
object describing the fields to change.
"""
settings: Mapping[str, Any] = field(default_factory=dict)
update: Optional["ServiceSettings"] = None
delta: Optional["ServiceSettings"] = None
@dataclass

View File

@@ -42,7 +42,7 @@ class AIService(FrameProcessor):
**kwargs: Additional arguments passed to the parent FrameProcessor.
"""
super().__init__(**kwargs)
self._settings: ServiceSettings = ServiceSettings(model="")
self._settings: ServiceSettings = ServiceSettings() # Here in case subclass doesn't implement more specific settings (hopefully shouldn't happen)
self._session_properties: Dict[str, Any] = {}
self._tracing_enabled: bool = False
self._tracing_context = None
@@ -73,6 +73,7 @@ class AIService(FrameProcessor):
Args:
frame: The start frame containing initialization parameters.
"""
self._settings.validate_complete()
self._tracing_enabled = frame.enable_tracing
self._tracing_context = frame.tracing_context
@@ -98,10 +99,10 @@ class AIService(FrameProcessor):
"""
pass
async def _update_settings(self, update: ServiceSettings) -> Dict[str, Any]:
"""Apply a settings update and return the changed fields.
async def _update_settings(self, delta: ServiceSettings) -> Dict[str, Any]:
"""Apply a settings delta and return the changed fields.
The update is applied to ``_settings`` and a dict mapping each changed
The delta is applied to ``_settings`` and a dict mapping each changed
field name to its **pre-update** value is returned. The ``model``
field is handled specially: when it changes, ``set_model_name`` is
called.
@@ -110,12 +111,12 @@ class AIService(FrameProcessor):
to react to specific changed fields (e.g. reconnect on voice change).
Args:
update: A settings delta.
delta: A delta-mode settings object.
Returns:
Dict mapping changed field names to their previous values.
"""
changed = self._settings.apply_update(update)
changed = self._settings.apply_update(delta)
if "model" in changed:
self._sync_model_name_to_metrics()

View File

@@ -254,6 +254,11 @@ class AnthropicLLMService(LLMService):
temperature=params.temperature,
top_k=params.top_k,
top_p=params.top_p,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
thinking=params.thinking,
extra=params.extra if isinstance(params.extra, dict) else {},
)

View File

@@ -116,6 +116,7 @@ class AssemblyAISTTService(WebsocketSTTService):
self._api_key = api_key
self._settings = AssemblyAISTTSettings(
model=None,
language=language,
connection_params=connection_params,
)
@@ -186,18 +187,18 @@ class AssemblyAISTTService(WebsocketSTTService):
"""
return True
async def _update_settings(self, update: STTSettings) -> dict[str, Any]:
"""Apply a settings update.
async def _update_settings(self, delta: STTSettings) -> dict[str, Any]:
"""Apply a settings delta.
Settings are stored but not applied to the active connection.
Args:
update: A :class:`STTSettings` (or ``AssemblyAISTTSettings``) delta.
delta: A :class:`STTSettings` (or ``AssemblyAISTTSettings``) delta.
Returns:
Dict mapping changed field names to their previous values.
"""
changed = await super()._update_settings(update)
changed = await super()._update_settings(delta)
if not changed:
return changed

View File

@@ -176,12 +176,12 @@ class AsyncAITTSService(AudioContextTTSService):
self._receive_task = None
self._keepalive_task = None
async def _update_settings(self, update: TTSSettings) -> dict[str, Any]:
"""Apply a settings update.
async def _update_settings(self, delta: TTSSettings) -> dict[str, Any]:
"""Apply a settings delta.
Settings are stored but not applied to the active connection.
"""
changed = await super()._update_settings(update)
changed = await super()._update_settings(delta)
if not changed:
return changed

View File

@@ -827,6 +827,12 @@ class AWSBedrockLLMService(LLMService):
max_tokens=params.max_tokens,
temperature=params.temperature,
top_p=params.top_p,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
latency=params.latency,
additional_model_request_fields=params.additional_model_request_fields
if isinstance(params.additional_model_request_fields, dict)

View File

@@ -267,6 +267,12 @@ class AWSNovaSonicLLMService(LLMService):
temperature=params.temperature,
max_tokens=params.max_tokens,
top_p=params.top_p,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
endpointing_sensitivity=params.endpointing_sensitivity,
)
self._sync_model_name_to_metrics()
@@ -338,12 +344,12 @@ class AWSNovaSonicLLMService(LLMService):
# settings
#
async def _update_settings(self, update: AWSNovaSonicLLMSettings) -> dict[str, Any]:
"""Apply a settings update.
async def _update_settings(self, delta: AWSNovaSonicLLMSettings) -> dict[str, Any]:
"""Apply a settings delta.
Settings are stored but not applied to the active connection.
"""
changed = await super()._update_settings(update)
changed = await super()._update_settings(delta)
if not changed:
return changed

View File

@@ -148,12 +148,12 @@ class AWSTranscribeSTTService(WebsocketSTTService):
}
return encoding_map.get(encoding, encoding)
async def _update_settings(self, update: STTSettings) -> dict[str, Any]:
"""Apply a settings update.
async def _update_settings(self, delta: STTSettings) -> dict[str, Any]:
"""Apply a settings delta.
Settings are stored but not applied to the active connection.
"""
changed = await super()._update_settings(update)
changed = await super()._update_settings(delta)
if not changed:
return changed

View File

@@ -209,6 +209,7 @@ class AWSPollyTTSService(TTSService):
self._aws_session = aioboto3.Session()
self._settings = AWSPollyTTSSettings(
model=None,
voice=voice_id,
engine=params.engine,
language=self.language_to_service_language(params.language)

View File

@@ -110,6 +110,7 @@ class AzureSTTService(STTService):
self._audio_stream = None
self._speech_recognizer = None
self._settings = AzureSTTSettings(
model=None,
region=region,
language=language_to_azure_language(language),
sample_rate=sample_rate,
@@ -134,12 +135,12 @@ class AzureSTTService(STTService):
"""
return language_to_azure_language(language)
async def _update_settings(self, update: STTSettings) -> dict[str, Any]:
"""Apply a settings update.
async def _update_settings(self, delta: STTSettings) -> dict[str, Any]:
"""Apply a settings delta.
Settings are stored but not applied to the active recognizer.
"""
changed = await super()._update_settings(update)
changed = await super()._update_settings(delta)
# TODO: someday we could reconnect here to apply updated settings.
# Code might look something like the below:

View File

@@ -156,6 +156,7 @@ class AzureBaseTTSService:
params = params or AzureBaseTTSService.InputParams()
self._settings = AzureTTSSettings(
model=None,
emphasis=params.emphasis,
language=self.language_to_service_language(params.language)
if params.language

View File

@@ -294,16 +294,16 @@ class CartesiaSTTService(WebsocketSTTService):
await self._disconnect_websocket()
async def _update_settings(self, update: STTSettings) -> dict[str, Any]:
"""Apply a settings update.
async def _update_settings(self, delta: STTSettings) -> dict[str, Any]:
"""Apply a settings delta.
Args:
update: A :class:`STTSettings` (or ``CartesiaSTTSettings``) delta.
delta: A :class:`STTSettings` (or ``CartesiaSTTSettings``) delta.
Returns:
Dict mapping changed field names to their previous values.
"""
changed = await super()._update_settings(update)
changed = await super()._update_settings(delta)
# TODO: someday we could reconnect here to apply updated settings.
# Code might look something like the below:

View File

@@ -28,7 +28,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, is_given
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.tts_service import AudioContextTTSService, TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.text.base_text_aggregator import BaseTextAggregator
@@ -443,7 +443,7 @@ class CartesiaTTSService(AudioContextTTSService):
voice_config["mode"] = "id"
voice_config["id"] = self._settings.voice
if is_given(self._settings.emotion) and self._settings.emotion:
if self._settings.emotion:
with warnings.catch_warnings():
warnings.simplefilter("always")
warnings.warn(
@@ -469,18 +469,18 @@ class CartesiaTTSService(AudioContextTTSService):
"use_original_timestamps": False if self._settings.model == "sonic" else True,
}
if is_given(self._settings.language) and self._settings.language:
if self._settings.language:
msg["language"] = self._settings.language
if is_given(self._settings.speed) and self._settings.speed:
if self._settings.speed:
msg["speed"] = self._settings.speed
if is_given(self._settings.generation_config) and self._settings.generation_config:
if self._settings.generation_config:
msg["generation_config"] = self._settings.generation_config.model_dump(
exclude_none=True
)
if is_given(self._settings.pronunciation_dict_id) and self._settings.pronunciation_dict_id:
if self._settings.pronunciation_dict_id:
msg["pronunciation_dict_id"] = self._settings.pronunciation_dict_id
return json.dumps(msg)
@@ -811,7 +811,7 @@ class CartesiaHttpTTSService(TTSService):
try:
voice_config = {"mode": "id", "id": self._settings.voice}
if is_given(self._settings.emotion) and self._settings.emotion:
if self._settings.emotion:
with warnings.catch_warnings():
warnings.simplefilter("always")
warnings.warn(
@@ -836,21 +836,18 @@ class CartesiaHttpTTSService(TTSService):
"output_format": output_format,
}
if is_given(self._settings.language) and self._settings.language:
if self._settings.language:
payload["language"] = self._settings.language
if is_given(self._settings.speed) and self._settings.speed:
if self._settings.speed:
payload["speed"] = self._settings.speed
if is_given(self._settings.generation_config) and self._settings.generation_config:
if self._settings.generation_config:
payload["generation_config"] = self._settings.generation_config.model_dump(
exclude_none=True
)
if (
is_given(self._settings.pronunciation_dict_id)
and self._settings.pronunciation_dict_id
):
if self._settings.pronunciation_dict_id:
payload["pronunciation_dict_id"] = self._settings.pronunciation_dict_id
yield TTSStartedFrame(context_id=context_id)

View File

@@ -384,12 +384,12 @@ class DeepgramFluxSTTService(WebsocketSTTService):
"""
return True
async def _update_settings(self, update: DeepgramFluxSTTSettings) -> dict[str, Any]:
"""Apply a settings update.
async def _update_settings(self, delta: DeepgramFluxSTTSettings) -> dict[str, Any]:
"""Apply a settings delta.
Settings are stored but not applied to the active connection.
"""
changed = await super()._update_settings(update)
changed = await super()._update_settings(delta)
if not changed:
return changed

Some files were not shown because too many files have changed in this diff Show More