From 71f53b08aa0df205f8cf5d1aff04d79b15447848 Mon Sep 17 00:00:00 2001 From: Greg Holmes Date: Wed, 15 Apr 2026 17:25:40 +0100 Subject: [PATCH 1/4] chore: initialize SDK regeneration branch From 816ca6c1350827429175f46b7fd0088ed7f3dc8b Mon Sep 17 00:00:00 2001 From: Greg Holmes Date: Wed, 15 Apr 2026 17:26:12 +0100 Subject: [PATCH 2/4] chore: unfreeze files pending regen Co-Authored-By: Claude Opus 4.6 (1M context) --- .fernignore | 14 +- src/deepgram/agent/v1/socket_client.py.bak | 357 ++++++++++++++++++ src/deepgram/listen/v1/socket_client.py.bak | 234 ++++++++++++ src/deepgram/listen/v2/socket_client.py.bak | 220 +++++++++++ src/deepgram/speak/v1/socket_client.py.bak | 235 ++++++++++++ ...ves_item_paragraphs_paragraphs_item.py.bak | 29 ++ ..._v1response_results_utterances_item.py.bak | 28 ++ ..._results_utterances_item_words_item.py.bak | 26 ++ 8 files changed, 1136 insertions(+), 7 deletions(-) create mode 100644 src/deepgram/agent/v1/socket_client.py.bak create mode 100644 src/deepgram/listen/v1/socket_client.py.bak create mode 100644 src/deepgram/listen/v2/socket_client.py.bak create mode 100644 src/deepgram/speak/v1/socket_client.py.bak create mode 100644 src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak create mode 100644 src/deepgram/types/listen_v1response_results_utterances_item.py.bak create mode 100644 src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak diff --git a/.fernignore b/.fernignore index 95cce1f0..416c8831 100644 --- a/.fernignore +++ b/.fernignore @@ -11,16 +11,16 @@ src/deepgram/client.py # - optional message param on control send_ methods (send_keep_alive, send_close_stream, etc.) # so users don't need to instantiate the type themselves for no-payload control messages # [temporarily frozen — generator bugs in construct_type call convention and exception handling] -src/deepgram/agent/v1/socket_client.py -src/deepgram/listen/v1/socket_client.py -src/deepgram/listen/v2/socket_client.py -src/deepgram/speak/v1/socket_client.py +src/deepgram/agent/v1/socket_client.py.bak +src/deepgram/listen/v1/socket_client.py.bak +src/deepgram/listen/v2/socket_client.py.bak +src/deepgram/speak/v1/socket_client.py.bak # Type files with manual int type corrections (Fern generates float for speaker/channel/num_words) # [temporarily frozen — waiting on internal-api-specs#205] -src/deepgram/types/listen_v1response_results_utterances_item.py -src/deepgram/types/listen_v1response_results_utterances_item_words_item.py -src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py +src/deepgram/types/listen_v1response_results_utterances_item.py.bak +src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak +src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak # Hand-written custom tests tests/custom/test_text_builder.py diff --git a/src/deepgram/agent/v1/socket_client.py.bak b/src/deepgram/agent/v1/socket_client.py.bak new file mode 100644 index 00000000..21b30ec1 --- /dev/null +++ b/src/deepgram/agent/v1/socket_client.py.bak @@ -0,0 +1,357 @@ +# This file was auto-generated by Fern from our API Definition. + +import json +import logging +import typing + +import websockets.sync.connection as websockets_sync_connection +from ...core.events import EventEmitterMixin, EventType +from ...core.unchecked_base_model import construct_type +from .types.agent_v1agent_audio_done import AgentV1AgentAudioDone +from .types.agent_v1agent_started_speaking import AgentV1AgentStartedSpeaking +from .types.agent_v1agent_thinking import AgentV1AgentThinking +from .types.agent_v1conversation_text import AgentV1ConversationText +from .types.agent_v1error import AgentV1Error +from .types.agent_v1function_call_request import AgentV1FunctionCallRequest +from .types.agent_v1inject_agent_message import AgentV1InjectAgentMessage +from .types.agent_v1inject_user_message import AgentV1InjectUserMessage +from .types.agent_v1injection_refused import AgentV1InjectionRefused +from .types.agent_v1keep_alive import AgentV1KeepAlive +from .types.agent_v1prompt_updated import AgentV1PromptUpdated +from .types.agent_v1receive_function_call_response import AgentV1ReceiveFunctionCallResponse +from .types.agent_v1send_function_call_response import AgentV1SendFunctionCallResponse +from .types.agent_v1settings import AgentV1Settings +from .types.agent_v1settings_applied import AgentV1SettingsApplied +from .types.agent_v1speak_updated import AgentV1SpeakUpdated +from .types.agent_v1think_updated import AgentV1ThinkUpdated +from .types.agent_v1update_prompt import AgentV1UpdatePrompt +from .types.agent_v1update_speak import AgentV1UpdateSpeak +from .types.agent_v1update_think import AgentV1UpdateThink +from .types.agent_v1user_started_speaking import AgentV1UserStartedSpeaking +from .types.agent_v1warning import AgentV1Warning +from .types.agent_v1welcome import AgentV1Welcome + +try: + from websockets.legacy.client import WebSocketClientProtocol # type: ignore +except ImportError: + from websockets import WebSocketClientProtocol # type: ignore + +_logger = logging.getLogger(__name__) + + +def _sanitize_numeric_types(obj: typing.Any) -> typing.Any: + """ + Recursively convert float values that are whole numbers to int. + + Workaround for Fern-generated models that type integer API fields + (like sample_rate) as float, causing JSON serialization to produce + values like 44100.0 instead of 44100. The Deepgram API rejects + float representations of integer fields. + + See: https://github.com/deepgram/internal-api-specs/issues/205 + """ + if isinstance(obj, dict): + return {k: _sanitize_numeric_types(v) for k, v in obj.items()} + elif isinstance(obj, list): + return [_sanitize_numeric_types(item) for item in obj] + elif isinstance(obj, float) and obj.is_integer(): + return int(obj) + return obj +V1SocketClientResponse = typing.Union[ + AgentV1ReceiveFunctionCallResponse, + AgentV1PromptUpdated, + AgentV1SpeakUpdated, + AgentV1ThinkUpdated, + AgentV1InjectionRefused, + AgentV1Welcome, + AgentV1SettingsApplied, + AgentV1ConversationText, + AgentV1UserStartedSpeaking, + AgentV1AgentThinking, + AgentV1FunctionCallRequest, + AgentV1AgentStartedSpeaking, + AgentV1AgentAudioDone, + AgentV1Error, + AgentV1Warning, + bytes, +] + + +class AsyncV1SocketClient(EventEmitterMixin): + def __init__(self, *, websocket: WebSocketClientProtocol): + super().__init__() + self._websocket = websocket + + async def __aiter__(self): + async for message in self._websocket: + if isinstance(message, bytes): + yield message + else: + try: + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + + async def start_listening(self): + """ + Start listening for messages on the websocket connection. + + Emits events in the following order: + - EventType.OPEN when connection is established + - EventType.MESSAGE for each message received + - EventType.ERROR if an error occurs + - EventType.CLOSE when connection is closed + """ + await self._emit_async(EventType.OPEN, None) + try: + async for raw_message in self._websocket: + if isinstance(raw_message, bytes): + parsed = raw_message + else: + json_data = json.loads(raw_message) + try: + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + await self._emit_async(EventType.MESSAGE, parsed) + except Exception as exc: + await self._emit_async(EventType.ERROR, exc) + finally: + await self._emit_async(EventType.CLOSE, None) + + async def send_settings(self, message: AgentV1Settings) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1Settings. + """ + await self._send_model(message) + + async def send_update_speak(self, message: AgentV1UpdateSpeak) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdateSpeak. + """ + await self._send_model(message) + + async def send_inject_user_message(self, message: AgentV1InjectUserMessage) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1InjectUserMessage. + """ + await self._send_model(message) + + async def send_inject_agent_message(self, message: AgentV1InjectAgentMessage) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1InjectAgentMessage. + """ + await self._send_model(message) + + async def send_function_call_response(self, message: AgentV1SendFunctionCallResponse) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1SendFunctionCallResponse. + """ + await self._send_model(message) + + async def send_keep_alive(self, message: typing.Optional[AgentV1KeepAlive] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1KeepAlive. + """ + await self._send_model(message or AgentV1KeepAlive(type="KeepAlive")) + + async def send_update_prompt(self, message: AgentV1UpdatePrompt) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdatePrompt. + """ + await self._send_model(message) + + async def send_update_think(self, message: AgentV1UpdateThink) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdateThink. + """ + await self._send_model(message) + + async def send_media(self, message: bytes) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a bytes. + """ + await self._send(message) + + async def recv(self) -> V1SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = await self._websocket.recv() + if isinstance(data, bytes): + return data # type: ignore + json_data = json.loads(data) + try: + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") + return json_data # type: ignore + + async def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + await self._websocket.send(data) + + async def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + await self._send(_sanitize_numeric_types(data.dict())) + + +class V1SocketClient(EventEmitterMixin): + def __init__(self, *, websocket: websockets_sync_connection.Connection): + super().__init__() + self._websocket = websocket + + def __iter__(self): + for message in self._websocket: + if isinstance(message, bytes): + yield message + else: + try: + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + + def start_listening(self): + """ + Start listening for messages on the websocket connection. + + Emits events in the following order: + - EventType.OPEN when connection is established + - EventType.MESSAGE for each message received + - EventType.ERROR if an error occurs + - EventType.CLOSE when connection is closed + """ + self._emit(EventType.OPEN, None) + try: + for raw_message in self._websocket: + if isinstance(raw_message, bytes): + parsed = raw_message + else: + json_data = json.loads(raw_message) + try: + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + self._emit(EventType.MESSAGE, parsed) + except Exception as exc: + self._emit(EventType.ERROR, exc) + finally: + self._emit(EventType.CLOSE, None) + + def send_settings(self, message: AgentV1Settings) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1Settings. + """ + self._send_model(message) + + def send_update_speak(self, message: AgentV1UpdateSpeak) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdateSpeak. + """ + self._send_model(message) + + def send_inject_user_message(self, message: AgentV1InjectUserMessage) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1InjectUserMessage. + """ + self._send_model(message) + + def send_inject_agent_message(self, message: AgentV1InjectAgentMessage) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1InjectAgentMessage. + """ + self._send_model(message) + + def send_function_call_response(self, message: AgentV1SendFunctionCallResponse) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1SendFunctionCallResponse. + """ + self._send_model(message) + + def send_keep_alive(self, message: typing.Optional[AgentV1KeepAlive] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1KeepAlive. + """ + self._send_model(message or AgentV1KeepAlive(type="KeepAlive")) + + def send_update_prompt(self, message: AgentV1UpdatePrompt) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdatePrompt. + """ + self._send_model(message) + + def send_update_think(self, message: AgentV1UpdateThink) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a AgentV1UpdateThink. + """ + self._send_model(message) + + def send_media(self, message: bytes) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a bytes. + """ + self._send(message) + + def recv(self) -> V1SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = self._websocket.recv() + if isinstance(data, bytes): + return data # type: ignore + json_data = json.loads(data) + try: + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") + return json_data # type: ignore + + def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + self._websocket.send(data) + + def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + self._send(_sanitize_numeric_types(data.dict())) diff --git a/src/deepgram/listen/v1/socket_client.py.bak b/src/deepgram/listen/v1/socket_client.py.bak new file mode 100644 index 00000000..5954d116 --- /dev/null +++ b/src/deepgram/listen/v1/socket_client.py.bak @@ -0,0 +1,234 @@ +# This file was auto-generated by Fern from our API Definition. + +import json +import logging +import typing + +import websockets.sync.connection as websockets_sync_connection +from ...core.events import EventEmitterMixin, EventType +from ...core.unchecked_base_model import construct_type +from .types.listen_v1close_stream import ListenV1CloseStream +from .types.listen_v1finalize import ListenV1Finalize +from .types.listen_v1keep_alive import ListenV1KeepAlive +from .types.listen_v1metadata import ListenV1Metadata +from .types.listen_v1results import ListenV1Results +from .types.listen_v1speech_started import ListenV1SpeechStarted +from .types.listen_v1utterance_end import ListenV1UtteranceEnd + +try: + from websockets.legacy.client import WebSocketClientProtocol # type: ignore +except ImportError: + from websockets import WebSocketClientProtocol # type: ignore + +_logger = logging.getLogger(__name__) +V1SocketClientResponse = typing.Union[ListenV1Results, ListenV1Metadata, ListenV1UtteranceEnd, ListenV1SpeechStarted] + + +class AsyncV1SocketClient(EventEmitterMixin): + def __init__(self, *, websocket: WebSocketClientProtocol): + super().__init__() + self._websocket = websocket + + async def __aiter__(self): + async for message in self._websocket: + if isinstance(message, bytes): + yield message + else: + try: + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + + async def start_listening(self): + """ + Start listening for messages on the websocket connection. + + Emits events in the following order: + - EventType.OPEN when connection is established + - EventType.MESSAGE for each message received + - EventType.ERROR if an error occurs + - EventType.CLOSE when connection is closed + """ + await self._emit_async(EventType.OPEN, None) + try: + async for raw_message in self._websocket: + if isinstance(raw_message, bytes): + parsed = raw_message + else: + json_data = json.loads(raw_message) + try: + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + await self._emit_async(EventType.MESSAGE, parsed) + except Exception as exc: + await self._emit_async(EventType.ERROR, exc) + finally: + await self._emit_async(EventType.CLOSE, None) + + async def send_media(self, message: bytes) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a bytes. + """ + await self._send(message) + + async def send_finalize(self, message: typing.Optional[ListenV1Finalize] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1Finalize. + """ + await self._send_model(message or ListenV1Finalize(type="Finalize")) + + async def send_close_stream(self, message: typing.Optional[ListenV1CloseStream] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1CloseStream. + """ + await self._send_model(message or ListenV1CloseStream(type="CloseStream")) + + async def send_keep_alive(self, message: typing.Optional[ListenV1KeepAlive] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1KeepAlive. + """ + await self._send_model(message or ListenV1KeepAlive(type="KeepAlive")) + + async def recv(self) -> V1SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = await self._websocket.recv() + if isinstance(data, bytes): + return data # type: ignore + json_data = json.loads(data) + try: + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") + return json_data # type: ignore + + async def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + await self._websocket.send(data) + + async def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + await self._send(data.dict()) + + +class V1SocketClient(EventEmitterMixin): + def __init__(self, *, websocket: websockets_sync_connection.Connection): + super().__init__() + self._websocket = websocket + + def __iter__(self): + for message in self._websocket: + if isinstance(message, bytes): + yield message + else: + try: + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + + def start_listening(self): + """ + Start listening for messages on the websocket connection. + + Emits events in the following order: + - EventType.OPEN when connection is established + - EventType.MESSAGE for each message received + - EventType.ERROR if an error occurs + - EventType.CLOSE when connection is closed + """ + self._emit(EventType.OPEN, None) + try: + for raw_message in self._websocket: + if isinstance(raw_message, bytes): + parsed = raw_message + else: + json_data = json.loads(raw_message) + try: + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + self._emit(EventType.MESSAGE, parsed) + except Exception as exc: + self._emit(EventType.ERROR, exc) + finally: + self._emit(EventType.CLOSE, None) + + def send_media(self, message: bytes) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a bytes. + """ + self._send(message) + + def send_finalize(self, message: typing.Optional[ListenV1Finalize] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1Finalize. + """ + self._send_model(message or ListenV1Finalize(type="Finalize")) + + def send_close_stream(self, message: typing.Optional[ListenV1CloseStream] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1CloseStream. + """ + self._send_model(message or ListenV1CloseStream(type="CloseStream")) + + def send_keep_alive(self, message: typing.Optional[ListenV1KeepAlive] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV1KeepAlive. + """ + self._send_model(message or ListenV1KeepAlive(type="KeepAlive")) + + def recv(self) -> V1SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = self._websocket.recv() + if isinstance(data, bytes): + return data # type: ignore + json_data = json.loads(data) + try: + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") + return json_data # type: ignore + + def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + self._websocket.send(data) + + def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + self._send(data.dict()) diff --git a/src/deepgram/listen/v2/socket_client.py.bak b/src/deepgram/listen/v2/socket_client.py.bak new file mode 100644 index 00000000..d214f0f5 --- /dev/null +++ b/src/deepgram/listen/v2/socket_client.py.bak @@ -0,0 +1,220 @@ +# This file was auto-generated by Fern from our API Definition. + +import json +import logging +import typing + +import websockets.sync.connection as websockets_sync_connection +from ...core.events import EventEmitterMixin, EventType +from ...core.unchecked_base_model import construct_type +from .types.listen_v2close_stream import ListenV2CloseStream +from .types.listen_v2configure_failure import ListenV2ConfigureFailure +from .types.listen_v2connected import ListenV2Connected +from .types.listen_v2fatal_error import ListenV2FatalError +from .types.listen_v2turn_info import ListenV2TurnInfo + +try: + from websockets.legacy.client import WebSocketClientProtocol # type: ignore +except ImportError: + from websockets import WebSocketClientProtocol # type: ignore + +_logger = logging.getLogger(__name__) +V2SocketClientResponse = typing.Union[ + ListenV2Connected, ListenV2TurnInfo, typing.Any, ListenV2ConfigureFailure, ListenV2FatalError +] + + +class AsyncV2SocketClient(EventEmitterMixin): + def __init__(self, *, websocket: WebSocketClientProtocol): + super().__init__() + self._websocket = websocket + + async def __aiter__(self): + async for message in self._websocket: + if isinstance(message, bytes): + yield message + else: + try: + yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + + async def start_listening(self): + """ + Start listening for messages on the websocket connection. + + Emits events in the following order: + - EventType.OPEN when connection is established + - EventType.MESSAGE for each message received + - EventType.ERROR if an error occurs + - EventType.CLOSE when connection is closed + """ + await self._emit_async(EventType.OPEN, None) + try: + async for raw_message in self._websocket: + if isinstance(raw_message, bytes): + parsed = raw_message + else: + json_data = json.loads(raw_message) + try: + parsed = construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + await self._emit_async(EventType.MESSAGE, parsed) + except Exception as exc: + await self._emit_async(EventType.ERROR, exc) + finally: + await self._emit_async(EventType.CLOSE, None) + + async def send_media(self, message: bytes) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a bytes. + """ + await self._send(message) + + async def send_close_stream(self, message: typing.Optional[ListenV2CloseStream] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV2CloseStream. + """ + await self._send_model(message or ListenV2CloseStream(type="CloseStream")) + + async def send_configure(self, message: typing.Any) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a typing.Any. + """ + await self._send(message) + + async def recv(self) -> V2SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = await self._websocket.recv() + if isinstance(data, bytes): + return data # type: ignore + json_data = json.loads(data) + try: + return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") + return json_data # type: ignore + + async def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + await self._websocket.send(data) + + async def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + await self._send(data.dict()) + + +class V2SocketClient(EventEmitterMixin): + def __init__(self, *, websocket: websockets_sync_connection.Connection): + super().__init__() + self._websocket = websocket + + def __iter__(self): + for message in self._websocket: + if isinstance(message, bytes): + yield message + else: + try: + yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + + def start_listening(self): + """ + Start listening for messages on the websocket connection. + + Emits events in the following order: + - EventType.OPEN when connection is established + - EventType.MESSAGE for each message received + - EventType.ERROR if an error occurs + - EventType.CLOSE when connection is closed + """ + self._emit(EventType.OPEN, None) + try: + for raw_message in self._websocket: + if isinstance(raw_message, bytes): + parsed = raw_message + else: + json_data = json.loads(raw_message) + try: + parsed = construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + self._emit(EventType.MESSAGE, parsed) + except Exception as exc: + self._emit(EventType.ERROR, exc) + finally: + self._emit(EventType.CLOSE, None) + + def send_media(self, message: bytes) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a bytes. + """ + self._send(message) + + def send_close_stream(self, message: typing.Optional[ListenV2CloseStream] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a ListenV2CloseStream. + """ + self._send_model(message or ListenV2CloseStream(type="CloseStream")) + + def send_configure(self, message: typing.Any) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a typing.Any. + """ + self._send(message) + + def recv(self) -> V2SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = self._websocket.recv() + if isinstance(data, bytes): + return data # type: ignore + json_data = json.loads(data) + try: + return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") + return json_data # type: ignore + + def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + self._websocket.send(data) + + def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + self._send(data.dict()) diff --git a/src/deepgram/speak/v1/socket_client.py.bak b/src/deepgram/speak/v1/socket_client.py.bak new file mode 100644 index 00000000..e3c28bb5 --- /dev/null +++ b/src/deepgram/speak/v1/socket_client.py.bak @@ -0,0 +1,235 @@ +# This file was auto-generated by Fern from our API Definition. + +import json +import logging +import typing + +import websockets.sync.connection as websockets_sync_connection +from ...core.events import EventEmitterMixin, EventType +from ...core.unchecked_base_model import construct_type +from .types.speak_v1clear import SpeakV1Clear +from .types.speak_v1cleared import SpeakV1Cleared +from .types.speak_v1close import SpeakV1Close +from .types.speak_v1flush import SpeakV1Flush +from .types.speak_v1flushed import SpeakV1Flushed +from .types.speak_v1metadata import SpeakV1Metadata +from .types.speak_v1text import SpeakV1Text +from .types.speak_v1warning import SpeakV1Warning + +try: + from websockets.legacy.client import WebSocketClientProtocol # type: ignore +except ImportError: + from websockets import WebSocketClientProtocol # type: ignore + +_logger = logging.getLogger(__name__) +V1SocketClientResponse = typing.Union[bytes, SpeakV1Metadata, SpeakV1Flushed, SpeakV1Cleared, SpeakV1Warning] + + +class AsyncV1SocketClient(EventEmitterMixin): + def __init__(self, *, websocket: WebSocketClientProtocol): + super().__init__() + self._websocket = websocket + + async def __aiter__(self): + async for message in self._websocket: + if isinstance(message, bytes): + yield message + else: + try: + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + + async def start_listening(self): + """ + Start listening for messages on the websocket connection. + + Emits events in the following order: + - EventType.OPEN when connection is established + - EventType.MESSAGE for each message received + - EventType.ERROR if an error occurs + - EventType.CLOSE when connection is closed + """ + await self._emit_async(EventType.OPEN, None) + try: + async for raw_message in self._websocket: + if isinstance(raw_message, bytes): + parsed = raw_message + else: + json_data = json.loads(raw_message) + try: + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + await self._emit_async(EventType.MESSAGE, parsed) + except Exception as exc: + await self._emit_async(EventType.ERROR, exc) + finally: + await self._emit_async(EventType.CLOSE, None) + + async def send_text(self, message: SpeakV1Text) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Text. + """ + await self._send_model(message) + + async def send_flush(self, message: typing.Optional[SpeakV1Flush] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Flush. + """ + await self._send_model(message or SpeakV1Flush(type="Flush")) + + async def send_clear(self, message: typing.Optional[SpeakV1Clear] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Clear. + """ + await self._send_model(message or SpeakV1Clear(type="Clear")) + + async def send_close(self, message: typing.Optional[SpeakV1Close] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Close. + """ + await self._send_model(message or SpeakV1Close(type="Close")) + + async def recv(self) -> V1SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = await self._websocket.recv() + if isinstance(data, bytes): + return data # type: ignore + json_data = json.loads(data) + try: + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") + return json_data # type: ignore + + async def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + await self._websocket.send(data) + + async def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + await self._send(data.dict()) + + +class V1SocketClient(EventEmitterMixin): + def __init__(self, *, websocket: websockets_sync_connection.Connection): + super().__init__() + self._websocket = websocket + + def __iter__(self): + for message in self._websocket: + if isinstance(message, bytes): + yield message + else: + try: + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + + def start_listening(self): + """ + Start listening for messages on the websocket connection. + + Emits events in the following order: + - EventType.OPEN when connection is established + - EventType.MESSAGE for each message received + - EventType.ERROR if an error occurs + - EventType.CLOSE when connection is closed + """ + self._emit(EventType.OPEN, None) + try: + for raw_message in self._websocket: + if isinstance(raw_message, bytes): + parsed = raw_message + else: + json_data = json.loads(raw_message) + try: + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning( + "Skipping unknown WebSocket message; update your SDK version to support new message types." + ) + continue + self._emit(EventType.MESSAGE, parsed) + except Exception as exc: + self._emit(EventType.ERROR, exc) + finally: + self._emit(EventType.CLOSE, None) + + def send_text(self, message: SpeakV1Text) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Text. + """ + self._send_model(message) + + def send_flush(self, message: typing.Optional[SpeakV1Flush] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Flush. + """ + self._send_model(message or SpeakV1Flush(type="Flush")) + + def send_clear(self, message: typing.Optional[SpeakV1Clear] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Clear. + """ + self._send_model(message or SpeakV1Clear(type="Clear")) + + def send_close(self, message: typing.Optional[SpeakV1Close] = None) -> None: + """ + Send a message to the websocket connection. + The message will be sent as a SpeakV1Close. + """ + self._send_model(message or SpeakV1Close(type="Close")) + + def recv(self) -> V1SocketClientResponse: + """ + Receive a message from the websocket connection. + """ + data = self._websocket.recv() + if isinstance(data, bytes): + return data # type: ignore + json_data = json.loads(data) + try: + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + except Exception: + _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") + return json_data # type: ignore + + def _send(self, data: typing.Any) -> None: + """ + Send a message to the websocket connection. + """ + if isinstance(data, dict): + data = json.dumps(data) + self._websocket.send(data) + + def _send_model(self, data: typing.Any) -> None: + """ + Send a Pydantic model to the websocket connection. + """ + self._send(data.dict()) diff --git a/src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak b/src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak new file mode 100644 index 00000000..eec3866b --- /dev/null +++ b/src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak @@ -0,0 +1,29 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from ..core.unchecked_base_model import UncheckedBaseModel +from .listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item_sentences_item import ( + ListenV1ResponseResultsChannelsItemAlternativesItemParagraphsParagraphsItemSentencesItem, +) + + +class ListenV1ResponseResultsChannelsItemAlternativesItemParagraphsParagraphsItem(UncheckedBaseModel): + sentences: typing.Optional[ + typing.List[ListenV1ResponseResultsChannelsItemAlternativesItemParagraphsParagraphsItemSentencesItem] + ] = None + speaker: typing.Optional[int] = None + num_words: typing.Optional[int] = None + start: typing.Optional[float] = None + end: typing.Optional[float] = 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 diff --git a/src/deepgram/types/listen_v1response_results_utterances_item.py.bak b/src/deepgram/types/listen_v1response_results_utterances_item.py.bak new file mode 100644 index 00000000..0947d9f5 --- /dev/null +++ b/src/deepgram/types/listen_v1response_results_utterances_item.py.bak @@ -0,0 +1,28 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from ..core.unchecked_base_model import UncheckedBaseModel +from .listen_v1response_results_utterances_item_words_item import ListenV1ResponseResultsUtterancesItemWordsItem + + +class ListenV1ResponseResultsUtterancesItem(UncheckedBaseModel): + start: typing.Optional[float] = None + end: typing.Optional[float] = None + confidence: typing.Optional[float] = None + channel: typing.Optional[int] = None + transcript: typing.Optional[str] = None + words: typing.Optional[typing.List[ListenV1ResponseResultsUtterancesItemWordsItem]] = None + speaker: typing.Optional[int] = None + id: typing.Optional[str] = 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 diff --git a/src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak b/src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak new file mode 100644 index 00000000..6cd1313a --- /dev/null +++ b/src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak @@ -0,0 +1,26 @@ +# This file was auto-generated by Fern from our API Definition. + +import typing + +import pydantic +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +from ..core.unchecked_base_model import UncheckedBaseModel + + +class ListenV1ResponseResultsUtterancesItemWordsItem(UncheckedBaseModel): + word: typing.Optional[str] = None + start: typing.Optional[float] = None + end: typing.Optional[float] = None + confidence: typing.Optional[float] = None + speaker: typing.Optional[int] = None + speaker_confidence: typing.Optional[float] = None + punctuated_word: typing.Optional[str] = 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 From 37c9e231d8a4a327adf468aaf492690da569a7e2 Mon Sep 17 00:00:00 2001 From: fern-api <115122769+fern-api[bot]@users.noreply.github.com> Date: Wed, 15 Apr 2026 16:28:51 +0000 Subject: [PATCH 3/4] SDK regeneration --- .fern/metadata.json | 2 +- poetry.lock | 6 +-- src/deepgram/agent/v1/socket_client.py | 50 ++++++------------- src/deepgram/listen/v1/socket_client.py | 42 ++++++++-------- src/deepgram/listen/v2/socket_client.py | 26 +++++----- ...natives_item_paragraphs_paragraphs_item.py | 4 +- ...sten_v1response_results_utterances_item.py | 4 +- ...onse_results_utterances_item_words_item.py | 2 +- src/deepgram/speak/v1/socket_client.py | 42 ++++++++-------- wiremock/wiremock-mappings.json | 2 +- 10 files changed, 84 insertions(+), 96 deletions(-) diff --git a/.fern/metadata.json b/.fern/metadata.json index 00c1530d..6448d51a 100644 --- a/.fern/metadata.json +++ b/.fern/metadata.json @@ -16,6 +16,6 @@ "skip_validation": true } }, - "originGitCommit": "aa8e0677bcaea82c02a5934c61d195b35921b33d", + "originGitCommit": "14bcc648246f9ac9fb131ba74e7bdaf0cc515238", "sdkVersion": "6.1.2" } \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index ab52d826..e7969f55 100644 --- a/poetry.lock +++ b/poetry.lock @@ -374,13 +374,13 @@ files = [ [[package]] name = "packaging" -version = "26.0" +version = "26.1" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, - {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, + {file = "packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f"}, + {file = "packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de"}, ] [[package]] diff --git a/src/deepgram/agent/v1/socket_client.py b/src/deepgram/agent/v1/socket_client.py index 21b30ec1..3d455f7f 100644 --- a/src/deepgram/agent/v1/socket_client.py +++ b/src/deepgram/agent/v1/socket_client.py @@ -3,7 +3,9 @@ import json import logging import typing +from json.decoder import JSONDecodeError +import websockets import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.unchecked_base_model import construct_type @@ -37,26 +39,6 @@ from websockets import WebSocketClientProtocol # type: ignore _logger = logging.getLogger(__name__) - - -def _sanitize_numeric_types(obj: typing.Any) -> typing.Any: - """ - Recursively convert float values that are whole numbers to int. - - Workaround for Fern-generated models that type integer API fields - (like sample_rate) as float, causing JSON serialization to produce - values like 44100.0 instead of 44100. The Deepgram API rejects - float representations of integer fields. - - See: https://github.com/deepgram/internal-api-specs/issues/205 - """ - if isinstance(obj, dict): - return {k: _sanitize_numeric_types(v) for k, v in obj.items()} - elif isinstance(obj, list): - return [_sanitize_numeric_types(item) for item in obj] - elif isinstance(obj, float) and obj.is_integer(): - return int(obj) - return obj V1SocketClientResponse = typing.Union[ AgentV1ReceiveFunctionCallResponse, AgentV1PromptUpdated, @@ -88,7 +70,7 @@ async def __aiter__(self): yield message else: try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -113,14 +95,14 @@ async def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue await self._emit_async(EventType.MESSAGE, parsed) - except Exception as exc: + except (websockets.WebSocketException, JSONDecodeError) as exc: await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) @@ -160,12 +142,12 @@ async def send_function_call_response(self, message: AgentV1SendFunctionCallResp """ await self._send_model(message) - async def send_keep_alive(self, message: typing.Optional[AgentV1KeepAlive] = None) -> None: + async def send_keep_alive(self, message: AgentV1KeepAlive) -> None: """ Send a message to the websocket connection. The message will be sent as a AgentV1KeepAlive. """ - await self._send_model(message or AgentV1KeepAlive(type="KeepAlive")) + await self._send_model(message) async def send_update_prompt(self, message: AgentV1UpdatePrompt) -> None: """ @@ -197,7 +179,7 @@ async def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + return construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -214,7 +196,7 @@ async def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - await self._send(_sanitize_numeric_types(data.dict())) + await self._send(data.dict()) class V1SocketClient(EventEmitterMixin): @@ -228,7 +210,7 @@ def __iter__(self): yield message else: try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -253,14 +235,14 @@ def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue self._emit(EventType.MESSAGE, parsed) - except Exception as exc: + except (websockets.WebSocketException, JSONDecodeError) as exc: self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) @@ -300,12 +282,12 @@ def send_function_call_response(self, message: AgentV1SendFunctionCallResponse) """ self._send_model(message) - def send_keep_alive(self, message: typing.Optional[AgentV1KeepAlive] = None) -> None: + def send_keep_alive(self, message: AgentV1KeepAlive) -> None: """ Send a message to the websocket connection. The message will be sent as a AgentV1KeepAlive. """ - self._send_model(message or AgentV1KeepAlive(type="KeepAlive")) + self._send_model(message) def send_update_prompt(self, message: AgentV1UpdatePrompt) -> None: """ @@ -337,7 +319,7 @@ def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + return construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -354,4 +336,4 @@ def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - self._send(_sanitize_numeric_types(data.dict())) + self._send(data.dict()) diff --git a/src/deepgram/listen/v1/socket_client.py b/src/deepgram/listen/v1/socket_client.py index 5954d116..011786d2 100644 --- a/src/deepgram/listen/v1/socket_client.py +++ b/src/deepgram/listen/v1/socket_client.py @@ -3,7 +3,9 @@ import json import logging import typing +from json.decoder import JSONDecodeError +import websockets import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.unchecked_base_model import construct_type @@ -35,7 +37,7 @@ async def __aiter__(self): yield message else: try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -60,14 +62,14 @@ async def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue await self._emit_async(EventType.MESSAGE, parsed) - except Exception as exc: + except (websockets.WebSocketException, JSONDecodeError) as exc: await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) @@ -79,26 +81,26 @@ async def send_media(self, message: bytes) -> None: """ await self._send(message) - async def send_finalize(self, message: typing.Optional[ListenV1Finalize] = None) -> None: + async def send_finalize(self, message: ListenV1Finalize) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1Finalize. """ - await self._send_model(message or ListenV1Finalize(type="Finalize")) + await self._send_model(message) - async def send_close_stream(self, message: typing.Optional[ListenV1CloseStream] = None) -> None: + async def send_close_stream(self, message: ListenV1CloseStream) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1CloseStream. """ - await self._send_model(message or ListenV1CloseStream(type="CloseStream")) + await self._send_model(message) - async def send_keep_alive(self, message: typing.Optional[ListenV1KeepAlive] = None) -> None: + async def send_keep_alive(self, message: ListenV1KeepAlive) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1KeepAlive. """ - await self._send_model(message or ListenV1KeepAlive(type="KeepAlive")) + await self._send_model(message) async def recv(self) -> V1SocketClientResponse: """ @@ -109,7 +111,7 @@ async def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + return construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -140,7 +142,7 @@ def __iter__(self): yield message else: try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -165,14 +167,14 @@ def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue self._emit(EventType.MESSAGE, parsed) - except Exception as exc: + except (websockets.WebSocketException, JSONDecodeError) as exc: self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) @@ -184,26 +186,26 @@ def send_media(self, message: bytes) -> None: """ self._send(message) - def send_finalize(self, message: typing.Optional[ListenV1Finalize] = None) -> None: + def send_finalize(self, message: ListenV1Finalize) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1Finalize. """ - self._send_model(message or ListenV1Finalize(type="Finalize")) + self._send_model(message) - def send_close_stream(self, message: typing.Optional[ListenV1CloseStream] = None) -> None: + def send_close_stream(self, message: ListenV1CloseStream) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1CloseStream. """ - self._send_model(message or ListenV1CloseStream(type="CloseStream")) + self._send_model(message) - def send_keep_alive(self, message: typing.Optional[ListenV1KeepAlive] = None) -> None: + def send_keep_alive(self, message: ListenV1KeepAlive) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1KeepAlive. """ - self._send_model(message or ListenV1KeepAlive(type="KeepAlive")) + self._send_model(message) def recv(self) -> V1SocketClientResponse: """ @@ -214,7 +216,7 @@ def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + return construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore diff --git a/src/deepgram/listen/v2/socket_client.py b/src/deepgram/listen/v2/socket_client.py index d214f0f5..d6dd1e05 100644 --- a/src/deepgram/listen/v2/socket_client.py +++ b/src/deepgram/listen/v2/socket_client.py @@ -3,7 +3,9 @@ import json import logging import typing +from json.decoder import JSONDecodeError +import websockets import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.unchecked_base_model import construct_type @@ -35,7 +37,7 @@ async def __aiter__(self): yield message else: try: - yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore + yield construct_type(V2SocketClientResponse, json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -60,14 +62,14 @@ async def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore + parsed = construct_type(V2SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue await self._emit_async(EventType.MESSAGE, parsed) - except Exception as exc: + except (websockets.WebSocketException, JSONDecodeError) as exc: await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) @@ -79,12 +81,12 @@ async def send_media(self, message: bytes) -> None: """ await self._send(message) - async def send_close_stream(self, message: typing.Optional[ListenV2CloseStream] = None) -> None: + async def send_close_stream(self, message: ListenV2CloseStream) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV2CloseStream. """ - await self._send_model(message or ListenV2CloseStream(type="CloseStream")) + await self._send_model(message) async def send_configure(self, message: typing.Any) -> None: """ @@ -102,7 +104,7 @@ async def recv(self) -> V2SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore + return construct_type(V2SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -133,7 +135,7 @@ def __iter__(self): yield message else: try: - yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore + yield construct_type(V2SocketClientResponse, json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -158,14 +160,14 @@ def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore + parsed = construct_type(V2SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue self._emit(EventType.MESSAGE, parsed) - except Exception as exc: + except (websockets.WebSocketException, JSONDecodeError) as exc: self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) @@ -177,12 +179,12 @@ def send_media(self, message: bytes) -> None: """ self._send(message) - def send_close_stream(self, message: typing.Optional[ListenV2CloseStream] = None) -> None: + def send_close_stream(self, message: ListenV2CloseStream) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV2CloseStream. """ - self._send_model(message or ListenV2CloseStream(type="CloseStream")) + self._send_model(message) def send_configure(self, message: typing.Any) -> None: """ @@ -200,7 +202,7 @@ def recv(self) -> V2SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore + return construct_type(V2SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore diff --git a/src/deepgram/requests/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py b/src/deepgram/requests/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py index 6c35ddb1..c0a334e1 100644 --- a/src/deepgram/requests/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py +++ b/src/deepgram/requests/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py @@ -12,7 +12,7 @@ class ListenV1ResponseResultsChannelsItemAlternativesItemParagraphsParagraphsIte sentences: typing_extensions.NotRequired[ typing.Sequence[ListenV1ResponseResultsChannelsItemAlternativesItemParagraphsParagraphsItemSentencesItemParams] ] - speaker: typing_extensions.NotRequired[float] - num_words: typing_extensions.NotRequired[float] + speaker: typing_extensions.NotRequired[int] + num_words: typing_extensions.NotRequired[int] start: typing_extensions.NotRequired[float] end: typing_extensions.NotRequired[float] diff --git a/src/deepgram/requests/listen_v1response_results_utterances_item.py b/src/deepgram/requests/listen_v1response_results_utterances_item.py index 8298c202..82fba7f9 100644 --- a/src/deepgram/requests/listen_v1response_results_utterances_item.py +++ b/src/deepgram/requests/listen_v1response_results_utterances_item.py @@ -10,8 +10,8 @@ class ListenV1ResponseResultsUtterancesItemParams(typing_extensions.TypedDict): start: typing_extensions.NotRequired[float] end: typing_extensions.NotRequired[float] confidence: typing_extensions.NotRequired[float] - channel: typing_extensions.NotRequired[float] + channel: typing_extensions.NotRequired[int] transcript: typing_extensions.NotRequired[str] words: typing_extensions.NotRequired[typing.Sequence[ListenV1ResponseResultsUtterancesItemWordsItemParams]] - speaker: typing_extensions.NotRequired[float] + speaker: typing_extensions.NotRequired[int] id: typing_extensions.NotRequired[str] diff --git a/src/deepgram/requests/listen_v1response_results_utterances_item_words_item.py b/src/deepgram/requests/listen_v1response_results_utterances_item_words_item.py index ea2bbf42..8ec08cc9 100644 --- a/src/deepgram/requests/listen_v1response_results_utterances_item_words_item.py +++ b/src/deepgram/requests/listen_v1response_results_utterances_item_words_item.py @@ -8,6 +8,6 @@ class ListenV1ResponseResultsUtterancesItemWordsItemParams(typing_extensions.Typ start: typing_extensions.NotRequired[float] end: typing_extensions.NotRequired[float] confidence: typing_extensions.NotRequired[float] - speaker: typing_extensions.NotRequired[float] + speaker: typing_extensions.NotRequired[int] speaker_confidence: typing_extensions.NotRequired[float] punctuated_word: typing_extensions.NotRequired[str] diff --git a/src/deepgram/speak/v1/socket_client.py b/src/deepgram/speak/v1/socket_client.py index e3c28bb5..461c8190 100644 --- a/src/deepgram/speak/v1/socket_client.py +++ b/src/deepgram/speak/v1/socket_client.py @@ -3,7 +3,9 @@ import json import logging import typing +from json.decoder import JSONDecodeError +import websockets import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.unchecked_base_model import construct_type @@ -36,7 +38,7 @@ async def __aiter__(self): yield message else: try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -61,14 +63,14 @@ async def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue await self._emit_async(EventType.MESSAGE, parsed) - except Exception as exc: + except (websockets.WebSocketException, JSONDecodeError) as exc: await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) @@ -80,26 +82,26 @@ async def send_text(self, message: SpeakV1Text) -> None: """ await self._send_model(message) - async def send_flush(self, message: typing.Optional[SpeakV1Flush] = None) -> None: + async def send_flush(self, message: SpeakV1Flush) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Flush. """ - await self._send_model(message or SpeakV1Flush(type="Flush")) + await self._send_model(message) - async def send_clear(self, message: typing.Optional[SpeakV1Clear] = None) -> None: + async def send_clear(self, message: SpeakV1Clear) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Clear. """ - await self._send_model(message or SpeakV1Clear(type="Clear")) + await self._send_model(message) - async def send_close(self, message: typing.Optional[SpeakV1Close] = None) -> None: + async def send_close(self, message: SpeakV1Close) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Close. """ - await self._send_model(message or SpeakV1Close(type="Close")) + await self._send_model(message) async def recv(self) -> V1SocketClientResponse: """ @@ -110,7 +112,7 @@ async def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + return construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -141,7 +143,7 @@ def __iter__(self): yield message else: try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore + yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -166,14 +168,14 @@ def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue self._emit(EventType.MESSAGE, parsed) - except Exception as exc: + except (websockets.WebSocketException, JSONDecodeError) as exc: self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) @@ -185,26 +187,26 @@ def send_text(self, message: SpeakV1Text) -> None: """ self._send_model(message) - def send_flush(self, message: typing.Optional[SpeakV1Flush] = None) -> None: + def send_flush(self, message: SpeakV1Flush) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Flush. """ - self._send_model(message or SpeakV1Flush(type="Flush")) + self._send_model(message) - def send_clear(self, message: typing.Optional[SpeakV1Clear] = None) -> None: + def send_clear(self, message: SpeakV1Clear) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Clear. """ - self._send_model(message or SpeakV1Clear(type="Clear")) + self._send_model(message) - def send_close(self, message: typing.Optional[SpeakV1Close] = None) -> None: + def send_close(self, message: SpeakV1Close) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Close. """ - self._send_model(message or SpeakV1Close(type="Close")) + self._send_model(message) def recv(self) -> V1SocketClientResponse: """ @@ -215,7 +217,7 @@ def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore + return construct_type(V1SocketClientResponse, json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore diff --git a/wiremock/wiremock-mappings.json b/wiremock/wiremock-mappings.json index 05e23bc8..630c6a96 100644 --- a/wiremock/wiremock-mappings.json +++ b/wiremock/wiremock-mappings.json @@ -1 +1 @@ -{"mappings": [{"id": "533b5d52-ab21-4763-aaae-87cf52f49aa5", "name": "List Agent Think Models - default", "request": {"urlPathTemplate": "/v1/agent/settings/think/models", "method": "GET"}, "response": {"status": 200, "body": "{\n \"models\": [\n {\n \"id\": \"gpt-5\",\n \"name\": \"name\",\n \"provider\": \"open_ai\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "533b5d52-ab21-4763-aaae-87cf52f49aa5", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}, "postServeActions": []}, {"id": "20e1029e-8bb9-4092-a809-b943e60822ef", "name": "Token-based Authentication - default", "request": {"urlPathTemplate": "/v1/auth/grant", "method": "POST"}, "response": {"status": 200, "body": "{\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U\",\n \"expires_in\": 30\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "20e1029e-8bb9-4092-a809-b943e60822ef", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "49d8d51a-7f01-4598-804f-b6f54cdc22da", "name": "Transcribe and analyze pre-recorded audio and video - default", "request": {"urlPathTemplate": "/v1/listen", "method": "POST", "queryParameters": {"callback": {"equalTo": "callback"}, "callback_method": {"equalTo": "POST"}, "extra": {"equalTo": "extra"}, "sentiment": {"equalTo": "true"}, "summarize": {"equalTo": "v2"}, "tag": {"equalTo": "tag"}, "topics": {"equalTo": "true"}, "custom_topic": {"equalTo": "custom_topic"}, "custom_topic_mode": {"equalTo": "extended"}, "intents": {"equalTo": "true"}, "custom_intent": {"equalTo": "custom_intent"}, "custom_intent_mode": {"equalTo": "extended"}, "detect_entities": {"equalTo": "true"}, "detect_language": {"equalTo": "true"}, "diarize": {"equalTo": "true"}, "dictation": {"equalTo": "true"}, "encoding": {"equalTo": "linear16"}, "filler_words": {"equalTo": "true"}, "keywords": {"equalTo": "keywords"}, "language": {"equalTo": "language"}, "measurements": {"equalTo": "true"}, "model": {"equalTo": "nova-3"}, "multichannel": {"equalTo": "true"}, "numerals": {"equalTo": "true"}, "paragraphs": {"equalTo": "true"}, "profanity_filter": {"equalTo": "true"}, "punctuate": {"equalTo": "true"}, "redact": {"equalTo": "redact"}, "replace": {"equalTo": "replace"}, "search": {"equalTo": "search"}, "smart_format": {"equalTo": "true"}, "utterances": {"equalTo": "true"}, "utt_split": {"equalTo": "1.1"}, "version": {"equalTo": "latest"}, "mip_opt_out": {"equalTo": "true"}}}, "response": {"status": 200, "body": "{\n \"metadata\": {\n \"request_id\": \"a847f427-4ad5-4d67-9b95-db801e58251c\",\n \"sha256\": \"154e291ecfa8be6ab8343560bcc109008fa7853eb5372533e8efdefc9b504c33\",\n \"created\": \"2024-05-12T18:57:13Z\",\n \"duration\": 25.933313,\n \"channels\": 1,\n \"models\": [\n \"30089e05-99d1-4376-b32e-c263170674af\"\n ],\n \"model_info\": {\n \"30089e05-99d1-4376-b32e-c263170674af\": {\n \"name\": \"2-general-nova\",\n \"version\": \"2024-01-09.29447\",\n \"arch\": \"nova-2\"\n }\n },\n \"summary_info\": {\n \"model_uuid\": \"67875a7f-c9c4-48a0-aa55-5bdb8a91c34a\",\n \"input_tokens\": 95,\n \"output_tokens\": 63\n },\n \"sentiment_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 105\n },\n \"topics_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 7\n },\n \"intents_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 4\n },\n \"tags\": [\n \"test\"\n ]\n },\n \"results\": {\n \"channels\": [\n {}\n ],\n \"utterances\": [\n {}\n ],\n \"summary\": {\n \"result\": \"success\",\n \"short\": \"Speaker 0 discusses the significance of the first all-female spacewalk with an all-female team, stating that it is a tribute to the skilled and qualified women who were denied opportunities in the past.\"\n },\n \"topics\": {\n \"results\": {\n \"topics\": {\n \"segments\": [\n {\n \"text\": \"And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 32,\n \"end_word\": 69,\n \"topics\": [\n {\n \"topic\": \"Spacewalk\",\n \"confidence_score\": 0.91581345\n }\n ]\n }\n ]\n }\n }\n },\n \"intents\": {\n \"results\": {\n \"intents\": {\n \"segments\": [\n {\n \"text\": \"If you found this valuable, you can subscribe to the show on spotify or your favorite podcast app.\",\n \"start_word\": 354,\n \"end_word\": 414,\n \"intents\": [\n {\n \"intent\": \"Encourage podcasting\",\n \"confidence_score\": 0.0038975573\n }\n ]\n }\n ]\n }\n }\n },\n \"sentiments\": {\n \"segments\": [\n {\n \"text\": \"Yeah. As as much as, um, it's worth celebrating, uh, the first, uh, spacewalk, um, with an all-female team, I think many of us are looking forward to it just being normal. And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 0,\n \"end_word\": 69,\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810546875\n }\n ],\n \"average\": {\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810185185185185\n }\n }\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "49d8d51a-7f01-4598-804f-b6f54cdc22da", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "0a0be61b-f024-4120-9c54-23bca3e07c93", "name": "List Models - default", "request": {"urlPathTemplate": "/v1/models", "method": "GET", "queryParameters": {"include_outdated": {"equalTo": "true"}}}, "response": {"status": 200, "body": "{\n \"stt\": [\n {\n \"name\": \"nova-3\",\n \"canonical_name\": \"nova-3\",\n \"architecture\": \"base\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2021-11-10.1\",\n \"uuid\": \"6b28e919-8427-4f32-9847-492e2efd7daf\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": true\n }\n ],\n \"tts\": [\n {\n \"name\": \"zeus\",\n \"canonical_name\": \"aura-2-zeus-en\",\n \"architecture\": \"aura-2\",\n \"languages\": [\n \"en\",\n \"en-US\"\n ],\n \"version\": \"2025-04-07.0\",\n \"uuid\": \"2baf189d-91ac-481d-b6d1-750888667b31\",\n \"metadata\": {\n \"accent\": \"American\",\n \"age\": \"Adult\",\n \"color\": \"#C58DFF\",\n \"image\": \"https://static.deepgram.com/examples/avatars/zeus.jpg\",\n \"sample\": \"https://static.deepgram.com/examples/Aura-2-zeus.wav\",\n \"tags\": [\n \"masculine\",\n \"deep\",\n \"trustworthy\",\n \"smooth\"\n ],\n \"use_cases\": [\n \"IVR\"\n ]\n }\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "0a0be61b-f024-4120-9c54-23bca3e07c93", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}, "postServeActions": []}, {"id": "0f94d3ea-43b6-4a1a-bce4-ab05b85440ae", "name": "Get a specific Model - default", "request": {"urlPathTemplate": "/v1/models/{model_id}", "method": "GET", "pathParameters": {"model_id": {"equalTo": "af6e9977-99f6-4d8f-b6f5-dfdf6fb6e291"}}}, "response": {"status": 200, "body": "{\n \"name\": \"general\",\n \"canonical_name\": \"enhanced-general\",\n \"architecture\": \"polaris\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2022-05-18.1\",\n \"uuid\": \"c7226e9e-ae1c-4057-ae2a-a71a6b0dc588\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": false\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "0f94d3ea-43b6-4a1a-bce4-ab05b85440ae", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "d08cac56-bc4d-4756-8fd1-d508914334d5", "name": "List Projects - default", "request": {"urlPathTemplate": "/v1/projects", "method": "GET"}, "response": {"status": 200, "body": "{\n \"projects\": [\n {\n \"project_id\": \"project_id\",\n \"name\": \"name\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "d08cac56-bc4d-4756-8fd1-d508914334d5", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}, "postServeActions": []}, {"id": "6f0163a8-530c-4e25-bbe0-9ca86b9525dc", "name": "Get a Project - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"limit": {"equalTo": "1.1"}, "page": {"equalTo": "1.1"}}}, "response": {"status": 200, "body": "{\n \"project_id\": \"project_id\",\n \"mip_opt_out\": true,\n \"name\": \"name\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "6f0163a8-530c-4e25-bbe0-9ca86b9525dc", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "68918577-6401-4439-8533-356257ff7bcf", "name": "Delete a Project - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}", "method": "DELETE", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"message\": \"message\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "68918577-6401-4439-8533-356257ff7bcf", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "659fc38b-3934-4e43-93bf-d331f547449e", "name": "Update a Project - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}", "method": "PATCH", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"message\": \"Successfully updated project info.\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "659fc38b-3934-4e43-93bf-d331f547449e", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "43ae6622-ad2f-4c81-9bc9-a8bbe17ef9d8", "name": "Leave a Project - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/leave", "method": "DELETE", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"message\": \"message\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "43ae6622-ad2f-4c81-9bc9-a8bbe17ef9d8", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "032d9b1c-3b87-40fb-bfab-8c5be92a5d71", "name": "List Project Keys - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/keys", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"status": {"equalTo": "active"}}}, "response": {"status": 200, "body": "{\n \"api_keys\": [\n {\n \"member\": {\n \"member_id\": \"1000-2000-3000-4000\",\n \"email\": \"john@test.com\"\n },\n \"api_key\": {\n \"api_key_id\": \"1234567890abcdef1234567890abcdef\",\n \"comment\": \"A comment\",\n \"scopes\": [\n \"admin\"\n ],\n \"created\": \"2021-01-01T00:00:00Z\"\n }\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "032d9b1c-3b87-40fb-bfab-8c5be92a5d71", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "0167c735-0b6f-4715-8df8-32300d4dae72", "name": "Create a Project Key - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/keys", "method": "POST", "pathParameters": {"project_id": {"equalTo": "project_id"}}}, "response": {"status": 200, "body": "{\n \"api_key_id\": \"api_key_id\",\n \"key\": \"key\",\n \"comment\": \"comment\",\n \"scopes\": [\n \"scopes\",\n \"scopes\"\n ],\n \"tags\": [\n \"tags\",\n \"tags\"\n ],\n \"expiration_date\": \"2024-01-15T09:30:00Z\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "0167c735-0b6f-4715-8df8-32300d4dae72", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "c9812dd3-f87e-4798-aec3-af0933330dd5", "name": "Get a Project Key - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/keys/{key_id}", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "key_id": {"equalTo": "123456789012345678901234"}}}, "response": {"status": 200, "body": "{\n \"item\": {\n \"member\": {\n \"member_id\": \"1000-2000-3000-4000\",\n \"email\": \"john@test.com\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"api_key\": {\n \"api_key_id\": \"1000-2000-3000-4000\",\n \"comment\": \"A comment\",\n \"scopes\": [\n \"admin\"\n ],\n \"tags\": [\n \"prod\",\n \"west-region\"\n ],\n \"expiration_date\": \"2021-01-01T00:00:00Z\",\n \"created\": \"2021-01-01T00:00:00Z\"\n }\n }\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "c9812dd3-f87e-4798-aec3-af0933330dd5", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "3d2fbc7c-7bac-436f-a6ac-abe1b2c2caac", "name": "Delete a Project Key - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/keys/{key_id}", "method": "DELETE", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "key_id": {"equalTo": "123456789012345678901234"}}}, "response": {"status": 200, "body": "{\n \"message\": \"message\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "3d2fbc7c-7bac-436f-a6ac-abe1b2c2caac", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "91e103d5-72f7-463d-840d-310069e33de9", "name": "List Project Members - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/members", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"members\": [\n {\n \"member_id\": \"member_id\",\n \"email\": \"email\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "91e103d5-72f7-463d-840d-310069e33de9", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "515c6f7e-09c3-43ea-ad6c-65bc11d20f46", "name": "Delete a Project Member - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/members/{member_id}", "method": "DELETE", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "member_id": {"equalTo": "123456789012345678901234"}}}, "response": {"status": 200, "body": "{\n \"message\": \"message\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "515c6f7e-09c3-43ea-ad6c-65bc11d20f46", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "a920ad0e-2796-4361-ac16-ac83fb75e32a", "name": "List Project Models - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/models", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"include_outdated": {"equalTo": "true"}}}, "response": {"status": 200, "body": "{\n \"stt\": [\n {\n \"name\": \"nova-3\",\n \"canonical_name\": \"nova-3\",\n \"architecture\": \"base\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2021-11-10.1\",\n \"uuid\": \"6b28e919-8427-4f32-9847-492e2efd7daf\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": true\n }\n ],\n \"tts\": [\n {\n \"name\": \"zeus\",\n \"canonical_name\": \"aura-2-zeus-en\",\n \"architecture\": \"aura-2\",\n \"languages\": [\n \"en\",\n \"en-US\"\n ],\n \"version\": \"2025-04-07.0\",\n \"uuid\": \"2baf189d-91ac-481d-b6d1-750888667b31\",\n \"metadata\": {\n \"accent\": \"American\",\n \"age\": \"Adult\",\n \"color\": \"#C58DFF\",\n \"image\": \"https://static.deepgram.com/examples/avatars/zeus.jpg\",\n \"sample\": \"https://static.deepgram.com/examples/Aura-2-zeus.wav\",\n \"tags\": [\n \"masculine\",\n \"deep\",\n \"trustworthy\",\n \"smooth\"\n ],\n \"use_cases\": [\n \"IVR\"\n ]\n }\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "a920ad0e-2796-4361-ac16-ac83fb75e32a", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "9f8c6bf2-ebee-4956-b39f-0291b9d64b6e", "name": "Get a Project Model - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/models/{model_id}", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "model_id": {"equalTo": "af6e9977-99f6-4d8f-b6f5-dfdf6fb6e291"}}}, "response": {"status": 200, "body": "{\n \"name\": \"general\",\n \"canonical_name\": \"enhanced-general\",\n \"architecture\": \"polaris\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2022-05-18.1\",\n \"uuid\": \"c7226e9e-ae1c-4057-ae2a-a71a6b0dc588\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": false\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "9f8c6bf2-ebee-4956-b39f-0291b9d64b6e", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "d6a14959-05fa-4aec-9f0c-ba2a817c66e5", "name": "List Project Requests - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/requests", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"start": {"equalTo": "2024-01-15T09:30:00Z"}, "end": {"equalTo": "2024-01-15T09:30:00Z"}, "limit": {"equalTo": "1.1"}, "page": {"equalTo": "1.1"}, "accessor": {"equalTo": "12345678-1234-1234-1234-123456789012"}, "request_id": {"equalTo": "12345678-1234-1234-1234-123456789012"}, "deployment": {"equalTo": "hosted"}, "endpoint": {"equalTo": "listen"}, "method": {"equalTo": "sync"}, "status": {"equalTo": "succeeded"}}}, "response": {"status": 200, "body": "{\n \"page\": 1.1,\n \"limit\": 1.1,\n \"requests\": [\n {\n \"request_id\": \"request_id\",\n \"project_uuid\": \"project_uuid\",\n \"created\": \"2024-01-15T09:30:00Z\",\n \"path\": \"path\",\n \"api_key_id\": \"api_key_id\",\n \"response\": {\n \"key\": \"value\"\n },\n \"code\": 1.1,\n \"deployment\": \"deployment\",\n \"callback\": \"callback\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "d6a14959-05fa-4aec-9f0c-ba2a817c66e5", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "733e39aa-d3ef-4ea7-8062-af080c6288c4", "name": "Get a Project Request - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/requests/{request_id}", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "request_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"request\": {\n \"request_id\": \"request_id\",\n \"project_uuid\": \"project_uuid\",\n \"created\": \"2024-01-15T09:30:00Z\",\n \"path\": \"path\",\n \"api_key_id\": \"api_key_id\",\n \"response\": {\n \"key\": \"value\"\n },\n \"code\": 1.1,\n \"deployment\": \"deployment\",\n \"callback\": \"callback\"\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "733e39aa-d3ef-4ea7-8062-af080c6288c4", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "6309dd55-c993-4ce1-b0b2-01a41c9f08d6", "name": "Get Project Usage - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/usage", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"start": {"equalTo": "start"}, "end": {"equalTo": "end"}, "accessor": {"equalTo": "12345678-1234-1234-1234-123456789012"}, "alternatives": {"equalTo": "true"}, "callback_method": {"equalTo": "true"}, "callback": {"equalTo": "true"}, "channels": {"equalTo": "true"}, "custom_intent_mode": {"equalTo": "true"}, "custom_intent": {"equalTo": "true"}, "custom_topic_mode": {"equalTo": "true"}, "custom_topic": {"equalTo": "true"}, "deployment": {"equalTo": "hosted"}, "detect_entities": {"equalTo": "true"}, "detect_language": {"equalTo": "true"}, "diarize": {"equalTo": "true"}, "dictation": {"equalTo": "true"}, "encoding": {"equalTo": "true"}, "endpoint": {"equalTo": "listen"}, "extra": {"equalTo": "true"}, "filler_words": {"equalTo": "true"}, "intents": {"equalTo": "true"}, "keyterm": {"equalTo": "true"}, "keywords": {"equalTo": "true"}, "language": {"equalTo": "true"}, "measurements": {"equalTo": "true"}, "method": {"equalTo": "sync"}, "model": {"equalTo": "6f548761-c9c0-429a-9315-11a1d28499c8"}, "multichannel": {"equalTo": "true"}, "numerals": {"equalTo": "true"}, "paragraphs": {"equalTo": "true"}, "profanity_filter": {"equalTo": "true"}, "punctuate": {"equalTo": "true"}, "redact": {"equalTo": "true"}, "replace": {"equalTo": "true"}, "sample_rate": {"equalTo": "true"}, "search": {"equalTo": "true"}, "sentiment": {"equalTo": "true"}, "smart_format": {"equalTo": "true"}, "summarize": {"equalTo": "true"}, "tag": {"equalTo": "tag1"}, "topics": {"equalTo": "true"}, "utt_split": {"equalTo": "true"}, "utterances": {"equalTo": "true"}, "version": {"equalTo": "true"}}}, "response": {"status": 200, "body": "{\n \"start\": \"2024-10-16\",\n \"end\": \"2024-10-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "6309dd55-c993-4ce1-b0b2-01a41c9f08d6", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "b132121b-4efe-42ad-a268-8acac35c189b", "name": "Get Project Balances - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/balances", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"balances\": [\n {\n \"balance_id\": \"balance_id\",\n \"amount\": 1.1,\n \"units\": \"units\",\n \"purchase_order_id\": \"purchase_order_id\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "b132121b-4efe-42ad-a268-8acac35c189b", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "4019c244-52d3-4d57-902c-af837631650a", "name": "Get a Project Balance - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/balances/{balance_id}", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "balance_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"balance_id\": \"balance_id\",\n \"amount\": 1.1,\n \"units\": \"units\",\n \"purchase_order_id\": \"purchase_order_id\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "4019c244-52d3-4d57-902c-af837631650a", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "555b6751-587f-400c-bf5e-400e108ad6b4", "name": "Get Project Billing Breakdown - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/billing/breakdown", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"start": {"equalTo": "start"}, "end": {"equalTo": "end"}, "accessor": {"equalTo": "12345678-1234-1234-1234-123456789012"}, "deployment": {"equalTo": "hosted"}, "tag": {"equalTo": "tag1"}, "line_item": {"equalTo": "streaming::nova-3"}}}, "response": {"status": 200, "body": "{\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n },\n \"results\": [\n {\n \"dollars\": 0.25,\n \"grouping\": {\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-16\",\n \"accessor\": \"123456789012345678901234\",\n \"deployment\": \"hosted\",\n \"line_item\": \"streaming::nova-3\",\n \"tags\": [\n \"tag1\",\n \"tag2\"\n ]\n }\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "555b6751-587f-400c-bf5e-400e108ad6b4", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "a61ae38c-e41f-4726-a55c-88f2135897be", "name": "List Project Billing Fields - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/billing/fields", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"start": {"equalTo": "start"}, "end": {"equalTo": "end"}}}, "response": {"status": 200, "body": "{\n \"accessors\": [\n \"12345678-1234-1234-1234-123456789012\",\n \"87654321-4321-4321-4321-210987654321\"\n ],\n \"deployments\": [\n \"hosted\",\n \"self-hosted\"\n ],\n \"tags\": [\n \"dev\",\n \"production\"\n ],\n \"line_items\": {\n \"streaming::nova-3\": \"Nova - 3 (Stream)\",\n \"sync::aura-2\": \"Aura -2 (Sync)\"\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "a61ae38c-e41f-4726-a55c-88f2135897be", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "85b4373c-ba39-41b1-84e8-ae1ee6b180ca", "name": "List Project Purchases - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/purchases", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"limit": {"equalTo": "1.1"}}}, "response": {"status": 200, "body": "{\n \"orders\": [\n {\n \"order_id\": \"025e19ba-b6d9-4a04-9f99-4fe715aca5f1\",\n \"expiration\": \"2026-03-04T00:00:00Z\",\n \"created\": \"2023-02-21T21:13:40Z\",\n \"amount\": 150,\n \"units\": \"usd\",\n \"order_type\": \"promotional\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "85b4373c-ba39-41b1-84e8-ae1ee6b180ca", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "2dd14c67-ed4e-4d97-9636-0a712899deb8", "name": "List Project Invites - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/invites", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"invites\": [\n {\n \"email\": \"email\",\n \"scope\": \"scope\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "2dd14c67-ed4e-4d97-9636-0a712899deb8", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "7c109496-adfe-4e85-b007-a6f799ee95cb", "name": "Create a Project Invite - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/invites", "method": "POST", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"message\": \"message\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "7c109496-adfe-4e85-b007-a6f799ee95cb", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "d6d268d0-d91e-4a65-80e0-339621173db9", "name": "Delete a Project Invite - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/invites/{email}", "method": "DELETE", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "email": {"equalTo": "john.doe@example.com"}}}, "response": {"status": 200, "body": "{\n \"message\": \"message\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "d6d268d0-d91e-4a65-80e0-339621173db9", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "1b965d71-c930-4a0b-90f3-2289f80f3634", "name": "List Project Member Scopes - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/members/{member_id}/scopes", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "member_id": {"equalTo": "123456789012345678901234"}}}, "response": {"status": 200, "body": "{\n \"scopes\": [\n \"scopes\"\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "1b965d71-c930-4a0b-90f3-2289f80f3634", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "eb2f5de2-b887-47be-abd5-7cb702aca55d", "name": "Update Project Member Scopes - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/members/{member_id}/scopes", "method": "PUT", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "member_id": {"equalTo": "123456789012345678901234"}}}, "response": {"status": 200, "body": "{\n \"message\": \"message\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "eb2f5de2-b887-47be-abd5-7cb702aca55d", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "9bdf51a4-1e10-41b8-8de2-2df650562db3", "name": "Get Project Usage Breakdown - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/usage/breakdown", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"start": {"equalTo": "start"}, "end": {"equalTo": "end"}, "grouping": {"equalTo": "accessor"}, "accessor": {"equalTo": "12345678-1234-1234-1234-123456789012"}, "alternatives": {"equalTo": "true"}, "callback_method": {"equalTo": "true"}, "callback": {"equalTo": "true"}, "channels": {"equalTo": "true"}, "custom_intent_mode": {"equalTo": "true"}, "custom_intent": {"equalTo": "true"}, "custom_topic_mode": {"equalTo": "true"}, "custom_topic": {"equalTo": "true"}, "deployment": {"equalTo": "hosted"}, "detect_entities": {"equalTo": "true"}, "detect_language": {"equalTo": "true"}, "diarize": {"equalTo": "true"}, "dictation": {"equalTo": "true"}, "encoding": {"equalTo": "true"}, "endpoint": {"equalTo": "listen"}, "extra": {"equalTo": "true"}, "filler_words": {"equalTo": "true"}, "intents": {"equalTo": "true"}, "keyterm": {"equalTo": "true"}, "keywords": {"equalTo": "true"}, "language": {"equalTo": "true"}, "measurements": {"equalTo": "true"}, "method": {"equalTo": "sync"}, "model": {"equalTo": "6f548761-c9c0-429a-9315-11a1d28499c8"}, "multichannel": {"equalTo": "true"}, "numerals": {"equalTo": "true"}, "paragraphs": {"equalTo": "true"}, "profanity_filter": {"equalTo": "true"}, "punctuate": {"equalTo": "true"}, "redact": {"equalTo": "true"}, "replace": {"equalTo": "true"}, "sample_rate": {"equalTo": "true"}, "search": {"equalTo": "true"}, "sentiment": {"equalTo": "true"}, "smart_format": {"equalTo": "true"}, "summarize": {"equalTo": "true"}, "tag": {"equalTo": "tag1"}, "topics": {"equalTo": "true"}, "utt_split": {"equalTo": "true"}, "utterances": {"equalTo": "true"}, "version": {"equalTo": "true"}}}, "response": {"status": 200, "body": "{\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n },\n \"results\": [\n {\n \"hours\": 1619.7242069444444,\n \"total_hours\": 1621.7395791666668,\n \"agent_hours\": 41.33564388888889,\n \"tokens_in\": 0,\n \"tokens_out\": 0,\n \"tts_characters\": 9158866,\n \"requests\": 373381,\n \"grouping\": {\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-16\",\n \"accessor\": \"123456789012345678901234\",\n \"endpoint\": \"listen\",\n \"feature_set\": \"punctuate\",\n \"models\": [\n \"Nova-2\"\n ],\n \"method\": \"async\",\n \"tags\": \"tag1\",\n \"deployment\": \"self-hosted\"\n }\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "9bdf51a4-1e10-41b8-8de2-2df650562db3", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "bc9fcd54-076e-48dc-a2dd-d71a8bf8bd4e", "name": "List Project Usage Fields - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/usage/fields", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"start": {"equalTo": "start"}, "end": {"equalTo": "end"}}}, "response": {"status": 200, "body": "{\n \"tags\": [\n \"tag=dev\",\n \"tag=production\"\n ],\n \"models\": [\n {\n \"name\": \"2-medical-nova\",\n \"language\": \"en-MY\",\n \"version\": \"2024-05-31.13574\",\n \"model_id\": \"1234567890-12345-67890\"\n }\n ],\n \"processing_methods\": [\n \"sync\",\n \"streaming\"\n ],\n \"features\": [\n \"alternatives\",\n \"detect_entities\",\n \"detect_language\"\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "bc9fcd54-076e-48dc-a2dd-d71a8bf8bd4e", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "b5ac3651-d3b7-4cd7-b0b8-e1a917a16f3b", "name": "Analyze text content - default", "request": {"urlPathTemplate": "/v1/read", "method": "POST", "queryParameters": {"callback": {"equalTo": "callback"}, "callback_method": {"equalTo": "POST"}, "sentiment": {"equalTo": "true"}, "summarize": {"equalTo": "v2"}, "tag": {"equalTo": "tag"}, "topics": {"equalTo": "true"}, "custom_topic": {"equalTo": "custom_topic"}, "custom_topic_mode": {"equalTo": "extended"}, "intents": {"equalTo": "true"}, "custom_intent": {"equalTo": "custom_intent"}, "custom_intent_mode": {"equalTo": "extended"}, "language": {"equalTo": "language"}}}, "response": {"status": 200, "body": "{\n \"metadata\": {\n \"metadata\": {\n \"request_id\": \"d04af392-db11-4c1d-83e1-20e34f0b8999\",\n \"created\": \"2024-11-18T23:47:44Z\",\n \"language\": \"en\"\n }\n },\n \"results\": {\n \"summary\": {\n \"results\": {\n \"summary\": {\n \"text\": \"The summary of the text submitted.\"\n }\n }\n },\n \"topics\": {\n \"results\": {\n \"topics\": {\n \"segments\": [\n {\n \"text\": \"And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 32,\n \"end_word\": 69,\n \"topics\": [\n {\n \"topic\": \"Spacewalk\",\n \"confidence_score\": 0.91581345\n }\n ]\n }\n ]\n }\n }\n },\n \"intents\": {\n \"results\": {\n \"intents\": {\n \"segments\": [\n {\n \"text\": \"If you found this valuable, you can subscribe to the show on spotify or your favorite podcast app.\",\n \"start_word\": 354,\n \"end_word\": 414,\n \"intents\": [\n {\n \"intent\": \"Encourage podcasting\",\n \"confidence_score\": 0.0038975573\n }\n ]\n }\n ]\n }\n }\n },\n \"sentiments\": {\n \"segments\": [\n {\n \"text\": \"Yeah. As as much as, um, it's worth celebrating, uh, the first, uh, spacewalk, um, with an all-female team, I think many of us are looking forward to it just being normal. And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 0,\n \"end_word\": 69,\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810546875\n }\n ],\n \"average\": {\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810185185185185\n }\n }\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "b5ac3651-d3b7-4cd7-b0b8-e1a917a16f3b", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "4110cb96-50e2-4fe6-b8ae-5d69120cee89", "name": "List Project Self-Hosted Distribution Credentials - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/self-hosted/distribution/credentials", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"distribution_credentials\": [\n {\n \"member\": {\n \"member_id\": \"3376abcd-8e5e-49d3-92d4-876d3a4f0363\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"8b36cfd0-472f-4a21-833f-2d6343c3a2f3\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "4110cb96-50e2-4fe6-b8ae-5d69120cee89", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "9c12eea9-6ba6-4d70-bb14-a2742cebc114", "name": "Create a Project Self-Hosted Distribution Credential - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/self-hosted/distribution/credentials", "method": "POST", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}, "queryParameters": {"provider": {"equalTo": "quay"}}}, "response": {"status": 200, "body": "{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "9c12eea9-6ba6-4d70-bb14-a2742cebc114", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "a47cd13f-2314-4190-b2c7-20436ccffbd2", "name": "Get a Project Self-Hosted Distribution Credential - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/self-hosted/distribution/credentials/{distribution_credentials_id}", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "distribution_credentials_id": {"equalTo": "8b36cfd0-472f-4a21-833f-2d6343c3a2f3"}}}, "response": {"status": 200, "body": "{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "a47cd13f-2314-4190-b2c7-20436ccffbd2", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "8bd46091-0e57-4b3d-9485-a86e6f1eaf17", "name": "Delete a Project Self-Hosted Distribution Credential - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/self-hosted/distribution/credentials/{distribution_credentials_id}", "method": "DELETE", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "distribution_credentials_id": {"equalTo": "8b36cfd0-472f-4a21-833f-2d6343c3a2f3"}}}, "response": {"status": 200, "body": "{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "8bd46091-0e57-4b3d-9485-a86e6f1eaf17", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "b06ec977-02ed-41e2-8fff-2bc45cd2166b", "name": "Text to Speech transformation - default", "request": {"urlPathTemplate": "/v1/speak", "method": "POST"}, "response": {"status": 200, "body": "{\n \"key\": \"value\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "b06ec977-02ed-41e2-8fff-2bc45cd2166b", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "61883f62-09ec-4be9-b477-13a89b9677cf", "name": "List Agent Configurations - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agents", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"agents\": [\n {\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "61883f62-09ec-4be9-b477-13a89b9677cf", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "a43cdbee-2b2f-47fb-8220-75d337cb6d3a", "name": "Create an Agent Configuration - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agents", "method": "POST", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n }\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "a43cdbee-2b2f-47fb-8220-75d337cb6d3a", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "2575dd3c-b1c8-4007-8f87-4e32073a9dcf", "name": "Get an Agent Configuration - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agents/{agent_id}", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "agent_id": {"equalTo": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}}, "response": {"status": 200, "body": "{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "2575dd3c-b1c8-4007-8f87-4e32073a9dcf", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "3b52c271-0e44-4148-b726-6f5ca8c91d26", "name": "Update Agent Metadata - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agents/{agent_id}", "method": "PUT", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "agent_id": {"equalTo": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}}, "response": {"status": 200, "body": "{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "3b52c271-0e44-4148-b726-6f5ca8c91d26", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "e839386d-beaa-4a7a-a478-ed9d9ab1b63e", "name": "Delete an Agent Configuration - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agents/{agent_id}", "method": "DELETE", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "agent_id": {"equalTo": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}}, "response": {"status": 200, "body": "{\n \"key\": \"value\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "e839386d-beaa-4a7a-a478-ed9d9ab1b63e", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "bb85071e-3933-4cd3-8fd7-d35eb4c992c5", "name": "List Agent Variables - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agent-variables", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}}}, "response": {"status": 200, "body": "{\n \"variables\": [\n {\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n }\n ]\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "bb85071e-3933-4cd3-8fd7-d35eb4c992c5", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "c5016e4b-f863-4dc7-972f-c577ac7fdc47", "name": "Create an Agent Variable - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agent-variables", "method": "POST", "pathParameters": {"project_id": {"equalTo": "project_id"}}}, "response": {"status": 200, "body": "{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "c5016e4b-f863-4dc7-972f-c577ac7fdc47", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "5bb4b688-8475-4911-8ad5-725b7d5338e3", "name": "Get an Agent Variable - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agent-variables/{variable_id}", "method": "GET", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "variable_id": {"equalTo": "v1a2b3c4-d5e6-7890-abcd-ef1234567890"}}}, "response": {"status": 200, "body": "{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "5bb4b688-8475-4911-8ad5-725b7d5338e3", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "2e2c7061-7573-423f-a907-2a15dd9f3307", "name": "Delete an Agent Variable - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agent-variables/{variable_id}", "method": "DELETE", "pathParameters": {"project_id": {"equalTo": "123456-7890-1234-5678-901234"}, "variable_id": {"equalTo": "v1a2b3c4-d5e6-7890-abcd-ef1234567890"}}}, "response": {"status": 200, "body": "{\n \"key\": \"value\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "2e2c7061-7573-423f-a907-2a15dd9f3307", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}, {"id": "33765621-bc60-4ef4-b295-4b276aeb871f", "name": "Update an Agent Variable - default", "request": {"urlPathTemplate": "/v1/projects/{project_id}/agent-variables/{variable_id}", "method": "PATCH", "pathParameters": {"project_id": {"equalTo": "project_id"}, "variable_id": {"equalTo": "variable_id"}}}, "response": {"status": 200, "body": "{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}", "headers": {"Content-Type": "application/json"}}, "uuid": "33765621-bc60-4ef4-b295-4b276aeb871f", "persistent": true, "priority": 3, "metadata": {"mocklab": {"created": {"at": "2020-01-01T00:00:00.000Z", "via": "SYSTEM"}}}}], "meta": {"total": 49}} \ No newline at end of file +{"mappings":[{"id":"533b5d52-ab21-4763-aaae-87cf52f49aa5","name":"List Agent Think Models - default","request":{"urlPathTemplate":"/v1/agent/settings/think/models","method":"GET"},"response":{"status":200,"body":"{\n \"models\": [\n {\n \"id\": \"gpt-5\",\n \"name\": \"name\",\n \"provider\": \"open_ai\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"533b5d52-ab21-4763-aaae-87cf52f49aa5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"20e1029e-8bb9-4092-a809-b943e60822ef","name":"Token-based Authentication - default","request":{"urlPathTemplate":"/v1/auth/grant","method":"POST"},"response":{"status":200,"body":"{\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U\",\n \"expires_in\": 30\n}","headers":{"Content-Type":"application/json"}},"uuid":"20e1029e-8bb9-4092-a809-b943e60822ef","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"49d8d51a-7f01-4598-804f-b6f54cdc22da","name":"Transcribe and analyze pre-recorded audio and video - default","request":{"urlPathTemplate":"/v1/listen","method":"POST","queryParameters":{"callback":{"equalTo":"callback"},"callback_method":{"equalTo":"POST"},"extra":{"equalTo":"extra"},"sentiment":{"equalTo":"true"},"summarize":{"equalTo":"v2"},"tag":{"equalTo":"tag"},"topics":{"equalTo":"true"},"custom_topic":{"equalTo":"custom_topic"},"custom_topic_mode":{"equalTo":"extended"},"intents":{"equalTo":"true"},"custom_intent":{"equalTo":"custom_intent"},"custom_intent_mode":{"equalTo":"extended"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"linear16"},"filler_words":{"equalTo":"true"},"keywords":{"equalTo":"keywords"},"language":{"equalTo":"language"},"measurements":{"equalTo":"true"},"model":{"equalTo":"nova-3"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"redact"},"replace":{"equalTo":"replace"},"search":{"equalTo":"search"},"smart_format":{"equalTo":"true"},"utterances":{"equalTo":"true"},"utt_split":{"equalTo":"1.1"},"version":{"equalTo":"latest"},"mip_opt_out":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"metadata\": {\n \"request_id\": \"a847f427-4ad5-4d67-9b95-db801e58251c\",\n \"sha256\": \"154e291ecfa8be6ab8343560bcc109008fa7853eb5372533e8efdefc9b504c33\",\n \"created\": \"2024-05-12T18:57:13Z\",\n \"duration\": 25.933313,\n \"channels\": 1,\n \"models\": [\n \"30089e05-99d1-4376-b32e-c263170674af\"\n ],\n \"model_info\": {\n \"30089e05-99d1-4376-b32e-c263170674af\": {\n \"name\": \"2-general-nova\",\n \"version\": \"2024-01-09.29447\",\n \"arch\": \"nova-2\"\n }\n },\n \"summary_info\": {\n \"model_uuid\": \"67875a7f-c9c4-48a0-aa55-5bdb8a91c34a\",\n \"input_tokens\": 95,\n \"output_tokens\": 63\n },\n \"sentiment_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 105\n },\n \"topics_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 7\n },\n \"intents_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 4\n },\n \"tags\": [\n \"test\"\n ]\n },\n \"results\": {\n \"channels\": [\n {}\n ],\n \"utterances\": [\n {}\n ],\n \"summary\": {\n \"result\": \"success\",\n \"short\": \"Speaker 0 discusses the significance of the first all-female spacewalk with an all-female team, stating that it is a tribute to the skilled and qualified women who were denied opportunities in the past.\"\n },\n \"topics\": {\n \"results\": {\n \"topics\": {\n \"segments\": [\n {\n \"text\": \"And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 32,\n \"end_word\": 69,\n \"topics\": [\n {\n \"topic\": \"Spacewalk\",\n \"confidence_score\": 0.91581345\n }\n ]\n }\n ]\n }\n }\n },\n \"intents\": {\n \"results\": {\n \"intents\": {\n \"segments\": [\n {\n \"text\": \"If you found this valuable, you can subscribe to the show on spotify or your favorite podcast app.\",\n \"start_word\": 354,\n \"end_word\": 414,\n \"intents\": [\n {\n \"intent\": \"Encourage podcasting\",\n \"confidence_score\": 0.0038975573\n }\n ]\n }\n ]\n }\n }\n },\n \"sentiments\": {\n \"segments\": [\n {\n \"text\": \"Yeah. As as much as, um, it's worth celebrating, uh, the first, uh, spacewalk, um, with an all-female team, I think many of us are looking forward to it just being normal. And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 0,\n \"end_word\": 69,\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810546875\n }\n ],\n \"average\": {\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810185185185185\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"49d8d51a-7f01-4598-804f-b6f54cdc22da","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"0a0be61b-f024-4120-9c54-23bca3e07c93","name":"List Models - default","request":{"urlPathTemplate":"/v1/models","method":"GET","queryParameters":{"include_outdated":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"stt\": [\n {\n \"name\": \"nova-3\",\n \"canonical_name\": \"nova-3\",\n \"architecture\": \"base\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2021-11-10.1\",\n \"uuid\": \"6b28e919-8427-4f32-9847-492e2efd7daf\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": true\n }\n ],\n \"tts\": [\n {\n \"name\": \"zeus\",\n \"canonical_name\": \"aura-2-zeus-en\",\n \"architecture\": \"aura-2\",\n \"languages\": [\n \"en\",\n \"en-US\"\n ],\n \"version\": \"2025-04-07.0\",\n \"uuid\": \"2baf189d-91ac-481d-b6d1-750888667b31\",\n \"metadata\": {\n \"accent\": \"American\",\n \"age\": \"Adult\",\n \"color\": \"#C58DFF\",\n \"image\": \"https://static.deepgram.com/examples/avatars/zeus.jpg\",\n \"sample\": \"https://static.deepgram.com/examples/Aura-2-zeus.wav\",\n \"tags\": [\n \"masculine\",\n \"deep\",\n \"trustworthy\",\n \"smooth\"\n ],\n \"use_cases\": [\n \"IVR\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"0a0be61b-f024-4120-9c54-23bca3e07c93","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"0f94d3ea-43b6-4a1a-bce4-ab05b85440ae","name":"Get a specific Model - default","request":{"urlPathTemplate":"/v1/models/{model_id}","method":"GET","pathParameters":{"model_id":{"equalTo":"af6e9977-99f6-4d8f-b6f5-dfdf6fb6e291"}}},"response":{"status":200,"body":"{\n \"name\": \"general\",\n \"canonical_name\": \"enhanced-general\",\n \"architecture\": \"polaris\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2022-05-18.1\",\n \"uuid\": \"c7226e9e-ae1c-4057-ae2a-a71a6b0dc588\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": false\n}","headers":{"Content-Type":"application/json"}},"uuid":"0f94d3ea-43b6-4a1a-bce4-ab05b85440ae","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"d08cac56-bc4d-4756-8fd1-d508914334d5","name":"List Projects - default","request":{"urlPathTemplate":"/v1/projects","method":"GET"},"response":{"status":200,"body":"{\n \"projects\": [\n {\n \"project_id\": \"project_id\",\n \"name\": \"name\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"d08cac56-bc4d-4756-8fd1-d508914334d5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"6f0163a8-530c-4e25-bbe0-9ca86b9525dc","name":"Get a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"limit":{"equalTo":"1.1"},"page":{"equalTo":"1.1"}}},"response":{"status":200,"body":"{\n \"project_id\": \"project_id\",\n \"mip_opt_out\": true,\n \"name\": \"name\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"6f0163a8-530c-4e25-bbe0-9ca86b9525dc","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"68918577-6401-4439-8533-356257ff7bcf","name":"Delete a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"68918577-6401-4439-8533-356257ff7bcf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"659fc38b-3934-4e43-93bf-d331f547449e","name":"Update a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"PATCH","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"Successfully updated project info.\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"659fc38b-3934-4e43-93bf-d331f547449e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"43ae6622-ad2f-4c81-9bc9-a8bbe17ef9d8","name":"Leave a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/leave","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"43ae6622-ad2f-4c81-9bc9-a8bbe17ef9d8","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"032d9b1c-3b87-40fb-bfab-8c5be92a5d71","name":"List Project Keys - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"status":{"equalTo":"active"}}},"response":{"status":200,"body":"{\n \"api_keys\": [\n {\n \"member\": {\n \"member_id\": \"1000-2000-3000-4000\",\n \"email\": \"john@test.com\"\n },\n \"api_key\": {\n \"api_key_id\": \"1234567890abcdef1234567890abcdef\",\n \"comment\": \"A comment\",\n \"scopes\": [\n \"admin\"\n ],\n \"created\": \"2021-01-01T00:00:00Z\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"032d9b1c-3b87-40fb-bfab-8c5be92a5d71","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"0167c735-0b6f-4715-8df8-32300d4dae72","name":"Create a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys","method":"POST","pathParameters":{"project_id":{"equalTo":"project_id"}}},"response":{"status":200,"body":"{\n \"api_key_id\": \"api_key_id\",\n \"key\": \"key\",\n \"comment\": \"comment\",\n \"scopes\": [\n \"scopes\",\n \"scopes\"\n ],\n \"tags\": [\n \"tags\",\n \"tags\"\n ],\n \"expiration_date\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"0167c735-0b6f-4715-8df8-32300d4dae72","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"c9812dd3-f87e-4798-aec3-af0933330dd5","name":"Get a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys/{key_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"key_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"item\": {\n \"member\": {\n \"member_id\": \"1000-2000-3000-4000\",\n \"email\": \"john@test.com\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"api_key\": {\n \"api_key_id\": \"1000-2000-3000-4000\",\n \"comment\": \"A comment\",\n \"scopes\": [\n \"admin\"\n ],\n \"tags\": [\n \"prod\",\n \"west-region\"\n ],\n \"expiration_date\": \"2021-01-01T00:00:00Z\",\n \"created\": \"2021-01-01T00:00:00Z\"\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"c9812dd3-f87e-4798-aec3-af0933330dd5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"3d2fbc7c-7bac-436f-a6ac-abe1b2c2caac","name":"Delete a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys/{key_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"key_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"3d2fbc7c-7bac-436f-a6ac-abe1b2c2caac","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"91e103d5-72f7-463d-840d-310069e33de9","name":"List Project Members - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"members\": [\n {\n \"member_id\": \"member_id\",\n \"email\": \"email\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"91e103d5-72f7-463d-840d-310069e33de9","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"515c6f7e-09c3-43ea-ad6c-65bc11d20f46","name":"Delete a Project Member - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"515c6f7e-09c3-43ea-ad6c-65bc11d20f46","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"a920ad0e-2796-4361-ac16-ac83fb75e32a","name":"List Project Models - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/models","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"include_outdated":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"stt\": [\n {\n \"name\": \"nova-3\",\n \"canonical_name\": \"nova-3\",\n \"architecture\": \"base\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2021-11-10.1\",\n \"uuid\": \"6b28e919-8427-4f32-9847-492e2efd7daf\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": true\n }\n ],\n \"tts\": [\n {\n \"name\": \"zeus\",\n \"canonical_name\": \"aura-2-zeus-en\",\n \"architecture\": \"aura-2\",\n \"languages\": [\n \"en\",\n \"en-US\"\n ],\n \"version\": \"2025-04-07.0\",\n \"uuid\": \"2baf189d-91ac-481d-b6d1-750888667b31\",\n \"metadata\": {\n \"accent\": \"American\",\n \"age\": \"Adult\",\n \"color\": \"#C58DFF\",\n \"image\": \"https://static.deepgram.com/examples/avatars/zeus.jpg\",\n \"sample\": \"https://static.deepgram.com/examples/Aura-2-zeus.wav\",\n \"tags\": [\n \"masculine\",\n \"deep\",\n \"trustworthy\",\n \"smooth\"\n ],\n \"use_cases\": [\n \"IVR\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"a920ad0e-2796-4361-ac16-ac83fb75e32a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"9f8c6bf2-ebee-4956-b39f-0291b9d64b6e","name":"Get a Project Model - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/models/{model_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"model_id":{"equalTo":"af6e9977-99f6-4d8f-b6f5-dfdf6fb6e291"}}},"response":{"status":200,"body":"{\n \"name\": \"general\",\n \"canonical_name\": \"enhanced-general\",\n \"architecture\": \"polaris\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2022-05-18.1\",\n \"uuid\": \"c7226e9e-ae1c-4057-ae2a-a71a6b0dc588\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": false\n}","headers":{"Content-Type":"application/json"}},"uuid":"9f8c6bf2-ebee-4956-b39f-0291b9d64b6e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"d6a14959-05fa-4aec-9f0c-ba2a817c66e5","name":"List Project Requests - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/requests","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"2024-01-15T09:30:00.000Z"},"end":{"equalTo":"2024-01-15T09:30:00.000Z"},"limit":{"equalTo":"1.1"},"page":{"equalTo":"1.1"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"request_id":{"equalTo":"12345678-1234-1234-1234-123456789012"},"deployment":{"equalTo":"hosted"},"endpoint":{"equalTo":"listen"},"method":{"equalTo":"sync"},"status":{"equalTo":"succeeded"}}},"response":{"status":200,"body":"{\n \"page\": 1.1,\n \"limit\": 1.1,\n \"requests\": [\n {\n \"request_id\": \"request_id\",\n \"project_uuid\": \"project_uuid\",\n \"created\": \"2024-01-15T09:30:00Z\",\n \"path\": \"path\",\n \"api_key_id\": \"api_key_id\",\n \"response\": {\n \"key\": \"value\"\n },\n \"code\": 1.1,\n \"deployment\": \"deployment\",\n \"callback\": \"callback\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"d6a14959-05fa-4aec-9f0c-ba2a817c66e5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"733e39aa-d3ef-4ea7-8062-af080c6288c4","name":"Get a Project Request - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/requests/{request_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"request_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"request\": {\n \"request_id\": \"request_id\",\n \"project_uuid\": \"project_uuid\",\n \"created\": \"2024-01-15T09:30:00Z\",\n \"path\": \"path\",\n \"api_key_id\": \"api_key_id\",\n \"response\": {\n \"key\": \"value\"\n },\n \"code\": 1.1,\n \"deployment\": \"deployment\",\n \"callback\": \"callback\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"733e39aa-d3ef-4ea7-8062-af080c6288c4","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"6309dd55-c993-4ce1-b0b2-01a41c9f08d6","name":"Get Project Usage - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"alternatives":{"equalTo":"true"},"callback_method":{"equalTo":"true"},"callback":{"equalTo":"true"},"channels":{"equalTo":"true"},"custom_intent_mode":{"equalTo":"true"},"custom_intent":{"equalTo":"true"},"custom_topic_mode":{"equalTo":"true"},"custom_topic":{"equalTo":"true"},"deployment":{"equalTo":"hosted"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"true"},"endpoint":{"equalTo":"listen"},"extra":{"equalTo":"true"},"filler_words":{"equalTo":"true"},"intents":{"equalTo":"true"},"keyterm":{"equalTo":"true"},"keywords":{"equalTo":"true"},"language":{"equalTo":"true"},"measurements":{"equalTo":"true"},"method":{"equalTo":"sync"},"model":{"equalTo":"6f548761-c9c0-429a-9315-11a1d28499c8"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"true"},"replace":{"equalTo":"true"},"sample_rate":{"equalTo":"true"},"search":{"equalTo":"true"},"sentiment":{"equalTo":"true"},"smart_format":{"equalTo":"true"},"summarize":{"equalTo":"true"},"tag":{"equalTo":"tag1"},"topics":{"equalTo":"true"},"utt_split":{"equalTo":"true"},"utterances":{"equalTo":"true"},"version":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"start\": \"2024-10-16\",\n \"end\": \"2024-10-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"6309dd55-c993-4ce1-b0b2-01a41c9f08d6","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"b132121b-4efe-42ad-a268-8acac35c189b","name":"Get Project Balances - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/balances","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"balances\": [\n {\n \"balance_id\": \"balance_id\",\n \"amount\": 1.1,\n \"units\": \"units\",\n \"purchase_order_id\": \"purchase_order_id\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"b132121b-4efe-42ad-a268-8acac35c189b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"4019c244-52d3-4d57-902c-af837631650a","name":"Get a Project Balance - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/balances/{balance_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"balance_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"balance_id\": \"balance_id\",\n \"amount\": 1.1,\n \"units\": \"units\",\n \"purchase_order_id\": \"purchase_order_id\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"4019c244-52d3-4d57-902c-af837631650a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"555b6751-587f-400c-bf5e-400e108ad6b4","name":"Get Project Billing Breakdown - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/billing/breakdown","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"deployment":{"equalTo":"hosted"},"tag":{"equalTo":"tag1"},"line_item":{"equalTo":"streaming::nova-3"}}},"response":{"status":200,"body":"{\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n },\n \"results\": [\n {\n \"dollars\": 0.25,\n \"grouping\": {\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-16\",\n \"accessor\": \"123456789012345678901234\",\n \"deployment\": \"hosted\",\n \"line_item\": \"streaming::nova-3\",\n \"tags\": [\n \"tag1\",\n \"tag2\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"555b6751-587f-400c-bf5e-400e108ad6b4","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"a61ae38c-e41f-4726-a55c-88f2135897be","name":"List Project Billing Fields - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/billing/fields","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"}}},"response":{"status":200,"body":"{\n \"accessors\": [\n \"12345678-1234-1234-1234-123456789012\",\n \"87654321-4321-4321-4321-210987654321\"\n ],\n \"deployments\": [\n \"hosted\",\n \"self-hosted\"\n ],\n \"tags\": [\n \"dev\",\n \"production\"\n ],\n \"line_items\": {\n \"streaming::nova-3\": \"Nova - 3 (Stream)\",\n \"sync::aura-2\": \"Aura -2 (Sync)\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a61ae38c-e41f-4726-a55c-88f2135897be","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"85b4373c-ba39-41b1-84e8-ae1ee6b180ca","name":"List Project Purchases - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/purchases","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"limit":{"equalTo":"1.1"}}},"response":{"status":200,"body":"{\n \"orders\": [\n {\n \"order_id\": \"025e19ba-b6d9-4a04-9f99-4fe715aca5f1\",\n \"expiration\": \"2026-03-04T00:00:00Z\",\n \"created\": \"2023-02-21T21:13:40Z\",\n \"amount\": 150,\n \"units\": \"usd\",\n \"order_type\": \"promotional\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"85b4373c-ba39-41b1-84e8-ae1ee6b180ca","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"2dd14c67-ed4e-4d97-9636-0a712899deb8","name":"List Project Invites - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"invites\": [\n {\n \"email\": \"email\",\n \"scope\": \"scope\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"2dd14c67-ed4e-4d97-9636-0a712899deb8","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"7c109496-adfe-4e85-b007-a6f799ee95cb","name":"Create a Project Invite - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"7c109496-adfe-4e85-b007-a6f799ee95cb","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"d6d268d0-d91e-4a65-80e0-339621173db9","name":"Delete a Project Invite - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites/{email}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"email":{"equalTo":"john.doe@example.com"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"d6d268d0-d91e-4a65-80e0-339621173db9","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"1b965d71-c930-4a0b-90f3-2289f80f3634","name":"List Project Member Scopes - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}/scopes","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"scopes\": [\n \"scopes\"\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"1b965d71-c930-4a0b-90f3-2289f80f3634","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"eb2f5de2-b887-47be-abd5-7cb702aca55d","name":"Update Project Member Scopes - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}/scopes","method":"PUT","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"eb2f5de2-b887-47be-abd5-7cb702aca55d","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"9bdf51a4-1e10-41b8-8de2-2df650562db3","name":"Get Project Usage Breakdown - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage/breakdown","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"grouping":{"equalTo":"accessor"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"alternatives":{"equalTo":"true"},"callback_method":{"equalTo":"true"},"callback":{"equalTo":"true"},"channels":{"equalTo":"true"},"custom_intent_mode":{"equalTo":"true"},"custom_intent":{"equalTo":"true"},"custom_topic_mode":{"equalTo":"true"},"custom_topic":{"equalTo":"true"},"deployment":{"equalTo":"hosted"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"true"},"endpoint":{"equalTo":"listen"},"extra":{"equalTo":"true"},"filler_words":{"equalTo":"true"},"intents":{"equalTo":"true"},"keyterm":{"equalTo":"true"},"keywords":{"equalTo":"true"},"language":{"equalTo":"true"},"measurements":{"equalTo":"true"},"method":{"equalTo":"sync"},"model":{"equalTo":"6f548761-c9c0-429a-9315-11a1d28499c8"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"true"},"replace":{"equalTo":"true"},"sample_rate":{"equalTo":"true"},"search":{"equalTo":"true"},"sentiment":{"equalTo":"true"},"smart_format":{"equalTo":"true"},"summarize":{"equalTo":"true"},"tag":{"equalTo":"tag1"},"topics":{"equalTo":"true"},"utt_split":{"equalTo":"true"},"utterances":{"equalTo":"true"},"version":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n },\n \"results\": [\n {\n \"hours\": 1619.7242069444444,\n \"total_hours\": 1621.7395791666668,\n \"agent_hours\": 41.33564388888889,\n \"tokens_in\": 0,\n \"tokens_out\": 0,\n \"tts_characters\": 9158866,\n \"requests\": 373381,\n \"grouping\": {\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-16\",\n \"accessor\": \"123456789012345678901234\",\n \"endpoint\": \"listen\",\n \"feature_set\": \"punctuate\",\n \"models\": [\n \"Nova-2\"\n ],\n \"method\": \"async\",\n \"tags\": \"tag1\",\n \"deployment\": \"self-hosted\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"9bdf51a4-1e10-41b8-8de2-2df650562db3","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"bc9fcd54-076e-48dc-a2dd-d71a8bf8bd4e","name":"List Project Usage Fields - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage/fields","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"}}},"response":{"status":200,"body":"{\n \"tags\": [\n \"tag=dev\",\n \"tag=production\"\n ],\n \"models\": [\n {\n \"name\": \"2-medical-nova\",\n \"language\": \"en-MY\",\n \"version\": \"2024-05-31.13574\",\n \"model_id\": \"1234567890-12345-67890\"\n }\n ],\n \"processing_methods\": [\n \"sync\",\n \"streaming\"\n ],\n \"features\": [\n \"alternatives\",\n \"detect_entities\",\n \"detect_language\"\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"bc9fcd54-076e-48dc-a2dd-d71a8bf8bd4e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"b5ac3651-d3b7-4cd7-b0b8-e1a917a16f3b","name":"Analyze text content - default","request":{"urlPathTemplate":"/v1/read","method":"POST","queryParameters":{"callback":{"equalTo":"callback"},"callback_method":{"equalTo":"POST"},"sentiment":{"equalTo":"true"},"summarize":{"equalTo":"v2"},"tag":{"equalTo":"tag"},"topics":{"equalTo":"true"},"custom_topic":{"equalTo":"custom_topic"},"custom_topic_mode":{"equalTo":"extended"},"intents":{"equalTo":"true"},"custom_intent":{"equalTo":"custom_intent"},"custom_intent_mode":{"equalTo":"extended"},"language":{"equalTo":"language"}}},"response":{"status":200,"body":"{\n \"metadata\": {\n \"metadata\": {\n \"request_id\": \"d04af392-db11-4c1d-83e1-20e34f0b8999\",\n \"created\": \"2024-11-18T23:47:44Z\",\n \"language\": \"en\"\n }\n },\n \"results\": {\n \"summary\": {\n \"results\": {\n \"summary\": {\n \"text\": \"The summary of the text submitted.\"\n }\n }\n },\n \"topics\": {\n \"results\": {\n \"topics\": {\n \"segments\": [\n {\n \"text\": \"And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 32,\n \"end_word\": 69,\n \"topics\": [\n {\n \"topic\": \"Spacewalk\",\n \"confidence_score\": 0.91581345\n }\n ]\n }\n ]\n }\n }\n },\n \"intents\": {\n \"results\": {\n \"intents\": {\n \"segments\": [\n {\n \"text\": \"If you found this valuable, you can subscribe to the show on spotify or your favorite podcast app.\",\n \"start_word\": 354,\n \"end_word\": 414,\n \"intents\": [\n {\n \"intent\": \"Encourage podcasting\",\n \"confidence_score\": 0.0038975573\n }\n ]\n }\n ]\n }\n }\n },\n \"sentiments\": {\n \"segments\": [\n {\n \"text\": \"Yeah. As as much as, um, it's worth celebrating, uh, the first, uh, spacewalk, um, with an all-female team, I think many of us are looking forward to it just being normal. And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 0,\n \"end_word\": 69,\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810546875\n }\n ],\n \"average\": {\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810185185185185\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"b5ac3651-d3b7-4cd7-b0b8-e1a917a16f3b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"4110cb96-50e2-4fe6-b8ae-5d69120cee89","name":"List Project Self-Hosted Distribution Credentials - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"distribution_credentials\": [\n {\n \"member\": {\n \"member_id\": \"3376abcd-8e5e-49d3-92d4-876d3a4f0363\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"8b36cfd0-472f-4a21-833f-2d6343c3a2f3\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"4110cb96-50e2-4fe6-b8ae-5d69120cee89","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"9c12eea9-6ba6-4d70-bb14-a2742cebc114","name":"Create a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"provider":{"equalTo":"quay"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"9c12eea9-6ba6-4d70-bb14-a2742cebc114","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"a47cd13f-2314-4190-b2c7-20436ccffbd2","name":"Get a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials/{distribution_credentials_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"distribution_credentials_id":{"equalTo":"8b36cfd0-472f-4a21-833f-2d6343c3a2f3"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a47cd13f-2314-4190-b2c7-20436ccffbd2","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"8bd46091-0e57-4b3d-9485-a86e6f1eaf17","name":"Delete a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials/{distribution_credentials_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"distribution_credentials_id":{"equalTo":"8b36cfd0-472f-4a21-833f-2d6343c3a2f3"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"8bd46091-0e57-4b3d-9485-a86e6f1eaf17","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"b06ec977-02ed-41e2-8fff-2bc45cd2166b","name":"Text to Speech transformation - default","request":{"urlPathTemplate":"/v1/speak","method":"POST"},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"b06ec977-02ed-41e2-8fff-2bc45cd2166b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"61883f62-09ec-4be9-b477-13a89b9677cf","name":"List Agent Configurations - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"agents\": [\n {\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"61883f62-09ec-4be9-b477-13a89b9677cf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"a43cdbee-2b2f-47fb-8220-75d337cb6d3a","name":"Create an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a43cdbee-2b2f-47fb-8220-75d337cb6d3a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"2575dd3c-b1c8-4007-8f87-4e32073a9dcf","name":"Get an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"2575dd3c-b1c8-4007-8f87-4e32073a9dcf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"3b52c271-0e44-4148-b726-6f5ca8c91d26","name":"Update Agent Metadata - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"PUT","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"3b52c271-0e44-4148-b726-6f5ca8c91d26","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"e839386d-beaa-4a7a-a478-ed9d9ab1b63e","name":"Delete an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"e839386d-beaa-4a7a-a478-ed9d9ab1b63e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"bb85071e-3933-4cd3-8fd7-d35eb4c992c5","name":"List Agent Variables - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"variables\": [\n {\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"bb85071e-3933-4cd3-8fd7-d35eb4c992c5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"c5016e4b-f863-4dc7-972f-c577ac7fdc47","name":"Create an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables","method":"POST","pathParameters":{"project_id":{"equalTo":"project_id"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"c5016e4b-f863-4dc7-972f-c577ac7fdc47","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"5bb4b688-8475-4911-8ad5-725b7d5338e3","name":"Get an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"variable_id":{"equalTo":"v1a2b3c4-d5e6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"5bb4b688-8475-4911-8ad5-725b7d5338e3","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"2e2c7061-7573-423f-a907-2a15dd9f3307","name":"Delete an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"variable_id":{"equalTo":"v1a2b3c4-d5e6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"2e2c7061-7573-423f-a907-2a15dd9f3307","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"33765621-bc60-4ef4-b295-4b276aeb871f","name":"Update an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"PATCH","pathParameters":{"project_id":{"equalTo":"project_id"},"variable_id":{"equalTo":"variable_id"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"33765621-bc60-4ef4-b295-4b276aeb871f","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}}],"meta":{"total":49}} \ No newline at end of file From dde19d37e544109f02d67be672c080c14359132a Mon Sep 17 00:00:00 2001 From: Greg Holmes Date: Wed, 15 Apr 2026 17:48:55 +0100 Subject: [PATCH 4/4] chore: re-apply manual patches after regen This covers: re-applied socket client patches (construct_type keyword args, broad exception catch, optional send_ params, _sanitize_numeric_types), removed .bak files, restored .fernignore, dropped type file freezes (generator now correct), fixed wiremock date format. --- .fernignore | 14 +- src/deepgram/agent/v1/socket_client.py | 52 ++- src/deepgram/agent/v1/socket_client.py.bak | 357 ------------------ src/deepgram/listen/v1/socket_client.py | 42 +-- src/deepgram/listen/v1/socket_client.py.bak | 234 ------------ src/deepgram/listen/v2/socket_client.py | 26 +- src/deepgram/listen/v2/socket_client.py.bak | 220 ----------- src/deepgram/speak/v1/socket_client.py | 42 +-- src/deepgram/speak/v1/socket_client.py.bak | 235 ------------ ...ves_item_paragraphs_paragraphs_item.py.bak | 29 -- ..._v1response_results_utterances_item.py.bak | 28 -- ..._results_utterances_item_words_item.py.bak | 26 -- wiremock/wiremock-mappings.json | 2 +- 13 files changed, 93 insertions(+), 1214 deletions(-) delete mode 100644 src/deepgram/agent/v1/socket_client.py.bak delete mode 100644 src/deepgram/listen/v1/socket_client.py.bak delete mode 100644 src/deepgram/listen/v2/socket_client.py.bak delete mode 100644 src/deepgram/speak/v1/socket_client.py.bak delete mode 100644 src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak delete mode 100644 src/deepgram/types/listen_v1response_results_utterances_item.py.bak delete mode 100644 src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak diff --git a/.fernignore b/.fernignore index 416c8831..0ded04e4 100644 --- a/.fernignore +++ b/.fernignore @@ -11,16 +11,10 @@ src/deepgram/client.py # - optional message param on control send_ methods (send_keep_alive, send_close_stream, etc.) # so users don't need to instantiate the type themselves for no-payload control messages # [temporarily frozen — generator bugs in construct_type call convention and exception handling] -src/deepgram/agent/v1/socket_client.py.bak -src/deepgram/listen/v1/socket_client.py.bak -src/deepgram/listen/v2/socket_client.py.bak -src/deepgram/speak/v1/socket_client.py.bak - -# Type files with manual int type corrections (Fern generates float for speaker/channel/num_words) -# [temporarily frozen — waiting on internal-api-specs#205] -src/deepgram/types/listen_v1response_results_utterances_item.py.bak -src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak -src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak +src/deepgram/agent/v1/socket_client.py +src/deepgram/listen/v1/socket_client.py +src/deepgram/listen/v2/socket_client.py +src/deepgram/speak/v1/socket_client.py # Hand-written custom tests tests/custom/test_text_builder.py diff --git a/src/deepgram/agent/v1/socket_client.py b/src/deepgram/agent/v1/socket_client.py index 3d455f7f..978138f4 100644 --- a/src/deepgram/agent/v1/socket_client.py +++ b/src/deepgram/agent/v1/socket_client.py @@ -3,9 +3,7 @@ import json import logging import typing -from json.decoder import JSONDecodeError -import websockets import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.unchecked_base_model import construct_type @@ -39,6 +37,28 @@ from websockets import WebSocketClientProtocol # type: ignore _logger = logging.getLogger(__name__) + + +def _sanitize_numeric_types(obj: typing.Any) -> typing.Any: + """ + Recursively convert float values that are whole numbers to int. + + Workaround for Fern-generated models that type integer API fields + (like sample_rate) as float, causing JSON serialization to produce + values like 44100.0 instead of 44100. The Deepgram API rejects + float representations of integer fields. + + See: https://github.com/deepgram/internal-api-specs/issues/205 + """ + if isinstance(obj, dict): + return {k: _sanitize_numeric_types(v) for k, v in obj.items()} + elif isinstance(obj, list): + return [_sanitize_numeric_types(item) for item in obj] + elif isinstance(obj, float) and obj.is_integer(): + return int(obj) + return obj + + V1SocketClientResponse = typing.Union[ AgentV1ReceiveFunctionCallResponse, AgentV1PromptUpdated, @@ -70,7 +90,7 @@ async def __aiter__(self): yield message else: try: - yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -95,14 +115,14 @@ async def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue await self._emit_async(EventType.MESSAGE, parsed) - except (websockets.WebSocketException, JSONDecodeError) as exc: + except Exception as exc: await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) @@ -142,12 +162,12 @@ async def send_function_call_response(self, message: AgentV1SendFunctionCallResp """ await self._send_model(message) - async def send_keep_alive(self, message: AgentV1KeepAlive) -> None: + async def send_keep_alive(self, message: typing.Optional[AgentV1KeepAlive] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a AgentV1KeepAlive. """ - await self._send_model(message) + await self._send_model(message or AgentV1KeepAlive(type="KeepAlive")) async def send_update_prompt(self, message: AgentV1UpdatePrompt) -> None: """ @@ -179,7 +199,7 @@ async def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(V1SocketClientResponse, json_data) # type: ignore + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -196,7 +216,7 @@ async def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - await self._send(data.dict()) + await self._send(_sanitize_numeric_types(data.dict())) class V1SocketClient(EventEmitterMixin): @@ -210,7 +230,7 @@ def __iter__(self): yield message else: try: - yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -235,14 +255,14 @@ def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue self._emit(EventType.MESSAGE, parsed) - except (websockets.WebSocketException, JSONDecodeError) as exc: + except Exception as exc: self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) @@ -282,12 +302,12 @@ def send_function_call_response(self, message: AgentV1SendFunctionCallResponse) """ self._send_model(message) - def send_keep_alive(self, message: AgentV1KeepAlive) -> None: + def send_keep_alive(self, message: typing.Optional[AgentV1KeepAlive] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a AgentV1KeepAlive. """ - self._send_model(message) + self._send_model(message or AgentV1KeepAlive(type="KeepAlive")) def send_update_prompt(self, message: AgentV1UpdatePrompt) -> None: """ @@ -319,7 +339,7 @@ def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(V1SocketClientResponse, json_data) # type: ignore + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -336,4 +356,4 @@ def _send_model(self, data: typing.Any) -> None: """ Send a Pydantic model to the websocket connection. """ - self._send(data.dict()) + self._send(_sanitize_numeric_types(data.dict())) diff --git a/src/deepgram/agent/v1/socket_client.py.bak b/src/deepgram/agent/v1/socket_client.py.bak deleted file mode 100644 index 21b30ec1..00000000 --- a/src/deepgram/agent/v1/socket_client.py.bak +++ /dev/null @@ -1,357 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import json -import logging -import typing - -import websockets.sync.connection as websockets_sync_connection -from ...core.events import EventEmitterMixin, EventType -from ...core.unchecked_base_model import construct_type -from .types.agent_v1agent_audio_done import AgentV1AgentAudioDone -from .types.agent_v1agent_started_speaking import AgentV1AgentStartedSpeaking -from .types.agent_v1agent_thinking import AgentV1AgentThinking -from .types.agent_v1conversation_text import AgentV1ConversationText -from .types.agent_v1error import AgentV1Error -from .types.agent_v1function_call_request import AgentV1FunctionCallRequest -from .types.agent_v1inject_agent_message import AgentV1InjectAgentMessage -from .types.agent_v1inject_user_message import AgentV1InjectUserMessage -from .types.agent_v1injection_refused import AgentV1InjectionRefused -from .types.agent_v1keep_alive import AgentV1KeepAlive -from .types.agent_v1prompt_updated import AgentV1PromptUpdated -from .types.agent_v1receive_function_call_response import AgentV1ReceiveFunctionCallResponse -from .types.agent_v1send_function_call_response import AgentV1SendFunctionCallResponse -from .types.agent_v1settings import AgentV1Settings -from .types.agent_v1settings_applied import AgentV1SettingsApplied -from .types.agent_v1speak_updated import AgentV1SpeakUpdated -from .types.agent_v1think_updated import AgentV1ThinkUpdated -from .types.agent_v1update_prompt import AgentV1UpdatePrompt -from .types.agent_v1update_speak import AgentV1UpdateSpeak -from .types.agent_v1update_think import AgentV1UpdateThink -from .types.agent_v1user_started_speaking import AgentV1UserStartedSpeaking -from .types.agent_v1warning import AgentV1Warning -from .types.agent_v1welcome import AgentV1Welcome - -try: - from websockets.legacy.client import WebSocketClientProtocol # type: ignore -except ImportError: - from websockets import WebSocketClientProtocol # type: ignore - -_logger = logging.getLogger(__name__) - - -def _sanitize_numeric_types(obj: typing.Any) -> typing.Any: - """ - Recursively convert float values that are whole numbers to int. - - Workaround for Fern-generated models that type integer API fields - (like sample_rate) as float, causing JSON serialization to produce - values like 44100.0 instead of 44100. The Deepgram API rejects - float representations of integer fields. - - See: https://github.com/deepgram/internal-api-specs/issues/205 - """ - if isinstance(obj, dict): - return {k: _sanitize_numeric_types(v) for k, v in obj.items()} - elif isinstance(obj, list): - return [_sanitize_numeric_types(item) for item in obj] - elif isinstance(obj, float) and obj.is_integer(): - return int(obj) - return obj -V1SocketClientResponse = typing.Union[ - AgentV1ReceiveFunctionCallResponse, - AgentV1PromptUpdated, - AgentV1SpeakUpdated, - AgentV1ThinkUpdated, - AgentV1InjectionRefused, - AgentV1Welcome, - AgentV1SettingsApplied, - AgentV1ConversationText, - AgentV1UserStartedSpeaking, - AgentV1AgentThinking, - AgentV1FunctionCallRequest, - AgentV1AgentStartedSpeaking, - AgentV1AgentAudioDone, - AgentV1Error, - AgentV1Warning, - bytes, -] - - -class AsyncV1SocketClient(EventEmitterMixin): - def __init__(self, *, websocket: WebSocketClientProtocol): - super().__init__() - self._websocket = websocket - - async def __aiter__(self): - async for message in self._websocket: - if isinstance(message, bytes): - yield message - else: - try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - - async def start_listening(self): - """ - Start listening for messages on the websocket connection. - - Emits events in the following order: - - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received - - EventType.ERROR if an error occurs - - EventType.CLOSE when connection is closed - """ - await self._emit_async(EventType.OPEN, None) - try: - async for raw_message in self._websocket: - if isinstance(raw_message, bytes): - parsed = raw_message - else: - json_data = json.loads(raw_message) - try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - await self._emit_async(EventType.MESSAGE, parsed) - except Exception as exc: - await self._emit_async(EventType.ERROR, exc) - finally: - await self._emit_async(EventType.CLOSE, None) - - async def send_settings(self, message: AgentV1Settings) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1Settings. - """ - await self._send_model(message) - - async def send_update_speak(self, message: AgentV1UpdateSpeak) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1UpdateSpeak. - """ - await self._send_model(message) - - async def send_inject_user_message(self, message: AgentV1InjectUserMessage) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1InjectUserMessage. - """ - await self._send_model(message) - - async def send_inject_agent_message(self, message: AgentV1InjectAgentMessage) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1InjectAgentMessage. - """ - await self._send_model(message) - - async def send_function_call_response(self, message: AgentV1SendFunctionCallResponse) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1SendFunctionCallResponse. - """ - await self._send_model(message) - - async def send_keep_alive(self, message: typing.Optional[AgentV1KeepAlive] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1KeepAlive. - """ - await self._send_model(message or AgentV1KeepAlive(type="KeepAlive")) - - async def send_update_prompt(self, message: AgentV1UpdatePrompt) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1UpdatePrompt. - """ - await self._send_model(message) - - async def send_update_think(self, message: AgentV1UpdateThink) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1UpdateThink. - """ - await self._send_model(message) - - async def send_media(self, message: bytes) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a bytes. - """ - await self._send(message) - - async def recv(self) -> V1SocketClientResponse: - """ - Receive a message from the websocket connection. - """ - data = await self._websocket.recv() - if isinstance(data, bytes): - return data # type: ignore - json_data = json.loads(data) - try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") - return json_data # type: ignore - - async def _send(self, data: typing.Any) -> None: - """ - Send a message to the websocket connection. - """ - if isinstance(data, dict): - data = json.dumps(data) - await self._websocket.send(data) - - async def _send_model(self, data: typing.Any) -> None: - """ - Send a Pydantic model to the websocket connection. - """ - await self._send(_sanitize_numeric_types(data.dict())) - - -class V1SocketClient(EventEmitterMixin): - def __init__(self, *, websocket: websockets_sync_connection.Connection): - super().__init__() - self._websocket = websocket - - def __iter__(self): - for message in self._websocket: - if isinstance(message, bytes): - yield message - else: - try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - - def start_listening(self): - """ - Start listening for messages on the websocket connection. - - Emits events in the following order: - - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received - - EventType.ERROR if an error occurs - - EventType.CLOSE when connection is closed - """ - self._emit(EventType.OPEN, None) - try: - for raw_message in self._websocket: - if isinstance(raw_message, bytes): - parsed = raw_message - else: - json_data = json.loads(raw_message) - try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - self._emit(EventType.MESSAGE, parsed) - except Exception as exc: - self._emit(EventType.ERROR, exc) - finally: - self._emit(EventType.CLOSE, None) - - def send_settings(self, message: AgentV1Settings) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1Settings. - """ - self._send_model(message) - - def send_update_speak(self, message: AgentV1UpdateSpeak) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1UpdateSpeak. - """ - self._send_model(message) - - def send_inject_user_message(self, message: AgentV1InjectUserMessage) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1InjectUserMessage. - """ - self._send_model(message) - - def send_inject_agent_message(self, message: AgentV1InjectAgentMessage) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1InjectAgentMessage. - """ - self._send_model(message) - - def send_function_call_response(self, message: AgentV1SendFunctionCallResponse) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1SendFunctionCallResponse. - """ - self._send_model(message) - - def send_keep_alive(self, message: typing.Optional[AgentV1KeepAlive] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1KeepAlive. - """ - self._send_model(message or AgentV1KeepAlive(type="KeepAlive")) - - def send_update_prompt(self, message: AgentV1UpdatePrompt) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1UpdatePrompt. - """ - self._send_model(message) - - def send_update_think(self, message: AgentV1UpdateThink) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a AgentV1UpdateThink. - """ - self._send_model(message) - - def send_media(self, message: bytes) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a bytes. - """ - self._send(message) - - def recv(self) -> V1SocketClientResponse: - """ - Receive a message from the websocket connection. - """ - data = self._websocket.recv() - if isinstance(data, bytes): - return data # type: ignore - json_data = json.loads(data) - try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") - return json_data # type: ignore - - def _send(self, data: typing.Any) -> None: - """ - Send a message to the websocket connection. - """ - if isinstance(data, dict): - data = json.dumps(data) - self._websocket.send(data) - - def _send_model(self, data: typing.Any) -> None: - """ - Send a Pydantic model to the websocket connection. - """ - self._send(_sanitize_numeric_types(data.dict())) diff --git a/src/deepgram/listen/v1/socket_client.py b/src/deepgram/listen/v1/socket_client.py index 011786d2..5954d116 100644 --- a/src/deepgram/listen/v1/socket_client.py +++ b/src/deepgram/listen/v1/socket_client.py @@ -3,9 +3,7 @@ import json import logging import typing -from json.decoder import JSONDecodeError -import websockets import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.unchecked_base_model import construct_type @@ -37,7 +35,7 @@ async def __aiter__(self): yield message else: try: - yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -62,14 +60,14 @@ async def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue await self._emit_async(EventType.MESSAGE, parsed) - except (websockets.WebSocketException, JSONDecodeError) as exc: + except Exception as exc: await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) @@ -81,26 +79,26 @@ async def send_media(self, message: bytes) -> None: """ await self._send(message) - async def send_finalize(self, message: ListenV1Finalize) -> None: + async def send_finalize(self, message: typing.Optional[ListenV1Finalize] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1Finalize. """ - await self._send_model(message) + await self._send_model(message or ListenV1Finalize(type="Finalize")) - async def send_close_stream(self, message: ListenV1CloseStream) -> None: + async def send_close_stream(self, message: typing.Optional[ListenV1CloseStream] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1CloseStream. """ - await self._send_model(message) + await self._send_model(message or ListenV1CloseStream(type="CloseStream")) - async def send_keep_alive(self, message: ListenV1KeepAlive) -> None: + async def send_keep_alive(self, message: typing.Optional[ListenV1KeepAlive] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1KeepAlive. """ - await self._send_model(message) + await self._send_model(message or ListenV1KeepAlive(type="KeepAlive")) async def recv(self) -> V1SocketClientResponse: """ @@ -111,7 +109,7 @@ async def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(V1SocketClientResponse, json_data) # type: ignore + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -142,7 +140,7 @@ def __iter__(self): yield message else: try: - yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -167,14 +165,14 @@ def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue self._emit(EventType.MESSAGE, parsed) - except (websockets.WebSocketException, JSONDecodeError) as exc: + except Exception as exc: self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) @@ -186,26 +184,26 @@ def send_media(self, message: bytes) -> None: """ self._send(message) - def send_finalize(self, message: ListenV1Finalize) -> None: + def send_finalize(self, message: typing.Optional[ListenV1Finalize] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1Finalize. """ - self._send_model(message) + self._send_model(message or ListenV1Finalize(type="Finalize")) - def send_close_stream(self, message: ListenV1CloseStream) -> None: + def send_close_stream(self, message: typing.Optional[ListenV1CloseStream] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1CloseStream. """ - self._send_model(message) + self._send_model(message or ListenV1CloseStream(type="CloseStream")) - def send_keep_alive(self, message: ListenV1KeepAlive) -> None: + def send_keep_alive(self, message: typing.Optional[ListenV1KeepAlive] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV1KeepAlive. """ - self._send_model(message) + self._send_model(message or ListenV1KeepAlive(type="KeepAlive")) def recv(self) -> V1SocketClientResponse: """ @@ -216,7 +214,7 @@ def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(V1SocketClientResponse, json_data) # type: ignore + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore diff --git a/src/deepgram/listen/v1/socket_client.py.bak b/src/deepgram/listen/v1/socket_client.py.bak deleted file mode 100644 index 5954d116..00000000 --- a/src/deepgram/listen/v1/socket_client.py.bak +++ /dev/null @@ -1,234 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import json -import logging -import typing - -import websockets.sync.connection as websockets_sync_connection -from ...core.events import EventEmitterMixin, EventType -from ...core.unchecked_base_model import construct_type -from .types.listen_v1close_stream import ListenV1CloseStream -from .types.listen_v1finalize import ListenV1Finalize -from .types.listen_v1keep_alive import ListenV1KeepAlive -from .types.listen_v1metadata import ListenV1Metadata -from .types.listen_v1results import ListenV1Results -from .types.listen_v1speech_started import ListenV1SpeechStarted -from .types.listen_v1utterance_end import ListenV1UtteranceEnd - -try: - from websockets.legacy.client import WebSocketClientProtocol # type: ignore -except ImportError: - from websockets import WebSocketClientProtocol # type: ignore - -_logger = logging.getLogger(__name__) -V1SocketClientResponse = typing.Union[ListenV1Results, ListenV1Metadata, ListenV1UtteranceEnd, ListenV1SpeechStarted] - - -class AsyncV1SocketClient(EventEmitterMixin): - def __init__(self, *, websocket: WebSocketClientProtocol): - super().__init__() - self._websocket = websocket - - async def __aiter__(self): - async for message in self._websocket: - if isinstance(message, bytes): - yield message - else: - try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - - async def start_listening(self): - """ - Start listening for messages on the websocket connection. - - Emits events in the following order: - - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received - - EventType.ERROR if an error occurs - - EventType.CLOSE when connection is closed - """ - await self._emit_async(EventType.OPEN, None) - try: - async for raw_message in self._websocket: - if isinstance(raw_message, bytes): - parsed = raw_message - else: - json_data = json.loads(raw_message) - try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - await self._emit_async(EventType.MESSAGE, parsed) - except Exception as exc: - await self._emit_async(EventType.ERROR, exc) - finally: - await self._emit_async(EventType.CLOSE, None) - - async def send_media(self, message: bytes) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a bytes. - """ - await self._send(message) - - async def send_finalize(self, message: typing.Optional[ListenV1Finalize] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a ListenV1Finalize. - """ - await self._send_model(message or ListenV1Finalize(type="Finalize")) - - async def send_close_stream(self, message: typing.Optional[ListenV1CloseStream] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a ListenV1CloseStream. - """ - await self._send_model(message or ListenV1CloseStream(type="CloseStream")) - - async def send_keep_alive(self, message: typing.Optional[ListenV1KeepAlive] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a ListenV1KeepAlive. - """ - await self._send_model(message or ListenV1KeepAlive(type="KeepAlive")) - - async def recv(self) -> V1SocketClientResponse: - """ - Receive a message from the websocket connection. - """ - data = await self._websocket.recv() - if isinstance(data, bytes): - return data # type: ignore - json_data = json.loads(data) - try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") - return json_data # type: ignore - - async def _send(self, data: typing.Any) -> None: - """ - Send a message to the websocket connection. - """ - if isinstance(data, dict): - data = json.dumps(data) - await self._websocket.send(data) - - async def _send_model(self, data: typing.Any) -> None: - """ - Send a Pydantic model to the websocket connection. - """ - await self._send(data.dict()) - - -class V1SocketClient(EventEmitterMixin): - def __init__(self, *, websocket: websockets_sync_connection.Connection): - super().__init__() - self._websocket = websocket - - def __iter__(self): - for message in self._websocket: - if isinstance(message, bytes): - yield message - else: - try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - - def start_listening(self): - """ - Start listening for messages on the websocket connection. - - Emits events in the following order: - - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received - - EventType.ERROR if an error occurs - - EventType.CLOSE when connection is closed - """ - self._emit(EventType.OPEN, None) - try: - for raw_message in self._websocket: - if isinstance(raw_message, bytes): - parsed = raw_message - else: - json_data = json.loads(raw_message) - try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - self._emit(EventType.MESSAGE, parsed) - except Exception as exc: - self._emit(EventType.ERROR, exc) - finally: - self._emit(EventType.CLOSE, None) - - def send_media(self, message: bytes) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a bytes. - """ - self._send(message) - - def send_finalize(self, message: typing.Optional[ListenV1Finalize] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a ListenV1Finalize. - """ - self._send_model(message or ListenV1Finalize(type="Finalize")) - - def send_close_stream(self, message: typing.Optional[ListenV1CloseStream] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a ListenV1CloseStream. - """ - self._send_model(message or ListenV1CloseStream(type="CloseStream")) - - def send_keep_alive(self, message: typing.Optional[ListenV1KeepAlive] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a ListenV1KeepAlive. - """ - self._send_model(message or ListenV1KeepAlive(type="KeepAlive")) - - def recv(self) -> V1SocketClientResponse: - """ - Receive a message from the websocket connection. - """ - data = self._websocket.recv() - if isinstance(data, bytes): - return data # type: ignore - json_data = json.loads(data) - try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") - return json_data # type: ignore - - def _send(self, data: typing.Any) -> None: - """ - Send a message to the websocket connection. - """ - if isinstance(data, dict): - data = json.dumps(data) - self._websocket.send(data) - - def _send_model(self, data: typing.Any) -> None: - """ - Send a Pydantic model to the websocket connection. - """ - self._send(data.dict()) diff --git a/src/deepgram/listen/v2/socket_client.py b/src/deepgram/listen/v2/socket_client.py index d6dd1e05..d214f0f5 100644 --- a/src/deepgram/listen/v2/socket_client.py +++ b/src/deepgram/listen/v2/socket_client.py @@ -3,9 +3,7 @@ import json import logging import typing -from json.decoder import JSONDecodeError -import websockets import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.unchecked_base_model import construct_type @@ -37,7 +35,7 @@ async def __aiter__(self): yield message else: try: - yield construct_type(V2SocketClientResponse, json.loads(message)) # type: ignore + yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -62,14 +60,14 @@ async def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(V2SocketClientResponse, json_data) # type: ignore + parsed = construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue await self._emit_async(EventType.MESSAGE, parsed) - except (websockets.WebSocketException, JSONDecodeError) as exc: + except Exception as exc: await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) @@ -81,12 +79,12 @@ async def send_media(self, message: bytes) -> None: """ await self._send(message) - async def send_close_stream(self, message: ListenV2CloseStream) -> None: + async def send_close_stream(self, message: typing.Optional[ListenV2CloseStream] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV2CloseStream. """ - await self._send_model(message) + await self._send_model(message or ListenV2CloseStream(type="CloseStream")) async def send_configure(self, message: typing.Any) -> None: """ @@ -104,7 +102,7 @@ async def recv(self) -> V2SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(V2SocketClientResponse, json_data) # type: ignore + return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -135,7 +133,7 @@ def __iter__(self): yield message else: try: - yield construct_type(V2SocketClientResponse, json.loads(message)) # type: ignore + yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -160,14 +158,14 @@ def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(V2SocketClientResponse, json_data) # type: ignore + parsed = construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue self._emit(EventType.MESSAGE, parsed) - except (websockets.WebSocketException, JSONDecodeError) as exc: + except Exception as exc: self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) @@ -179,12 +177,12 @@ def send_media(self, message: bytes) -> None: """ self._send(message) - def send_close_stream(self, message: ListenV2CloseStream) -> None: + def send_close_stream(self, message: typing.Optional[ListenV2CloseStream] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a ListenV2CloseStream. """ - self._send_model(message) + self._send_model(message or ListenV2CloseStream(type="CloseStream")) def send_configure(self, message: typing.Any) -> None: """ @@ -202,7 +200,7 @@ def recv(self) -> V2SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(V2SocketClientResponse, json_data) # type: ignore + return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore diff --git a/src/deepgram/listen/v2/socket_client.py.bak b/src/deepgram/listen/v2/socket_client.py.bak deleted file mode 100644 index d214f0f5..00000000 --- a/src/deepgram/listen/v2/socket_client.py.bak +++ /dev/null @@ -1,220 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import json -import logging -import typing - -import websockets.sync.connection as websockets_sync_connection -from ...core.events import EventEmitterMixin, EventType -from ...core.unchecked_base_model import construct_type -from .types.listen_v2close_stream import ListenV2CloseStream -from .types.listen_v2configure_failure import ListenV2ConfigureFailure -from .types.listen_v2connected import ListenV2Connected -from .types.listen_v2fatal_error import ListenV2FatalError -from .types.listen_v2turn_info import ListenV2TurnInfo - -try: - from websockets.legacy.client import WebSocketClientProtocol # type: ignore -except ImportError: - from websockets import WebSocketClientProtocol # type: ignore - -_logger = logging.getLogger(__name__) -V2SocketClientResponse = typing.Union[ - ListenV2Connected, ListenV2TurnInfo, typing.Any, ListenV2ConfigureFailure, ListenV2FatalError -] - - -class AsyncV2SocketClient(EventEmitterMixin): - def __init__(self, *, websocket: WebSocketClientProtocol): - super().__init__() - self._websocket = websocket - - async def __aiter__(self): - async for message in self._websocket: - if isinstance(message, bytes): - yield message - else: - try: - yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - - async def start_listening(self): - """ - Start listening for messages on the websocket connection. - - Emits events in the following order: - - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received - - EventType.ERROR if an error occurs - - EventType.CLOSE when connection is closed - """ - await self._emit_async(EventType.OPEN, None) - try: - async for raw_message in self._websocket: - if isinstance(raw_message, bytes): - parsed = raw_message - else: - json_data = json.loads(raw_message) - try: - parsed = construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - await self._emit_async(EventType.MESSAGE, parsed) - except Exception as exc: - await self._emit_async(EventType.ERROR, exc) - finally: - await self._emit_async(EventType.CLOSE, None) - - async def send_media(self, message: bytes) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a bytes. - """ - await self._send(message) - - async def send_close_stream(self, message: typing.Optional[ListenV2CloseStream] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a ListenV2CloseStream. - """ - await self._send_model(message or ListenV2CloseStream(type="CloseStream")) - - async def send_configure(self, message: typing.Any) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a typing.Any. - """ - await self._send(message) - - async def recv(self) -> V2SocketClientResponse: - """ - Receive a message from the websocket connection. - """ - data = await self._websocket.recv() - if isinstance(data, bytes): - return data # type: ignore - json_data = json.loads(data) - try: - return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") - return json_data # type: ignore - - async def _send(self, data: typing.Any) -> None: - """ - Send a message to the websocket connection. - """ - if isinstance(data, dict): - data = json.dumps(data) - await self._websocket.send(data) - - async def _send_model(self, data: typing.Any) -> None: - """ - Send a Pydantic model to the websocket connection. - """ - await self._send(data.dict()) - - -class V2SocketClient(EventEmitterMixin): - def __init__(self, *, websocket: websockets_sync_connection.Connection): - super().__init__() - self._websocket = websocket - - def __iter__(self): - for message in self._websocket: - if isinstance(message, bytes): - yield message - else: - try: - yield construct_type(type_=V2SocketClientResponse, object_=json.loads(message)) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - - def start_listening(self): - """ - Start listening for messages on the websocket connection. - - Emits events in the following order: - - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received - - EventType.ERROR if an error occurs - - EventType.CLOSE when connection is closed - """ - self._emit(EventType.OPEN, None) - try: - for raw_message in self._websocket: - if isinstance(raw_message, bytes): - parsed = raw_message - else: - json_data = json.loads(raw_message) - try: - parsed = construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - self._emit(EventType.MESSAGE, parsed) - except Exception as exc: - self._emit(EventType.ERROR, exc) - finally: - self._emit(EventType.CLOSE, None) - - def send_media(self, message: bytes) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a bytes. - """ - self._send(message) - - def send_close_stream(self, message: typing.Optional[ListenV2CloseStream] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a ListenV2CloseStream. - """ - self._send_model(message or ListenV2CloseStream(type="CloseStream")) - - def send_configure(self, message: typing.Any) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a typing.Any. - """ - self._send(message) - - def recv(self) -> V2SocketClientResponse: - """ - Receive a message from the websocket connection. - """ - data = self._websocket.recv() - if isinstance(data, bytes): - return data # type: ignore - json_data = json.loads(data) - try: - return construct_type(type_=V2SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") - return json_data # type: ignore - - def _send(self, data: typing.Any) -> None: - """ - Send a message to the websocket connection. - """ - if isinstance(data, dict): - data = json.dumps(data) - self._websocket.send(data) - - def _send_model(self, data: typing.Any) -> None: - """ - Send a Pydantic model to the websocket connection. - """ - self._send(data.dict()) diff --git a/src/deepgram/speak/v1/socket_client.py b/src/deepgram/speak/v1/socket_client.py index 461c8190..e3c28bb5 100644 --- a/src/deepgram/speak/v1/socket_client.py +++ b/src/deepgram/speak/v1/socket_client.py @@ -3,9 +3,7 @@ import json import logging import typing -from json.decoder import JSONDecodeError -import websockets import websockets.sync.connection as websockets_sync_connection from ...core.events import EventEmitterMixin, EventType from ...core.unchecked_base_model import construct_type @@ -38,7 +36,7 @@ async def __aiter__(self): yield message else: try: - yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -63,14 +61,14 @@ async def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue await self._emit_async(EventType.MESSAGE, parsed) - except (websockets.WebSocketException, JSONDecodeError) as exc: + except Exception as exc: await self._emit_async(EventType.ERROR, exc) finally: await self._emit_async(EventType.CLOSE, None) @@ -82,26 +80,26 @@ async def send_text(self, message: SpeakV1Text) -> None: """ await self._send_model(message) - async def send_flush(self, message: SpeakV1Flush) -> None: + async def send_flush(self, message: typing.Optional[SpeakV1Flush] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Flush. """ - await self._send_model(message) + await self._send_model(message or SpeakV1Flush(type="Flush")) - async def send_clear(self, message: SpeakV1Clear) -> None: + async def send_clear(self, message: typing.Optional[SpeakV1Clear] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Clear. """ - await self._send_model(message) + await self._send_model(message or SpeakV1Clear(type="Clear")) - async def send_close(self, message: SpeakV1Close) -> None: + async def send_close(self, message: typing.Optional[SpeakV1Close] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Close. """ - await self._send_model(message) + await self._send_model(message or SpeakV1Close(type="Close")) async def recv(self) -> V1SocketClientResponse: """ @@ -112,7 +110,7 @@ async def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(V1SocketClientResponse, json_data) # type: ignore + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore @@ -143,7 +141,7 @@ def __iter__(self): yield message else: try: - yield construct_type(V1SocketClientResponse, json.loads(message)) # type: ignore + yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." @@ -168,14 +166,14 @@ def start_listening(self): else: json_data = json.loads(raw_message) try: - parsed = construct_type(V1SocketClientResponse, json_data) # type: ignore + parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning( "Skipping unknown WebSocket message; update your SDK version to support new message types." ) continue self._emit(EventType.MESSAGE, parsed) - except (websockets.WebSocketException, JSONDecodeError) as exc: + except Exception as exc: self._emit(EventType.ERROR, exc) finally: self._emit(EventType.CLOSE, None) @@ -187,26 +185,26 @@ def send_text(self, message: SpeakV1Text) -> None: """ self._send_model(message) - def send_flush(self, message: SpeakV1Flush) -> None: + def send_flush(self, message: typing.Optional[SpeakV1Flush] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Flush. """ - self._send_model(message) + self._send_model(message or SpeakV1Flush(type="Flush")) - def send_clear(self, message: SpeakV1Clear) -> None: + def send_clear(self, message: typing.Optional[SpeakV1Clear] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Clear. """ - self._send_model(message) + self._send_model(message or SpeakV1Clear(type="Clear")) - def send_close(self, message: SpeakV1Close) -> None: + def send_close(self, message: typing.Optional[SpeakV1Close] = None) -> None: """ Send a message to the websocket connection. The message will be sent as a SpeakV1Close. """ - self._send_model(message) + self._send_model(message or SpeakV1Close(type="Close")) def recv(self) -> V1SocketClientResponse: """ @@ -217,7 +215,7 @@ def recv(self) -> V1SocketClientResponse: return data # type: ignore json_data = json.loads(data) try: - return construct_type(V1SocketClientResponse, json_data) # type: ignore + return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore except Exception: _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") return json_data # type: ignore diff --git a/src/deepgram/speak/v1/socket_client.py.bak b/src/deepgram/speak/v1/socket_client.py.bak deleted file mode 100644 index e3c28bb5..00000000 --- a/src/deepgram/speak/v1/socket_client.py.bak +++ /dev/null @@ -1,235 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import json -import logging -import typing - -import websockets.sync.connection as websockets_sync_connection -from ...core.events import EventEmitterMixin, EventType -from ...core.unchecked_base_model import construct_type -from .types.speak_v1clear import SpeakV1Clear -from .types.speak_v1cleared import SpeakV1Cleared -from .types.speak_v1close import SpeakV1Close -from .types.speak_v1flush import SpeakV1Flush -from .types.speak_v1flushed import SpeakV1Flushed -from .types.speak_v1metadata import SpeakV1Metadata -from .types.speak_v1text import SpeakV1Text -from .types.speak_v1warning import SpeakV1Warning - -try: - from websockets.legacy.client import WebSocketClientProtocol # type: ignore -except ImportError: - from websockets import WebSocketClientProtocol # type: ignore - -_logger = logging.getLogger(__name__) -V1SocketClientResponse = typing.Union[bytes, SpeakV1Metadata, SpeakV1Flushed, SpeakV1Cleared, SpeakV1Warning] - - -class AsyncV1SocketClient(EventEmitterMixin): - def __init__(self, *, websocket: WebSocketClientProtocol): - super().__init__() - self._websocket = websocket - - async def __aiter__(self): - async for message in self._websocket: - if isinstance(message, bytes): - yield message - else: - try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - - async def start_listening(self): - """ - Start listening for messages on the websocket connection. - - Emits events in the following order: - - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received - - EventType.ERROR if an error occurs - - EventType.CLOSE when connection is closed - """ - await self._emit_async(EventType.OPEN, None) - try: - async for raw_message in self._websocket: - if isinstance(raw_message, bytes): - parsed = raw_message - else: - json_data = json.loads(raw_message) - try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - await self._emit_async(EventType.MESSAGE, parsed) - except Exception as exc: - await self._emit_async(EventType.ERROR, exc) - finally: - await self._emit_async(EventType.CLOSE, None) - - async def send_text(self, message: SpeakV1Text) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a SpeakV1Text. - """ - await self._send_model(message) - - async def send_flush(self, message: typing.Optional[SpeakV1Flush] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a SpeakV1Flush. - """ - await self._send_model(message or SpeakV1Flush(type="Flush")) - - async def send_clear(self, message: typing.Optional[SpeakV1Clear] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a SpeakV1Clear. - """ - await self._send_model(message or SpeakV1Clear(type="Clear")) - - async def send_close(self, message: typing.Optional[SpeakV1Close] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a SpeakV1Close. - """ - await self._send_model(message or SpeakV1Close(type="Close")) - - async def recv(self) -> V1SocketClientResponse: - """ - Receive a message from the websocket connection. - """ - data = await self._websocket.recv() - if isinstance(data, bytes): - return data # type: ignore - json_data = json.loads(data) - try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") - return json_data # type: ignore - - async def _send(self, data: typing.Any) -> None: - """ - Send a message to the websocket connection. - """ - if isinstance(data, dict): - data = json.dumps(data) - await self._websocket.send(data) - - async def _send_model(self, data: typing.Any) -> None: - """ - Send a Pydantic model to the websocket connection. - """ - await self._send(data.dict()) - - -class V1SocketClient(EventEmitterMixin): - def __init__(self, *, websocket: websockets_sync_connection.Connection): - super().__init__() - self._websocket = websocket - - def __iter__(self): - for message in self._websocket: - if isinstance(message, bytes): - yield message - else: - try: - yield construct_type(type_=V1SocketClientResponse, object_=json.loads(message)) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - - def start_listening(self): - """ - Start listening for messages on the websocket connection. - - Emits events in the following order: - - EventType.OPEN when connection is established - - EventType.MESSAGE for each message received - - EventType.ERROR if an error occurs - - EventType.CLOSE when connection is closed - """ - self._emit(EventType.OPEN, None) - try: - for raw_message in self._websocket: - if isinstance(raw_message, bytes): - parsed = raw_message - else: - json_data = json.loads(raw_message) - try: - parsed = construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning( - "Skipping unknown WebSocket message; update your SDK version to support new message types." - ) - continue - self._emit(EventType.MESSAGE, parsed) - except Exception as exc: - self._emit(EventType.ERROR, exc) - finally: - self._emit(EventType.CLOSE, None) - - def send_text(self, message: SpeakV1Text) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a SpeakV1Text. - """ - self._send_model(message) - - def send_flush(self, message: typing.Optional[SpeakV1Flush] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a SpeakV1Flush. - """ - self._send_model(message or SpeakV1Flush(type="Flush")) - - def send_clear(self, message: typing.Optional[SpeakV1Clear] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a SpeakV1Clear. - """ - self._send_model(message or SpeakV1Clear(type="Clear")) - - def send_close(self, message: typing.Optional[SpeakV1Close] = None) -> None: - """ - Send a message to the websocket connection. - The message will be sent as a SpeakV1Close. - """ - self._send_model(message or SpeakV1Close(type="Close")) - - def recv(self) -> V1SocketClientResponse: - """ - Receive a message from the websocket connection. - """ - data = self._websocket.recv() - if isinstance(data, bytes): - return data # type: ignore - json_data = json.loads(data) - try: - return construct_type(type_=V1SocketClientResponse, object_=json_data) # type: ignore - except Exception: - _logger.warning("Skipping unknown WebSocket message; update your SDK version to support new message types.") - return json_data # type: ignore - - def _send(self, data: typing.Any) -> None: - """ - Send a message to the websocket connection. - """ - if isinstance(data, dict): - data = json.dumps(data) - self._websocket.send(data) - - def _send_model(self, data: typing.Any) -> None: - """ - Send a Pydantic model to the websocket connection. - """ - self._send(data.dict()) diff --git a/src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak b/src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak deleted file mode 100644 index eec3866b..00000000 --- a/src/deepgram/types/listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item.py.bak +++ /dev/null @@ -1,29 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -import pydantic -from ..core.pydantic_utilities import IS_PYDANTIC_V2 -from ..core.unchecked_base_model import UncheckedBaseModel -from .listen_v1response_results_channels_item_alternatives_item_paragraphs_paragraphs_item_sentences_item import ( - ListenV1ResponseResultsChannelsItemAlternativesItemParagraphsParagraphsItemSentencesItem, -) - - -class ListenV1ResponseResultsChannelsItemAlternativesItemParagraphsParagraphsItem(UncheckedBaseModel): - sentences: typing.Optional[ - typing.List[ListenV1ResponseResultsChannelsItemAlternativesItemParagraphsParagraphsItemSentencesItem] - ] = None - speaker: typing.Optional[int] = None - num_words: typing.Optional[int] = None - start: typing.Optional[float] = None - end: typing.Optional[float] = 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 diff --git a/src/deepgram/types/listen_v1response_results_utterances_item.py.bak b/src/deepgram/types/listen_v1response_results_utterances_item.py.bak deleted file mode 100644 index 0947d9f5..00000000 --- a/src/deepgram/types/listen_v1response_results_utterances_item.py.bak +++ /dev/null @@ -1,28 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -import pydantic -from ..core.pydantic_utilities import IS_PYDANTIC_V2 -from ..core.unchecked_base_model import UncheckedBaseModel -from .listen_v1response_results_utterances_item_words_item import ListenV1ResponseResultsUtterancesItemWordsItem - - -class ListenV1ResponseResultsUtterancesItem(UncheckedBaseModel): - start: typing.Optional[float] = None - end: typing.Optional[float] = None - confidence: typing.Optional[float] = None - channel: typing.Optional[int] = None - transcript: typing.Optional[str] = None - words: typing.Optional[typing.List[ListenV1ResponseResultsUtterancesItemWordsItem]] = None - speaker: typing.Optional[int] = None - id: typing.Optional[str] = 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 diff --git a/src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak b/src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak deleted file mode 100644 index 6cd1313a..00000000 --- a/src/deepgram/types/listen_v1response_results_utterances_item_words_item.py.bak +++ /dev/null @@ -1,26 +0,0 @@ -# This file was auto-generated by Fern from our API Definition. - -import typing - -import pydantic -from ..core.pydantic_utilities import IS_PYDANTIC_V2 -from ..core.unchecked_base_model import UncheckedBaseModel - - -class ListenV1ResponseResultsUtterancesItemWordsItem(UncheckedBaseModel): - word: typing.Optional[str] = None - start: typing.Optional[float] = None - end: typing.Optional[float] = None - confidence: typing.Optional[float] = None - speaker: typing.Optional[int] = None - speaker_confidence: typing.Optional[float] = None - punctuated_word: typing.Optional[str] = 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 diff --git a/wiremock/wiremock-mappings.json b/wiremock/wiremock-mappings.json index 630c6a96..b7e8b543 100644 --- a/wiremock/wiremock-mappings.json +++ b/wiremock/wiremock-mappings.json @@ -1 +1 @@ -{"mappings":[{"id":"533b5d52-ab21-4763-aaae-87cf52f49aa5","name":"List Agent Think Models - default","request":{"urlPathTemplate":"/v1/agent/settings/think/models","method":"GET"},"response":{"status":200,"body":"{\n \"models\": [\n {\n \"id\": \"gpt-5\",\n \"name\": \"name\",\n \"provider\": \"open_ai\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"533b5d52-ab21-4763-aaae-87cf52f49aa5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"20e1029e-8bb9-4092-a809-b943e60822ef","name":"Token-based Authentication - default","request":{"urlPathTemplate":"/v1/auth/grant","method":"POST"},"response":{"status":200,"body":"{\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U\",\n \"expires_in\": 30\n}","headers":{"Content-Type":"application/json"}},"uuid":"20e1029e-8bb9-4092-a809-b943e60822ef","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"49d8d51a-7f01-4598-804f-b6f54cdc22da","name":"Transcribe and analyze pre-recorded audio and video - default","request":{"urlPathTemplate":"/v1/listen","method":"POST","queryParameters":{"callback":{"equalTo":"callback"},"callback_method":{"equalTo":"POST"},"extra":{"equalTo":"extra"},"sentiment":{"equalTo":"true"},"summarize":{"equalTo":"v2"},"tag":{"equalTo":"tag"},"topics":{"equalTo":"true"},"custom_topic":{"equalTo":"custom_topic"},"custom_topic_mode":{"equalTo":"extended"},"intents":{"equalTo":"true"},"custom_intent":{"equalTo":"custom_intent"},"custom_intent_mode":{"equalTo":"extended"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"linear16"},"filler_words":{"equalTo":"true"},"keywords":{"equalTo":"keywords"},"language":{"equalTo":"language"},"measurements":{"equalTo":"true"},"model":{"equalTo":"nova-3"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"redact"},"replace":{"equalTo":"replace"},"search":{"equalTo":"search"},"smart_format":{"equalTo":"true"},"utterances":{"equalTo":"true"},"utt_split":{"equalTo":"1.1"},"version":{"equalTo":"latest"},"mip_opt_out":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"metadata\": {\n \"request_id\": \"a847f427-4ad5-4d67-9b95-db801e58251c\",\n \"sha256\": \"154e291ecfa8be6ab8343560bcc109008fa7853eb5372533e8efdefc9b504c33\",\n \"created\": \"2024-05-12T18:57:13Z\",\n \"duration\": 25.933313,\n \"channels\": 1,\n \"models\": [\n \"30089e05-99d1-4376-b32e-c263170674af\"\n ],\n \"model_info\": {\n \"30089e05-99d1-4376-b32e-c263170674af\": {\n \"name\": \"2-general-nova\",\n \"version\": \"2024-01-09.29447\",\n \"arch\": \"nova-2\"\n }\n },\n \"summary_info\": {\n \"model_uuid\": \"67875a7f-c9c4-48a0-aa55-5bdb8a91c34a\",\n \"input_tokens\": 95,\n \"output_tokens\": 63\n },\n \"sentiment_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 105\n },\n \"topics_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 7\n },\n \"intents_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 4\n },\n \"tags\": [\n \"test\"\n ]\n },\n \"results\": {\n \"channels\": [\n {}\n ],\n \"utterances\": [\n {}\n ],\n \"summary\": {\n \"result\": \"success\",\n \"short\": \"Speaker 0 discusses the significance of the first all-female spacewalk with an all-female team, stating that it is a tribute to the skilled and qualified women who were denied opportunities in the past.\"\n },\n \"topics\": {\n \"results\": {\n \"topics\": {\n \"segments\": [\n {\n \"text\": \"And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 32,\n \"end_word\": 69,\n \"topics\": [\n {\n \"topic\": \"Spacewalk\",\n \"confidence_score\": 0.91581345\n }\n ]\n }\n ]\n }\n }\n },\n \"intents\": {\n \"results\": {\n \"intents\": {\n \"segments\": [\n {\n \"text\": \"If you found this valuable, you can subscribe to the show on spotify or your favorite podcast app.\",\n \"start_word\": 354,\n \"end_word\": 414,\n \"intents\": [\n {\n \"intent\": \"Encourage podcasting\",\n \"confidence_score\": 0.0038975573\n }\n ]\n }\n ]\n }\n }\n },\n \"sentiments\": {\n \"segments\": [\n {\n \"text\": \"Yeah. As as much as, um, it's worth celebrating, uh, the first, uh, spacewalk, um, with an all-female team, I think many of us are looking forward to it just being normal. And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 0,\n \"end_word\": 69,\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810546875\n }\n ],\n \"average\": {\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810185185185185\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"49d8d51a-7f01-4598-804f-b6f54cdc22da","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"0a0be61b-f024-4120-9c54-23bca3e07c93","name":"List Models - default","request":{"urlPathTemplate":"/v1/models","method":"GET","queryParameters":{"include_outdated":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"stt\": [\n {\n \"name\": \"nova-3\",\n \"canonical_name\": \"nova-3\",\n \"architecture\": \"base\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2021-11-10.1\",\n \"uuid\": \"6b28e919-8427-4f32-9847-492e2efd7daf\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": true\n }\n ],\n \"tts\": [\n {\n \"name\": \"zeus\",\n \"canonical_name\": \"aura-2-zeus-en\",\n \"architecture\": \"aura-2\",\n \"languages\": [\n \"en\",\n \"en-US\"\n ],\n \"version\": \"2025-04-07.0\",\n \"uuid\": \"2baf189d-91ac-481d-b6d1-750888667b31\",\n \"metadata\": {\n \"accent\": \"American\",\n \"age\": \"Adult\",\n \"color\": \"#C58DFF\",\n \"image\": \"https://static.deepgram.com/examples/avatars/zeus.jpg\",\n \"sample\": \"https://static.deepgram.com/examples/Aura-2-zeus.wav\",\n \"tags\": [\n \"masculine\",\n \"deep\",\n \"trustworthy\",\n \"smooth\"\n ],\n \"use_cases\": [\n \"IVR\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"0a0be61b-f024-4120-9c54-23bca3e07c93","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"0f94d3ea-43b6-4a1a-bce4-ab05b85440ae","name":"Get a specific Model - default","request":{"urlPathTemplate":"/v1/models/{model_id}","method":"GET","pathParameters":{"model_id":{"equalTo":"af6e9977-99f6-4d8f-b6f5-dfdf6fb6e291"}}},"response":{"status":200,"body":"{\n \"name\": \"general\",\n \"canonical_name\": \"enhanced-general\",\n \"architecture\": \"polaris\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2022-05-18.1\",\n \"uuid\": \"c7226e9e-ae1c-4057-ae2a-a71a6b0dc588\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": false\n}","headers":{"Content-Type":"application/json"}},"uuid":"0f94d3ea-43b6-4a1a-bce4-ab05b85440ae","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"d08cac56-bc4d-4756-8fd1-d508914334d5","name":"List Projects - default","request":{"urlPathTemplate":"/v1/projects","method":"GET"},"response":{"status":200,"body":"{\n \"projects\": [\n {\n \"project_id\": \"project_id\",\n \"name\": \"name\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"d08cac56-bc4d-4756-8fd1-d508914334d5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"6f0163a8-530c-4e25-bbe0-9ca86b9525dc","name":"Get a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"limit":{"equalTo":"1.1"},"page":{"equalTo":"1.1"}}},"response":{"status":200,"body":"{\n \"project_id\": \"project_id\",\n \"mip_opt_out\": true,\n \"name\": \"name\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"6f0163a8-530c-4e25-bbe0-9ca86b9525dc","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"68918577-6401-4439-8533-356257ff7bcf","name":"Delete a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"68918577-6401-4439-8533-356257ff7bcf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"659fc38b-3934-4e43-93bf-d331f547449e","name":"Update a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"PATCH","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"Successfully updated project info.\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"659fc38b-3934-4e43-93bf-d331f547449e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"43ae6622-ad2f-4c81-9bc9-a8bbe17ef9d8","name":"Leave a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/leave","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"43ae6622-ad2f-4c81-9bc9-a8bbe17ef9d8","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"032d9b1c-3b87-40fb-bfab-8c5be92a5d71","name":"List Project Keys - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"status":{"equalTo":"active"}}},"response":{"status":200,"body":"{\n \"api_keys\": [\n {\n \"member\": {\n \"member_id\": \"1000-2000-3000-4000\",\n \"email\": \"john@test.com\"\n },\n \"api_key\": {\n \"api_key_id\": \"1234567890abcdef1234567890abcdef\",\n \"comment\": \"A comment\",\n \"scopes\": [\n \"admin\"\n ],\n \"created\": \"2021-01-01T00:00:00Z\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"032d9b1c-3b87-40fb-bfab-8c5be92a5d71","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"0167c735-0b6f-4715-8df8-32300d4dae72","name":"Create a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys","method":"POST","pathParameters":{"project_id":{"equalTo":"project_id"}}},"response":{"status":200,"body":"{\n \"api_key_id\": \"api_key_id\",\n \"key\": \"key\",\n \"comment\": \"comment\",\n \"scopes\": [\n \"scopes\",\n \"scopes\"\n ],\n \"tags\": [\n \"tags\",\n \"tags\"\n ],\n \"expiration_date\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"0167c735-0b6f-4715-8df8-32300d4dae72","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"c9812dd3-f87e-4798-aec3-af0933330dd5","name":"Get a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys/{key_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"key_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"item\": {\n \"member\": {\n \"member_id\": \"1000-2000-3000-4000\",\n \"email\": \"john@test.com\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"api_key\": {\n \"api_key_id\": \"1000-2000-3000-4000\",\n \"comment\": \"A comment\",\n \"scopes\": [\n \"admin\"\n ],\n \"tags\": [\n \"prod\",\n \"west-region\"\n ],\n \"expiration_date\": \"2021-01-01T00:00:00Z\",\n \"created\": \"2021-01-01T00:00:00Z\"\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"c9812dd3-f87e-4798-aec3-af0933330dd5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"3d2fbc7c-7bac-436f-a6ac-abe1b2c2caac","name":"Delete a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys/{key_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"key_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"3d2fbc7c-7bac-436f-a6ac-abe1b2c2caac","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"91e103d5-72f7-463d-840d-310069e33de9","name":"List Project Members - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"members\": [\n {\n \"member_id\": \"member_id\",\n \"email\": \"email\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"91e103d5-72f7-463d-840d-310069e33de9","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"515c6f7e-09c3-43ea-ad6c-65bc11d20f46","name":"Delete a Project Member - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"515c6f7e-09c3-43ea-ad6c-65bc11d20f46","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"a920ad0e-2796-4361-ac16-ac83fb75e32a","name":"List Project Models - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/models","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"include_outdated":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"stt\": [\n {\n \"name\": \"nova-3\",\n \"canonical_name\": \"nova-3\",\n \"architecture\": \"base\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2021-11-10.1\",\n \"uuid\": \"6b28e919-8427-4f32-9847-492e2efd7daf\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": true\n }\n ],\n \"tts\": [\n {\n \"name\": \"zeus\",\n \"canonical_name\": \"aura-2-zeus-en\",\n \"architecture\": \"aura-2\",\n \"languages\": [\n \"en\",\n \"en-US\"\n ],\n \"version\": \"2025-04-07.0\",\n \"uuid\": \"2baf189d-91ac-481d-b6d1-750888667b31\",\n \"metadata\": {\n \"accent\": \"American\",\n \"age\": \"Adult\",\n \"color\": \"#C58DFF\",\n \"image\": \"https://static.deepgram.com/examples/avatars/zeus.jpg\",\n \"sample\": \"https://static.deepgram.com/examples/Aura-2-zeus.wav\",\n \"tags\": [\n \"masculine\",\n \"deep\",\n \"trustworthy\",\n \"smooth\"\n ],\n \"use_cases\": [\n \"IVR\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"a920ad0e-2796-4361-ac16-ac83fb75e32a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"9f8c6bf2-ebee-4956-b39f-0291b9d64b6e","name":"Get a Project Model - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/models/{model_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"model_id":{"equalTo":"af6e9977-99f6-4d8f-b6f5-dfdf6fb6e291"}}},"response":{"status":200,"body":"{\n \"name\": \"general\",\n \"canonical_name\": \"enhanced-general\",\n \"architecture\": \"polaris\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2022-05-18.1\",\n \"uuid\": \"c7226e9e-ae1c-4057-ae2a-a71a6b0dc588\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": false\n}","headers":{"Content-Type":"application/json"}},"uuid":"9f8c6bf2-ebee-4956-b39f-0291b9d64b6e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"d6a14959-05fa-4aec-9f0c-ba2a817c66e5","name":"List Project Requests - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/requests","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"2024-01-15T09:30:00.000Z"},"end":{"equalTo":"2024-01-15T09:30:00.000Z"},"limit":{"equalTo":"1.1"},"page":{"equalTo":"1.1"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"request_id":{"equalTo":"12345678-1234-1234-1234-123456789012"},"deployment":{"equalTo":"hosted"},"endpoint":{"equalTo":"listen"},"method":{"equalTo":"sync"},"status":{"equalTo":"succeeded"}}},"response":{"status":200,"body":"{\n \"page\": 1.1,\n \"limit\": 1.1,\n \"requests\": [\n {\n \"request_id\": \"request_id\",\n \"project_uuid\": \"project_uuid\",\n \"created\": \"2024-01-15T09:30:00Z\",\n \"path\": \"path\",\n \"api_key_id\": \"api_key_id\",\n \"response\": {\n \"key\": \"value\"\n },\n \"code\": 1.1,\n \"deployment\": \"deployment\",\n \"callback\": \"callback\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"d6a14959-05fa-4aec-9f0c-ba2a817c66e5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"733e39aa-d3ef-4ea7-8062-af080c6288c4","name":"Get a Project Request - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/requests/{request_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"request_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"request\": {\n \"request_id\": \"request_id\",\n \"project_uuid\": \"project_uuid\",\n \"created\": \"2024-01-15T09:30:00Z\",\n \"path\": \"path\",\n \"api_key_id\": \"api_key_id\",\n \"response\": {\n \"key\": \"value\"\n },\n \"code\": 1.1,\n \"deployment\": \"deployment\",\n \"callback\": \"callback\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"733e39aa-d3ef-4ea7-8062-af080c6288c4","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"6309dd55-c993-4ce1-b0b2-01a41c9f08d6","name":"Get Project Usage - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"alternatives":{"equalTo":"true"},"callback_method":{"equalTo":"true"},"callback":{"equalTo":"true"},"channels":{"equalTo":"true"},"custom_intent_mode":{"equalTo":"true"},"custom_intent":{"equalTo":"true"},"custom_topic_mode":{"equalTo":"true"},"custom_topic":{"equalTo":"true"},"deployment":{"equalTo":"hosted"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"true"},"endpoint":{"equalTo":"listen"},"extra":{"equalTo":"true"},"filler_words":{"equalTo":"true"},"intents":{"equalTo":"true"},"keyterm":{"equalTo":"true"},"keywords":{"equalTo":"true"},"language":{"equalTo":"true"},"measurements":{"equalTo":"true"},"method":{"equalTo":"sync"},"model":{"equalTo":"6f548761-c9c0-429a-9315-11a1d28499c8"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"true"},"replace":{"equalTo":"true"},"sample_rate":{"equalTo":"true"},"search":{"equalTo":"true"},"sentiment":{"equalTo":"true"},"smart_format":{"equalTo":"true"},"summarize":{"equalTo":"true"},"tag":{"equalTo":"tag1"},"topics":{"equalTo":"true"},"utt_split":{"equalTo":"true"},"utterances":{"equalTo":"true"},"version":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"start\": \"2024-10-16\",\n \"end\": \"2024-10-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"6309dd55-c993-4ce1-b0b2-01a41c9f08d6","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"b132121b-4efe-42ad-a268-8acac35c189b","name":"Get Project Balances - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/balances","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"balances\": [\n {\n \"balance_id\": \"balance_id\",\n \"amount\": 1.1,\n \"units\": \"units\",\n \"purchase_order_id\": \"purchase_order_id\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"b132121b-4efe-42ad-a268-8acac35c189b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"4019c244-52d3-4d57-902c-af837631650a","name":"Get a Project Balance - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/balances/{balance_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"balance_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"balance_id\": \"balance_id\",\n \"amount\": 1.1,\n \"units\": \"units\",\n \"purchase_order_id\": \"purchase_order_id\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"4019c244-52d3-4d57-902c-af837631650a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"555b6751-587f-400c-bf5e-400e108ad6b4","name":"Get Project Billing Breakdown - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/billing/breakdown","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"deployment":{"equalTo":"hosted"},"tag":{"equalTo":"tag1"},"line_item":{"equalTo":"streaming::nova-3"}}},"response":{"status":200,"body":"{\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n },\n \"results\": [\n {\n \"dollars\": 0.25,\n \"grouping\": {\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-16\",\n \"accessor\": \"123456789012345678901234\",\n \"deployment\": \"hosted\",\n \"line_item\": \"streaming::nova-3\",\n \"tags\": [\n \"tag1\",\n \"tag2\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"555b6751-587f-400c-bf5e-400e108ad6b4","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"a61ae38c-e41f-4726-a55c-88f2135897be","name":"List Project Billing Fields - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/billing/fields","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"}}},"response":{"status":200,"body":"{\n \"accessors\": [\n \"12345678-1234-1234-1234-123456789012\",\n \"87654321-4321-4321-4321-210987654321\"\n ],\n \"deployments\": [\n \"hosted\",\n \"self-hosted\"\n ],\n \"tags\": [\n \"dev\",\n \"production\"\n ],\n \"line_items\": {\n \"streaming::nova-3\": \"Nova - 3 (Stream)\",\n \"sync::aura-2\": \"Aura -2 (Sync)\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a61ae38c-e41f-4726-a55c-88f2135897be","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"85b4373c-ba39-41b1-84e8-ae1ee6b180ca","name":"List Project Purchases - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/purchases","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"limit":{"equalTo":"1.1"}}},"response":{"status":200,"body":"{\n \"orders\": [\n {\n \"order_id\": \"025e19ba-b6d9-4a04-9f99-4fe715aca5f1\",\n \"expiration\": \"2026-03-04T00:00:00Z\",\n \"created\": \"2023-02-21T21:13:40Z\",\n \"amount\": 150,\n \"units\": \"usd\",\n \"order_type\": \"promotional\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"85b4373c-ba39-41b1-84e8-ae1ee6b180ca","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"2dd14c67-ed4e-4d97-9636-0a712899deb8","name":"List Project Invites - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"invites\": [\n {\n \"email\": \"email\",\n \"scope\": \"scope\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"2dd14c67-ed4e-4d97-9636-0a712899deb8","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"7c109496-adfe-4e85-b007-a6f799ee95cb","name":"Create a Project Invite - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"7c109496-adfe-4e85-b007-a6f799ee95cb","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"d6d268d0-d91e-4a65-80e0-339621173db9","name":"Delete a Project Invite - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites/{email}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"email":{"equalTo":"john.doe@example.com"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"d6d268d0-d91e-4a65-80e0-339621173db9","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"1b965d71-c930-4a0b-90f3-2289f80f3634","name":"List Project Member Scopes - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}/scopes","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"scopes\": [\n \"scopes\"\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"1b965d71-c930-4a0b-90f3-2289f80f3634","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"eb2f5de2-b887-47be-abd5-7cb702aca55d","name":"Update Project Member Scopes - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}/scopes","method":"PUT","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"eb2f5de2-b887-47be-abd5-7cb702aca55d","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"9bdf51a4-1e10-41b8-8de2-2df650562db3","name":"Get Project Usage Breakdown - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage/breakdown","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"grouping":{"equalTo":"accessor"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"alternatives":{"equalTo":"true"},"callback_method":{"equalTo":"true"},"callback":{"equalTo":"true"},"channels":{"equalTo":"true"},"custom_intent_mode":{"equalTo":"true"},"custom_intent":{"equalTo":"true"},"custom_topic_mode":{"equalTo":"true"},"custom_topic":{"equalTo":"true"},"deployment":{"equalTo":"hosted"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"true"},"endpoint":{"equalTo":"listen"},"extra":{"equalTo":"true"},"filler_words":{"equalTo":"true"},"intents":{"equalTo":"true"},"keyterm":{"equalTo":"true"},"keywords":{"equalTo":"true"},"language":{"equalTo":"true"},"measurements":{"equalTo":"true"},"method":{"equalTo":"sync"},"model":{"equalTo":"6f548761-c9c0-429a-9315-11a1d28499c8"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"true"},"replace":{"equalTo":"true"},"sample_rate":{"equalTo":"true"},"search":{"equalTo":"true"},"sentiment":{"equalTo":"true"},"smart_format":{"equalTo":"true"},"summarize":{"equalTo":"true"},"tag":{"equalTo":"tag1"},"topics":{"equalTo":"true"},"utt_split":{"equalTo":"true"},"utterances":{"equalTo":"true"},"version":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n },\n \"results\": [\n {\n \"hours\": 1619.7242069444444,\n \"total_hours\": 1621.7395791666668,\n \"agent_hours\": 41.33564388888889,\n \"tokens_in\": 0,\n \"tokens_out\": 0,\n \"tts_characters\": 9158866,\n \"requests\": 373381,\n \"grouping\": {\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-16\",\n \"accessor\": \"123456789012345678901234\",\n \"endpoint\": \"listen\",\n \"feature_set\": \"punctuate\",\n \"models\": [\n \"Nova-2\"\n ],\n \"method\": \"async\",\n \"tags\": \"tag1\",\n \"deployment\": \"self-hosted\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"9bdf51a4-1e10-41b8-8de2-2df650562db3","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"bc9fcd54-076e-48dc-a2dd-d71a8bf8bd4e","name":"List Project Usage Fields - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage/fields","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"}}},"response":{"status":200,"body":"{\n \"tags\": [\n \"tag=dev\",\n \"tag=production\"\n ],\n \"models\": [\n {\n \"name\": \"2-medical-nova\",\n \"language\": \"en-MY\",\n \"version\": \"2024-05-31.13574\",\n \"model_id\": \"1234567890-12345-67890\"\n }\n ],\n \"processing_methods\": [\n \"sync\",\n \"streaming\"\n ],\n \"features\": [\n \"alternatives\",\n \"detect_entities\",\n \"detect_language\"\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"bc9fcd54-076e-48dc-a2dd-d71a8bf8bd4e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"b5ac3651-d3b7-4cd7-b0b8-e1a917a16f3b","name":"Analyze text content - default","request":{"urlPathTemplate":"/v1/read","method":"POST","queryParameters":{"callback":{"equalTo":"callback"},"callback_method":{"equalTo":"POST"},"sentiment":{"equalTo":"true"},"summarize":{"equalTo":"v2"},"tag":{"equalTo":"tag"},"topics":{"equalTo":"true"},"custom_topic":{"equalTo":"custom_topic"},"custom_topic_mode":{"equalTo":"extended"},"intents":{"equalTo":"true"},"custom_intent":{"equalTo":"custom_intent"},"custom_intent_mode":{"equalTo":"extended"},"language":{"equalTo":"language"}}},"response":{"status":200,"body":"{\n \"metadata\": {\n \"metadata\": {\n \"request_id\": \"d04af392-db11-4c1d-83e1-20e34f0b8999\",\n \"created\": \"2024-11-18T23:47:44Z\",\n \"language\": \"en\"\n }\n },\n \"results\": {\n \"summary\": {\n \"results\": {\n \"summary\": {\n \"text\": \"The summary of the text submitted.\"\n }\n }\n },\n \"topics\": {\n \"results\": {\n \"topics\": {\n \"segments\": [\n {\n \"text\": \"And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 32,\n \"end_word\": 69,\n \"topics\": [\n {\n \"topic\": \"Spacewalk\",\n \"confidence_score\": 0.91581345\n }\n ]\n }\n ]\n }\n }\n },\n \"intents\": {\n \"results\": {\n \"intents\": {\n \"segments\": [\n {\n \"text\": \"If you found this valuable, you can subscribe to the show on spotify or your favorite podcast app.\",\n \"start_word\": 354,\n \"end_word\": 414,\n \"intents\": [\n {\n \"intent\": \"Encourage podcasting\",\n \"confidence_score\": 0.0038975573\n }\n ]\n }\n ]\n }\n }\n },\n \"sentiments\": {\n \"segments\": [\n {\n \"text\": \"Yeah. As as much as, um, it's worth celebrating, uh, the first, uh, spacewalk, um, with an all-female team, I think many of us are looking forward to it just being normal. And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 0,\n \"end_word\": 69,\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810546875\n }\n ],\n \"average\": {\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810185185185185\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"b5ac3651-d3b7-4cd7-b0b8-e1a917a16f3b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"4110cb96-50e2-4fe6-b8ae-5d69120cee89","name":"List Project Self-Hosted Distribution Credentials - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"distribution_credentials\": [\n {\n \"member\": {\n \"member_id\": \"3376abcd-8e5e-49d3-92d4-876d3a4f0363\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"8b36cfd0-472f-4a21-833f-2d6343c3a2f3\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"4110cb96-50e2-4fe6-b8ae-5d69120cee89","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"9c12eea9-6ba6-4d70-bb14-a2742cebc114","name":"Create a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"provider":{"equalTo":"quay"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"9c12eea9-6ba6-4d70-bb14-a2742cebc114","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"a47cd13f-2314-4190-b2c7-20436ccffbd2","name":"Get a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials/{distribution_credentials_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"distribution_credentials_id":{"equalTo":"8b36cfd0-472f-4a21-833f-2d6343c3a2f3"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a47cd13f-2314-4190-b2c7-20436ccffbd2","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"8bd46091-0e57-4b3d-9485-a86e6f1eaf17","name":"Delete a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials/{distribution_credentials_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"distribution_credentials_id":{"equalTo":"8b36cfd0-472f-4a21-833f-2d6343c3a2f3"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"8bd46091-0e57-4b3d-9485-a86e6f1eaf17","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"b06ec977-02ed-41e2-8fff-2bc45cd2166b","name":"Text to Speech transformation - default","request":{"urlPathTemplate":"/v1/speak","method":"POST"},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"b06ec977-02ed-41e2-8fff-2bc45cd2166b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"61883f62-09ec-4be9-b477-13a89b9677cf","name":"List Agent Configurations - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"agents\": [\n {\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"61883f62-09ec-4be9-b477-13a89b9677cf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"a43cdbee-2b2f-47fb-8220-75d337cb6d3a","name":"Create an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a43cdbee-2b2f-47fb-8220-75d337cb6d3a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"2575dd3c-b1c8-4007-8f87-4e32073a9dcf","name":"Get an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"2575dd3c-b1c8-4007-8f87-4e32073a9dcf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"3b52c271-0e44-4148-b726-6f5ca8c91d26","name":"Update Agent Metadata - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"PUT","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"3b52c271-0e44-4148-b726-6f5ca8c91d26","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"e839386d-beaa-4a7a-a478-ed9d9ab1b63e","name":"Delete an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"e839386d-beaa-4a7a-a478-ed9d9ab1b63e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"bb85071e-3933-4cd3-8fd7-d35eb4c992c5","name":"List Agent Variables - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"variables\": [\n {\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"bb85071e-3933-4cd3-8fd7-d35eb4c992c5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"c5016e4b-f863-4dc7-972f-c577ac7fdc47","name":"Create an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables","method":"POST","pathParameters":{"project_id":{"equalTo":"project_id"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"c5016e4b-f863-4dc7-972f-c577ac7fdc47","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"5bb4b688-8475-4911-8ad5-725b7d5338e3","name":"Get an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"variable_id":{"equalTo":"v1a2b3c4-d5e6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"5bb4b688-8475-4911-8ad5-725b7d5338e3","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"2e2c7061-7573-423f-a907-2a15dd9f3307","name":"Delete an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"variable_id":{"equalTo":"v1a2b3c4-d5e6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"2e2c7061-7573-423f-a907-2a15dd9f3307","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}},{"id":"33765621-bc60-4ef4-b295-4b276aeb871f","name":"Update an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"PATCH","pathParameters":{"project_id":{"equalTo":"project_id"},"variable_id":{"equalTo":"variable_id"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"33765621-bc60-4ef4-b295-4b276aeb871f","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00.000Z","via":"SYSTEM"}}}}],"meta":{"total":49}} \ No newline at end of file +{"mappings":[{"id":"533b5d52-ab21-4763-aaae-87cf52f49aa5","name":"List Agent Think Models - default","request":{"urlPathTemplate":"/v1/agent/settings/think/models","method":"GET"},"response":{"status":200,"body":"{\n \"models\": [\n {\n \"id\": \"gpt-5\",\n \"name\": \"name\",\n \"provider\": \"open_ai\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"533b5d52-ab21-4763-aaae-87cf52f49aa5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"20e1029e-8bb9-4092-a809-b943e60822ef","name":"Token-based Authentication - default","request":{"urlPathTemplate":"/v1/auth/grant","method":"POST"},"response":{"status":200,"body":"{\n \"access_token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U\",\n \"expires_in\": 30\n}","headers":{"Content-Type":"application/json"}},"uuid":"20e1029e-8bb9-4092-a809-b943e60822ef","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"49d8d51a-7f01-4598-804f-b6f54cdc22da","name":"Transcribe and analyze pre-recorded audio and video - default","request":{"urlPathTemplate":"/v1/listen","method":"POST","queryParameters":{"callback":{"equalTo":"callback"},"callback_method":{"equalTo":"POST"},"extra":{"equalTo":"extra"},"sentiment":{"equalTo":"true"},"summarize":{"equalTo":"v2"},"tag":{"equalTo":"tag"},"topics":{"equalTo":"true"},"custom_topic":{"equalTo":"custom_topic"},"custom_topic_mode":{"equalTo":"extended"},"intents":{"equalTo":"true"},"custom_intent":{"equalTo":"custom_intent"},"custom_intent_mode":{"equalTo":"extended"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"linear16"},"filler_words":{"equalTo":"true"},"keywords":{"equalTo":"keywords"},"language":{"equalTo":"language"},"measurements":{"equalTo":"true"},"model":{"equalTo":"nova-3"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"redact"},"replace":{"equalTo":"replace"},"search":{"equalTo":"search"},"smart_format":{"equalTo":"true"},"utterances":{"equalTo":"true"},"utt_split":{"equalTo":"1.1"},"version":{"equalTo":"latest"},"mip_opt_out":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"metadata\": {\n \"request_id\": \"a847f427-4ad5-4d67-9b95-db801e58251c\",\n \"sha256\": \"154e291ecfa8be6ab8343560bcc109008fa7853eb5372533e8efdefc9b504c33\",\n \"created\": \"2024-05-12T18:57:13Z\",\n \"duration\": 25.933313,\n \"channels\": 1,\n \"models\": [\n \"30089e05-99d1-4376-b32e-c263170674af\"\n ],\n \"model_info\": {\n \"30089e05-99d1-4376-b32e-c263170674af\": {\n \"name\": \"2-general-nova\",\n \"version\": \"2024-01-09.29447\",\n \"arch\": \"nova-2\"\n }\n },\n \"summary_info\": {\n \"model_uuid\": \"67875a7f-c9c4-48a0-aa55-5bdb8a91c34a\",\n \"input_tokens\": 95,\n \"output_tokens\": 63\n },\n \"sentiment_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 105\n },\n \"topics_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 7\n },\n \"intents_info\": {\n \"model_uuid\": \"80ab3179-d113-4254-bd6b-4a2f96498695\",\n \"input_tokens\": 105,\n \"output_tokens\": 4\n },\n \"tags\": [\n \"test\"\n ]\n },\n \"results\": {\n \"channels\": [\n {}\n ],\n \"utterances\": [\n {}\n ],\n \"summary\": {\n \"result\": \"success\",\n \"short\": \"Speaker 0 discusses the significance of the first all-female spacewalk with an all-female team, stating that it is a tribute to the skilled and qualified women who were denied opportunities in the past.\"\n },\n \"topics\": {\n \"results\": {\n \"topics\": {\n \"segments\": [\n {\n \"text\": \"And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 32,\n \"end_word\": 69,\n \"topics\": [\n {\n \"topic\": \"Spacewalk\",\n \"confidence_score\": 0.91581345\n }\n ]\n }\n ]\n }\n }\n },\n \"intents\": {\n \"results\": {\n \"intents\": {\n \"segments\": [\n {\n \"text\": \"If you found this valuable, you can subscribe to the show on spotify or your favorite podcast app.\",\n \"start_word\": 354,\n \"end_word\": 414,\n \"intents\": [\n {\n \"intent\": \"Encourage podcasting\",\n \"confidence_score\": 0.0038975573\n }\n ]\n }\n ]\n }\n }\n },\n \"sentiments\": {\n \"segments\": [\n {\n \"text\": \"Yeah. As as much as, um, it's worth celebrating, uh, the first, uh, spacewalk, um, with an all-female team, I think many of us are looking forward to it just being normal. And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 0,\n \"end_word\": 69,\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810546875\n }\n ],\n \"average\": {\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810185185185185\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"49d8d51a-7f01-4598-804f-b6f54cdc22da","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"0a0be61b-f024-4120-9c54-23bca3e07c93","name":"List Models - default","request":{"urlPathTemplate":"/v1/models","method":"GET","queryParameters":{"include_outdated":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"stt\": [\n {\n \"name\": \"nova-3\",\n \"canonical_name\": \"nova-3\",\n \"architecture\": \"base\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2021-11-10.1\",\n \"uuid\": \"6b28e919-8427-4f32-9847-492e2efd7daf\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": true\n }\n ],\n \"tts\": [\n {\n \"name\": \"zeus\",\n \"canonical_name\": \"aura-2-zeus-en\",\n \"architecture\": \"aura-2\",\n \"languages\": [\n \"en\",\n \"en-US\"\n ],\n \"version\": \"2025-04-07.0\",\n \"uuid\": \"2baf189d-91ac-481d-b6d1-750888667b31\",\n \"metadata\": {\n \"accent\": \"American\",\n \"age\": \"Adult\",\n \"color\": \"#C58DFF\",\n \"image\": \"https://static.deepgram.com/examples/avatars/zeus.jpg\",\n \"sample\": \"https://static.deepgram.com/examples/Aura-2-zeus.wav\",\n \"tags\": [\n \"masculine\",\n \"deep\",\n \"trustworthy\",\n \"smooth\"\n ],\n \"use_cases\": [\n \"IVR\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"0a0be61b-f024-4120-9c54-23bca3e07c93","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"0f94d3ea-43b6-4a1a-bce4-ab05b85440ae","name":"Get a specific Model - default","request":{"urlPathTemplate":"/v1/models/{model_id}","method":"GET","pathParameters":{"model_id":{"equalTo":"af6e9977-99f6-4d8f-b6f5-dfdf6fb6e291"}}},"response":{"status":200,"body":"{\n \"name\": \"general\",\n \"canonical_name\": \"enhanced-general\",\n \"architecture\": \"polaris\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2022-05-18.1\",\n \"uuid\": \"c7226e9e-ae1c-4057-ae2a-a71a6b0dc588\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": false\n}","headers":{"Content-Type":"application/json"}},"uuid":"0f94d3ea-43b6-4a1a-bce4-ab05b85440ae","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"d08cac56-bc4d-4756-8fd1-d508914334d5","name":"List Projects - default","request":{"urlPathTemplate":"/v1/projects","method":"GET"},"response":{"status":200,"body":"{\n \"projects\": [\n {\n \"project_id\": \"project_id\",\n \"name\": \"name\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"d08cac56-bc4d-4756-8fd1-d508914334d5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}},"postServeActions":[]},{"id":"6f0163a8-530c-4e25-bbe0-9ca86b9525dc","name":"Get a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"limit":{"equalTo":"1.1"},"page":{"equalTo":"1.1"}}},"response":{"status":200,"body":"{\n \"project_id\": \"project_id\",\n \"mip_opt_out\": true,\n \"name\": \"name\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"6f0163a8-530c-4e25-bbe0-9ca86b9525dc","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"68918577-6401-4439-8533-356257ff7bcf","name":"Delete a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"68918577-6401-4439-8533-356257ff7bcf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"659fc38b-3934-4e43-93bf-d331f547449e","name":"Update a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}","method":"PATCH","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"Successfully updated project info.\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"659fc38b-3934-4e43-93bf-d331f547449e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"43ae6622-ad2f-4c81-9bc9-a8bbe17ef9d8","name":"Leave a Project - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/leave","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"43ae6622-ad2f-4c81-9bc9-a8bbe17ef9d8","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"032d9b1c-3b87-40fb-bfab-8c5be92a5d71","name":"List Project Keys - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"status":{"equalTo":"active"}}},"response":{"status":200,"body":"{\n \"api_keys\": [\n {\n \"member\": {\n \"member_id\": \"1000-2000-3000-4000\",\n \"email\": \"john@test.com\"\n },\n \"api_key\": {\n \"api_key_id\": \"1234567890abcdef1234567890abcdef\",\n \"comment\": \"A comment\",\n \"scopes\": [\n \"admin\"\n ],\n \"created\": \"2021-01-01T00:00:00Z\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"032d9b1c-3b87-40fb-bfab-8c5be92a5d71","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"0167c735-0b6f-4715-8df8-32300d4dae72","name":"Create a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys","method":"POST","pathParameters":{"project_id":{"equalTo":"project_id"}}},"response":{"status":200,"body":"{\n \"api_key_id\": \"api_key_id\",\n \"key\": \"key\",\n \"comment\": \"comment\",\n \"scopes\": [\n \"scopes\",\n \"scopes\"\n ],\n \"tags\": [\n \"tags\",\n \"tags\"\n ],\n \"expiration_date\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"0167c735-0b6f-4715-8df8-32300d4dae72","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"c9812dd3-f87e-4798-aec3-af0933330dd5","name":"Get a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys/{key_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"key_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"item\": {\n \"member\": {\n \"member_id\": \"1000-2000-3000-4000\",\n \"email\": \"john@test.com\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"api_key\": {\n \"api_key_id\": \"1000-2000-3000-4000\",\n \"comment\": \"A comment\",\n \"scopes\": [\n \"admin\"\n ],\n \"tags\": [\n \"prod\",\n \"west-region\"\n ],\n \"expiration_date\": \"2021-01-01T00:00:00Z\",\n \"created\": \"2021-01-01T00:00:00Z\"\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"c9812dd3-f87e-4798-aec3-af0933330dd5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"3d2fbc7c-7bac-436f-a6ac-abe1b2c2caac","name":"Delete a Project Key - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/keys/{key_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"key_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"3d2fbc7c-7bac-436f-a6ac-abe1b2c2caac","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"91e103d5-72f7-463d-840d-310069e33de9","name":"List Project Members - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"members\": [\n {\n \"member_id\": \"member_id\",\n \"email\": \"email\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"91e103d5-72f7-463d-840d-310069e33de9","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"515c6f7e-09c3-43ea-ad6c-65bc11d20f46","name":"Delete a Project Member - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"515c6f7e-09c3-43ea-ad6c-65bc11d20f46","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"a920ad0e-2796-4361-ac16-ac83fb75e32a","name":"List Project Models - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/models","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"include_outdated":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"stt\": [\n {\n \"name\": \"nova-3\",\n \"canonical_name\": \"nova-3\",\n \"architecture\": \"base\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2021-11-10.1\",\n \"uuid\": \"6b28e919-8427-4f32-9847-492e2efd7daf\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": true\n }\n ],\n \"tts\": [\n {\n \"name\": \"zeus\",\n \"canonical_name\": \"aura-2-zeus-en\",\n \"architecture\": \"aura-2\",\n \"languages\": [\n \"en\",\n \"en-US\"\n ],\n \"version\": \"2025-04-07.0\",\n \"uuid\": \"2baf189d-91ac-481d-b6d1-750888667b31\",\n \"metadata\": {\n \"accent\": \"American\",\n \"age\": \"Adult\",\n \"color\": \"#C58DFF\",\n \"image\": \"https://static.deepgram.com/examples/avatars/zeus.jpg\",\n \"sample\": \"https://static.deepgram.com/examples/Aura-2-zeus.wav\",\n \"tags\": [\n \"masculine\",\n \"deep\",\n \"trustworthy\",\n \"smooth\"\n ],\n \"use_cases\": [\n \"IVR\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"a920ad0e-2796-4361-ac16-ac83fb75e32a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"9f8c6bf2-ebee-4956-b39f-0291b9d64b6e","name":"Get a Project Model - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/models/{model_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"model_id":{"equalTo":"af6e9977-99f6-4d8f-b6f5-dfdf6fb6e291"}}},"response":{"status":200,"body":"{\n \"name\": \"general\",\n \"canonical_name\": \"enhanced-general\",\n \"architecture\": \"polaris\",\n \"languages\": [\n \"en\",\n \"en-us\"\n ],\n \"version\": \"2022-05-18.1\",\n \"uuid\": \"c7226e9e-ae1c-4057-ae2a-a71a6b0dc588\",\n \"batch\": true,\n \"streaming\": true,\n \"formatted_output\": false\n}","headers":{"Content-Type":"application/json"}},"uuid":"9f8c6bf2-ebee-4956-b39f-0291b9d64b6e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"d6a14959-05fa-4aec-9f0c-ba2a817c66e5","name":"List Project Requests - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/requests","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"2024-01-15T09:30:00Z"},"end":{"equalTo":"2024-01-15T09:30:00Z"},"limit":{"equalTo":"1.1"},"page":{"equalTo":"1.1"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"request_id":{"equalTo":"12345678-1234-1234-1234-123456789012"},"deployment":{"equalTo":"hosted"},"endpoint":{"equalTo":"listen"},"method":{"equalTo":"sync"},"status":{"equalTo":"succeeded"}}},"response":{"status":200,"body":"{\n \"page\": 1.1,\n \"limit\": 1.1,\n \"requests\": [\n {\n \"request_id\": \"request_id\",\n \"project_uuid\": \"project_uuid\",\n \"created\": \"2024-01-15T09:30:00Z\",\n \"path\": \"path\",\n \"api_key_id\": \"api_key_id\",\n \"response\": {\n \"key\": \"value\"\n },\n \"code\": 1.1,\n \"deployment\": \"deployment\",\n \"callback\": \"callback\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"d6a14959-05fa-4aec-9f0c-ba2a817c66e5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"733e39aa-d3ef-4ea7-8062-af080c6288c4","name":"Get a Project Request - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/requests/{request_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"request_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"request\": {\n \"request_id\": \"request_id\",\n \"project_uuid\": \"project_uuid\",\n \"created\": \"2024-01-15T09:30:00Z\",\n \"path\": \"path\",\n \"api_key_id\": \"api_key_id\",\n \"response\": {\n \"key\": \"value\"\n },\n \"code\": 1.1,\n \"deployment\": \"deployment\",\n \"callback\": \"callback\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"733e39aa-d3ef-4ea7-8062-af080c6288c4","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"6309dd55-c993-4ce1-b0b2-01a41c9f08d6","name":"Get Project Usage - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"alternatives":{"equalTo":"true"},"callback_method":{"equalTo":"true"},"callback":{"equalTo":"true"},"channels":{"equalTo":"true"},"custom_intent_mode":{"equalTo":"true"},"custom_intent":{"equalTo":"true"},"custom_topic_mode":{"equalTo":"true"},"custom_topic":{"equalTo":"true"},"deployment":{"equalTo":"hosted"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"true"},"endpoint":{"equalTo":"listen"},"extra":{"equalTo":"true"},"filler_words":{"equalTo":"true"},"intents":{"equalTo":"true"},"keyterm":{"equalTo":"true"},"keywords":{"equalTo":"true"},"language":{"equalTo":"true"},"measurements":{"equalTo":"true"},"method":{"equalTo":"sync"},"model":{"equalTo":"6f548761-c9c0-429a-9315-11a1d28499c8"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"true"},"replace":{"equalTo":"true"},"sample_rate":{"equalTo":"true"},"search":{"equalTo":"true"},"sentiment":{"equalTo":"true"},"smart_format":{"equalTo":"true"},"summarize":{"equalTo":"true"},"tag":{"equalTo":"tag1"},"topics":{"equalTo":"true"},"utt_split":{"equalTo":"true"},"utterances":{"equalTo":"true"},"version":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"start\": \"2024-10-16\",\n \"end\": \"2024-10-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"6309dd55-c993-4ce1-b0b2-01a41c9f08d6","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"b132121b-4efe-42ad-a268-8acac35c189b","name":"Get Project Balances - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/balances","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"balances\": [\n {\n \"balance_id\": \"balance_id\",\n \"amount\": 1.1,\n \"units\": \"units\",\n \"purchase_order_id\": \"purchase_order_id\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"b132121b-4efe-42ad-a268-8acac35c189b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"4019c244-52d3-4d57-902c-af837631650a","name":"Get a Project Balance - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/balances/{balance_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"balance_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"balance_id\": \"balance_id\",\n \"amount\": 1.1,\n \"units\": \"units\",\n \"purchase_order_id\": \"purchase_order_id\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"4019c244-52d3-4d57-902c-af837631650a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"555b6751-587f-400c-bf5e-400e108ad6b4","name":"Get Project Billing Breakdown - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/billing/breakdown","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"deployment":{"equalTo":"hosted"},"tag":{"equalTo":"tag1"},"line_item":{"equalTo":"streaming::nova-3"}}},"response":{"status":200,"body":"{\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n },\n \"results\": [\n {\n \"dollars\": 0.25,\n \"grouping\": {\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-16\",\n \"accessor\": \"123456789012345678901234\",\n \"deployment\": \"hosted\",\n \"line_item\": \"streaming::nova-3\",\n \"tags\": [\n \"tag1\",\n \"tag2\"\n ]\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"555b6751-587f-400c-bf5e-400e108ad6b4","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"a61ae38c-e41f-4726-a55c-88f2135897be","name":"List Project Billing Fields - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/billing/fields","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"}}},"response":{"status":200,"body":"{\n \"accessors\": [\n \"12345678-1234-1234-1234-123456789012\",\n \"87654321-4321-4321-4321-210987654321\"\n ],\n \"deployments\": [\n \"hosted\",\n \"self-hosted\"\n ],\n \"tags\": [\n \"dev\",\n \"production\"\n ],\n \"line_items\": {\n \"streaming::nova-3\": \"Nova - 3 (Stream)\",\n \"sync::aura-2\": \"Aura -2 (Sync)\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a61ae38c-e41f-4726-a55c-88f2135897be","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"85b4373c-ba39-41b1-84e8-ae1ee6b180ca","name":"List Project Purchases - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/purchases","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"limit":{"equalTo":"1.1"}}},"response":{"status":200,"body":"{\n \"orders\": [\n {\n \"order_id\": \"025e19ba-b6d9-4a04-9f99-4fe715aca5f1\",\n \"expiration\": \"2026-03-04T00:00:00Z\",\n \"created\": \"2023-02-21T21:13:40Z\",\n \"amount\": 150,\n \"units\": \"usd\",\n \"order_type\": \"promotional\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"85b4373c-ba39-41b1-84e8-ae1ee6b180ca","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"2dd14c67-ed4e-4d97-9636-0a712899deb8","name":"List Project Invites - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"invites\": [\n {\n \"email\": \"email\",\n \"scope\": \"scope\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"2dd14c67-ed4e-4d97-9636-0a712899deb8","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"7c109496-adfe-4e85-b007-a6f799ee95cb","name":"Create a Project Invite - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"7c109496-adfe-4e85-b007-a6f799ee95cb","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"d6d268d0-d91e-4a65-80e0-339621173db9","name":"Delete a Project Invite - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/invites/{email}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"email":{"equalTo":"john.doe@example.com"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"d6d268d0-d91e-4a65-80e0-339621173db9","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"1b965d71-c930-4a0b-90f3-2289f80f3634","name":"List Project Member Scopes - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}/scopes","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"scopes\": [\n \"scopes\"\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"1b965d71-c930-4a0b-90f3-2289f80f3634","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"eb2f5de2-b887-47be-abd5-7cb702aca55d","name":"Update Project Member Scopes - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/members/{member_id}/scopes","method":"PUT","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"member_id":{"equalTo":"123456789012345678901234"}}},"response":{"status":200,"body":"{\n \"message\": \"message\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"eb2f5de2-b887-47be-abd5-7cb702aca55d","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"9bdf51a4-1e10-41b8-8de2-2df650562db3","name":"Get Project Usage Breakdown - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage/breakdown","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"},"grouping":{"equalTo":"accessor"},"accessor":{"equalTo":"12345678-1234-1234-1234-123456789012"},"alternatives":{"equalTo":"true"},"callback_method":{"equalTo":"true"},"callback":{"equalTo":"true"},"channels":{"equalTo":"true"},"custom_intent_mode":{"equalTo":"true"},"custom_intent":{"equalTo":"true"},"custom_topic_mode":{"equalTo":"true"},"custom_topic":{"equalTo":"true"},"deployment":{"equalTo":"hosted"},"detect_entities":{"equalTo":"true"},"detect_language":{"equalTo":"true"},"diarize":{"equalTo":"true"},"dictation":{"equalTo":"true"},"encoding":{"equalTo":"true"},"endpoint":{"equalTo":"listen"},"extra":{"equalTo":"true"},"filler_words":{"equalTo":"true"},"intents":{"equalTo":"true"},"keyterm":{"equalTo":"true"},"keywords":{"equalTo":"true"},"language":{"equalTo":"true"},"measurements":{"equalTo":"true"},"method":{"equalTo":"sync"},"model":{"equalTo":"6f548761-c9c0-429a-9315-11a1d28499c8"},"multichannel":{"equalTo":"true"},"numerals":{"equalTo":"true"},"paragraphs":{"equalTo":"true"},"profanity_filter":{"equalTo":"true"},"punctuate":{"equalTo":"true"},"redact":{"equalTo":"true"},"replace":{"equalTo":"true"},"sample_rate":{"equalTo":"true"},"search":{"equalTo":"true"},"sentiment":{"equalTo":"true"},"smart_format":{"equalTo":"true"},"summarize":{"equalTo":"true"},"tag":{"equalTo":"tag1"},"topics":{"equalTo":"true"},"utt_split":{"equalTo":"true"},"utterances":{"equalTo":"true"},"version":{"equalTo":"true"}}},"response":{"status":200,"body":"{\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-23\",\n \"resolution\": {\n \"units\": \"day\",\n \"amount\": 1\n },\n \"results\": [\n {\n \"hours\": 1619.7242069444444,\n \"total_hours\": 1621.7395791666668,\n \"agent_hours\": 41.33564388888889,\n \"tokens_in\": 0,\n \"tokens_out\": 0,\n \"tts_characters\": 9158866,\n \"requests\": 373381,\n \"grouping\": {\n \"start\": \"2025-01-16\",\n \"end\": \"2025-01-16\",\n \"accessor\": \"123456789012345678901234\",\n \"endpoint\": \"listen\",\n \"feature_set\": \"punctuate\",\n \"models\": [\n \"Nova-2\"\n ],\n \"method\": \"async\",\n \"tags\": \"tag1\",\n \"deployment\": \"self-hosted\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"9bdf51a4-1e10-41b8-8de2-2df650562db3","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"bc9fcd54-076e-48dc-a2dd-d71a8bf8bd4e","name":"List Project Usage Fields - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/usage/fields","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"start":{"equalTo":"start"},"end":{"equalTo":"end"}}},"response":{"status":200,"body":"{\n \"tags\": [\n \"tag=dev\",\n \"tag=production\"\n ],\n \"models\": [\n {\n \"name\": \"2-medical-nova\",\n \"language\": \"en-MY\",\n \"version\": \"2024-05-31.13574\",\n \"model_id\": \"1234567890-12345-67890\"\n }\n ],\n \"processing_methods\": [\n \"sync\",\n \"streaming\"\n ],\n \"features\": [\n \"alternatives\",\n \"detect_entities\",\n \"detect_language\"\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"bc9fcd54-076e-48dc-a2dd-d71a8bf8bd4e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"b5ac3651-d3b7-4cd7-b0b8-e1a917a16f3b","name":"Analyze text content - default","request":{"urlPathTemplate":"/v1/read","method":"POST","queryParameters":{"callback":{"equalTo":"callback"},"callback_method":{"equalTo":"POST"},"sentiment":{"equalTo":"true"},"summarize":{"equalTo":"v2"},"tag":{"equalTo":"tag"},"topics":{"equalTo":"true"},"custom_topic":{"equalTo":"custom_topic"},"custom_topic_mode":{"equalTo":"extended"},"intents":{"equalTo":"true"},"custom_intent":{"equalTo":"custom_intent"},"custom_intent_mode":{"equalTo":"extended"},"language":{"equalTo":"language"}}},"response":{"status":200,"body":"{\n \"metadata\": {\n \"metadata\": {\n \"request_id\": \"d04af392-db11-4c1d-83e1-20e34f0b8999\",\n \"created\": \"2024-11-18T23:47:44Z\",\n \"language\": \"en\"\n }\n },\n \"results\": {\n \"summary\": {\n \"results\": {\n \"summary\": {\n \"text\": \"The summary of the text submitted.\"\n }\n }\n },\n \"topics\": {\n \"results\": {\n \"topics\": {\n \"segments\": [\n {\n \"text\": \"And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 32,\n \"end_word\": 69,\n \"topics\": [\n {\n \"topic\": \"Spacewalk\",\n \"confidence_score\": 0.91581345\n }\n ]\n }\n ]\n }\n }\n },\n \"intents\": {\n \"results\": {\n \"intents\": {\n \"segments\": [\n {\n \"text\": \"If you found this valuable, you can subscribe to the show on spotify or your favorite podcast app.\",\n \"start_word\": 354,\n \"end_word\": 414,\n \"intents\": [\n {\n \"intent\": \"Encourage podcasting\",\n \"confidence_score\": 0.0038975573\n }\n ]\n }\n ]\n }\n }\n },\n \"sentiments\": {\n \"segments\": [\n {\n \"text\": \"Yeah. As as much as, um, it's worth celebrating, uh, the first, uh, spacewalk, um, with an all-female team, I think many of us are looking forward to it just being normal. And, um, I think if it signifies anything, it is, uh, to honor the the women who came before us who, um, were skilled and qualified, um, and didn't get the the same opportunities that we have today.\",\n \"start_word\": 0,\n \"end_word\": 69,\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810546875\n }\n ],\n \"average\": {\n \"sentiment\": \"positive\",\n \"sentiment_score\": 0.5810185185185185\n }\n }\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"b5ac3651-d3b7-4cd7-b0b8-e1a917a16f3b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"4110cb96-50e2-4fe6-b8ae-5d69120cee89","name":"List Project Self-Hosted Distribution Credentials - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"distribution_credentials\": [\n {\n \"member\": {\n \"member_id\": \"3376abcd-8e5e-49d3-92d4-876d3a4f0363\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"8b36cfd0-472f-4a21-833f-2d6343c3a2f3\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"4110cb96-50e2-4fe6-b8ae-5d69120cee89","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"9c12eea9-6ba6-4d70-bb14-a2742cebc114","name":"Create a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}},"queryParameters":{"provider":{"equalTo":"quay"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"9c12eea9-6ba6-4d70-bb14-a2742cebc114","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"a47cd13f-2314-4190-b2c7-20436ccffbd2","name":"Get a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials/{distribution_credentials_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"distribution_credentials_id":{"equalTo":"8b36cfd0-472f-4a21-833f-2d6343c3a2f3"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a47cd13f-2314-4190-b2c7-20436ccffbd2","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"8bd46091-0e57-4b3d-9485-a86e6f1eaf17","name":"Delete a Project Self-Hosted Distribution Credential - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/self-hosted/distribution/credentials/{distribution_credentials_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"distribution_credentials_id":{"equalTo":"8b36cfd0-472f-4a21-833f-2d6343c3a2f3"}}},"response":{"status":200,"body":"{\n \"member\": {\n \"member_id\": \"c7b9b131-73f3-11d9-8665-0b00d2e44b83\",\n \"email\": \"email@example.com\"\n },\n \"distribution_credentials\": {\n \"distribution_credentials_id\": \"82c32c10-53b2-4d23-993f-864b3d44502a\",\n \"provider\": \"quay\",\n \"comment\": \"My Self-Hosted Distribution Credentials\",\n \"scopes\": [\n \"self-hosted:product:api\",\n \"self-hosted:product:engine\"\n ],\n \"created\": \"2023-06-28T15:36:59Z\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"8bd46091-0e57-4b3d-9485-a86e6f1eaf17","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"b06ec977-02ed-41e2-8fff-2bc45cd2166b","name":"Text to Speech transformation - default","request":{"urlPathTemplate":"/v1/speak","method":"POST"},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"b06ec977-02ed-41e2-8fff-2bc45cd2166b","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"61883f62-09ec-4be9-b477-13a89b9677cf","name":"List Agent Configurations - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"agents\": [\n {\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"61883f62-09ec-4be9-b477-13a89b9677cf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"a43cdbee-2b2f-47fb-8220-75d337cb6d3a","name":"Create an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents","method":"POST","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n }\n}","headers":{"Content-Type":"application/json"}},"uuid":"a43cdbee-2b2f-47fb-8220-75d337cb6d3a","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"2575dd3c-b1c8-4007-8f87-4e32073a9dcf","name":"Get an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"2575dd3c-b1c8-4007-8f87-4e32073a9dcf","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"3b52c271-0e44-4148-b726-6f5ca8c91d26","name":"Update Agent Metadata - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"PUT","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"agent_id\": \"agent_id\",\n \"config\": {\n \"key\": \"value\"\n },\n \"metadata\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"3b52c271-0e44-4148-b726-6f5ca8c91d26","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"e839386d-beaa-4a7a-a478-ed9d9ab1b63e","name":"Delete an Agent Configuration - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agents/{agent_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"agent_id":{"equalTo":"a1b2c3d4-e5f6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"e839386d-beaa-4a7a-a478-ed9d9ab1b63e","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"bb85071e-3933-4cd3-8fd7-d35eb4c992c5","name":"List Agent Variables - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"}}},"response":{"status":200,"body":"{\n \"variables\": [\n {\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n }\n ]\n}","headers":{"Content-Type":"application/json"}},"uuid":"bb85071e-3933-4cd3-8fd7-d35eb4c992c5","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"c5016e4b-f863-4dc7-972f-c577ac7fdc47","name":"Create an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables","method":"POST","pathParameters":{"project_id":{"equalTo":"project_id"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"c5016e4b-f863-4dc7-972f-c577ac7fdc47","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"5bb4b688-8475-4911-8ad5-725b7d5338e3","name":"Get an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"GET","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"variable_id":{"equalTo":"v1a2b3c4-d5e6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"5bb4b688-8475-4911-8ad5-725b7d5338e3","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"2e2c7061-7573-423f-a907-2a15dd9f3307","name":"Delete an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"DELETE","pathParameters":{"project_id":{"equalTo":"123456-7890-1234-5678-901234"},"variable_id":{"equalTo":"v1a2b3c4-d5e6-7890-abcd-ef1234567890"}}},"response":{"status":200,"body":"{\n \"key\": \"value\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"2e2c7061-7573-423f-a907-2a15dd9f3307","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}},{"id":"33765621-bc60-4ef4-b295-4b276aeb871f","name":"Update an Agent Variable - default","request":{"urlPathTemplate":"/v1/projects/{project_id}/agent-variables/{variable_id}","method":"PATCH","pathParameters":{"project_id":{"equalTo":"project_id"},"variable_id":{"equalTo":"variable_id"}}},"response":{"status":200,"body":"{\n \"variable_id\": \"variable_id\",\n \"key\": \"key\",\n \"value\": {\n \"key\": \"value\"\n },\n \"created_at\": \"2024-01-15T09:30:00Z\",\n \"updated_at\": \"2024-01-15T09:30:00Z\"\n}","headers":{"Content-Type":"application/json"}},"uuid":"33765621-bc60-4ef4-b295-4b276aeb871f","persistent":true,"priority":3,"metadata":{"mocklab":{"created":{"at":"2020-01-01T00:00:00Z","via":"SYSTEM"}}}}],"meta":{"total":49}} \ No newline at end of file