From fdd3fc1f0b33bedddb6393b36e03267693159793 Mon Sep 17 00:00:00 2001 From: openhands Date: Fri, 9 Jan 2026 21:18:02 +0000 Subject: [PATCH 1/2] Fix non-JSON logging in sockets.py and state.py - Fix literal string '{event}' in error logs (sockets.py lines 145, 163) The string was not an f-string, so {event} was logged literally instead of the actual event data. Changed to use %r format which calls repr() to get useful debugging info (class name, id, source, timestamp). - Fix model_dump() returning non-JSON-serializable objects (state.py) The model_dump() method returns Python objects like UUID and enums that appear as repr strings in logs (e.g., UUID('...'), ). Changed to use model_dump(mode='json') wrapped in json.dumps() for proper JSON-serializable output. Co-authored-by: openhands --- openhands-agent-server/openhands/agent_server/sockets.py | 4 ++-- openhands-sdk/openhands/sdk/conversation/state.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openhands-agent-server/openhands/agent_server/sockets.py b/openhands-agent-server/openhands/agent_server/sockets.py index 5195ccf9c7..c13e80716a 100644 --- a/openhands-agent-server/openhands/agent_server/sockets.py +++ b/openhands-agent-server/openhands/agent_server/sockets.py @@ -142,7 +142,7 @@ async def _send_event(event: Event, websocket: WebSocket): dumped = event.model_dump(mode="json") await websocket.send_json(dumped) except Exception: - logger.exception("error_sending_event:{event}", stack_info=True) + logger.exception("error_sending_event: %r", event, stack_info=True) @dataclass @@ -160,7 +160,7 @@ async def _send_bash_event(event: BashEventBase, websocket: WebSocket): dumped = event.model_dump(mode="json") await websocket.send_json(dumped) except Exception: - logger.exception("error_sending_event:{event}", stack_info=True) + logger.exception("error_sending_bash_event: %r", event, stack_info=True) @dataclass diff --git a/openhands-sdk/openhands/sdk/conversation/state.py b/openhands-sdk/openhands/sdk/conversation/state.py index f2d339be0f..6be066f178 100644 --- a/openhands-sdk/openhands/sdk/conversation/state.py +++ b/openhands-sdk/openhands/sdk/conversation/state.py @@ -251,8 +251,8 @@ def create( logger.info( f"Resumed conversation {state.id} from persistent storage.\n" - f"State: {state.model_dump(exclude={'agent'})}\n" - f"Agent: {state.agent.model_dump_succint()}" + f"State: {json.dumps(state.model_dump(exclude={'agent'}, mode='json'))}\n" + f"Agent: {json.dumps(state.agent.model_dump_succint())}" ) return state @@ -278,8 +278,8 @@ def create( state._autosave_enabled = True logger.info( f"Created new conversation {state.id}\n" - f"State: {state.model_dump(exclude={'agent'})}\n" - f"Agent: {state.agent.model_dump_succint()}" + f"State: {json.dumps(state.model_dump(exclude={'agent'}, mode='json'))}\n" + f"Agent: {json.dumps(state.agent.model_dump_succint())}" ) return state From 10f31a64caf4ce062346e982cc3785848e12099c Mon Sep 17 00:00:00 2001 From: openhands Date: Fri, 9 Jan 2026 21:31:29 +0000 Subject: [PATCH 2/2] Revert state.py changes (fix 2) Co-authored-by: openhands --- openhands-sdk/openhands/sdk/conversation/state.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openhands-sdk/openhands/sdk/conversation/state.py b/openhands-sdk/openhands/sdk/conversation/state.py index 6be066f178..f2d339be0f 100644 --- a/openhands-sdk/openhands/sdk/conversation/state.py +++ b/openhands-sdk/openhands/sdk/conversation/state.py @@ -251,8 +251,8 @@ def create( logger.info( f"Resumed conversation {state.id} from persistent storage.\n" - f"State: {json.dumps(state.model_dump(exclude={'agent'}, mode='json'))}\n" - f"Agent: {json.dumps(state.agent.model_dump_succint())}" + f"State: {state.model_dump(exclude={'agent'})}\n" + f"Agent: {state.agent.model_dump_succint()}" ) return state @@ -278,8 +278,8 @@ def create( state._autosave_enabled = True logger.info( f"Created new conversation {state.id}\n" - f"State: {json.dumps(state.model_dump(exclude={'agent'}, mode='json'))}\n" - f"Agent: {json.dumps(state.agent.model_dump_succint())}" + f"State: {state.model_dump(exclude={'agent'})}\n" + f"Agent: {state.agent.model_dump_succint()}" ) return state