Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions deepgram/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -340,16 +340,14 @@
AgentKeepAlive,
# sub level
Listen,
ListenProvider,
Speak,
SpeakProvider,
Header,
Item,
Properties,
Parameters,
Function,
Think,
ThinkProvider,
Provider,
Comment thread
naomi-lgbt marked this conversation as resolved.
Agent,
Input,
Output,
Expand Down
4 changes: 1 addition & 3 deletions deepgram/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -354,16 +354,14 @@
AgentKeepAlive,
# sub level
Listen,
ListenProvider,
Speak,
SpeakProvider,
Header,
Item,
Properties,
Parameters,
Function,
Think,
ThinkProvider,
Provider,
Agent,
Input,
Output,
Expand Down
4 changes: 1 addition & 3 deletions deepgram/clients/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -363,16 +363,14 @@
AgentKeepAlive,
# sub level
Listen,
ListenProvider,
Speak,
SpeakProvider,
Header,
Item,
Properties,
Parameters,
Function,
Think,
ThinkProvider,
Provider,
Agent,
Input,
Output,
Expand Down
4 changes: 1 addition & 3 deletions deepgram/clients/agent/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,14 @@
AgentKeepAlive,
# sub level
Listen,
ListenProvider,
Speak,
SpeakProvider,
Header,
Item,
Properties,
Parameters,
Function,
Think,
ThinkProvider,
Provider,
Agent,
Input,
Output,
Expand Down
8 changes: 2 additions & 6 deletions deepgram/clients/agent/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,14 @@
AgentKeepAlive as LatestAgentKeepAlive,
# sub level
Listen as LatestListen,
ListenProvider as LatestListenProvider,
Speak as LatestSpeak,
SpeakProvider as LatestSpeakProvider,
Header as LatestHeader,
Item as LatestItem,
Properties as LatestProperties,
Parameters as LatestParameters,
Function as LatestFunction,
Think as LatestThink,
ThinkProvider as LatestThinkProvider,
Provider as LatestProvider,
Agent as LatestAgent,
Input as LatestInput,
Output as LatestOutput,
Expand Down Expand Up @@ -85,16 +83,14 @@
AgentKeepAlive = LatestAgentKeepAlive

Listen = LatestListen
ListenProvider = LatestListenProvider
Speak = LatestSpeak
SpeakProvider = LatestSpeakProvider
Header = LatestHeader
Item = LatestItem
Properties = LatestProperties
Parameters = LatestParameters
Function = LatestFunction
Think = LatestThink
ThinkProvider = LatestThinkProvider
Provider = LatestProvider
Agent = LatestAgent
Input = LatestInput
Output = LatestOutput
Expand Down
4 changes: 1 addition & 3 deletions deepgram/clients/agent/v1/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,14 @@
AgentKeepAlive,
# sub level
Listen,
ListenProvider,
Speak,
SpeakProvider,
Header,
Item,
Properties,
Parameters,
Function,
Think,
ThinkProvider,
Provider,
Agent,
Input,
Output,
Expand Down
4 changes: 1 addition & 3 deletions deepgram/clients/agent/v1/websocket/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,14 @@
AgentKeepAlive,
# sub level
Listen,
ListenProvider,
Speak,
SpeakProvider,
Header,
Item,
Properties,
Parameters,
Function,
Think,
ThinkProvider,
Provider,
Agent,
Input,
Output,
Expand Down
3 changes: 0 additions & 3 deletions deepgram/clients/agent/v1/websocket/async_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,9 +224,6 @@ async def start(
else:
raise DeepgramError("Invalid options type")

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"):
raise DeepgramError("Keyterms are only supported for nova-3 models")

try:
# speaker substitutes the listening thread
if self._speaker is not None:
Expand Down
8 changes: 0 additions & 8 deletions deepgram/clients/agent/v1/websocket/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,14 +225,6 @@ def start(
else:
raise DeepgramError("Invalid options type")

if (
self._settings.agent.listen.provider
and 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")
):
raise DeepgramError("Keyterms are only supported for nova-3 models")

try:
# speaker substitutes the listening thread
if self._speaker is not None:
Expand Down
129 changes: 29 additions & 100 deletions deepgram/clients/agent/v1/websocket/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Use of this source code is governed by a MIT license that can be found in the LICENSE file.
# SPDX-License-Identifier: MIT

from typing import List, Optional, Union, Any, Tuple
from typing import List, Optional, Union, Any, Tuple, Dict
import logging

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

class Provider(dict):
"""
Generic attribute class for provider objects.
"""
def __getattr__(self, name):
try:
return self[name]
except KeyError:
# pylint: disable=raise-missing-from
raise AttributeError(name)
def __setattr__(self, name, value):
self[name] = value


@dataclass
class Endpoint(BaseResponse):
Expand Down Expand Up @@ -121,103 +134,13 @@ def __getitem__(self, key):
return _dict[key]


@dataclass
class CartesiaVoice(BaseResponse):
"""
This class defines the voice for the Cartesia model.
"""

mode: str = field(
default="", metadata=dataclass_config(exclude=lambda f: f is None or f == "")
)
id: str = field(
default="", metadata=dataclass_config(exclude=lambda f: f is None or f == "")
)


@dataclass
class ListenProvider(BaseResponse):
"""
This class defines the provider for the Listen model.
"""

type: str = field(default="")
model: str = field(default="")
keyterms: Optional[List[str]] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)

def __getitem__(self, key):
_dict = self.to_dict()
if "keyterms" in _dict and isinstance(_dict["keyterms"], list):
_dict["keyterms"] = [str(keyterm) for keyterm in _dict["keyterms"]]
return _dict[key]


@dataclass
class ThinkProvider(BaseResponse):
"""
This class defines the provider for the Think model.
"""

type: Optional[str] = field(default=None)
model: Optional[str] = field(default=None)
temperature: Optional[float] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)


