diff --git a/.fern/metadata.json b/.fern/metadata.json index cf7550af..b8abe06f 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -21,8 +21,8 @@ "skip_validation": true } }, - "originGitCommit": "7d90d34144ca944bba2a570780fad2d53fdc5c4d", - "originGitCommitIsDirty": false, + "originGitCommit": "56f50652950bce4294c5388be6f25055749f55a7", + "originGitCommitIsDirty": true, "invokedBy": "manual", "sdkVersion": "7.16.0" } diff --git a/.fernignore b/.fernignore index 01aa1d64..0a68a051 100644 --- a/.fernignore +++ b/.fernignore @@ -57,6 +57,14 @@ src/deepgram/requests/shared_intents.py src/deepgram/agent/v1/types/agent_v1conversation_text.py src/deepgram/agent/v1/requests/agent_v1conversation_text.py +# Deepgram Think shares the title "Deepgram" with the Speak provider in the +# AsyncAPI overrides. Fern therefore emits the Speak model and its speed / +# expressivity controls here instead of the Think contract. Preserve the actual +# Think models and temperature / reasoning_mode / voice_prompt_opt_out fields. +# [temporarily frozen — remove after Fern disambiguates the provider titles] +src/deepgram/types/think_settings_v1provider.py +src/deepgram/requests/think_settings_v1provider.py + # WebSocket socket clients: # - except Exception broad catch (supports custom transports, generator narrows to WebSocketException) # - _sanitize_numeric_types in agent socket client (float→int for API) diff --git a/examples/34-voice-agent-deepgram-think.py b/examples/34-voice-agent-deepgram-think.py new file mode 100644 index 00000000..9abadbf5 --- /dev/null +++ b/examples/34-voice-agent-deepgram-think.py @@ -0,0 +1,63 @@ +"""Configure a Voice Agent with a Deepgram-hosted Think model.""" + +import threading + +from dotenv import load_dotenv + +from deepgram import DeepgramClient +from deepgram.agent.v1.types import ( + AgentV1Settings, + AgentV1SettingsAgent, + AgentV1SettingsAgentListen, + AgentV1SettingsAgentListenProvider_V2, + AgentV1SettingsAudio, + AgentV1SettingsAudioInput, +) +from deepgram.core.events import EventType +from deepgram.types.speak_settings_v1 import SpeakSettingsV1 +from deepgram.types.speak_settings_v1provider import SpeakSettingsV1Provider_Deepgram +from deepgram.types.think_settings_v1 import ThinkSettingsV1 +from deepgram.types.think_settings_v1provider import ThinkSettingsV1Provider_Deepgram + +load_dotenv() +client = DeepgramClient() + +settings = AgentV1Settings( + audio=AgentV1SettingsAudio(input=AgentV1SettingsAudioInput(encoding="linear16", sample_rate=24000)), + # think-fast requires Model Improvement Program participation. + # With mip_opt_out=True, use phonellm-mini-alpha-2-fp8 or the service returns INVALID_SETTINGS. + mip_opt_out=True, + agent=AgentV1SettingsAgent( + listen=AgentV1SettingsAgentListen( + provider=AgentV1SettingsAgentListenProvider_V2(type="deepgram", model="flux-general-en") + ), + think=ThinkSettingsV1( + provider=ThinkSettingsV1Provider_Deepgram( + type="deepgram", + model="phonellm-mini-alpha-2-fp8", + temperature=0.2, + reasoning_mode="none", + ), + prompt="You are helpful and concise.", + ), + speak=SpeakSettingsV1( + provider=SpeakSettingsV1Provider_Deepgram(type="deepgram", model="aura-2-asteria-en") + ), + ), +) + +with client.agent.v1.connect() as agent: + settings_applied = threading.Event() + + def on_message(message: object) -> None: + message_type = getattr(message, "type", "Unknown") + print(f"Received {message_type}") + if message_type == "SettingsApplied": + settings_applied.set() + + agent.on(EventType.MESSAGE, on_message) + threading.Thread(target=agent.start_listening, daemon=True).start() + agent.send_settings(settings) + + if not settings_applied.wait(10): + raise TimeoutError("Timed out waiting for Deepgram Think settings to apply") diff --git a/examples/README.md b/examples/README.md index 6953c427..7b675a3d 100644 --- a/examples/README.md +++ b/examples/README.md @@ -37,6 +37,7 @@ This directory contains comprehensive examples demonstrating how to use the Deep - **31-voice-agent-session-recording.py** - Record selected Voice Agent events as JSON - **32-voice-agent-force-end-turn.py** - End an active Voice Agent Flux turn with ForceEndTurn - **33-voice-agent-think-live.py** - Configure Think Live, update it in-session, and observe dynamic Agent events +- **34-voice-agent-deepgram-think.py** - Configure Deepgram-hosted Think with an MIP-safe model ### 40-49: Text Intelligence (Read) diff --git a/poetry.lock b/poetry.lock index 9a9366a9..812e02ee 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1522,38 +1522,38 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pytest" -version = "9.1.1" +version = "9.2.0" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c"}, - {file = "pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313"}, + {file = "pytest-9.2.0-py3-none-any.whl", hash = "sha256:07acdcf88ec174f907dc01af70bf52d49b014bbab03faeeade31c96b18c2e588"}, + {file = "pytest-9.2.0.tar.gz", hash = "sha256:97c4f3b1f3c7414aa36465e09b8220f1d03627993bd51b1282e193753c80557b"}, ] [package.dependencies] colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1", markers = "python_version < \"3.11\""} -iniconfig = ">=1.0.1" -packaging = ">=22" -pluggy = ">=1.5,<2" -pygments = ">=2.7.2" -tomli = {version = ">=1", markers = "python_version < \"3.11\""} +iniconfig = ">=2" +packaging = ">=24" +pluggy = ">=1.6,<2" +pygments = ">=2.15" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} [package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "asynctest ; python_version < \"3.11\"", "attrs (>=23.1)", "coverage (>=7.5)", "hypothesis (>=6.75)", "mock", "numpy (>=1.26)", "pexpect (>=4.9)", "pytest-xdist (>=3.5)", "pyyaml", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-asyncio" -version = "1.4.0" +version = "1.4.1" description = "Pytest support for asyncio" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1"}, - {file = "pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42"}, + {file = "pytest_asyncio-1.4.1-py3-none-any.whl", hash = "sha256:507afa78ec77c6661164ef1a2368bc7820383fd1a14b2a7f813de8b5a92949cc"}, + {file = "pytest_asyncio-1.4.1.tar.gz", hash = "sha256:e8266eb094e5ee9ffdb2068c9836f33e209ea77a970eb846933d416b5602669b"}, ] [package.dependencies] @@ -1776,14 +1776,14 @@ files = [ [[package]] name = "types-python-dateutil" -version = "2.9.0.20261021" +version = "2.9.0.20261029" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "types_python_dateutil-2.9.0.20261021-py3-none-any.whl", hash = "sha256:12aab3bdfe55e1d9de7f54301e025d6276ce17e6a08e31644f2202d59c8d1fca"}, - {file = "types_python_dateutil-2.9.0.20261021.tar.gz", hash = "sha256:62d66fcdd293e38745eae644e5da4cb399b98799c0ae61f03a54896fb51b3140"}, + {file = "types_python_dateutil-2.9.0.20261029-py3-none-any.whl", hash = "sha256:8fd04c6e1722d2523a74d6670596fc0007077651465b686f144ae1d200dcacf5"}, + {file = "types_python_dateutil-2.9.0.20261029.tar.gz", hash = "sha256:3258b491686c441d8074cfc8712308741900c9ff128a06421baec3767c503511"}, ] [[package]] diff --git a/src/deepgram/__init__.py b/src/deepgram/__init__.py index a18d8231..509967e6 100644 --- a/src/deepgram/__init__.py +++ b/src/deepgram/__init__.py @@ -48,6 +48,7 @@ DeepgramListenProviderV1, DeepgramListenProviderV2, DeepgramModel, + DeepgramReasoningMode, DeepgramThinkLiveProviderV1, DeleteAgentConfigurationV1Response, DeleteAgentVariableV1Response, @@ -242,6 +243,7 @@ ThinkSettingsV1Provider, ThinkSettingsV1Provider_Anthropic, ThinkSettingsV1Provider_AwsBedrock, + ThinkSettingsV1Provider_Deepgram, ThinkSettingsV1Provider_Google, ThinkSettingsV1Provider_Groq, ThinkSettingsV1Provider_OpenAi, @@ -418,6 +420,7 @@ ThinkSettingsV1ProviderParams, ThinkSettingsV1Provider_AnthropicParams, ThinkSettingsV1Provider_AwsBedrockParams, + ThinkSettingsV1Provider_DeepgramParams, ThinkSettingsV1Provider_GoogleParams, ThinkSettingsV1Provider_GroqParams, ThinkSettingsV1Provider_OpenAiParams, @@ -509,6 +512,7 @@ "DeepgramListenProviderV2Params": ".requests", "DeepgramModel": ".types", "DeepgramParams": ".requests", + "DeepgramReasoningMode": ".types", "DeepgramThinkLiveProviderV1": ".types", "DeepgramThinkLiveProviderV1Params": ".requests", "DefaultAioHttpClient": "._default_clients", @@ -831,6 +835,8 @@ "ThinkSettingsV1Provider_AnthropicParams": ".requests", "ThinkSettingsV1Provider_AwsBedrock": ".types", "ThinkSettingsV1Provider_AwsBedrockParams": ".requests", + "ThinkSettingsV1Provider_Deepgram": ".types", + "ThinkSettingsV1Provider_DeepgramParams": ".requests", "ThinkSettingsV1Provider_Google": ".types", "ThinkSettingsV1Provider_GoogleParams": ".requests", "ThinkSettingsV1Provider_Groq": ".types", @@ -997,6 +1003,7 @@ def __dir__(): "DeepgramListenProviderV2Params", "DeepgramModel", "DeepgramParams", + "DeepgramReasoningMode", "DeepgramThinkLiveProviderV1", "DeepgramThinkLiveProviderV1Params", "DefaultAioHttpClient", @@ -1319,6 +1326,8 @@ def __dir__(): "ThinkSettingsV1Provider_AnthropicParams", "ThinkSettingsV1Provider_AwsBedrock", "ThinkSettingsV1Provider_AwsBedrockParams", + "ThinkSettingsV1Provider_Deepgram", + "ThinkSettingsV1Provider_DeepgramParams", "ThinkSettingsV1Provider_Google", "ThinkSettingsV1Provider_GoogleParams", "ThinkSettingsV1Provider_Groq", diff --git a/src/deepgram/requests/__init__.py b/src/deepgram/requests/__init__.py index 778d15b2..d12c7597 100644 --- a/src/deepgram/requests/__init__.py +++ b/src/deepgram/requests/__init__.py @@ -199,6 +199,7 @@ ThinkSettingsV1ProviderParams, ThinkSettingsV1Provider_AnthropicParams, ThinkSettingsV1Provider_AwsBedrockParams, + ThinkSettingsV1Provider_DeepgramParams, ThinkSettingsV1Provider_GoogleParams, ThinkSettingsV1Provider_GroqParams, ThinkSettingsV1Provider_OpenAiParams, @@ -370,6 +371,7 @@ "ThinkSettingsV1ProviderParams": ".think_settings_v1provider", "ThinkSettingsV1Provider_AnthropicParams": ".think_settings_v1provider", "ThinkSettingsV1Provider_AwsBedrockParams": ".think_settings_v1provider", + "ThinkSettingsV1Provider_DeepgramParams": ".think_settings_v1provider", "ThinkSettingsV1Provider_GoogleParams": ".think_settings_v1provider", "ThinkSettingsV1Provider_GroqParams": ".think_settings_v1provider", "ThinkSettingsV1Provider_OpenAiParams": ".think_settings_v1provider", @@ -579,6 +581,7 @@ def __dir__(): "ThinkSettingsV1ProviderParams", "ThinkSettingsV1Provider_AnthropicParams", "ThinkSettingsV1Provider_AwsBedrockParams", + "ThinkSettingsV1Provider_DeepgramParams", "ThinkSettingsV1Provider_GoogleParams", "ThinkSettingsV1Provider_GroqParams", "ThinkSettingsV1Provider_OpenAiParams", diff --git a/src/deepgram/requests/think_settings_v1provider.py b/src/deepgram/requests/think_settings_v1provider.py index 723b0e12..b80d9d17 100644 --- a/src/deepgram/requests/think_settings_v1provider.py +++ b/src/deepgram/requests/think_settings_v1provider.py @@ -7,6 +7,7 @@ import typing_extensions from ..types.anthropic_model import AnthropicModel from ..types.aws_bedrock_think_provider_model import AwsBedrockThinkProviderModel +from ..types.deepgram_reasoning_mode import DeepgramReasoningMode from ..types.google_model import GoogleModel from ..types.google_version import GoogleVersion from ..types.groq_reasoning_mode import GroqReasoningMode @@ -52,10 +53,20 @@ class ThinkSettingsV1Provider_GroqParams(typing_extensions.TypedDict): reasoning_mode: typing_extensions.NotRequired[GroqReasoningMode] +class ThinkSettingsV1Provider_DeepgramParams(typing_extensions.TypedDict): + type: typing.Literal["deepgram"] + version: typing_extensions.NotRequired[typing.Literal["v1"]] + model: typing.Union[typing.Literal["think-fast", "phonellm-mini-alpha-2-fp8"], typing.Any] + temperature: typing_extensions.NotRequired[float] + reasoning_mode: typing_extensions.NotRequired[DeepgramReasoningMode] + voice_prompt_opt_out: typing_extensions.NotRequired[bool] + + ThinkSettingsV1ProviderParams = typing.Union[ ThinkSettingsV1Provider_OpenAiParams, ThinkSettingsV1Provider_AwsBedrockParams, ThinkSettingsV1Provider_AnthropicParams, ThinkSettingsV1Provider_GoogleParams, ThinkSettingsV1Provider_GroqParams, + ThinkSettingsV1Provider_DeepgramParams, ] diff --git a/src/deepgram/types/__init__.py b/src/deepgram/types/__init__.py index 109c82ec..f748a09e 100644 --- a/src/deepgram/types/__init__.py +++ b/src/deepgram/types/__init__.py @@ -51,6 +51,7 @@ from .deepgram_listen_provider_v1 import DeepgramListenProviderV1 from .deepgram_listen_provider_v2 import DeepgramListenProviderV2 from .deepgram_model import DeepgramModel + from .deepgram_reasoning_mode import DeepgramReasoningMode from .deepgram_think_live_provider_v1 import DeepgramThinkLiveProviderV1 from .delete_agent_configuration_v1response import DeleteAgentConfigurationV1Response from .delete_agent_variable_v1response import DeleteAgentVariableV1Response @@ -276,6 +277,7 @@ ThinkSettingsV1Provider, ThinkSettingsV1Provider_Anthropic, ThinkSettingsV1Provider_AwsBedrock, + ThinkSettingsV1Provider_Deepgram, ThinkSettingsV1Provider_Google, ThinkSettingsV1Provider_Groq, ThinkSettingsV1Provider_OpenAi, @@ -332,6 +334,7 @@ "DeepgramListenProviderV1": ".deepgram_listen_provider_v1", "DeepgramListenProviderV2": ".deepgram_listen_provider_v2", "DeepgramModel": ".deepgram_model", + "DeepgramReasoningMode": ".deepgram_reasoning_mode", "DeepgramThinkLiveProviderV1": ".deepgram_think_live_provider_v1", "DeleteAgentConfigurationV1Response": ".delete_agent_configuration_v1response", "DeleteAgentVariableV1Response": ".delete_agent_variable_v1response", @@ -526,6 +529,7 @@ "ThinkSettingsV1Provider": ".think_settings_v1provider", "ThinkSettingsV1Provider_Anthropic": ".think_settings_v1provider", "ThinkSettingsV1Provider_AwsBedrock": ".think_settings_v1provider", + "ThinkSettingsV1Provider_Deepgram": ".think_settings_v1provider", "ThinkSettingsV1Provider_Google": ".think_settings_v1provider", "ThinkSettingsV1Provider_Groq": ".think_settings_v1provider", "ThinkSettingsV1Provider_OpenAi": ".think_settings_v1provider", @@ -626,6 +630,7 @@ def __dir__(): "DeepgramListenProviderV1", "DeepgramListenProviderV2", "DeepgramModel", + "DeepgramReasoningMode", "DeepgramThinkLiveProviderV1", "DeleteAgentConfigurationV1Response", "DeleteAgentVariableV1Response", @@ -820,6 +825,7 @@ def __dir__(): "ThinkSettingsV1Provider", "ThinkSettingsV1Provider_Anthropic", "ThinkSettingsV1Provider_AwsBedrock", + "ThinkSettingsV1Provider_Deepgram", "ThinkSettingsV1Provider_Google", "ThinkSettingsV1Provider_Groq", "ThinkSettingsV1Provider_OpenAi", diff --git a/src/deepgram/types/deepgram_reasoning_mode.py b/src/deepgram/types/deepgram_reasoning_mode.py new file mode 100644 index 00000000..efa07716 --- /dev/null +++ b/src/deepgram/types/deepgram_reasoning_mode.py @@ -0,0 +1,5 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +DeepgramReasoningMode = typing.Union[typing.Literal["none", "minimal", "low", "medium", "high"], typing.Any] diff --git a/src/deepgram/types/think_settings_v1provider.py b/src/deepgram/types/think_settings_v1provider.py index d46270d7..3fe0ba6c 100644 --- a/src/deepgram/types/think_settings_v1provider.py +++ b/src/deepgram/types/think_settings_v1provider.py @@ -11,6 +11,7 @@ from .anthropic_model import AnthropicModel from .aws_bedrock_think_provider_credentials import AwsBedrockThinkProviderCredentials from .aws_bedrock_think_provider_model import AwsBedrockThinkProviderModel +from .deepgram_reasoning_mode import DeepgramReasoningMode from .google_model import GoogleModel from .google_version import GoogleVersion from .groq_reasoning_mode import GroqReasoningMode @@ -100,6 +101,24 @@ class Config: extra = pydantic.Extra.allow +class ThinkSettingsV1Provider_Deepgram(UncheckedBaseModel): + type: typing.Literal["deepgram"] = "deepgram" + version: typing.Optional[typing.Literal["v1"]] = None + model: typing.Union[typing.Literal["think-fast", "phonellm-mini-alpha-2-fp8"], typing.Any] + temperature: typing.Optional[float] = None + reasoning_mode: typing.Optional[DeepgramReasoningMode] = None + voice_prompt_opt_out: typing.Optional[bool] = None + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow + + ThinkSettingsV1Provider = typing_extensions.Annotated[ typing.Union[ ThinkSettingsV1Provider_OpenAi, @@ -107,6 +126,7 @@ class Config: ThinkSettingsV1Provider_Anthropic, ThinkSettingsV1Provider_Google, ThinkSettingsV1Provider_Groq, + ThinkSettingsV1Provider_Deepgram, ], UnionMetadata(discriminant="type"), ] diff --git a/tests/custom/test_agent_think_live.py b/tests/custom/test_agent_think_live.py index 95646ee3..d627fa84 100644 --- a/tests/custom/test_agent_think_live.py +++ b/tests/custom/test_agent_think_live.py @@ -19,7 +19,7 @@ from deepgram.types.think_live_settings_v1 import ThinkLiveSettingsV1 from deepgram.types.think_settings_v1 import ThinkSettingsV1 from deepgram.types.think_settings_v1functions_item import ThinkSettingsV1FunctionsItem -from deepgram.types.think_settings_v1provider import ThinkSettingsV1Provider_OpenAi +from deepgram.types.think_settings_v1provider import ThinkSettingsV1Provider_Deepgram, ThinkSettingsV1Provider_OpenAi class _FakeWebSocket: @@ -72,6 +72,23 @@ def _settings_with_think_live() -> AgentV1Settings: ) +def _settings_with_deepgram_think() -> AgentV1Settings: + return AgentV1Settings( + audio=AgentV1SettingsAudio(input=AgentV1SettingsAudioInput(encoding="linear16", sample_rate=24000)), + agent=AgentV1SettingsAgent( + think=ThinkSettingsV1( + provider=ThinkSettingsV1Provider_Deepgram( + type="deepgram", + version="v1", + model="phonellm-mini-alpha-2-fp8", + temperature=0.2, + reasoning_mode="none", + ) + ) + ), + ) + + def _sent_json(websocket: _FakeWebSocket | _FakeAsyncWebSocket) -> dict[str, Any]: assert len(websocket.sent) == 1 return json.loads(websocket.sent[0]) @@ -167,6 +184,51 @@ async def test_async_think_live_settings_and_update_serialize() -> None: } +def test_sync_deepgram_think_settings_serialize() -> None: + websocket = _FakeWebSocket() + V1SocketClient(websocket=cast(Any, websocket)).send_settings(_settings_with_deepgram_think()) + + assert _sent_json(websocket)["agent"]["think"]["provider"] == { + "type": "deepgram", + "version": "v1", + "model": "phonellm-mini-alpha-2-fp8", + "temperature": 0.2, + "reasoning_mode": "none", + } + + +async def test_async_deepgram_think_settings_serialize() -> None: + websocket = _FakeAsyncWebSocket() + await AsyncV1SocketClient(websocket=cast(Any, websocket)).send_settings(_settings_with_deepgram_think()) + + assert _sent_json(websocket)["agent"]["think"]["provider"] == { + "type": "deepgram", + "version": "v1", + "model": "phonellm-mini-alpha-2-fp8", + "temperature": 0.2, + "reasoning_mode": "none", + } + + +def test_deepgram_think_provider_uses_the_deepgram_union_variant() -> None: + settings = construct_type( + type_=ThinkSettingsV1, + object_={ + "provider": { + "type": "deepgram", + "model": "think-fast", + "temperature": 1.0, + "voice_prompt_opt_out": True, + } + }, + ) + + assert isinstance(settings.provider, ThinkSettingsV1Provider_Deepgram) + assert settings.provider.model == "think-fast" + assert settings.provider.temperature == 1.0 + assert settings.provider.voice_prompt_opt_out is True + + @pytest.mark.parametrize("behavior", [None, "default", "queue", "interrupt"]) def test_sync_dynamic_injection_behaviors_serialize(behavior: str | None) -> None: websocket = _FakeWebSocket() diff --git a/tests/manual/agent/v1/connect/deepgram_think_provider.py b/tests/manual/agent/v1/connect/deepgram_think_provider.py new file mode 100644 index 00000000..78569af3 --- /dev/null +++ b/tests/manual/agent/v1/connect/deepgram_think_provider.py @@ -0,0 +1,66 @@ +"""Manual live integration test for the Deepgram Think provider. + +Set DEEPGRAM_API_KEY before running this script. It passes only after the +Voice Agent service accepts the settings and emits SettingsApplied. +""" + +import threading + +from dotenv import load_dotenv + +from deepgram import DeepgramClient +from deepgram.agent.v1.types import ( + AgentV1Settings, + AgentV1SettingsAgent, + AgentV1SettingsAgentListen, + AgentV1SettingsAgentListenProvider_V2, + AgentV1SettingsAudio, + AgentV1SettingsAudioInput, +) +from deepgram.core.events import EventType +from deepgram.types.speak_settings_v1 import SpeakSettingsV1 +from deepgram.types.speak_settings_v1provider import SpeakSettingsV1Provider_Deepgram +from deepgram.types.think_settings_v1 import ThinkSettingsV1 +from deepgram.types.think_settings_v1provider import ThinkSettingsV1Provider_Deepgram + +load_dotenv() +client = DeepgramClient() +settings_applied = threading.Event() +errors: list[object] = [] + +settings = AgentV1Settings( + audio=AgentV1SettingsAudio(input=AgentV1SettingsAudioInput(encoding="linear16", sample_rate=24000)), + mip_opt_out=True, + agent=AgentV1SettingsAgent( + listen=AgentV1SettingsAgentListen( + provider=AgentV1SettingsAgentListenProvider_V2(type="deepgram", model="flux-general-en") + ), + think=ThinkSettingsV1( + provider=ThinkSettingsV1Provider_Deepgram( + type="deepgram", + model="phonellm-mini-alpha-2-fp8", + temperature=0.2, + reasoning_mode="none", + ), + prompt="Reply with one sentence.", + ), + speak=SpeakSettingsV1( + provider=SpeakSettingsV1Provider_Deepgram(type="deepgram", model="aura-2-asteria-en") + ), + ), +) + +with client.agent.v1.connect() as agent: + def on_message(message: object) -> None: + message_type = getattr(message, "type", "Unknown") + if message_type == "SettingsApplied": + settings_applied.set() + elif message_type == "Error": + errors.append(message) + + agent.on(EventType.MESSAGE, on_message) + threading.Thread(target=agent.start_listening, daemon=True).start() + agent.send_settings(settings) + + if not settings_applied.wait(10): + raise AssertionError(f"Deepgram Think settings were not accepted: {errors!r}") diff --git a/tests/typecheck/compat_aliases.py b/tests/typecheck/compat_aliases.py index 94fd33ce..0bb7ae5a 100644 --- a/tests/typecheck/compat_aliases.py +++ b/tests/typecheck/compat_aliases.py @@ -3,12 +3,15 @@ from typing_extensions import assert_type # 3.10-compatible backport (typing.assert_type is 3.11+) from deepgram import ( + DeepgramReasoningMode, DeepgramThinkLiveProviderV1, DeepgramThinkLiveProviderV1Params, ThinkLiveSettingsV1, ThinkLiveSettingsV1Params, ThinkSettingsV1FunctionsItem, ThinkSettingsV1FunctionsItemParams, + ThinkSettingsV1Provider_Deepgram, + ThinkSettingsV1Provider_DeepgramParams, ) from deepgram import ( ListenV1LanguageHint as RootListenV1LanguageHint, @@ -53,6 +56,9 @@ from deepgram.requests import ( ThinkSettingsV1FunctionsItemParams as RequestsThinkSettingsV1FunctionsItemParams, ) +from deepgram.requests import ( + ThinkSettingsV1Provider_DeepgramParams as RequestsThinkSettingsV1Provider_DeepgramParams, +) from deepgram.types import ( DeepgramThinkLiveProviderV1 as TypesDeepgramThinkLiveProviderV1, ) @@ -67,6 +73,9 @@ from deepgram.types import ( ThinkSettingsV1FunctionsItem as TypesThinkSettingsV1FunctionsItem, ) +from deepgram.types import ( + ThinkSettingsV1Provider_Deepgram as TypesThinkSettingsV1Provider_Deepgram, +) create_key_request: CreateKeyV1RequestOneParams = {"key": "value"} history_content: AgentV1HistoryContentParams = { @@ -127,6 +136,16 @@ think_live_provider = DeepgramThinkLiveProviderV1(presence_check_max_count=3, presence_check_interval_ms=5000) think_live_settings = ThinkLiveSettingsV1(provider=think_live_provider) +deepgram_reasoning_mode: DeepgramReasoningMode = "none" +deepgram_think_provider_params: ThinkSettingsV1Provider_DeepgramParams = { + "type": "deepgram", + "version": "v1", + "model": "think-fast", + "temperature": 0.2, + "reasoning_mode": deepgram_reasoning_mode, + "voice_prompt_opt_out": True, +} +deepgram_think_provider = ThinkSettingsV1Provider_Deepgram(**deepgram_think_provider_params) filler_function = ThinkSettingsV1FunctionsItem( defer_until_eot=True, initial_agent_filler=True, @@ -146,6 +165,8 @@ assert_type(think_live_provider_params, RequestsDeepgramThinkLiveProviderV1Params) assert_type(think_live_settings_params, RequestsThinkLiveSettingsV1Params) assert_type(filler_function_params, RequestsThinkSettingsV1FunctionsItemParams) +assert_type(deepgram_think_provider_params, RequestsThinkSettingsV1Provider_DeepgramParams) +assert_type(deepgram_think_provider, TypesThinkSettingsV1Provider_Deepgram) # language_hint backward-compat: the deprecated singular kwarg (str or list) must # keep type-checking on the V2 listen provider, alongside the canonical plural.