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(