audio / deepgram /client.py
rehanaliraza
app
d5b44da
Raw
History Blame Contribute Delete
17.6 kB
# Copyright 2023-2024 Deepgram SDK contributors. All Rights Reserved.
# 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 Optional
from importlib import import_module
import os
import logging
import deprecation # type: ignore
from . import __version__
from .utils import verboselogs
# common
# pylint: disable=unused-import
from .clients import (
TextSource,
BufferSource,
StreamSource,
FileSource,
UrlSource,
)
from .clients import BaseResponse
from .clients import (
Average,
Intent,
Intents,
IntentsInfo,
Segment,
SentimentInfo,
Sentiment,
Sentiments,
SummaryInfo,
Topic,
Topics,
TopicsInfo,
)
from .clients import (
ModelInfo,
Hit,
Search,
)
from .clients import (
OpenResponse,
CloseResponse,
UnhandledResponse,
ErrorResponse,
)
from .clients import (
DeepgramError,
DeepgramTypeError,
DeepgramModuleError,
DeepgramApiError,
DeepgramUnknownApiError,
)
# listen client
from .clients import ListenRouter, ReadRouter, SpeakRouter, AgentRouter
# speech-to-text
from .clients import LiveClient, AsyncLiveClient # backward compat
from .clients import (
ListenWebSocketClient,
AsyncListenWebSocketClient,
)
from .clients import (
ListenWebSocketOptions,
LiveOptions,
LiveTranscriptionEvents,
)
# live client responses
from .clients import (
#### top level
LiveResultResponse,
ListenWSMetadataResponse,
SpeechStartedResponse,
UtteranceEndResponse,
#### common websocket response
# OpenResponse,
# CloseResponse,
# ErrorResponse,
# UnhandledResponse,
#### unique
ListenWSMetadata,
ListenWSAlternative,
ListenWSChannel,
ListenWSWord,
)
# prerecorded
from .clients import (
# common
# UrlSource,
# BufferSource,
# StreamSource,
# TextSource,
# FileSource,
# unique
PreRecordedStreamSource,
PrerecordedSource,
ListenRestSource,
)
from .clients import (
PreRecordedClient,
AsyncPreRecordedClient,
) # backward compat
from .clients import (
ListenRESTClient,
AsyncListenRESTClient,
)
from .clients import (
ListenRESTOptions,
PrerecordedOptions,
)
# rest client responses
from .clients import (
#### top level
AsyncPrerecordedResponse,
PrerecordedResponse,
SyncPrerecordedResponse,
#### shared
# Average,
# Intent,
# Intents,
# IntentsInfo,
# Segment,
# SentimentInfo,
# Sentiment,
# Sentiments,
# SummaryInfo,
# Topic,
# Topics,
# TopicsInfo,
#### between rest and websocket
# ModelInfo,
# Alternative,
# Hit,
# Search,
# Channel,
# Word,
# unique
Entity,
ListenRESTMetadata,
Paragraph,
Paragraphs,
ListenRESTResults,
Sentence,
Summaries,
SummaryV1,
SummaryV2,
Translation,
Utterance,
Warning,
ListenRESTAlternative,
ListenRESTChannel,
ListenRESTWord,
)
# read
from .clients import ReadClient, AsyncReadClient
from .clients import AnalyzeClient, AsyncAnalyzeClient
from .clients import (
AnalyzeOptions,
AnalyzeStreamSource,
AnalyzeSource,
)
# read client responses
from .clients import (
#### top level
AsyncAnalyzeResponse,
SyncAnalyzeResponse,
AnalyzeResponse,
#### shared
# Average,
# Intent,
# Intents,
# IntentsInfo,
# Segment,
# SentimentInfo,
# Sentiment,
# Sentiments,
# SummaryInfo,
# Topic,
# Topics,
# TopicsInfo,
#### unique
AnalyzeMetadata,
AnalyzeResults,
AnalyzeSummary,
)
# speak
## speak REST
from .clients import (
#### top level
SpeakRESTOptions,
SpeakOptions, # backward compat
#### common
# TextSource,
# BufferSource,
# StreamSource,
# FileSource,
#### unique
SpeakSource,
SpeakRestSource,
SpeakRESTSource,
)
from .clients import (
SpeakClient, # backward compat
SpeakRESTClient,
AsyncSpeakRESTClient,
)
from .clients import (
SpeakResponse, # backward compat
SpeakRESTResponse,
)
## speak WebSocket
from .clients import SpeakWebSocketEvents, SpeakWebSocketMessage
from .clients import (
SpeakWSOptions,
)
from .clients import (
SpeakWebSocketClient,
AsyncSpeakWebSocketClient,
SpeakWSClient,
AsyncSpeakWSClient,
)
from .clients import (
#### top level
SpeakWSMetadataResponse,
FlushedResponse,
ClearedResponse,
WarningResponse,
#### common websocket response
# OpenResponse,
# CloseResponse,
# UnhandledResponse,
# ErrorResponse,
)
# auth client classes
from .clients import AuthRESTClient, AsyncAuthRESTClient
# auth client responses
from .clients import (
GrantTokenResponse,
)
# manage client classes/input
from .clients import ManageClient, AsyncManageClient
from .clients import (
ProjectOptions,
KeyOptions,
ScopeOptions,
InviteOptions,
UsageRequestOptions,
UsageSummaryOptions,
UsageFieldsOptions,
)
# manage client responses
from .clients import (
#### top level
Message,
ProjectsResponse,
ModelResponse,
ModelsResponse,
MembersResponse,
KeyResponse,
KeysResponse,
ScopesResponse,
InvitesResponse,
UsageRequest,
UsageResponse,
UsageRequestsResponse,
UsageSummaryResponse,
UsageFieldsResponse,
BalancesResponse,
#### shared
Project,
STTDetails,
TTSMetadata,
TTSDetails,
Member,
Key,
Invite,
Config,
STTUsageDetails,
Callback,
TokenDetail,
SpeechSegment,
TTSUsageDetails,
STTTokens,
TTSTokens,
UsageSummaryResults,
Resolution,
UsageModel,
Balance,
)
# on-prem
from .clients import (
OnPremClient,
AsyncOnPremClient,
SelfHostedClient,
AsyncSelfHostedClient,
)
# agent
from .clients import AgentWebSocketEvents
# websocket
from .clients import (
AgentWebSocketClient,
AsyncAgentWebSocketClient,
)
from .clients import (
#### common websocket response
# OpenResponse,
# CloseResponse,
# ErrorResponse,
# UnhandledResponse,
#### unique
WelcomeResponse,
SettingsAppliedResponse,
ConversationTextResponse,
UserStartedSpeakingResponse,
AgentThinkingResponse,
FunctionCallRequest,
AgentStartedSpeakingResponse,
AgentAudioDoneResponse,
InjectionRefusedResponse,
)
from .clients import (
# top level
SettingsOptions,
UpdatePromptOptions,
UpdateSpeakOptions,
InjectAgentMessageOptions,
FunctionCallResponse,
AgentKeepAlive,
# sub level
Listen,
ListenProvider,
Speak,
SpeakProvider,
Header,
Item,
Properties,
Parameters,
Function,
Think,
ThinkProvider,
Agent,
Input,
Output,
Audio,
Endpoint,
)
# client errors and options
from .options import DeepgramClientOptions, ClientOptionsFromEnv
from .errors import DeepgramApiKeyError
# pylint: enable=unused-import
class Deepgram: # pylint: disable=broad-exception-raised
"""
The Deepgram class is no longer a class in version 3 of this SDK.
"""
def __init__(self, *anything):
raise Exception(
"""
FATAL ERROR:
You are attempting to instantiate a Deepgram object, which is no longer a class in version 3 of this SDK.
To fix this issue:
1. You need to revert to the previous version 2 of the SDK: pip install deepgram-sdk==2.12.0
2. or, update your application's code to use version 3 of this SDK. See the README for more information.
Things to consider:
- This Version 3 of the SDK requires Python 3.10 or higher.
Older versions (3.9 and lower) of Python are nearing end-of-life: https://devguide.python.org/versions/
Understand the risks of using a version of Python nearing EOL.
- Version 2 of the SDK will receive maintenance updates in the form of security fixes only.
No new features will be added to version 2 of the SDK.
"""
)
class DeepgramClient:
"""
Represents a client for interacting with the Deepgram API.
This class provides a client for making requests to the Deepgram API with various configuration options.
Attributes:
api_key (str): The Deepgram API key used for authentication.
config_options (DeepgramClientOptions): An optional configuration object specifying client options.
Raises:
DeepgramApiKeyError: If the API key is missing or invalid.
Methods:
listen: Returns a ListenClient instance for interacting with Deepgram's transcription services.
manage: (Preferred) Returns a Threaded ManageClient instance for managing Deepgram resources.
selfhosted: (Preferred) Returns an Threaded SelfHostedClient instance for interacting with Deepgram's on-premises API.
asyncmanage: Returns an (Async) ManageClient instance for managing Deepgram resources.
asyncselfhosted: Returns an (Async) SelfHostedClient instance for interacting with Deepgram's on-premises API.
"""
_config: DeepgramClientOptions
_logger: verboselogs.VerboseLogger
def __init__(
self,
api_key: str = "",
config: Optional[DeepgramClientOptions] = None,
):
self._logger = verboselogs.VerboseLogger(__name__)
self._logger.addHandler(logging.StreamHandler())
if api_key == "" and config is not None:
self._logger.info("Attempting to set API key from config object")
api_key = config.api_key
if api_key == "":
self._logger.info("Attempting to set API key from environment variable")
api_key = os.getenv("DEEPGRAM_API_KEY", "")
if api_key == "":
self._logger.warning("WARNING: API key is missing")
self.api_key = api_key
if config is None: # Use default configuration
self._config = DeepgramClientOptions(self.api_key)
else:
config.set_apikey(self.api_key)
self._config = config
@property
def listen(self):
"""
Returns a Listen dot-notation router for interacting with Deepgram's transcription services.
"""
return ListenRouter(self._config)
@property
def read(self):
"""
Returns a Read dot-notation router for interacting with Deepgram's read services.
"""
return ReadRouter(self._config)
@property
def speak(self):
"""
Returns a Speak dot-notation router for interacting with Deepgram's speak services.
"""
return SpeakRouter(self._config)
@property
@deprecation.deprecated(
deprecated_in="3.4.0",
removed_in="4.0.0",
current_version=__version__,
details="deepgram.asyncspeak is deprecated. Use deepgram.speak.asyncrest instead.",
)
def asyncspeak(self):
"""
DEPRECATED: deepgram.asyncspeak is deprecated. Use deepgram.speak.asyncrest instead.
"""
return self.Version(self._config, "asyncspeak")
@property
def manage(self):
"""
Returns a ManageClient instance for managing Deepgram resources.
"""
return self.Version(self._config, "manage")
@property
def asyncmanage(self):
"""
Returns an AsyncManageClient instance for managing Deepgram resources.
"""
return self.Version(self._config, "asyncmanage")
@property
def auth(self):
"""
Returns an AuthRESTClient instance for managing short-lived tokens.
"""
return self.Version(self._config, "auth")
@property
def asyncauth(self):
"""
Returns an AsyncAuthRESTClient instance for managing short-lived tokens.
"""
return self.Version(self._config, "asyncauth")
@property
@deprecation.deprecated(
deprecated_in="3.4.0",
removed_in="4.0.0",
current_version=__version__,
details="deepgram.onprem is deprecated. Use deepgram.speak.selfhosted instead.",
)
def onprem(self):
"""
DEPRECATED: deepgram.onprem is deprecated. Use deepgram.speak.selfhosted instead.
"""
return self.Version(self._config, "selfhosted")
@property
def selfhosted(self):
"""
Returns an SelfHostedClient instance for interacting with Deepgram's on-premises API.
"""
return self.Version(self._config, "selfhosted")
@property
@deprecation.deprecated(
deprecated_in="3.4.0",
removed_in="4.0.0",
current_version=__version__,
details="deepgram.asynconprem is deprecated. Use deepgram.speak.asyncselfhosted instead.",
)
def asynconprem(self):
"""
DEPRECATED: deepgram.asynconprem is deprecated. Use deepgram.speak.asyncselfhosted instead.
"""
return self.Version(self._config, "asyncselfhosted")
@property
def asyncselfhosted(self):
"""
Returns an AsyncSelfHostedClient instance for interacting with Deepgram's on-premises API.
"""
return self.Version(self._config, "asyncselfhosted")
@property
def agent(self):
"""
Returns a Agent dot-notation router for interacting with Deepgram's speak services.
"""
return AgentRouter(self._config)
# INTERNAL CLASSES
class Version:
"""
Represents a version of the Deepgram API.
"""
_logger: verboselogs.VerboseLogger
_config: DeepgramClientOptions
_parent: str
def __init__(self, config, parent: str):
self._logger = verboselogs.VerboseLogger(__name__)
self._logger.addHandler(logging.StreamHandler())
self._logger.setLevel(config.verbose)
self._config = config
self._parent = parent
# FUTURE VERSIONING:
# When v2 or v1.1beta1 or etc. This allows easy access to the latest version of the API.
# @property
# def latest(self):
# match self._parent:
# case "manage":
# return ManageClient(self._config)
# case "selfhosted":
# return SelfHostedClient(self._config)
# case _:
# raise DeepgramModuleError("Invalid parent")
def v(self, version: str = ""):
# pylint: disable-msg=too-many-statements
"""
Returns a client for the specified version of the API.
"""
self._logger.debug("Version.v ENTER")
self._logger.info("version: %s", version)
if len(version) == 0:
self._logger.error("version is empty")
self._logger.debug("Version.v LEAVE")
raise DeepgramModuleError("Invalid module version")
parent = ""
filename = ""
classname = ""
match self._parent:
case "manage":
parent = "manage"
filename = "client"
classname = "ManageClient"
case "asyncmanage":
parent = "manage"
filename = "async_client"
classname = "AsyncManageClient"
case "asyncspeak":
return AsyncSpeakRESTClient(self._config)
case "selfhosted":
parent = "selfhosted"
filename = "client"
classname = "SelfHostedClient"
case "asyncselfhosted":
parent = "selfhosted"
filename = "async_client"
classname = "AsyncSelfHostedClient"
case "auth":
parent = "auth"
filename = "client"
classname = "AuthRESTClient"
case "asyncauth":
parent = "auth"
filename = "async_client"
classname = "AsyncAuthRESTClient"
case _:
self._logger.error("parent unknown: %s", self._parent)
self._logger.debug("Version.v LEAVE")
raise DeepgramModuleError("Invalid parent type")
# create class path
path = f"deepgram.clients.{parent}.v{version}.{filename}"
self._logger.info("path: %s", path)
self._logger.info("classname: %s", classname)
# import class
mod = import_module(path)
if mod is None:
self._logger.error("module path is None")
self._logger.debug("Version.v LEAVE")
raise DeepgramModuleError("Unable to find package")
my_class = getattr(mod, classname)
if my_class is None:
self._logger.error("my_class is None")
self._logger.debug("Version.v LEAVE")
raise DeepgramModuleError("Unable to find class")
# instantiate class
my_class_instance = my_class(self._config)
self._logger.notice("Version.v succeeded")
self._logger.debug("Version.v LEAVE")
return my_class_instance
# pylint: enable-msg=too-many-statements