-
Notifications
You must be signed in to change notification settings - Fork 120
Description
Bug Report: Missing inject_agent_message Method in Agent WebSocket Client
Summary
The Deepgram Python SDK has all the infrastructure for agent message injection (InjectAgentMessageOptions, events, response handling) but is missing the actual inject_agent_message method implementation in both sync and async agent WebSocket clients.
Environment
- SDK Version: Current main branch
- Python Version: 4.6.0
- OS: darwin 24.5.0
- Files Affected:
deepgram/clients/agent/v1/websocket/client.pydeepgram/clients/agent/v1/websocket/async_client.py
Issue Description
The SDK imports InjectAgentMessageOptions but provides no corresponding inject_agent_message method to use it, while the parallel inject_user_message method exists and works correctly.
Expected Behavior
The SDK should provide both:
- ✅
inject_user_message(options: InjectUserMessageOptions)- EXISTS - ❌
inject_agent_message(options: InjectAgentMessageOptions)- MISSING
Actual Behavior
Attempting to call inject_agent_message results in:
AttributeError: 'AgentWebSocketClient' object has no attribute 'inject_agent_message'Steps to Reproduce
- Create an agent WebSocket client
- Try to call
inject_agent_messagemethod - Observe the AttributeError
from deepgram import DeepgramClient, InjectAgentMessageOptions
client = DeepgramClient()
agent_client = client.agent.websocket.v("1")
# This works (inject_user_message exists)
user_options = InjectUserMessageOptions(content="Hello")
agent_client.inject_user_message(user_options) # ✅ Success
# This fails (inject_agent_message missing)
agent_options = InjectAgentMessageOptions(message="Hello from agent")
agent_client.inject_agent_message(agent_options) # ❌ AttributeErrorEvidence from Codebase
1. Infrastructure EXISTS
Options Class (deepgram/clients/agent/v1/websocket/options.py:417-423):
@dataclass
class InjectAgentMessageOptions(BaseResponse):
"""
The client can send an InjectAgentMessage to immediately trigger an agent statement.
"""
type: str = str(AgentWebSocketEvents.InjectAgentMessage)
message: str = field(default="")Event Enum (deepgram/clients/agent/enums.py:33):
InjectAgentMessage: str = "InjectAgentMessage"Response Handling (deepgram/clients/agent/v1/websocket/response.py:100-109):
@dataclass
class InjectionRefusedResponse(BaseResponse):
"""
The server will send an InjectionRefused message when an InjectAgentMessage
request is ignored because it arrived while the user was speaking...
"""2. Method Implementation MISSING
Sync Client (deepgram/clients/agent/v1/websocket/client.py):
# Line 35: InjectAgentMessageOptions imported ✅
from .options import (
InjectAgentMessageOptions, # ✅ IMPORTED
InjectUserMessageOptions, # ✅ IMPORTED
# ...
)
# Line 619: inject_user_message method exists ✅
def inject_user_message(self, options: InjectUserMessageOptions) -> bool:
"""Injects a user message to trigger an agent response from text input."""
# ... implementation exists ...
# MISSING: inject_agent_message method should be here ❌
# def inject_agent_message(self, options: InjectAgentMessageOptions) -> bool:
# """Injects an agent message to immediately trigger an agent statement."""
# # ... NO IMPLEMENTATION FOUND ...Async Client (deepgram/clients/agent/v1/websocket/async_client.py):
# Line 35: InjectAgentMessageOptions imported ✅
from .options import (
InjectAgentMessageOptions, # ✅ IMPORTED
InjectUserMessageOptions, # ✅ IMPORTED
# ...
)
# Line 623: inject_user_message method exists ✅
async def inject_user_message(self, options: InjectUserMessageOptions) -> bool:
"""Injects a user message to trigger an agent response from text input."""
# ... implementation exists ...
# MISSING: inject_agent_message method should be here ❌
# async def inject_agent_message(self, options: InjectAgentMessageOptions) -> bool:
# """Injects an agent message to immediately trigger an agent statement."""
# # ... NO IMPLEMENTATION FOUND ...Test Evidence
Previous test runs show the exact error:
{
"error": "'AgentWebSocketClient' object has no attribute 'inject_agent_message'",
"file": "tests/response_data/agent/websocket/inject_agent_message-800037f7-error.json"
}Impact Assessment
- Severity: Medium - Feature partially implemented
- User Impact: Users cannot inject agent messages despite having the options class
- API Completeness: SDK doesn't match its own API specification
- Developer Experience: Confusing to have options class but no method to use it
Suggested Fix
Add the missing methods to both client files:
Sync Client (client.py)
def inject_agent_message(self, options: InjectAgentMessageOptions) -> bool:
"""
Injects an agent message to immediately trigger an agent statement.
"""
self._logger.spam("AgentWebSocketClient.inject_agent_message ENTER")
if not isinstance(options, InjectAgentMessageOptions):
self._logger.error("options must be of type InjectAgentMessageOptions")
self._logger.spam("AgentWebSocketClient.inject_agent_message LEAVE")
return False
self._logger.notice("Sending InjectAgentMessage...")
ret = self.send(str(options))
if not ret:
self._logger.error("inject_agent_message failed")
self._logger.spam("AgentWebSocketClient.inject_agent_message LEAVE")
return False
self._logger.notice("inject_agent_message succeeded")
self._logger.spam("AgentWebSocketClient.inject_agent_message LEAVE")
return TrueAsync Client (async_client.py)
async def inject_agent_message(self, options: InjectAgentMessageOptions) -> bool:
"""
Injects an agent message to immediately trigger an agent statement.
"""
self._logger.spam("AsyncAgentWebSocketClient.inject_agent_message ENTER")
if not isinstance(options, InjectAgentMessageOptions):
self._logger.error("options must be of type InjectAgentMessageOptions")
self._logger.spam("AsyncAgentWebSocketClient.inject_agent_message LEAVE")
return False
self._logger.notice("Sending InjectAgentMessage...")
ret = await self.send(str(options))
if not ret:
self._logger.error("inject_agent_message failed")
self._logger.spam("AsyncAgentWebSocketClient.inject_agent_message LEAVE")
return False
self._logger.notice("inject_agent_message succeeded")
self._logger.spam("AsyncAgentWebSocketClient.inject_agent_message LEAVE")
return TrueFiles to Modify
deepgram/clients/agent/v1/websocket/client.py- Add syncinject_agent_messagemethoddeepgram/clients/agent/v1/websocket/async_client.py- Add asyncinject_agent_messagemethod
Test Cases to Add
After implementing the fix, add test cases to verify:
- Method exists and is callable
- Method accepts
InjectAgentMessageOptionsparameter - Method returns boolean success/failure
- Method sends proper WebSocket message format
- Method handles injection refused responses
- Method works in both sync and async contexts
Additional Notes
- The fix should follow the exact same pattern as
inject_user_message - Both methods should have identical error handling and logging
- The implementation gap suggests this feature was planned but never completed
- This affects both the public API and internal consistency of the SDK