@@ -103,6 +103,7 @@ def __init__(
103103 self .api_server_host = None
104104 self .api_server_port = None
105105 self .api_server = None
106+ self .async_lock = asyncio .Lock ()
106107
107108 async def _initialize_tokenizer (self ):
108109 if self .tokenizer is None :
@@ -455,35 +456,44 @@ async def init_process_group(
455456 ),
456457 )
457458
458- async def run_api_server (self ):
459- """Run the OpenAI API server in a Ray actor."""
460- if not (self .api_server_host is None or self .api_server_port is None ):
461- raise RuntimeError ("API server is already running." )
462- from trinity .common .models .api .vllm_patch import run_api_server_in_ray_actor
463-
464- self .api_server_host , self .api_server_port = self .get_available_address ()
465- self .api_server = asyncio .create_task (
466- run_api_server_in_ray_actor (
467- self .async_llm ,
468- self .api_server_host ,
469- self .api_server_port ,
470- self .config .model_path ,
471- self .config .enable_auto_tool_choice ,
472- self .config .tool_call_parser ,
473- self .config .reasoning_parser ,
474- )
475- )
459+ async def run_api_server (self ) -> bool :
460+ """Run the OpenAI API server in a Ray actor.
476461
477- def has_api_server (self ) -> bool :
478- return self .config .enable_openai_api
462+ Returns:
463+ success (bool): Whether the API server is started successfully.
464+ """
465+ async with self .async_lock :
466+ if not self .config .enable_openai_api :
467+ return False # Not enabled
468+
469+ if self .api_server_host is not None and self .api_server_port is not None :
470+ return True # already running
471+
472+ from trinity .common .models .api .vllm_patch import run_api_server_in_ray_actor
473+
474+ api_server_host , api_server_port = self .get_available_address ()
475+ self .api_server = asyncio .create_task (
476+ run_api_server_in_ray_actor (
477+ self .async_llm ,
478+ api_server_host ,
479+ api_server_port ,
480+ self .config .model_path ,
481+ self .config .enable_auto_tool_choice ,
482+ self .config .tool_call_parser ,
483+ self .config .reasoning_parser ,
484+ )
485+ )
486+ self .api_server_host = api_server_host
487+ self .api_server_port = api_server_port
488+ return True
479489
480- def get_api_server_url (self ) -> Optional [str ]:
490+ async def get_api_server_url (self ) -> Optional [str ]:
481491 """Get the URL of the OpenAI API server.
482492
483493 Returns:
484494 api_url (str): The URL of the OpenAI API server.
485495 """
486- if not self .has_api_server ():
496+ if not await self .run_api_server ():
487497 return None
488498 return f"http://{ self .api_server_host } :{ self .api_server_port } "
489499
0 commit comments