Skip to content

Commit 4521048

Browse files
authored
Merge pull request #532 from deepgram/feat/generic
feat: make provider objects generic
2 parents 6380b56 + bf825dc commit 4521048

File tree

11 files changed

+140
-135
lines changed

11 files changed

+140
-135
lines changed

deepgram/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -340,16 +340,14 @@
340340
AgentKeepAlive,
341341
# sub level
342342
Listen,
343-
ListenProvider,
344343
Speak,
345-
SpeakProvider,
346344
Header,
347345
Item,
348346
Properties,
349347
Parameters,
350348
Function,
351349
Think,
352-
ThinkProvider,
350+
Provider,
353351
Agent,
354352
Input,
355353
Output,

deepgram/client.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -354,16 +354,14 @@
354354
AgentKeepAlive,
355355
# sub level
356356
Listen,
357-
ListenProvider,
358357
Speak,
359-
SpeakProvider,
360358
Header,
361359
Item,
362360
Properties,
363361
Parameters,
364362
Function,
365363
Think,
366-
ThinkProvider,
364+
Provider,
367365
Agent,
368366
Input,
369367
Output,

deepgram/clients/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,16 +363,14 @@
363363
AgentKeepAlive,
364364
# sub level
365365
Listen,
366-
ListenProvider,
367366
Speak,
368-
SpeakProvider,
369367
Header,
370368
Item,
371369
Properties,
372370
Parameters,
373371
Function,
374372
Think,
375-
ThinkProvider,
373+
Provider,
376374
Agent,
377375
Input,
378376
Output,

deepgram/clients/agent/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,14 @@
3838
AgentKeepAlive,
3939
# sub level
4040
Listen,
41-
ListenProvider,
4241
Speak,
43-
SpeakProvider,
4442
Header,
4543
Item,
4644
Properties,
4745
Parameters,
4846
Function,
4947
Think,
50-
ThinkProvider,
48+
Provider,
5149
Agent,
5250
Input,
5351
Output,

deepgram/clients/agent/client.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,14 @@
3737
AgentKeepAlive as LatestAgentKeepAlive,
3838
# sub level
3939
Listen as LatestListen,
40-
ListenProvider as LatestListenProvider,
4140
Speak as LatestSpeak,
42-
SpeakProvider as LatestSpeakProvider,
4341
Header as LatestHeader,
4442
Item as LatestItem,
4543
Properties as LatestProperties,
4644
Parameters as LatestParameters,
4745
Function as LatestFunction,
4846
Think as LatestThink,
49-
ThinkProvider as LatestThinkProvider,
47+
Provider as LatestProvider,
5048
Agent as LatestAgent,
5149
Input as LatestInput,
5250
Output as LatestOutput,
@@ -85,16 +83,14 @@
8583
AgentKeepAlive = LatestAgentKeepAlive
8684

8785
Listen = LatestListen
88-
ListenProvider = LatestListenProvider
8986
Speak = LatestSpeak
90-
SpeakProvider = LatestSpeakProvider
9187
Header = LatestHeader
9288
Item = LatestItem
9389
Properties = LatestProperties
9490
Parameters = LatestParameters
9591
Function = LatestFunction
9692
Think = LatestThink
97-
ThinkProvider = LatestThinkProvider
93+
Provider = LatestProvider
9894
Agent = LatestAgent
9995
Input = LatestInput
10096
Output = LatestOutput

deepgram/clients/agent/v1/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,14 @@
4242
AgentKeepAlive,
4343
# sub level
4444
Listen,
45-
ListenProvider,
4645
Speak,
47-
SpeakProvider,
4846
Header,
4947
Item,
5048
Properties,
5149
Parameters,
5250
Function,
5351
Think,
54-
ThinkProvider,
52+
Provider,
5553
Agent,
5654
Input,
5755
Output,

