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
84 changes: 75 additions & 9 deletions deepgram/clients/agent/v1/websocket/options.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +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

Expand Down Expand Up @@ -140,7 +143,16 @@ class Think(BaseResponse):
This class defines any configuration settings for the Think model.
"""

provider: Provider = field(default_factory=Provider)
provider: Provider = field(
default_factory=Provider,
metadata=dataclass_config(
exclude=lambda f: (
f is None
or (isinstance(f, dict) and not f)
or (isinstance(f, Provider) and not f)
)
),
)
functions: Optional[List[Function]] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)
Expand All @@ -155,7 +167,11 @@ class Think(BaseResponse):
)

def __post_init__(self):
if not isinstance(self.provider, Provider):
if (
not isinstance(self.provider, Provider)
and self.provider is not None
and not (isinstance(self.provider, dict) and not self.provider)
):
self.provider = Provider(self.provider)

def __getitem__(self, key):
Expand All @@ -175,10 +191,23 @@ class Listen(BaseResponse):
This class defines any configuration settings for the Listen model.
"""

provider: Provider = field(default_factory=Provider)
provider: Provider = field(
default_factory=Provider,
metadata=dataclass_config(
exclude=lambda f: (
f is None
or (isinstance(f, dict) and not f)
or (isinstance(f, Provider) and not f)
)
),
)

def __post_init__(self):
if not isinstance(self.provider, Provider):
if (
not isinstance(self.provider, Provider)
and self.provider is not None
and not (isinstance(self.provider, dict) and not self.provider)
):
self.provider = Provider(self.provider)

def __getitem__(self, key):
Expand All @@ -192,13 +221,26 @@ class Speak(BaseResponse):
This class defines any configuration settings for the Speak model.
"""

provider: Provider = field(default_factory=Provider)
provider: Provider = field(
default_factory=Provider,
metadata=dataclass_config(
exclude=lambda f: (
f is None
or (isinstance(f, dict) and not f)
or (isinstance(f, Provider) and not f)
)
),
)
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):
if (
not isinstance(self.provider, Provider)
and self.provider is not None
and not (isinstance(self.provider, dict) and not self.provider)
):
self.provider = Provider(self.provider)

def __getitem__(self, key):
Expand All @@ -215,9 +257,30 @@ class Agent(BaseResponse):
"""

language: str = field(default="en")
listen: Listen = field(default_factory=Listen)
think: Think = field(default_factory=Think)
speak: Speak = field(default_factory=Speak)
listen: Listen = field(
default_factory=Listen,
metadata=dataclass_config(
exclude=lambda f: f is None
or (isinstance(f, dict) and not f)
or (isinstance(f, Listen) and not f)
),
)
think: Think = field(
default_factory=Think,
metadata=dataclass_config(
exclude=lambda f: f is None
or (isinstance(f, dict) and not f)
or (isinstance(f, Think) and not f)
),
)
speak: Speak = field(
default_factory=Speak,
metadata=dataclass_config(
exclude=lambda f: f is None
or (isinstance(f, dict) and not f)
or (isinstance(f, Speak) and not f)
),
)
greeting: Optional[str] = field(
default=None, metadata=dataclass_config(exclude=lambda f: f is None)
)
Expand All @@ -231,6 +294,8 @@ def __getitem__(self, key):
if "speak" in _dict and isinstance(_dict["speak"], dict):
_dict["speak"] = Speak.from_dict(_dict["speak"])
return _dict[key]


@dataclass
class Input(BaseResponse):
"""
Expand Down Expand Up @@ -272,6 +337,7 @@ def __getitem__(self, key):
_dict["output"] = Output.from_dict(_dict["output"])
return _dict[key]


@dataclass
class SettingsOptions(BaseResponse):
"""
Expand Down
2 changes: 1 addition & 1 deletion examples/agent/no_mic/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ def main():
options.agent.think.provider.model = "gpt-4o-mini"
options.agent.think.prompt = "You are a friendly AI assistant."
options.agent.speak.provider.type = "deepgram"
options.agent.speak.model = "aura-2-thalia-en"
options.agent.speak.provider.model = "aura-2-thalia-en"
options.agent.greeting = "Hello! How can I help you today?"

# Send Keep Alive messages
Expand Down
2 changes: 1 addition & 1 deletion examples/agent/simple/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def main():
"microphone_record": "true",
"speaker_playback": "true",
},
# verbose=verboselogs.DEBUG,
verbose=verboselogs.SPAM,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@naomi-lgbt did you want to change this to SPAM or leave it as DEBUG?

)
print("Created DeepgramClientOptions...")

Expand Down