From 180feac1d10330a13f6f1940bbed4821e9350974 Mon Sep 17 00:00:00 2001 From: Paul Asjes Date: Thu, 21 May 2026 11:38:23 +0200 Subject: [PATCH 1/3] Add API attributes --- src/elevenlabs/speech_engine/resource.py | 10 +++++++-- src/elevenlabs/speech_engine_custom.py | 26 +++++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/elevenlabs/speech_engine/resource.py b/src/elevenlabs/speech_engine/resource.py index 7d25bb16..329c82b7 100644 --- a/src/elevenlabs/speech_engine/resource.py +++ b/src/elevenlabs/speech_engine/resource.py @@ -11,6 +11,7 @@ from .server import SpeechEngineServer from .session import SpeechEngineSession from .types import WebSocketLike +from ..types.speech_engine_response import SpeechEngineResponse logger = logging.getLogger("elevenlabs.speech_engine") @@ -114,12 +115,17 @@ async def on_transcript(transcript, session): def __init__( self, - engine_id: str, + id: str, client_wrapper: typing.Any = None, + response: typing.Optional[SpeechEngineResponse] = None, ) -> None: - self.engine_id = engine_id + self.id = id self._client_wrapper = client_wrapper + # Full API response, accessible as engine.config.asr, engine.config.overrides, etc. + # None when the resource is constructed directly without an API call. + self.config: typing.Optional[SpeechEngineResponse] = response + def _get_api_key(self) -> typing.Optional[str]: if self._client_wrapper is None: return None diff --git a/src/elevenlabs/speech_engine_custom.py b/src/elevenlabs/speech_engine_custom.py index 18115838..d691ac95 100644 --- a/src/elevenlabs/speech_engine_custom.py +++ b/src/elevenlabs/speech_engine_custom.py @@ -55,8 +55,9 @@ def create( # type: ignore[override] request_options=request_options, ) return SpeechEngineResource( - engine_id=response.speech_engine_id, + id=response.speech_engine_id, client_wrapper=self._raw_client._client_wrapper, + response=response, ) def get( # type: ignore[override] @@ -73,10 +74,11 @@ def get( # type: ignore[override] :meth:`~SpeechEngineResource.create_session`, :meth:`~SpeechEngineResource.verify_request`). """ - super().get(speech_engine_id, request_options=request_options) + response = super().get(speech_engine_id, request_options=request_options) return SpeechEngineResource( - engine_id=speech_engine_id, + id=speech_engine_id, client_wrapper=self._raw_client._client_wrapper, + response=response, ) def update( # type: ignore[override] @@ -103,7 +105,7 @@ def update( # type: ignore[override] :meth:`~SpeechEngineResource.create_session`, :meth:`~SpeechEngineResource.verify_request`). """ - super().update( + response = super().update( speech_engine_id, name=name, speech_engine=speech_engine, @@ -118,8 +120,9 @@ def update( # type: ignore[override] request_options=request_options, ) return SpeechEngineResource( - engine_id=speech_engine_id, + id=speech_engine_id, client_wrapper=self._raw_client._client_wrapper, + response=response, ) @@ -163,8 +166,9 @@ async def create( # type: ignore[override] request_options=request_options, ) return SpeechEngineResource( - engine_id=response.speech_engine_id, + id=response.speech_engine_id, client_wrapper=self._raw_client._client_wrapper, + response=response, ) async def get( # type: ignore[override] @@ -181,10 +185,11 @@ async def get( # type: ignore[override] :meth:`~SpeechEngineResource.create_session`, :meth:`~SpeechEngineResource.verify_request`). """ - await super().get(speech_engine_id, request_options=request_options) + response = await super().get(speech_engine_id, request_options=request_options) return SpeechEngineResource( - engine_id=speech_engine_id, + id=speech_engine_id, client_wrapper=self._raw_client._client_wrapper, + response=response, ) async def update( # type: ignore[override] @@ -211,7 +216,7 @@ async def update( # type: ignore[override] :meth:`~SpeechEngineResource.create_session`, :meth:`~SpeechEngineResource.verify_request`). """ - await super().update( + response = await super().update( speech_engine_id, name=name, speech_engine=speech_engine, @@ -226,6 +231,7 @@ async def update( # type: ignore[override] request_options=request_options, ) return SpeechEngineResource( - engine_id=speech_engine_id, + id=speech_engine_id, client_wrapper=self._raw_client._client_wrapper, + response=response, ) From ddc0ee304b78139329f114676140d8b202fbc94a Mon Sep 17 00:00:00 2001 From: Paul Asjes Date: Thu, 21 May 2026 12:12:32 +0200 Subject: [PATCH 2/3] Add overrides and version bump --- pyproject.toml | 2 +- src/elevenlabs/core/client_wrapper.py | 4 ++-- src/elevenlabs/speech_engine/client.py | 5 +++++ src/elevenlabs/speech_engine/raw_client.py | 9 +++++++++ src/elevenlabs/speech_engine_custom.py | 5 +++++ tests/test_speech_engine_custom.py | 12 ++++++------ 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 41850495..59ea5960 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ dynamic = ["version"] [tool.poetry] name = "elevenlabs" -version = "2.49.0" +version = "2.49.1" description = "" readme = "README.md" authors = [] diff --git a/src/elevenlabs/core/client_wrapper.py b/src/elevenlabs/core/client_wrapper.py index efe50811..e56a3f1a 100644 --- a/src/elevenlabs/core/client_wrapper.py +++ b/src/elevenlabs/core/client_wrapper.py @@ -22,10 +22,10 @@ def __init__( def get_headers(self) -> typing.Dict[str, str]: headers: typing.Dict[str, str] = { - "User-Agent": "elevenlabs/2.49.0", + "User-Agent": "elevenlabs/2.49.1", "X-Fern-Language": "Python", "X-Fern-SDK-Name": "elevenlabs", - "X-Fern-SDK-Version": "2.49.0", + "X-Fern-SDK-Version": "2.49.1", **(self.get_custom_headers() or {}), } if self._api_key is not None: diff --git a/src/elevenlabs/speech_engine/client.py b/src/elevenlabs/speech_engine/client.py index f6870885..7b3f2fb7 100644 --- a/src/elevenlabs/speech_engine/client.py +++ b/src/elevenlabs/speech_engine/client.py @@ -13,6 +13,7 @@ from ..types.privacy_config_input import PrivacyConfigInput from ..types.sort_direction import SortDirection from ..types.speech_engine_config import SpeechEngineConfig +from ..types.speech_engine_conversation_initiation_client_data_config import SpeechEngineConversationInitiationClientDataConfig from ..types.speech_engine_response import SpeechEngineResponse from ..types.tts_conversational_config_input import TtsConversationalConfigInput from .raw_client import AsyncRawSpeechEngineClient, RawSpeechEngineClient @@ -112,6 +113,7 @@ def create( call_limits: typing.Optional[AgentCallLimits] = OMIT, language: typing.Optional[str] = OMIT, tags: typing.Optional[typing.Sequence[str]] = OMIT, + overrides: typing.Optional[SpeechEngineConversationInitiationClientDataConfig] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> SpeechEngineResponse: """ @@ -181,6 +183,7 @@ def create( call_limits=call_limits, language=language, tags=tags, + overrides=overrides, request_options=request_options, ) return _response.data @@ -427,6 +430,7 @@ async def create( call_limits: typing.Optional[AgentCallLimits] = OMIT, language: typing.Optional[str] = OMIT, tags: typing.Optional[typing.Sequence[str]] = OMIT, + overrides: typing.Optional[SpeechEngineConversationInitiationClientDataConfig] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> SpeechEngineResponse: """ @@ -504,6 +508,7 @@ async def main() -> None: call_limits=call_limits, language=language, tags=tags, + overrides=overrides, request_options=request_options, ) return _response.data diff --git a/src/elevenlabs/speech_engine/raw_client.py b/src/elevenlabs/speech_engine/raw_client.py index e7784e76..d991374a 100644 --- a/src/elevenlabs/speech_engine/raw_client.py +++ b/src/elevenlabs/speech_engine/raw_client.py @@ -20,6 +20,7 @@ from ..types.privacy_config_input import PrivacyConfigInput from ..types.sort_direction import SortDirection from ..types.speech_engine_config import SpeechEngineConfig +from ..types.speech_engine_conversation_initiation_client_data_config import SpeechEngineConversationInitiationClientDataConfig from ..types.speech_engine_response import SpeechEngineResponse from ..types.tts_conversational_config_input import TtsConversationalConfigInput @@ -120,6 +121,7 @@ def create( call_limits: typing.Optional[AgentCallLimits] = OMIT, language: typing.Optional[str] = OMIT, tags: typing.Optional[typing.Sequence[str]] = OMIT, + overrides: typing.Optional[SpeechEngineConversationInitiationClientDataConfig] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> HttpResponse[SpeechEngineResponse]: """ @@ -193,6 +195,9 @@ def create( ), "language": language, "tags": tags, + "overrides": convert_and_respect_annotation_metadata( + object_=overrides, annotation=SpeechEngineConversationInitiationClientDataConfig, direction="write" + ), }, headers={ "content-type": "application/json", @@ -525,6 +530,7 @@ async def create( call_limits: typing.Optional[AgentCallLimits] = OMIT, language: typing.Optional[str] = OMIT, tags: typing.Optional[typing.Sequence[str]] = OMIT, + overrides: typing.Optional[SpeechEngineConversationInitiationClientDataConfig] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> AsyncHttpResponse[SpeechEngineResponse]: """ @@ -598,6 +604,9 @@ async def create( ), "language": language, "tags": tags, + "overrides": convert_and_respect_annotation_metadata( + object_=overrides, annotation=SpeechEngineConversationInitiationClientDataConfig, direction="write" + ), }, headers={ "content-type": "application/json", diff --git a/src/elevenlabs/speech_engine_custom.py b/src/elevenlabs/speech_engine_custom.py index d691ac95..0d7fbc80 100644 --- a/src/elevenlabs/speech_engine_custom.py +++ b/src/elevenlabs/speech_engine_custom.py @@ -10,6 +10,7 @@ from .types.conversation_config_input import ConversationConfigInput from .types.privacy_config_input import PrivacyConfigInput from .types.speech_engine_config import SpeechEngineConfig +from .types.speech_engine_conversation_initiation_client_data_config import SpeechEngineConversationInitiationClientDataConfig from .types.tts_conversational_config_input import TtsConversationalConfigInput OMIT = typing.cast(typing.Any, ...) @@ -31,6 +32,7 @@ def create( # type: ignore[override] call_limits: typing.Optional[AgentCallLimits] = OMIT, language: typing.Optional[str] = OMIT, tags: typing.Optional[typing.Sequence[str]] = OMIT, + overrides: typing.Optional[SpeechEngineConversationInitiationClientDataConfig] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> SpeechEngineResource: """Create a Speech Engine resource. @@ -52,6 +54,7 @@ def create( # type: ignore[override] call_limits=call_limits, language=language, tags=tags, + overrides=overrides, request_options=request_options, ) return SpeechEngineResource( @@ -142,6 +145,7 @@ async def create( # type: ignore[override] call_limits: typing.Optional[AgentCallLimits] = OMIT, language: typing.Optional[str] = OMIT, tags: typing.Optional[typing.Sequence[str]] = OMIT, + overrides: typing.Optional[SpeechEngineConversationInitiationClientDataConfig] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> SpeechEngineResource: """Create a Speech Engine resource. @@ -163,6 +167,7 @@ async def create( # type: ignore[override] call_limits=call_limits, language=language, tags=tags, + overrides=overrides, request_options=request_options, ) return SpeechEngineResource( diff --git a/tests/test_speech_engine_custom.py b/tests/test_speech_engine_custom.py index 48d86e72..c4f92be5 100644 --- a/tests/test_speech_engine_custom.py +++ b/tests/test_speech_engine_custom.py @@ -33,7 +33,7 @@ def test_create_returns_resource() -> None: result = client.create(speech_engine=SpeechEngineConfig(ws_url="wss://test")) assert isinstance(result, SpeechEngineResource) - assert result.engine_id == "seng_abc" + assert result.id == "seng_abc" def test_get_returns_resource() -> None: @@ -43,7 +43,7 @@ def test_get_returns_resource() -> None: result = client.get("seng_abc") assert isinstance(result, SpeechEngineResource) - assert result.engine_id == "seng_abc" + assert result.id == "seng_abc" def test_update_returns_resource() -> None: @@ -53,7 +53,7 @@ def test_update_returns_resource() -> None: result = client.update("seng_abc", name="Renamed") assert isinstance(result, SpeechEngineResource) - assert result.engine_id == "seng_abc" + assert result.id == "seng_abc" # --------------------------------------------------------------------------- @@ -70,7 +70,7 @@ async def test_async_create_returns_resource() -> None: result = await client.create(speech_engine=SpeechEngineConfig(ws_url="wss://test")) assert isinstance(result, SpeechEngineResource) - assert result.engine_id == "seng_abc" + assert result.id == "seng_abc" @pytest.mark.asyncio @@ -81,7 +81,7 @@ async def test_async_get_returns_resource() -> None: result = await client.get("seng_abc") assert isinstance(result, SpeechEngineResource) - assert result.engine_id == "seng_abc" + assert result.id == "seng_abc" @pytest.mark.asyncio @@ -92,4 +92,4 @@ async def test_async_update_returns_resource() -> None: result = await client.update("seng_abc", name="Renamed") assert isinstance(result, SpeechEngineResource) - assert result.engine_id == "seng_abc" + assert result.id == "seng_abc" From 682494f40200f9b08de90253f3c14dfff6a8423b Mon Sep 17 00:00:00 2001 From: Paul Asjes Date: Thu, 21 May 2026 12:19:50 +0200 Subject: [PATCH 3/3] undo breaking change --- src/elevenlabs/speech_engine/resource.py | 4 ++-- src/elevenlabs/speech_engine_custom.py | 12 ++++++------ tests/test_speech_engine_custom.py | 12 ++++++------ 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/elevenlabs/speech_engine/resource.py b/src/elevenlabs/speech_engine/resource.py index 329c82b7..b2171ebb 100644 --- a/src/elevenlabs/speech_engine/resource.py +++ b/src/elevenlabs/speech_engine/resource.py @@ -115,11 +115,11 @@ async def on_transcript(transcript, session): def __init__( self, - id: str, + engine_id: str, client_wrapper: typing.Any = None, response: typing.Optional[SpeechEngineResponse] = None, ) -> None: - self.id = id + self.engine_id = engine_id self._client_wrapper = client_wrapper # Full API response, accessible as engine.config.asr, engine.config.overrides, etc. diff --git a/src/elevenlabs/speech_engine_custom.py b/src/elevenlabs/speech_engine_custom.py index 0d7fbc80..a316b8b7 100644 --- a/src/elevenlabs/speech_engine_custom.py +++ b/src/elevenlabs/speech_engine_custom.py @@ -58,7 +58,7 @@ def create( # type: ignore[override] request_options=request_options, ) return SpeechEngineResource( - id=response.speech_engine_id, + engine_id=response.speech_engine_id, client_wrapper=self._raw_client._client_wrapper, response=response, ) @@ -79,7 +79,7 @@ def get( # type: ignore[override] """ response = super().get(speech_engine_id, request_options=request_options) return SpeechEngineResource( - id=speech_engine_id, + engine_id=speech_engine_id, client_wrapper=self._raw_client._client_wrapper, response=response, ) @@ -123,7 +123,7 @@ def update( # type: ignore[override] request_options=request_options, ) return SpeechEngineResource( - id=speech_engine_id, + engine_id=speech_engine_id, client_wrapper=self._raw_client._client_wrapper, response=response, ) @@ -171,7 +171,7 @@ async def create( # type: ignore[override] request_options=request_options, ) return SpeechEngineResource( - id=response.speech_engine_id, + engine_id=response.speech_engine_id, client_wrapper=self._raw_client._client_wrapper, response=response, ) @@ -192,7 +192,7 @@ async def get( # type: ignore[override] """ response = await super().get(speech_engine_id, request_options=request_options) return SpeechEngineResource( - id=speech_engine_id, + engine_id=speech_engine_id, client_wrapper=self._raw_client._client_wrapper, response=response, ) @@ -236,7 +236,7 @@ async def update( # type: ignore[override] request_options=request_options, ) return SpeechEngineResource( - id=speech_engine_id, + engine_id=speech_engine_id, client_wrapper=self._raw_client._client_wrapper, response=response, ) diff --git a/tests/test_speech_engine_custom.py b/tests/test_speech_engine_custom.py index c4f92be5..48d86e72 100644 --- a/tests/test_speech_engine_custom.py +++ b/tests/test_speech_engine_custom.py @@ -33,7 +33,7 @@ def test_create_returns_resource() -> None: result = client.create(speech_engine=SpeechEngineConfig(ws_url="wss://test")) assert isinstance(result, SpeechEngineResource) - assert result.id == "seng_abc" + assert result.engine_id == "seng_abc" def test_get_returns_resource() -> None: @@ -43,7 +43,7 @@ def test_get_returns_resource() -> None: result = client.get("seng_abc") assert isinstance(result, SpeechEngineResource) - assert result.id == "seng_abc" + assert result.engine_id == "seng_abc" def test_update_returns_resource() -> None: @@ -53,7 +53,7 @@ def test_update_returns_resource() -> None: result = client.update("seng_abc", name="Renamed") assert isinstance(result, SpeechEngineResource) - assert result.id == "seng_abc" + assert result.engine_id == "seng_abc" # --------------------------------------------------------------------------- @@ -70,7 +70,7 @@ async def test_async_create_returns_resource() -> None: result = await client.create(speech_engine=SpeechEngineConfig(ws_url="wss://test")) assert isinstance(result, SpeechEngineResource) - assert result.id == "seng_abc" + assert result.engine_id == "seng_abc" @pytest.mark.asyncio @@ -81,7 +81,7 @@ async def test_async_get_returns_resource() -> None: result = await client.get("seng_abc") assert isinstance(result, SpeechEngineResource) - assert result.id == "seng_abc" + assert result.engine_id == "seng_abc" @pytest.mark.asyncio @@ -92,4 +92,4 @@ async def test_async_update_returns_resource() -> None: result = await client.update("seng_abc", name="Renamed") assert isinstance(result, SpeechEngineResource) - assert result.id == "seng_abc" + assert result.engine_id == "seng_abc"