From 4ef9c72da17ef9e64fc73b198ba4662d260b2315 Mon Sep 17 00:00:00 2001 From: Ray Myers Date: Thu, 24 Apr 2025 19:53:17 -0500 Subject: [PATCH] fix - Show error message for too many conversations (#8078) --- frontend/src/i18n/declaration.ts | 1 + frontend/src/i18n/translation.json | 3 +++ .../standalone_conversation_manager.py | 18 +++++++++++++++--- openhands/server/routes/files.py | 2 +- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/frontend/src/i18n/declaration.ts b/frontend/src/i18n/declaration.ts index 9421c41e2e..fe104d700f 100644 --- a/frontend/src/i18n/declaration.ts +++ b/frontend/src/i18n/declaration.ts @@ -338,6 +338,7 @@ export enum I18nKey { STATUS$LLM_RETRY = "STATUS$LLM_RETRY", AGENT_ERROR$BAD_ACTION = "AGENT_ERROR$BAD_ACTION", AGENT_ERROR$ACTION_TIMEOUT = "AGENT_ERROR$ACTION_TIMEOUT", + AGENT_ERROR$TOO_MANY_CONVERSATIONS = "AGENT_ERROR$TOO_MANY_CONVERSATIONS", PROJECT_MENU_CARD_CONTEXT_MENU$CONNECT_TO_GITHUB_LABEL = "PROJECT_MENU_CARD_CONTEXT_MENU$CONNECT_TO_GITHUB_LABEL", PROJECT_MENU_CARD_CONTEXT_MENU$PUSH_TO_GITHUB_LABEL = "PROJECT_MENU_CARD_CONTEXT_MENU$PUSH_TO_GITHUB_LABEL", PROJECT_MENU_CARD_CONTEXT_MENU$DOWNLOAD_FILES_LABEL = "PROJECT_MENU_CARD_CONTEXT_MENU$DOWNLOAD_FILES_LABEL", diff --git a/frontend/src/i18n/translation.json b/frontend/src/i18n/translation.json index 8490feb095..314a93e336 100644 --- a/frontend/src/i18n/translation.json +++ b/frontend/src/i18n/translation.json @@ -4796,6 +4796,9 @@ "es": "La acción expiró", "tr": "İşlem zaman aşımına uğradı" }, + "AGENT_ERROR$TOO_MANY_CONVERSATIONS": { + "en": "Too many conversations at once." + }, "PROJECT_MENU_CARD_CONTEXT_MENU$CONNECT_TO_GITHUB_LABEL": { "en": "Connect to GitHub", "es": "Conectar a GitHub", diff --git a/openhands/server/conversation_manager/standalone_conversation_manager.py b/openhands/server/conversation_manager/standalone_conversation_manager.py index cb6ca5666a..5e43f7ee00 100644 --- a/openhands/server/conversation_manager/standalone_conversation_manager.py +++ b/openhands/server/conversation_manager/standalone_conversation_manager.py @@ -285,7 +285,7 @@ class StandaloneConversationManager(ConversationManager): response_ids = await self.get_running_agent_loops(user_id) if len(response_ids) >= self.config.max_concurrent_conversations: logger.info( - 'too_many_sessions_for:{user_id}', + f'too_many_sessions_for:{user_id or ''}', extra={'session_id': sid, 'user_id': user_id}, ) # Get the conversations sorted (oldest first) @@ -297,6 +297,18 @@ class StandaloneConversationManager(ConversationManager): while len(conversations) >= self.config.max_concurrent_conversations: oldest_conversation_id = conversations.pop().conversation_id + logger.debug( + f'closing_from_too_many_sessions:{user_id or ''}:{oldest_conversation_id}', + extra={'session_id': oldest_conversation_id, 'user_id': user_id}, + ) + # Send status message to client and close session. + status_update_dict = { + 'status_update': True, + 'type': 'error', + 'id': 'AGENT_ERROR$TOO_MANY_CONVERSATIONS', + 'message': 'Too many conversations at once. If you are still using this one, try reactivating it by prompting the agent to continue' + } + await self.sio.emit('oh_event', status_update_dict, to=ROOM_KEY.format(sid=oldest_conversation_id)) await self.close_session(oldest_conversation_id) session = Session( @@ -381,8 +393,8 @@ class StandaloneConversationManager(ConversationManager): f'removing connections: {connection_ids_to_remove}', extra={'session_id': sid}, ) - for connnnection_id in connection_ids_to_remove: - self._local_connection_id_to_session_id.pop(connnnection_id, None) + for connection_id in connection_ids_to_remove: + self._local_connection_id_to_session_id.pop(connection_id, None) session = self._local_agent_loops_by_sid.pop(sid, None) if not session: diff --git a/openhands/server/routes/files.py b/openhands/server/routes/files.py index de89ce052c..adbf0e1fec 100644 --- a/openhands/server/routes/files.py +++ b/openhands/server/routes/files.py @@ -211,7 +211,7 @@ async def git_changes( changes = await call_sync_from_async(runtime.get_git_changes, cwd) if changes is None: return JSONResponse( - status_code=500, + status_code=404, content={'error': 'Not a git repository'}, ) return changes