From b11a3bc43f54e0cb4c34f99c017a85ef8531d5cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Wed, 15 Apr 2026 15:16:32 -0700 Subject: [PATCH] Add `method` field to Daily DTMF output frames Lets callers specify Daily's DTMF delivery method (e.g. "rfc2833" or "info") alongside `session_id` and `digit_duration_ms`. Forwarded to Daily's `send_dtmf` as `method`. --- changelog/4313.added.md | 2 +- src/pipecat/transports/daily/transport.py | 27 +++++++++++++++-------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/changelog/4313.added.md b/changelog/4313.added.md index 1c704a3a7..738744a80 100644 --- a/changelog/4313.added.md +++ b/changelog/4313.added.md @@ -1,3 +1,3 @@ - Added `DailyTransport.send_dtmf()` to expose the Daily call client's DTMF sending capability, enabling applications to send tones during a call (e.g. IVR navigation). - Added `buttons` field to `OutputDTMFFrame` and `OutputDTMFUrgentFrame` for sending multi-key DTMF sequences as a `list[KeypadEntry]`. Use `OutputDTMFFrame.from_string("123#")` (or the equivalent on `OutputDTMFUrgentFrame`) to build one from a dial string. -- Added `DailyOutputDTMFFrame` and `DailyOutputDTMFUrgentFrame` frames. In addition to the inherited `buttons`, they accept `session_id` and `digit_duration_ms`, which are forwarded to Daily's `send_dtmf` as `sessionId` and `digitDurationMs`. +- Added `DailyOutputDTMFFrame` and `DailyOutputDTMFUrgentFrame` frames. In addition to the inherited `buttons`, they accept `session_id`, `digit_duration_ms` and `method`, which are forwarded to Daily's `send_dtmf` as `sessionId`, `digitDurationMs` and `method`. diff --git a/src/pipecat/transports/daily/transport.py b/src/pipecat/transports/daily/transport.py index e96799b37..b58701a0b 100644 --- a/src/pipecat/transports/daily/transport.py +++ b/src/pipecat/transports/daily/transport.py @@ -158,38 +158,45 @@ class DailyOutputDTMFFrame(OutputDTMFFrame): """DTMF output frame with Daily-specific options for transport queuing. A DTMF keypress output that will be queued after any preceding audio has - finished playing. Inherits ``tones`` from :class:`OutputDTMFFrame`; the - two extra fields are forwarded to Daily's ``send_dtmf`` as ``sessionId`` - and ``digitDurationMs``. + finished playing. Inherits ``buttons`` from :class:`OutputDTMFFrame`; the + extra fields are forwarded to Daily's ``send_dtmf`` as ``sessionId``, + ``digitDurationMs`` and ``method``. Parameters: session_id: Target participant session id. When ``None``, Daily sends the tones to the default destination for the call. digit_duration_ms: Duration of each DTMF digit in milliseconds. When ``None``, Daily's default duration is used. + method: DTMF delivery method (e.g. ``"telephone-event"``, ``"sip-info"`` + or ``auto``). When ``None``, Daily's default method is used. """ session_id: Optional[str] = None digit_duration_ms: Optional[int] = None + method: Optional[str] = None @dataclass class DailyOutputDTMFUrgentFrame(OutputDTMFUrgentFrame): """DTMF output frame with Daily-specific options for immediate sending. - A DTMF keypress output that will be sent right away. Inherits ``tones`` - from :class:`OutputDTMFUrgentFrame`; the two extra fields are forwarded - to Daily's ``send_dtmf`` as ``sessionId`` and ``digitDurationMs``. + A DTMF keypress output that will be sent right away. Inherits + ``buttons`` from :class:`OutputDTMFUrgentFrame`; the extra fields are + forwarded to Daily's ``send_dtmf`` as ``sessionId``, ``digitDurationMs`` + and ``method``. Parameters: session_id: Target participant session id. When ``None``, Daily sends the tones to the default destination for the call. digit_duration_ms: Duration of each DTMF digit in milliseconds. When ``None``, Daily's default duration is used. + method: DTMF delivery method (e.g. ``"telephone-event"``, ``"sip-info"`` + or ``auto``). When ``None``, Daily's default method is used. """ session_id: Optional[str] = None digit_duration_ms: Optional[int] = None + method: Optional[str] = None class WebRTCVADAnalyzer(VADAnalyzer): @@ -2178,9 +2185,9 @@ class DailyOutputTransport(BaseOutputTransport): Args: frame: The DTMF frame to write. When it is a :class:`DailyOutputDTMFFrame` or - :class:`DailyOutputDTMFUrgentFrame`, the ``session_id`` and - ``digit_duration_ms`` fields are also forwarded to the Daily - call client. + :class:`DailyOutputDTMFUrgentFrame`, the ``session_id``, + ``digit_duration_ms`` and ``method`` fields are also + forwarded to the Daily call client. """ if not frame.buttons: return @@ -2191,6 +2198,8 @@ class DailyOutputTransport(BaseOutputTransport): settings["sessionId"] = frame.session_id if frame.digit_duration_ms is not None: settings["digitDurationMs"] = frame.digit_duration_ms + if frame.method is not None: + settings["method"] = frame.method await self._client.send_dtmf(settings)