@@ -53,16 +53,26 @@ async def initialize_session(self, session: MCPSession) -> None:
5353
5454 exit_stack = AsyncExitStack ()
5555
56- client_info = Implementation (name = "reward-kit" , version = "1.0.0" , _extra = {})
57- client_info ._extra ["session_id" ] = session .session_id
56+ # Attach client metadata for the server to consume (session_id, seed, config, etc.).
57+ # The server inspects a private `_extra` dict on client_info, so we populate it here.
58+ client_info = Implementation (name = "reward-kit" , version = "1.0.0" )
59+ extra_data : Dict [str , Any ] = {"session_id" : session .session_id }
5860 if session .seed is not None :
59- client_info . _extra ["seed" ] = session .seed
61+ extra_data ["seed" ] = session .seed
6062 if session .dataset_row and session .dataset_row .environment_context :
61- client_info . _extra ["config" ] = session .dataset_row .environment_context
63+ extra_data ["config" ] = session .dataset_row .environment_context
6264 if session .dataset_row and session .dataset_row .id :
63- client_info . _extra ["dataset_row_id" ] = session .dataset_row .id
65+ extra_data ["dataset_row_id" ] = session .dataset_row .id
6466 if session .model_id :
65- client_info ._extra ["model_id" ] = session .model_id
67+ extra_data ["model_id" ] = session .model_id
68+
69+ # Merge with any existing _extra dict instead of overwriting
70+ existing_extra = getattr (client_info , "_extra" , None )
71+ merged_extra : Dict [str , Any ] = {}
72+ if isinstance (existing_extra , dict ):
73+ merged_extra .update (existing_extra )
74+ merged_extra .update (extra_data )
75+ setattr (client_info , "_extra" , merged_extra )
6676
6777 read_stream , write_stream , _ = await exit_stack .enter_async_context (
6878 streamablehttp_client (session .base_url , terminate_on_close = True )
@@ -92,7 +102,10 @@ async def _prewarm_tools_cache(self, session: MCPSession) -> None:
92102 # Only fetch tools if not already cached for this base_url
93103 if cache_key not in self ._tools_cache :
94104 logger .debug (f"Pre-warming tools cache for { cache_key } " )
95- tools_response = await session ._mcp_session .list_tools ()
105+ mcp_session_local = session ._mcp_session
106+ if mcp_session_local is None :
107+ raise RuntimeError ("Session not initialized during prewarm" )
108+ tools_response = await mcp_session_local .list_tools ()
96109 tools = tools_response .tools if hasattr (tools_response , "tools" ) else []
97110
98111 tool_schemas = []
@@ -213,7 +226,7 @@ async def get_initial_state(self, session: MCPSession) -> Any:
213226 try :
214227 # Use shorter timeout for playback mode, longer timeout for high-concurrency initialization
215228 # (50+ concurrent sessions need more time for initial state setup)
216- timeout = 3.0 if hasattr ( session , "_is_playback_mode" ) and session . _is_playback_mode else 15.0
229+ timeout = 3.0 if bool ( getattr ( session , "_is_playback_mode" , False )) else 15.0
217230 async with httpx .AsyncClient (timeout = timeout ) as client :
218231 initial_state_response = await client .get (
219232 f"{ base_url } /control/initial_state" ,
0 commit comments