From bc0e7130b8c6b6365e4ff73c5de66c2d9d38f700 Mon Sep 17 00:00:00 2001
From: Pablo Ois Lagarde
Date: Fri, 20 Mar 2026 16:37:53 -0300
Subject: [PATCH 1/2] fix: always include parameters field in Genesys AudioHook
messages
The AudioHook protocol requires every message to carry a `parameters`
object. `_create_message` conditionally included it only when parameters
were truthy, so pong responses and closed responses without
outputVariables were sent without the field.
Clients that validate message structure (including the Genesys reference
implementation) rejected these messages, which broke server sequence
tracking and prevented outputVariables from reaching the Architect flow.
Co-Authored-By: Claude Opus 4.6 (1M context)
---
changelog/0000.fixed.md | 7 +++++++
src/pipecat/serializers/genesys.py | 3 +--
tests/genesys/test_genesys_serializer.py | 3 ++-
3 files changed, 10 insertions(+), 3 deletions(-)
create mode 100644 changelog/0000.fixed.md
diff --git a/changelog/0000.fixed.md b/changelog/0000.fixed.md
new file mode 100644
index 000000000..39fabc029
--- /dev/null
+++ b/changelog/0000.fixed.md
@@ -0,0 +1,7 @@
+- Fixed Genesys AudioHook serializer to always include the `parameters` field in
+ protocol messages. The AudioHook protocol requires every message to carry a
+ `parameters` object (even if empty), but `_create_message` omitted it when no
+ parameters were provided. This caused clients that validate message structure
+ (including the Genesys reference implementation) to reject `pong` and
+ parameter-less `closed` responses, breaking server sequence tracking and
+ preventing `outputVariables` from reaching the Architect flow.
diff --git a/src/pipecat/serializers/genesys.py b/src/pipecat/serializers/genesys.py
index 2cc3c32db..4e0c11504 100644
--- a/src/pipecat/serializers/genesys.py
+++ b/src/pipecat/serializers/genesys.py
@@ -336,8 +336,7 @@ class GenesysAudioHookSerializer(FrameSerializer):
if include_position:
msg["position"] = self._format_position(self._position)
- if parameters:
- msg["parameters"] = parameters
+ msg["parameters"] = parameters if parameters is not None else {}
return msg
diff --git a/tests/genesys/test_genesys_serializer.py b/tests/genesys/test_genesys_serializer.py
index 03132d7cb..1f63ae94e 100644
--- a/tests/genesys/test_genesys_serializer.py
+++ b/tests/genesys/test_genesys_serializer.py
@@ -76,6 +76,7 @@ class TestGenesysAudioHookSerializer:
assert msg["type"] == "pong"
assert msg["id"] == serializer.session_id
+ assert msg["parameters"] == {}
def test_create_closed_response(self):
"""Test creating a closed response message."""
@@ -86,7 +87,7 @@ class TestGenesysAudioHookSerializer:
assert msg["type"] == "closed"
assert serializer.is_open is False
- assert "parameters" not in msg # No parameters when no output_variables
+ assert msg["parameters"] == {} # Empty parameters when no output_variables
def test_create_closed_response_with_output_variables(self):
"""Test creating a closed response with custom output variables."""
From 53e0136366eed70d84dafa707054e02e12a9c3d1 Mon Sep 17 00:00:00 2001
From: Pablo Ois Lagarde
Date: Fri, 20 Mar 2026 16:46:35 -0300
Subject: [PATCH 2/2] chore: rename changelog fragment to PR #4093
Co-Authored-By: Claude Opus 4.6 (1M context)
---
changelog/{0000.fixed.md => 4093.fixed.md} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename changelog/{0000.fixed.md => 4093.fixed.md} (100%)
diff --git a/changelog/0000.fixed.md b/changelog/4093.fixed.md
similarity index 100%
rename from changelog/0000.fixed.md
rename to changelog/4093.fixed.md