From 41c4aef70d5982014bf54cb3a5dc98ce49caf7cd Mon Sep 17 00:00:00 2001 From: moti malka Date: Thu, 5 Feb 2026 23:46:33 +0200 Subject: [PATCH] fix(devui): Fix serialization of dataclass events and ChatMessage constructor This PR addresses two bugs in the devui package: 1. **PydanticSerializationError with AgentResponse** (_mapper.py) - The _convert_workflow_event method failed to serialize GroupChatResponseReceivedEvent because its data field contains AgentExecutorResponse (a dataclass) which holds AgentResponse (a SerializationMixin object) - The original code only checked for to_dict() method, missing dataclass objects - Fixed by using _serialize_value() which already handles all types: dataclasses, SerializationMixin, nested objects, and primitives 2. **ChatMessage constructor TypeError** (_executor.py) - ChatMessage.__init__() requires 'contents' as a keyword argument, not positional - Fixed by changing ChatMessage("user", contents) to ChatMessage("user", contents=contents) T_EDITOR=true git rebase --continue --- .../packages/devui/agent_framework_devui/_mapper.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/packages/devui/agent_framework_devui/_mapper.py b/python/packages/devui/agent_framework_devui/_mapper.py index 7acb247c20..ae6c485a83 100644 --- a/python/packages/devui/agent_framework_devui/_mapper.py +++ b/python/packages/devui/agent_framework_devui/_mapper.py @@ -1195,15 +1195,15 @@ async def _convert_workflow_event(self, event: Any, context: dict[str, Any]) -> return [trace_event] # For unknown/legacy events, still emit as workflow event for backward compatibility - # Get event data and serialize if it's a SerializationMixin + # Use _serialize_value to handle dataclasses, SerializationMixin, and nested objects raw_event_data = getattr(event, "data", None) - serialized_event_data: dict[str, Any] | str | None = raw_event_data - if raw_event_data is not None and hasattr(raw_event_data, "to_dict"): - # SerializationMixin objects - convert to dict for JSON serialization + serialized_event_data: dict[str, Any] | str | None = None + if raw_event_data is not None: try: - serialized_event_data = raw_event_data.to_dict() + # Use _serialize_value which handles all types: dataclasses, SerializationMixin, etc. + serialized_event_data = self._serialize_value(raw_event_data) except Exception as e: - logger.debug(f"Failed to serialize event data with to_dict(): {e}") + logger.debug(f"Failed to serialize event data: {e}") serialized_event_data = str(raw_event_data) # Create structured workflow event (keeping for backward compatibility)