From c11dcad30937e4934d75f1ea36d82a87b5180df0 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Wed, 11 Jun 2025 11:34:16 -0500 Subject: [PATCH] Add more log context on key events (#9056) --- openhands/server/session/agent_session.py | 44 ++++++++++++++--------- openhands/server/session/session.py | 8 ++--- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/openhands/server/session/agent_session.py b/openhands/server/session/agent_session.py index 5f1d1fa9f6..b2d47ba520 100644 --- a/openhands/server/session/agent_session.py +++ b/openhands/server/session/agent_session.py @@ -121,11 +121,10 @@ class AgentSession: self._started_at = started_at finished = False # For monitoring runtime_connected = False - + restored_state = False custom_secrets_handler = UserSecrets( custom_secrets=custom_secrets if custom_secrets else {} ) - try: self._create_security_analyzer(config.security.security_analyzer) runtime_connected = await self._create_runtime( @@ -173,7 +172,7 @@ class AgentSession: agent_configs, ) else: - self.controller = self._create_controller( + self.controller, restored_state = self._create_controller( agent, config.security.confirmation_mode, max_iterations, @@ -198,14 +197,24 @@ class AgentSession: finally: self._starting = False success = finished and runtime_connected - self.logger.info( - 'Agent session start', - extra={ - 'signal': 'agent_session_start', - 'success': success, - 'duration': (time.time() - started_at), - }, - ) + duration = (time.time() - started_at) + + log_metadata = { + 'signal': 'agent_session_start', + 'success': success, + 'duration': duration, + 'restored_state': restored_state + } + if success: + self.logger.info( + f'Agent session start succeeded in {duration}s', + extra=log_metadata + ) + else: + self.logger.error( + f'Agent session start failed in {duration}s', + extra=log_metadata + ) async def close(self) -> None: """Closes the Agent session""" @@ -252,7 +261,7 @@ class AgentSession: """ assert initial_message is None replay_events = ReplayManager.get_replay_events(json.loads(replay_json)) - self.controller = self._create_controller( + self.controller, _ = self._create_controller( agent, config.security.confirmation_mode, max_iterations, @@ -396,7 +405,7 @@ class AgentSession: agent_to_llm_config: dict[str, LLMConfig] | None = None, agent_configs: dict[str, AgentConfig] | None = None, replay_events: list[Event] | None = None, - ) -> AgentController: + ) -> tuple[AgentController, bool]: """Creates an AgentController instance Parameters: @@ -406,6 +415,9 @@ class AgentSession: - max_budget_per_task: - agent_to_llm_config: - agent_configs: + + Returns: + Agent Controller and a bool indicating if state was restored from a previous conversation """ if self.controller is not None: @@ -425,7 +437,7 @@ class AgentSession: '-------------------------------------------------------------------------------------------' ) self.logger.debug(msg) - + initial_state = self._maybe_restore_state() controller = AgentController( sid=self.sid, event_stream=self.event_stream, @@ -437,11 +449,11 @@ class AgentSession: confirmation_mode=confirmation_mode, headless_mode=False, status_callback=self._status_callback, - initial_state=self._maybe_restore_state(), + initial_state=initial_state, replay_events=replay_events, ) - return controller + return (controller, initial_state is not None) async def _create_memory( self, diff --git a/openhands/server/session/session.py b/openhands/server/session/session.py index b468873f8a..76f58c012c 100644 --- a/openhands/server/session/session.py +++ b/openhands/server/session/session.py @@ -270,8 +270,8 @@ class Session: isinstance(event, AgentStateChangedObservation) and event.agent_state == AgentState.ERROR ): - self.logger.info( - 'Agent status error', + self.logger.error( + f'Agent status error: {event.reason}', extra={'signal': 'agent_status_error'}, ) elif isinstance(event, ErrorObservation): @@ -329,8 +329,8 @@ class Session: controller = self.agent_session.controller if controller is not None and not agent_session.is_closed(): await controller.set_agent_state_to(AgentState.ERROR) - self.logger.info( - 'Agent status error', + self.logger.error( + f'Agent status error: {message}', extra={'signal': 'agent_status_error'}, ) await self.send(