@dataclass
class SpeakProvider(BaseResponse):
"""
This class defines the provider for the Speak model.
"""

type: Optional[str] = field(default="deepgram")
"""
Deepgram OR OpenAI model to use.
"""
model: Optional[str] = field(
default="aura-2-thalia-en",
metadata=dataclass_config(exclude=lambda f: f is None),
)
"""
ElevenLabs or Cartesia model to use.
"""
model_id: Optional[str] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)
"""
Cartesia voice configuration.
"""
voice: Optional[CartesiaVoice] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)
"""
Cartesia language.
"""
language: Optional[str] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)
"""
ElevenLabs language.
"""
language_code: Optional[str] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)

def __getitem__(self, key):
_dict = self.to_dict()
if "voice" in _dict and isinstance(_dict["voice"], dict):
_dict["voice"] = CartesiaVoice.from_dict(_dict["voice"])
return _dict[key]
@dataclass
class Think(BaseResponse):
"""
This class defines any configuration settings for the Think model.
"""

provider: ThinkProvider = field(default_factory=ThinkProvider)
provider: Provider = field(default_factory=Provider)
functions: Optional[List[Function]] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)
Expand All @@ -228,10 +151,12 @@ class Think(BaseResponse):
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)

def __post_init__(self):
if not isinstance(self.provider, Provider):
self.provider = Provider(self.provider)

def __getitem__(self, key):
_dict = self.to_dict()
if "provider" in _dict and isinstance(_dict["provider"], dict):
_dict["provider"] = ThinkProvider.from_dict(_dict["provider"])
if "functions" in _dict and isinstance(_dict["functions"], list):
_dict["functions"] = [
Function.from_dict(function) for function in _dict["functions"]
Expand All @@ -247,12 +172,14 @@ class Listen(BaseResponse):
This class defines any configuration settings for the Listen model.
"""

provider: ListenProvider = field(default_factory=ListenProvider)
provider: Provider = field(default_factory=Provider)

def __post_init__(self):
if not isinstance(self.provider, Provider):
self.provider = Provider(self.provider)

def __getitem__(self, key):
_dict = self.to_dict()
if "provider" in _dict and isinstance(_dict["provider"], dict):
_dict["provider"] = ListenProvider.from_dict(_dict["provider"])
return _dict[key]


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

provider: SpeakProvider = field(default_factory=SpeakProvider)
provider: Provider = field(default_factory=Provider)
endpoint: Optional[Endpoint] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)

def __post_init__(self):
if not isinstance(self.provider, Provider):
self.provider = Provider(self.provider)

def __getitem__(self, key):
_dict = self.to_dict()
if "provider" in _dict and isinstance(_dict["provider"], dict):
_dict["provider"] = SpeakProvider.from_dict(_dict["provider"])
if "endpoint" in _dict and isinstance(_dict["endpoint"], dict):
_dict["endpoint"] = Endpoint.from_dict(_dict["endpoint"])
return _dict[key]
Expand Down
Loading