Skip to content

Commit 93b1276

Browse files
authored
[Feat]: Add experiment manager (#8820)
1 parent 412e265 commit 93b1276

File tree

4 files changed

+35
-3
lines changed

4 files changed

+35
-3
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import os
2+
3+
from openhands.server.session.conversation_init_data import ConversationInitData
4+
from openhands.utils.import_utils import get_impl
5+
6+
7+
class ExperimentManager:
8+
@staticmethod
9+
def run_conversation_variant_test(
10+
user_id: str, conversation_id: str, conversation_settings: ConversationInitData
11+
) -> ConversationInitData:
12+
return conversation_settings
13+
14+
15+
experiment_manager_cls = os.environ.get(
16+
'OPENHANDS_EXPERIMENT_MANAGER_CLS',
17+
'openhands.experiments.experiment_manager.ExperimentManager',
18+
)
19+
ExperimentManagerImpl = get_impl(ExperimentManager, experiment_manager_cls)

openhands/server/listen_socket.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
AgentStateChangedObservation,
2020
)
2121
from openhands.events.serialization import event_to_dict
22+
from openhands.experiments.experiment_manager import ExperimentManagerImpl
2223
from openhands.integrations.provider import PROVIDER_TOKEN_TYPE, ProviderToken
2324
from openhands.integrations.service_types import ProviderType
2425
from openhands.server.session.conversation_init_data import ConversationInitData
@@ -49,7 +50,7 @@ def create_provider_tokens_object(
4950

5051

5152
async def setup_init_convo_settings(
52-
user_id: str | None, providers_set: list[ProviderType]
53+
user_id: str | None, conversation_id: str, providers_set: list[ProviderType]
5354
) -> ConversationInitData:
5455
settings_store = await SettingsStoreImpl.get_instance(config, user_id)
5556
settings = await settings_store.load()
@@ -73,7 +74,11 @@ async def setup_init_convo_settings(
7374
if user_secrets:
7475
session_init_args['custom_secrets'] = user_secrets.custom_secrets
7576

76-
return ConversationInitData(**session_init_args)
77+
convo_init_data = ConversationInitData(**session_init_args)
78+
# We should recreate the same experiment conditions when restarting a conversation
79+
return ExperimentManagerImpl.run_conversation_variant_test(
80+
user_id, conversation_id, convo_init_data
81+
)
7782

7883

7984
@sio.event
@@ -119,7 +124,9 @@ async def connect(connection_id: str, environ: dict) -> None:
119124
f'User {user_id} is allowed to connect to conversation {conversation_id}'
120125
)
121126

122-
conversation_init_data = await setup_init_convo_settings(user_id, providers_set)
127+
conversation_init_data = await setup_init_convo_settings(
128+
user_id, conversation_id, providers_set
129+
)
123130
agent_loop_info = await conversation_manager.join_conversation(
124131
conversation_id,
125132
connection_id,

openhands/server/services/conversation_service.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from openhands.core.logger import openhands_logger as logger
66
from openhands.events.action.message import MessageAction
7+
from openhands.experiments.experiment_manager import ExperimentManagerImpl
78
from openhands.integrations.provider import (
89
CUSTOM_SECRETS_TYPE_WITH_JSON_SCHEMA,
910
PROVIDER_TOKEN_TYPE,
@@ -78,6 +79,8 @@ async def create_new_conversation(
7879
session_init_args['git_provider'] = git_provider
7980
session_init_args['conversation_instructions'] = conversation_instructions
8081
conversation_init_data = ConversationInitData(**session_init_args)
82+
83+
8184
logger.info('Loading conversation store')
8285
conversation_store = await ConversationStoreImpl.get_instance(config, user_id)
8386
logger.info('ServerConversation store loaded')
@@ -93,6 +96,7 @@ async def create_new_conversation(
9396
extra={'user_id': user_id, 'session_id': conversation_id},
9497
)
9598

99+
conversation_init_data = ExperimentManagerImpl.run_conversation_variant_test(user_id, conversation_id, conversation_init_data)
96100
conversation_title = get_default_conversation_title(conversation_id)
97101

98102
logger.info(f'Saving metadata for conversation {conversation_id}')
@@ -105,6 +109,7 @@ async def create_new_conversation(
105109
selected_repository=selected_repository,
106110
selected_branch=selected_branch,
107111
git_provider=git_provider,
112+
llm_model=settings.llm_model,
108113
)
109114
)
110115

openhands/storage/data_models/conversation_metadata.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ConversationMetadata:
2525
trigger: ConversationTrigger | None = None
2626
pr_number: list[int] = field(default_factory=list)
2727
created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
28+
llm_model: str | None = None
2829
# Cost and token metrics
2930
accumulated_cost: float = 0.0
3031
prompt_tokens: int = 0

0 commit comments

Comments
 (0)