|
@@ -6,8 +6,8 @@ from unittest.mock import AsyncMock, MagicMock, patch
|
|
|
import pytest
|
|
import pytest
|
|
|
|
|
|
|
|
from openhands.core.config.app_config import AppConfig
|
|
from openhands.core.config.app_config import AppConfig
|
|
|
|
|
+from openhands.server.session.conversation_init_data import ConversationInitData
|
|
|
from openhands.server.session.manager import SessionManager
|
|
from openhands.server.session.manager import SessionManager
|
|
|
-from openhands.server.session.session_init_data import SessionInitData
|
|
|
|
|
from openhands.storage.memory import InMemoryFileStore
|
|
from openhands.storage.memory import InMemoryFileStore
|
|
|
|
|
|
|
|
|
|
|
|
@@ -41,7 +41,7 @@ async def test_session_not_running_in_cluster():
|
|
|
async with SessionManager(
|
|
async with SessionManager(
|
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
|
) as session_manager:
|
|
) as session_manager:
|
|
|
- result = await session_manager._is_session_running_in_cluster(
|
|
|
|
|
|
|
+ result = await session_manager._is_agent_loop_running_in_cluster(
|
|
|
'non-existant-session'
|
|
'non-existant-session'
|
|
|
)
|
|
)
|
|
|
assert result is False
|
|
assert result is False
|
|
@@ -65,7 +65,7 @@ async def test_session_is_running_in_cluster():
|
|
|
async with SessionManager(
|
|
async with SessionManager(
|
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
|
) as session_manager:
|
|
) as session_manager:
|
|
|
- result = await session_manager._is_session_running_in_cluster(
|
|
|
|
|
|
|
+ result = await session_manager._is_agent_loop_running_in_cluster(
|
|
|
'existing-session'
|
|
'existing-session'
|
|
|
)
|
|
)
|
|
|
assert result is True
|
|
assert result is True
|
|
@@ -83,8 +83,8 @@ async def test_init_new_local_session():
|
|
|
mock_session = MagicMock()
|
|
mock_session = MagicMock()
|
|
|
mock_session.return_value = session_instance
|
|
mock_session.return_value = session_instance
|
|
|
sio = get_mock_sio()
|
|
sio = get_mock_sio()
|
|
|
- is_session_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
- is_session_running_in_cluster_mock.return_value = False
|
|
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock.return_value = False
|
|
|
with (
|
|
with (
|
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.1),
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.1),
|
|
@@ -93,14 +93,16 @@ async def test_init_new_local_session():
|
|
|
AsyncMock(),
|
|
AsyncMock(),
|
|
|
),
|
|
),
|
|
|
patch(
|
|
patch(
|
|
|
- 'openhands.server.session.manager.SessionManager._is_session_running_in_cluster',
|
|
|
|
|
- is_session_running_in_cluster_mock,
|
|
|
|
|
|
|
+ 'openhands.server.session.manager.SessionManager._is_agent_loop_running_in_cluster',
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock,
|
|
|
),
|
|
),
|
|
|
):
|
|
):
|
|
|
async with SessionManager(
|
|
async with SessionManager(
|
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
|
) as session_manager:
|
|
) as session_manager:
|
|
|
- await session_manager.start_agent_loop('new-session-id', SessionInitData())
|
|
|
|
|
|
|
+ await session_manager.maybe_start_agent_loop(
|
|
|
|
|
+ 'new-session-id', ConversationInitData()
|
|
|
|
|
+ )
|
|
|
await session_manager.join_conversation('new-session-id', 'new-session-id')
|
|
await session_manager.join_conversation('new-session-id', 'new-session-id')
|
|
|
assert session_instance.initialize_agent.call_count == 1
|
|
assert session_instance.initialize_agent.call_count == 1
|
|
|
assert sio.enter_room.await_count == 1
|
|
assert sio.enter_room.await_count == 1
|
|
@@ -113,8 +115,8 @@ async def test_join_local_session():
|
|
|
mock_session = MagicMock()
|
|
mock_session = MagicMock()
|
|
|
mock_session.return_value = session_instance
|
|
mock_session.return_value = session_instance
|
|
|
sio = get_mock_sio()
|
|
sio = get_mock_sio()
|
|
|
- is_session_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
- is_session_running_in_cluster_mock.return_value = False
|
|
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock.return_value = False
|
|
|
with (
|
|
with (
|
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.01),
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.01),
|
|
@@ -123,14 +125,16 @@ async def test_join_local_session():
|
|
|
AsyncMock(),
|
|
AsyncMock(),
|
|
|
),
|
|
),
|
|
|
patch(
|
|
patch(
|
|
|
- 'openhands.server.session.manager.SessionManager._is_session_running_in_cluster',
|
|
|
|
|
- is_session_running_in_cluster_mock,
|
|
|
|
|
|
|
+ 'openhands.server.session.manager.SessionManager._is_agent_loop_running_in_cluster',
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock,
|
|
|
),
|
|
),
|
|
|
):
|
|
):
|
|
|
async with SessionManager(
|
|
async with SessionManager(
|
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
|
) as session_manager:
|
|
) as session_manager:
|
|
|
- await session_manager.start_agent_loop('new-session-id', SessionInitData())
|
|
|
|
|
|
|
+ await session_manager.maybe_start_agent_loop(
|
|
|
|
|
+ 'new-session-id', ConversationInitData()
|
|
|
|
|
+ )
|
|
|
await session_manager.join_conversation('new-session-id', 'new-session-id')
|
|
await session_manager.join_conversation('new-session-id', 'new-session-id')
|
|
|
await session_manager.join_conversation('new-session-id', 'new-session-id')
|
|
await session_manager.join_conversation('new-session-id', 'new-session-id')
|
|
|
assert session_instance.initialize_agent.call_count == 1
|
|
assert session_instance.initialize_agent.call_count == 1
|
|
@@ -144,8 +148,8 @@ async def test_join_cluster_session():
|
|
|
mock_session = MagicMock()
|
|
mock_session = MagicMock()
|
|
|
mock_session.return_value = session_instance
|
|
mock_session.return_value = session_instance
|
|
|
sio = get_mock_sio()
|
|
sio = get_mock_sio()
|
|
|
- is_session_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
- is_session_running_in_cluster_mock.return_value = True
|
|
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock.return_value = True
|
|
|
with (
|
|
with (
|
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.01),
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.01),
|
|
@@ -154,8 +158,8 @@ async def test_join_cluster_session():
|
|
|
AsyncMock(),
|
|
AsyncMock(),
|
|
|
),
|
|
),
|
|
|
patch(
|
|
patch(
|
|
|
- 'openhands.server.session.manager.SessionManager._is_session_running_in_cluster',
|
|
|
|
|
- is_session_running_in_cluster_mock,
|
|
|
|
|
|
|
+ 'openhands.server.session.manager.SessionManager._is_agent_loop_running_in_cluster',
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock,
|
|
|
),
|
|
),
|
|
|
):
|
|
):
|
|
|
async with SessionManager(
|
|
async with SessionManager(
|
|
@@ -173,8 +177,8 @@ async def test_add_to_local_event_stream():
|
|
|
mock_session = MagicMock()
|
|
mock_session = MagicMock()
|
|
|
mock_session.return_value = session_instance
|
|
mock_session.return_value = session_instance
|
|
|
sio = get_mock_sio()
|
|
sio = get_mock_sio()
|
|
|
- is_session_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
- is_session_running_in_cluster_mock.return_value = False
|
|
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock.return_value = False
|
|
|
with (
|
|
with (
|
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.01),
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.01),
|
|
@@ -183,14 +187,16 @@ async def test_add_to_local_event_stream():
|
|
|
AsyncMock(),
|
|
AsyncMock(),
|
|
|
),
|
|
),
|
|
|
patch(
|
|
patch(
|
|
|
- 'openhands.server.session.manager.SessionManager._is_session_running_in_cluster',
|
|
|
|
|
- is_session_running_in_cluster_mock,
|
|
|
|
|
|
|
+ 'openhands.server.session.manager.SessionManager._is_agent_loop_running_in_cluster',
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock,
|
|
|
),
|
|
),
|
|
|
):
|
|
):
|
|
|
async with SessionManager(
|
|
async with SessionManager(
|
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
sio, AppConfig(), InMemoryFileStore()
|
|
|
) as session_manager:
|
|
) as session_manager:
|
|
|
- await session_manager.start_agent_loop('new-session-id', SessionInitData())
|
|
|
|
|
|
|
+ await session_manager.maybe_start_agent_loop(
|
|
|
|
|
+ 'new-session-id', ConversationInitData()
|
|
|
|
|
+ )
|
|
|
await session_manager.join_conversation('new-session-id', 'connection-id')
|
|
await session_manager.join_conversation('new-session-id', 'connection-id')
|
|
|
await session_manager.send_to_event_stream(
|
|
await session_manager.send_to_event_stream(
|
|
|
'connection-id', {'event_type': 'some_event'}
|
|
'connection-id', {'event_type': 'some_event'}
|
|
@@ -205,8 +211,8 @@ async def test_add_to_cluster_event_stream():
|
|
|
mock_session = MagicMock()
|
|
mock_session = MagicMock()
|
|
|
mock_session.return_value = session_instance
|
|
mock_session.return_value = session_instance
|
|
|
sio = get_mock_sio()
|
|
sio = get_mock_sio()
|
|
|
- is_session_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
- is_session_running_in_cluster_mock.return_value = True
|
|
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock = AsyncMock()
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock.return_value = True
|
|
|
with (
|
|
with (
|
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
patch('openhands.server.session.manager.Session', mock_session),
|
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.01),
|
|
patch('openhands.server.session.manager._REDIS_POLL_TIMEOUT', 0.01),
|
|
@@ -215,8 +221,8 @@ async def test_add_to_cluster_event_stream():
|
|
|
AsyncMock(),
|
|
AsyncMock(),
|
|
|
),
|
|
),
|
|
|
patch(
|
|
patch(
|
|
|
- 'openhands.server.session.manager.SessionManager._is_session_running_in_cluster',
|
|
|
|
|
- is_session_running_in_cluster_mock,
|
|
|
|
|
|
|
+ 'openhands.server.session.manager.SessionManager._is_agent_loop_running_in_cluster',
|
|
|
|
|
+ is_agent_loop_running_in_cluster_mock,
|
|
|
),
|
|
),
|
|
|
):
|
|
):
|
|
|
async with SessionManager(
|
|
async with SessionManager(
|