deepgram/clients/agent/v1/websocket/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,14 @@
3333
AgentKeepAlive,
3434
# sub level
3535
Listen,
36-
ListenProvider,
3736
Speak,
38-
SpeakProvider,
3937
Header,
4038
Item,
4139
Properties,
4240
Parameters,
4341
Function,
4442
Think,
45-
ThinkProvider,
43+
Provider,
4644
Agent,
4745
Input,
4846
Output,

deepgram/clients/agent/v1/websocket/async_client.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,9 +224,6 @@ async def start(
224224
else:
225225
raise DeepgramError("Invalid options type")
226226

227-
if self._settings.agent.listen.provider.keyterms is not None and self._settings.agent.listen.provider.model is not None and not self._settings.agent.listen.provider.model.startswith("nova-3"):
228-
raise DeepgramError("Keyterms are only supported for nova-3 models")
229-
230227
try:
231228
# speaker substitutes the listening thread
232229
if self._speaker is not None:

deepgram/clients/agent/v1/websocket/client.py

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -225,14 +225,6 @@ def start(
225225
else:
226226
raise DeepgramError("Invalid options type")
227227

228-
if (
229-
self._settings.agent.listen.provider
230-
and self._settings.agent.listen.provider.keyterms is not None
231-
and self._settings.agent.listen.provider.model is not None
232-
and not self._settings.agent.listen.provider.model.startswith("nova-3")
233-
):
234-
raise DeepgramError("Keyterms are only supported for nova-3 models")
235-
236228
try:
237229
# speaker substitutes the listening thread
238230
if self._speaker is not None:

deepgram/clients/agent/v1/websocket/options.py

Lines changed: 29 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Use of this source code is governed by a MIT license that can be found in the LICENSE file.
33
# SPDX-License-Identifier: MIT
44

5-
from typing import List, Optional, Union, Any, Tuple
5+
from typing import List, Optional, Union, Any, Tuple, Dict
66
import logging
77

88
from dataclasses import dataclass, field
@@ -68,6 +68,19 @@ def __getitem__(self, key):
6868
_dict["properties"] = _dict["properties"].copy()
6969
return _dict[key]
7070

71+
class Provider(dict):
72+
"""
73+
Generic attribute class for provider objects.
74+
"""
75+
def __getattr__(self, name):
76+
try:
77+
return self[name]
78+
except KeyError:
79+
# pylint: disable=raise-missing-from
80+
raise AttributeError(name)
81+
def __setattr__(self, name, value):
82+
self[name] = value
83+
7184

7285
@dataclass
7386
class Endpoint(BaseResponse):
@@ -121,103 +134,13 @@ def __getitem__(self, key):
121134
return _dict[key]
122135

123136

124-
@dataclass
125-
class CartesiaVoice(BaseResponse):
126-
"""
127-
This class defines the voice for the Cartesia model.
128-
"""
129-
130-
mode: str = field(
131-
default="", metadata=dataclass_config(exclude=lambda f: f is None or f == "")
132-
)
133-
id: str = field(
134-
default="", metadata=dataclass_config(exclude=lambda f: f is None or f == "")
135-
)
136-
137-
138-
@dataclass
139-
class ListenProvider(BaseResponse):
140-
"""
141-
This class defines the provider for the Listen model.
142-
"""
143-
144-
type: str = field(default="")
145-
model: str = field(default="")
146-
keyterms: Optional[List[str]] = field(
147-
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
148-
)
149-
150-
def __getitem__(self, key):
151-
_dict = self.to_dict()
152-
if "keyterms" in _dict and isinstance(_dict["keyterms"], list):
153-
_dict["keyterms"] = [str(keyterm) for keyterm in _dict["keyterms"]]
154-
return _dict[key]
155-
156-
157-
@dataclass
158-
class ThinkProvider(BaseResponse):
159-
"""
160-
This class defines the provider for the Think model.
161-
"""
162-
163-
type: Optional[str] = field(default=None)
164-
model: Optional[str] = field(default=None)
165-
temperature: Optional[float] = field(
166-
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
167-
)
168-
169-
170-
@dataclass
171-
class SpeakProvider(BaseResponse):
172-
"""
173-
This class defines the provider for the Speak model.
174-
"""
175-
176-
type: Optional[str] = field(default="deepgram")
177-
"""
178-
Deepgram OR OpenAI model to use.
179-
"""
180-
model: Optional[str] = field(
181-
default="aura-2-thalia-en",
182-
metadata=dataclass_config(exclude=lambda f: f is None),
183-
)
184-
"""
185-
ElevenLabs or Cartesia model to use.
186-
"""
187-
model_id: Optional[str] = field(
188-
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
189-
)
190-
"""
191-
Cartesia voice configuration.
192-
"""
193-
voice: Optional[CartesiaVoice] = field(
194-
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
195-
)
196-
"""
197-
Cartesia language.
198-
"""
199-
language: Optional[str] = field(
200-
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
201-
)
202-
"""
203-
ElevenLabs language.
204-
"""
205-
language_code: Optional[str] = field(
206-
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
207-
)
208-
209-
def __getitem__(self, key):
210-
_dict = self.to_dict()
211-
if "voice" in _dict and isinstance(_dict["voice"], dict):
212-
_dict["voice"] = CartesiaVoice.from_dict(_dict["voice"])
213-
return _dict[key]
214137
@dataclass
215138
class Think(BaseResponse):
216139
"""
217140
This class defines any configuration settings for the Think model.
218141
"""
219142

220-
provider: ThinkProvider = field(default_factory=ThinkProvider)
143+
provider: Provider = field(default_factory=Provider)
221144
functions: Optional[List[Function]] = field(
222145
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
223146
)
@@ -228,10 +151,12 @@ class Think(BaseResponse):
228151
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
229152
)
230153

154+
def __post_init__(self):
155+
if not isinstance(self.provider, Provider):
156+
self.provider = Provider(self.provider)
157+
231158
def __getitem__(self, key):
232159
_dict = self.to_dict()
233-
if "provider" in _dict and isinstance(_dict["provider"], dict):
234-
_dict["provider"] = ThinkProvider.from_dict(_dict["provider"])
235160
if "functions" in _dict and isinstance(_dict["functions"], list):
236161
_dict["functions"] = [
237162
Function.from_dict(function) for function in _dict["functions"]
@@ -247,12 +172,14 @@ class Listen(BaseResponse):
247172
This class defines any configuration settings for the Listen model.
248173
"""
249174

250-
provider: ListenProvider = field(default_factory=ListenProvider)
175+
provider: Provider = field(default_factory=Provider)
176+
177+
def __post_init__(self):
178+
if not isinstance(self.provider, Provider):
179+
self.provider = Provider(self.provider)
251180

252181
def __getitem__(self, key):
253182
_dict = self.to_dict()
254-
if "provider" in _dict and isinstance(_dict["provider"], dict):
255-
_dict["provider"] = ListenProvider.from_dict(_dict["provider"])
256183
return _dict[key]
257184

258185

@@ -262,15 +189,17 @@ class Speak(BaseResponse):
262189
This class defines any configuration settings for the Speak model.
263190
"""
264191

265-
provider: SpeakProvider = field(default_factory=SpeakProvider)
192+
provider: Provider = field(default_factory=Provider)
266193
endpoint: Optional[Endpoint] = field(
267194
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
268195
)
269196

197+
def __post_init__(self):
198+
if not isinstance(self.provider, Provider):
199+
self.provider = Provider(self.provider)
200+
270201
def __getitem__(self, key):
271202
_dict = self.to_dict()
272-
if "provider" in _dict and isinstance(_dict["provider"], dict):
273-
_dict["provider"] = SpeakProvider.from_dict(_dict["provider"])
274203
if "endpoint" in _dict and isinstance(_dict["endpoint"], dict):
275204
_dict["endpoint"] = Endpoint.from_dict(_dict["endpoint"])
276205
return _dict[key]

0 commit comments

Comments
 (0)