Skip to content

Commit 7cf57a1

Browse files
PaulAsjesclaude
andcommitted
Wire speech engine to Fern-generated CRUD client
Replace the stub _AsyncSpeechEngineAccessor with custom SpeechEngineClient/AsyncSpeechEngineClient classes that extend the Fern-generated clients and add resource() for WebSocket server setup. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent afaf723 commit 7cf57a1

2 files changed

Lines changed: 48 additions & 21 deletions

File tree

src/elevenlabs/client.py

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from .environment import ElevenLabsEnvironment
88
from .music_custom import AsyncMusicClient, MusicClient
99
from .realtime_tts import RealtimeTextToSpeechClient
10+
from .speech_engine_custom import AsyncSpeechEngineClient, SpeechEngineClient
1011
from .speech_to_text_custom import AsyncSpeechToTextClient, SpeechToTextClient
1112
from .webhooks_custom import AsyncWebhooksClient, WebhooksClient
1213

@@ -62,24 +63,11 @@ def __init__(
6263
self._webhooks = WebhooksClient(client_wrapper=self._client_wrapper)
6364
self._music = MusicClient(client_wrapper=self._client_wrapper)
6465
self._speech_to_text = SpeechToTextClient(client_wrapper=self._client_wrapper)
66+
self._speech_engine = SpeechEngineClient(client_wrapper=self._client_wrapper)
6567

66-
67-
class _AsyncSpeechEngineAccessor:
68-
"""Stub accessor for speech engine resources.
69-
70-
Will be replaced with a Fern-generated client once CRUD endpoints exist.
71-
"""
72-
73-
def __init__(self, client_wrapper: typing.Any) -> None:
74-
self._client_wrapper = client_wrapper
75-
76-
async def get(self, engine_id: str) -> typing.Any:
77-
from .speech_engine.resource import SpeechEngineResource # noqa: E402
78-
79-
return SpeechEngineResource(
80-
engine_id=engine_id,
81-
client_wrapper=self._client_wrapper,
82-
)
68+
@property
69+
def speech_engine(self) -> SpeechEngineClient:
70+
return self._speech_engine
8371

8472

8573
class AsyncElevenLabs(AsyncBaseElevenLabs):
@@ -125,10 +113,8 @@ def __init__(
125113
self._webhooks = AsyncWebhooksClient(client_wrapper=self._client_wrapper)
126114
self._music = AsyncMusicClient(client_wrapper=self._client_wrapper)
127115
self._speech_to_text = AsyncSpeechToTextClient(client_wrapper=self._client_wrapper)
128-
self._speech_engine = None # type: typing.Optional[_AsyncSpeechEngineAccessor]
116+
self._speech_engine = AsyncSpeechEngineClient(client_wrapper=self._client_wrapper)
129117

130118
@property
131-
def speech_engine(self) -> _AsyncSpeechEngineAccessor:
132-
if self._speech_engine is None:
133-
self._speech_engine = _AsyncSpeechEngineAccessor(self._client_wrapper)
119+
def speech_engine(self) -> AsyncSpeechEngineClient:
134120
return self._speech_engine
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import typing
2+
3+
from .speech_engine.client import SpeechEngineClient as AutogeneratedSpeechEngineClient
4+
from .speech_engine.client import AsyncSpeechEngineClient as AutogeneratedAsyncSpeechEngineClient
5+
from .speech_engine.resource import SpeechEngineResource
6+
7+
8+
class SpeechEngineClient(AutogeneratedSpeechEngineClient):
9+
"""Extends the generated SpeechEngineClient with WebSocket server integration."""
10+
11+
def resource(self, engine_id: str) -> SpeechEngineResource:
12+
"""Return a :class:`SpeechEngineResource` for WebSocket server setup.
13+
14+
Unlike :meth:`get` which fetches the full engine configuration from the
15+
API, this method returns a lightweight resource bound to the given
16+
*engine_id* that provides :meth:`~SpeechEngineResource.serve`,
17+
:meth:`~SpeechEngineResource.create_session`, and
18+
:meth:`~SpeechEngineResource.verify_request`.
19+
"""
20+
return SpeechEngineResource(
21+
engine_id=engine_id,
22+
client_wrapper=self._client_wrapper,
23+
)
24+
25+
26+
class AsyncSpeechEngineClient(AutogeneratedAsyncSpeechEngineClient):
27+
"""Extends the generated AsyncSpeechEngineClient with WebSocket server integration."""
28+
29+
def resource(self, engine_id: str) -> SpeechEngineResource:
30+
"""Return a :class:`SpeechEngineResource` for WebSocket server setup.
31+
32+
Unlike :meth:`get` which fetches the full engine configuration from the
33+
API, this method returns a lightweight resource bound to the given
34+
*engine_id* that provides :meth:`~SpeechEngineResource.serve`,
35+
:meth:`~SpeechEngineResource.create_session`, and
36+
:meth:`~SpeechEngineResource.verify_request`.
37+
"""
38+
return SpeechEngineResource(
39+
engine_id=engine_id,
40+
client_wrapper=self._client_wrapper,
41+
)

0 commit comments

Comments
 (0)