@@ -113,15 +113,16 @@ def extract_session_id(self, request: Request, request_json: Dict) -> Optional[s
113113 if session_key is None :
114114 return None
115115 val = request .headers .get (session_key )
116- return val if val is not None else request_json .get (session_key , None )
116+ return val if val is not None else ( request_json or {}) .get (session_key , None )
117117
118118 @abc .abstractmethod
119- def route_request (
119+ async def route_request (
120120 self ,
121121 endpoints : List [EndpointInfo ],
122122 engine_stats : Dict [str , EngineStats ],
123123 request_stats : Dict [str , RequestStats ],
124124 request : Request ,
125+ request_json : Optional [Dict ] = None ,
125126 ) -> str :
126127 """
127128 Route the request to the appropriate engine URL
@@ -149,12 +150,13 @@ def __init__(self):
149150 self .last_endpoints_hash = None
150151 self ._initialized = True
151152
152- def route_request (
153+ async def route_request (
153154 self ,
154155 endpoints : List [EndpointInfo ],
155156 engine_stats : Dict [str , EngineStats ],
156157 request_stats : Dict [str , RequestStats ],
157158 request : Request ,
159+ request_json : Optional [Dict ] = None ,
158160 ) -> str :
159161 """
160162 Route the request to the appropriate engine URL using a simple
@@ -201,7 +203,7 @@ async def route_request(
201203 engine_stats : Dict [str , EngineStats ],
202204 request_stats : Dict [str , RequestStats ],
203205 request : Request ,
204- request_json : Dict ,
206+ request_json : Optional [ Dict ] = None ,
205207 ) -> str :
206208 """
207209 Route the request to the appropriate engine URL by the 'session id' in
@@ -320,7 +322,7 @@ async def route_request(
320322 engine_stats : Dict [str , EngineStats ],
321323 request_stats : Dict [str , RequestStats ],
322324 request : Request ,
323- request_json : Dict ,
325+ request_json : Optional [ Dict ] = None ,
324326 ) -> str :
325327 """
326328 Route the request to the appropriate engine URL by where the KV cache
@@ -346,14 +348,14 @@ async def route_request(
346348 self .tokenizer = AutoTokenizer .from_pretrained (
347349 endpoints [0 ].model_names [0 ]
348350 )
349- token_ids = self .tokenizer .encode (request_json .get ("prompt" , "" ))
351+ token_ids = self .tokenizer .encode (( request_json or {}) .get ("prompt" , "" ))
350352 except Exception :
351353 # Remote /tokenize fallback (let errors bubble up to keep behavior simple)
352354 remote_url = endpoints [0 ].url + "/tokenize"
353355 headers = {"Content-Type" : "application/json" }
354356 data = {
355357 "model" : endpoints [0 ].model_names [0 ],
356- "prompt" : request_json .get ("prompt" , "" ),
358+ "prompt" : ( request_json or {}) .get ("prompt" , "" ),
357359 }
358360 body = requests .post (
359361 remote_url , headers = headers , json = data , timeout = 10
@@ -435,7 +437,7 @@ async def route_request(
435437 engine_stats : Dict [str , EngineStats ],
436438 request_stats : Dict [str , RequestStats ],
437439 request : Request ,
438- request_json : Dict ,
440+ request_json : Optional [ Dict ] = None ,
439441 ) -> str :
440442 """
441443 Route the request to the appropriate engine URL by where the longest
@@ -455,9 +457,10 @@ async def route_request(
455457 """
456458
457459 # Handle chat completions
458- if "messages" in request_json :
460+ _request_json = request_json or {}
461+ if "messages" in _request_json :
459462 # Get the last message from the messages array
460- messages = request_json ["messages" ]
463+ messages = _request_json ["messages" ]
461464 if messages :
462465 # Concatenate all message content
463466 prompt_parts = []
@@ -478,7 +481,7 @@ async def route_request(
478481 prompt = ""
479482 else :
480483 # Handle regular completions
481- prompt = request_json ["prompt" ]
484+ prompt = _request_json ["prompt" ]
482485
483486 available_endpoints = set (endpoint .url for endpoint in endpoints )
484487 _ , matched_endpoint = await self .hashtrie .longest_prefix_match (
@@ -503,20 +506,20 @@ def __init__(self, prefill_model_labels: List[str], decode_model_labels: List[st
503506 self .decode_model_labels = decode_model_labels
504507 self .request_cache = {} # Cache to store prefill results
505508
506- def route_request (
509+ async def route_request (
507510 self ,
508511 endpoints : List [EndpointInfo ],
509512 engine_stats : Dict [str , EngineStats ],
510513 request_stats : Dict [str , RequestStats ],
511514 request : Request ,
512- request_json : Dict ,
515+ request_json : Optional [ Dict ] = None ,
513516 ) -> str :
514517 """
515518 Route the request to appropriate endpoints for prefill and decode operations.
516519 First request goes to prefill endpoint, then second request goes to decode endpoint.
517520 """
518521 # Find prefill and decode endpoints
519- is_prefill = request_json .get ("max_tokens" , 0 ) == 1
522+ is_prefill = ( request_json or {}) .get ("max_tokens" , 0 ) == 1
520523 if is_prefill :
521524 logger .info ("Prefill request" )
522525 else :
@@ -631,7 +634,7 @@ async def route_request(
631634 engine_stats : Dict [str , EngineStats ],
632635 request_stats : Dict [str , RequestStats ],
633636 request : Request ,
634- request_json : Dict ,
637+ request_json : Optional [ Dict ] = None ,
635638 ) -> str :
636639 """
637640 This method is called by the router framework but for orchestrated routing,
0 commit comments