diff --git a/openhands/runtime/impl/docker/docker_runtime.py b/openhands/runtime/impl/docker/docker_runtime.py index b1a9caa8cf7f..ecb1386a6843 100644 --- a/openhands/runtime/impl/docker/docker_runtime.py +++ b/openhands/runtime/impl/docker/docker_runtime.py @@ -121,7 +121,7 @@ async def connect(self): 'error', f'Container {self.container_name} not found.', ) - raise e + raise AgentRuntimeDisconnectedError from e if self.runtime_container_image is None: if self.base_container_image is None: raise ValueError( diff --git a/openhands/server/conversation_manager/standalone_conversation_manager.py b/openhands/server/conversation_manager/standalone_conversation_manager.py index 2f49de63dc9e..ca5d634bc9fb 100644 --- a/openhands/server/conversation_manager/standalone_conversation_manager.py +++ b/openhands/server/conversation_manager/standalone_conversation_manager.py @@ -10,6 +10,7 @@ from openhands.core.logger import openhands_logger as logger from openhands.core.schema.agent import AgentState from openhands.events.action import MessageAction +from openhands.events.observation.agent import AgentStateChangedObservation from openhands.events.stream import EventStream, session_exists from openhands.server.session.conversation import Conversation from openhands.server.session.session import ROOM_KEY, Session @@ -95,6 +96,15 @@ async def join_conversation( event_stream = await self._get_event_stream(sid) if not event_stream: return await self.maybe_start_agent_loop(sid, settings, user_id) + for event in event_stream.get_events(reverse=True): + if isinstance(event, AgentStateChangedObservation): + if event.agent_state in ( + AgentState.STOPPED.value, + AgentState.ERROR.value, + ): + await self.close_session(sid) + return await self.maybe_start_agent_loop(sid, settings, user_id) + break return event_stream async def detach_from_conversation(self, conversation: Conversation): diff --git a/openhands/server/session/agent_session.py b/openhands/server/session/agent_session.py index 79b98733850a..cc8453302e9b 100644 --- a/openhands/server/session/agent_session.py +++ b/openhands/server/session/agent_session.py @@ -163,10 +163,6 @@ async def close(self): if self.security_analyzer is not None: await self.security_analyzer.close() - async def stop_agent_loop_for_error(self): - if self.controller is not None: - await self.controller.set_agent_state_to(AgentState.ERROR) - def _create_security_analyzer(self, security_analyzer: str | None): """Creates a SecurityAnalyzer instance that will be used to analyze the agent actions diff --git a/openhands/server/session/session.py b/openhands/server/session/session.py index d7807fc94740..48f171e0bc74 100644 --- a/openhands/server/session/session.py +++ b/openhands/server/session/session.py @@ -242,7 +242,9 @@ async def send_error(self, message: str): async def _send_status_message(self, msg_type: str, id: str, message: str): """Sends a status message to the client.""" if msg_type == 'error': - await self.agent_session.stop_agent_loop_for_error() + controller = self.agent_session.controller + if controller is not None: + await controller.set_agent_state_to(AgentState.ERROR) await self.send( {'status_update': True, 'type': msg_type, 'id': id, 'message': message} )