@@ -1181,6 +1181,13 @@ async def chat_stream_generator(
11811181 self .multimodal_server_config ,
11821182 request_media_io_kwargs = request .media_io_kwargs )
11831183
1184+ # Decode base64 int32 prompt_token_ids relayed by the orchestrator.
1185+ if request .prompt_token_ids is None and request .prompt_token_ids_b64 :
1186+ import numpy as np
1187+ request .prompt_token_ids = np .frombuffer (
1188+ base64 .b64decode (request .prompt_token_ids_b64 ),
1189+ dtype = np .int32 ).tolist ()
1190+
11841191 if request .prompt_token_ids is not None :
11851192 prompt = request .prompt_token_ids
11861193 else :
@@ -1263,6 +1270,18 @@ async def chat_stream_generator(
12631270 else :
12641271 response = await self ._create_chat_response (
12651272 promise , postproc_params , raw_request , disaggregated_params )
1273+ # Context-only: optionally return prompt_token_ids as a base64
1274+ # int32 buffer (one string) so the disagg orchestrator relays it
1275+ # without materializing the int list on its event loop. The encode
1276+ # runs here on the context worker (1-of-N), not the orchestrator.
1277+ if (request .disaggregated_params is not None and
1278+ request .disaggregated_params .return_prompt_token_ids_b64
1279+ and response .prompt_token_ids is not None ):
1280+ import numpy as np
1281+ response .prompt_token_ids_b64 = base64 .b64encode (
1282+ np .asarray (response .prompt_token_ids ,
1283+ dtype = np .int32 ).tobytes ()).decode ("ascii" )
1284+ response .prompt_token_ids = None
12661285 return JSONResponse (content = response .model_dump ())
12671286 except CppExecutorError :
12681287 logger .error (traceback .format_exc ())
0 commit comments