From 7f0dac1ad5f3a095dc67bd1476d2b11e6a9b1039 Mon Sep 17 00:00:00 2001 From: Abhishek Date: Tue, 12 May 2026 19:01:13 +0530 Subject: [PATCH] feat: configurable ElevenLabs base URL for Data Residency (#278) * feat: configurable ElevenLabs base URL for Data Residency (#269) Adds a `base_url` field to `ElevenlabsTTSConfiguration` so users on an ElevenLabs Data Residency plan (EU, etc.) can point Dograh at the regional endpoint instead of the hardcoded global one. Defaults to `https://api.elevenlabs.io`, preserving existing behaviour. The service factory rewrites the HTTP scheme to WSS when constructing the WebSocket TTS service. Co-Authored-By: Claude Opus 4.7 (1M context) * fix: fix drift --------- Co-authored-by: Claude Opus 4.7 (1M context) --- api/services/configuration/registry.py | 8 ++++++++ api/services/pipecat/service_factory.py | 7 +++++++ sdk/python/src/dograh_sdk/_generated_models.py | 4 ++-- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/api/services/configuration/registry.py b/api/services/configuration/registry.py index 0ce0459..758a24d 100644 --- a/api/services/configuration/registry.py +++ b/api/services/configuration/registry.py @@ -443,6 +443,14 @@ class ElevenlabsTTSConfiguration(BaseServiceConfiguration): default="eleven_flash_v2_5", json_schema_extra={"examples": ELEVENLABS_TTS_MODELS}, ) + base_url: str = Field( + default="https://api.elevenlabs.io", + description=( + "ElevenLabs API base URL. Override to use a Data Residency endpoint " + "(e.g. https://api.eu.residency.elevenlabs.io) for GDPR / HIPAA / " + "regional compliance." + ), + ) OPENAI_TTS_MODELS = ["gpt-4o-mini-tts"] diff --git a/api/services/pipecat/service_factory.py b/api/services/pipecat/service_factory.py index 14c73ae..dcd5841 100644 --- a/api/services/pipecat/service_factory.py +++ b/api/services/pipecat/service_factory.py @@ -247,9 +247,16 @@ def create_tts_service(user_config, audio_config: "AudioConfig"): voice_id = user_config.tts.voice.split(" - ")[1] except IndexError: voice_id = user_config.tts.voice + # ElevenLabs TTS uses WebSocket. Users configure base_url with an HTTP + # scheme (matching ElevenLabs documentation, e.g. + # https://api.eu.residency.elevenlabs.io); rewrite it to the WS scheme. + elevenlabs_url = user_config.tts.base_url.replace("https://", "wss://").replace( + "http://", "ws://" + ) return ElevenLabsTTSService( reconnect_on_error=False, api_key=user_config.tts.api_key, + url=elevenlabs_url, settings=ElevenLabsTTSSettings( voice=voice_id, model=user_config.tts.model, diff --git a/sdk/python/src/dograh_sdk/_generated_models.py b/sdk/python/src/dograh_sdk/_generated_models.py index 3e6a05f..6f12f2f 100644 --- a/sdk/python/src/dograh_sdk/_generated_models.py +++ b/sdk/python/src/dograh_sdk/_generated_models.py @@ -1,6 +1,6 @@ # generated by datamodel-codegen: -# filename: dograh-openapi-XXXXXX.json.OGVaBJhIgZ -# timestamp: 2026-05-11T11:41:34+00:00 +# filename: dograh-openapi-XXXXXX.json.Zvc0Wos2dk +# timestamp: 2026-05-12T13:08:52+00:00 from __future__ import annotations