From 82ac54426cfbdb365fb06e331e82ad442b70d543 Mon Sep 17 00:00:00 2001 From: komayama Date: Wed, 8 Jul 2026 16:37:28 +0900 Subject: [PATCH 1/3] Add operation_callback_url parameter for continuous DTMF recognition --- .../callautomation/_call_connection_client.py | 7 +++++++ .../aio/_call_connection_client_async.py | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/sdk/communication/azure-communication-callautomation/azure/communication/callautomation/_call_connection_client.py b/sdk/communication/azure-communication-callautomation/azure/communication/callautomation/_call_connection_client.py index 076c2f41920a..ed799728323f 100644 --- a/sdk/communication/azure-communication-callautomation/azure/communication/callautomation/_call_connection_client.py +++ b/sdk/communication/azure-communication-callautomation/azure/communication/callautomation/_call_connection_client.py @@ -822,6 +822,7 @@ def start_continuous_dtmf_recognition( target_participant: "CommunicationIdentifier", *, operation_context: Optional[str] = None, + operation_callback_url: Optional[str] = None, **kwargs, ) -> None: """Start continuous Dtmf recognition by subscribing to tones. @@ -830,6 +831,11 @@ def start_continuous_dtmf_recognition( :type target_participant: ~azure.communication.callautomation.CommunicationIdentifier :keyword operation_context: The value to identify context of the operation. :paramtype operation_context: str + :keyword operation_callback_url: Set a callback URL that overrides the default callback URL set + by CreateCall/AnswerCall for this operation. + This setup is per-action. If this is not set, the default callback URL set by + CreateCall/AnswerCall will be used. + :paramtype operation_callback_url: str or None :return: None :rtype: None :raises ~azure.core.exceptions.HttpResponseError: @@ -837,6 +843,7 @@ def start_continuous_dtmf_recognition( continuous_dtmf_recognition_request = ContinuousDtmfRecognitionRequest( target_participant=serialize_identifier(target_participant), operation_context=operation_context, + operation_callback_uri=operation_callback_url, ) self._call_media_client.start_continuous_dtmf_recognition( self._call_connection_id, continuous_dtmf_recognition_request, **kwargs diff --git a/sdk/communication/azure-communication-callautomation/azure/communication/callautomation/aio/_call_connection_client_async.py b/sdk/communication/azure-communication-callautomation/azure/communication/callautomation/aio/_call_connection_client_async.py index 0c7db6a4661b..d06e2ed88e88 100644 --- a/sdk/communication/azure-communication-callautomation/azure/communication/callautomation/aio/_call_connection_client_async.py +++ b/sdk/communication/azure-communication-callautomation/azure/communication/callautomation/aio/_call_connection_client_async.py @@ -823,6 +823,7 @@ async def start_continuous_dtmf_recognition( target_participant: "CommunicationIdentifier", *, operation_context: Optional[str] = None, + operation_callback_url: Optional[str] = None, **kwargs, ) -> None: """Start continuous Dtmf recognition by subscribing to tones. @@ -831,12 +832,19 @@ async def start_continuous_dtmf_recognition( :type target_participant: ~azure.communication.callautomation.CommunicationIdentifier :keyword operation_context: Value that can be used to track this call and its associated events. :paramtype operation_context: str + :keyword operation_callback_url: Set a callback URL that overrides the default callback URL set + by CreateCall/AnswerCall for this operation. + This setup is per-action. If this is not set, the default callback URL set by + CreateCall/AnswerCall will be used. + :paramtype operation_callback_url: str or None :return: None :rtype: None :raises ~azure.core.exceptions.HttpResponseError: """ continuous_dtmf_recognition_request = ContinuousDtmfRecognitionRequest( - target_participant=serialize_identifier(target_participant), operation_context=operation_context + target_participant=serialize_identifier(target_participant), + operation_context=operation_context, + operation_callback_uri=operation_callback_url, ) await self._call_media_client.start_continuous_dtmf_recognition( self._call_connection_id, continuous_dtmf_recognition_request, **kwargs From cae6b18c2a61700ecbde07eaa9801c956c7d9972 Mon Sep 17 00:00:00 2001 From: komayama Date: Wed, 8 Jul 2026 16:38:33 +0900 Subject: [PATCH 2/3] Add operation_callback_url parameter to add participant methods --- sdk/communication/azure-communication-callautomation/api.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/communication/azure-communication-callautomation/api.md b/sdk/communication/azure-communication-callautomation/api.md index 0829a7c75f2c..bf69b3fff7d2 100644 --- a/sdk/communication/azure-communication-callautomation/api.md +++ b/sdk/communication/azure-communication-callautomation/api.md @@ -430,6 +430,7 @@ namespace azure.communication.callautomation self, target_participant: CommunicationIdentifier, *, + operation_callback_url: Optional[str] = ..., operation_context: Optional[str] = ..., **kwargs ) -> None: ... @@ -1511,6 +1512,7 @@ namespace azure.communication.callautomation.aio self, target_participant: CommunicationIdentifier, *, + operation_callback_url: Optional[str] = ..., operation_context: Optional[str] = ..., **kwargs ) -> None: ... From 431177846dad3e283ee377dcc5e0835162eaa352 Mon Sep 17 00:00:00 2001 From: komayama Date: Wed, 8 Jul 2026 16:43:36 +0900 Subject: [PATCH 3/3] Add operation_context and operation_callback_url to continuous DTMF recognition tests --- .../tests/test_call_media_client.py | 14 ++++++++++++-- .../tests/test_call_media_client_async.py | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/sdk/communication/azure-communication-callautomation/tests/test_call_media_client.py b/sdk/communication/azure-communication-callautomation/tests/test_call_media_client.py index da8b144107ef..27289289047f 100644 --- a/sdk/communication/azure-communication-callautomation/tests/test_call_media_client.py +++ b/sdk/communication/azure-communication-callautomation/tests/test_call_media_client.py @@ -523,10 +523,16 @@ def test_cancel(self): def test_start_continuous_dtmf_recognition(self): mock_start_continuous_dtmf_recognition = Mock() self.call_media_operations.start_continuous_dtmf_recognition = mock_start_continuous_dtmf_recognition - self.call_connection_client.start_continuous_dtmf_recognition(target_participant=self.target_user) + self.call_connection_client.start_continuous_dtmf_recognition( + target_participant=self.target_user, + operation_context=self.operation_context, + operation_callback_url=self.operation_callback_url, + ) expected_continuous_dtmf_recognition_request = ContinuousDtmfRecognitionRequest( - target_participant=serialize_identifier(self.target_user) + target_participant=serialize_identifier(self.target_user), + operation_context=self.operation_context, + operation_callback_uri=self.operation_callback_url, ) mock_start_continuous_dtmf_recognition.assert_called_once() @@ -542,6 +548,10 @@ def test_start_continuous_dtmf_recognition(self): expected_continuous_dtmf_recognition_request.operation_context, actual_start_continuous_dtmf_recognition.operation_context, ) + self.assertEqual( + expected_continuous_dtmf_recognition_request.operation_callback_uri, + actual_start_continuous_dtmf_recognition.operation_callback_uri, + ) def test_stop_continuous_dtmf_recognition(self): mock_stop_continuous_dtmf_recognition = Mock() diff --git a/sdk/communication/azure-communication-callautomation/tests/test_call_media_client_async.py b/sdk/communication/azure-communication-callautomation/tests/test_call_media_client_async.py index 06728de5c50e..ba0c2773eb32 100644 --- a/sdk/communication/azure-communication-callautomation/tests/test_call_media_client_async.py +++ b/sdk/communication/azure-communication-callautomation/tests/test_call_media_client_async.py @@ -551,10 +551,16 @@ async def test_cancel(self): async def test_start_continuous_dtmf_recognition(self): mock_start_continuous_dtmf_recognition = AsyncMock() self.call_media_operations.start_continuous_dtmf_recognition = mock_start_continuous_dtmf_recognition - await self.call_connection_client.start_continuous_dtmf_recognition(target_participant=self.target_user) + await self.call_connection_client.start_continuous_dtmf_recognition( + target_participant=self.target_user, + operation_context=self.operation_context, + operation_callback_url=self.operation_callback_url, + ) expected_continuous_dtmf_recognition_request = ContinuousDtmfRecognitionRequest( - target_participant=serialize_identifier(self.target_user) + target_participant=serialize_identifier(self.target_user), + operation_context=self.operation_context, + operation_callback_uri=self.operation_callback_url, ) mock_start_continuous_dtmf_recognition.assert_awaited_once() @@ -570,6 +576,10 @@ async def test_start_continuous_dtmf_recognition(self): expected_continuous_dtmf_recognition_request.operation_context, actual_start_continuous_dtmf_recognition.operation_context, ) + self.assertEqual( + expected_continuous_dtmf_recognition_request.operation_callback_uri, + actual_start_continuous_dtmf_recognition.operation_callback_uri, + ) async def test_stop_continuous_dtmf_recognition(self): mock_stop_continuous_dtmf_recognition = AsyncMock()