@@ -500,6 +500,32 @@ def _shared_exit(sig, frame):
500500 s .handle_exit = _shared_exit
501501
502502
503+ async def _run_servers (
504+ host : str ,
505+ port : int ,
506+ otlp_port : int ,
507+ * ,
508+ reload : bool = False ,
509+ reload_dirs : list [str ] | None = None ,
510+ log_level : str = "warning" ,
511+ ) -> None :
512+ """Start the main API and OTLP HTTP servers."""
513+ import uvicorn
514+
515+ shared_kwargs : dict = {
516+ "host" : host ,
517+ "reload" : reload ,
518+ "log_level" : log_level ,
519+ }
520+ if reload_dirs :
521+ shared_kwargs ["reload_dirs" ] = reload_dirs
522+
523+ main_server = uvicorn .Server (uvicorn .Config ("agentevals.api.app:app" , port = port , ** shared_kwargs ))
524+ otlp_server = uvicorn .Server (uvicorn .Config ("agentevals.api.otlp_app:otlp_app" , port = otlp_port , ** shared_kwargs ))
525+ _link_server_shutdown (main_server , otlp_server )
526+ await asyncio .gather (main_server .serve (), otlp_server .serve ())
527+
528+
503529@main .command ("serve" )
504530@click .option (
505531 "--dev" ,
@@ -546,8 +572,6 @@ def serve(dev: bool, host: str, port: int, otlp_port: int, eval_sets: str | None
546572 """
547573 from pathlib import Path
548574
549- import uvicorn
550-
551575 level = logging .WARNING
552576 if verbose == 1 :
553577 level = logging .INFO
@@ -582,82 +606,20 @@ def serve(dev: bool, host: str, port: int, otlp_port: int, eval_sets: str | None
582606 click .echo ()
583607
584608 src_path = Path (__file__ ).parent .parent
585-
586- async def _run_dev_servers ():
587- main_config = uvicorn .Config (
588- "agentevals.api.app:app" ,
589- host = host ,
590- port = port ,
591- reload = True ,
592- reload_dirs = [str (src_path )],
593- log_level = "info" ,
594- )
595- otlp_config = uvicorn .Config (
596- "agentevals.api.otlp_app:otlp_app" ,
597- host = host ,
598- port = otlp_port ,
599- reload = True ,
600- reload_dirs = [str (src_path )],
601- log_level = "info" ,
602- )
603- main_server = uvicorn .Server (main_config )
604- otlp_server = uvicorn .Server (otlp_config )
605- _link_server_shutdown (main_server , otlp_server )
606- await asyncio .gather (main_server .serve (), otlp_server .serve ())
607-
608- asyncio .run (_run_dev_servers ())
609+ reload_dirs = [str (src_path )]
610+ asyncio .run (_run_servers (host , port , otlp_port , reload = True , reload_dirs = reload_dirs , log_level = "info" ))
609611 elif has_ui and not headless :
610612 click .echo (f"agentevals: http://{ host } :{ port } " )
611613 click .echo (f" OTLP HTTP: http://{ host } :{ otlp_port } " )
612614 click .echo ()
613615
614- async def _run_ui_servers ():
615- main_config = uvicorn .Config (
616- "agentevals.api.app:app" ,
617- host = host ,
618- port = port ,
619- reload = False ,
620- log_level = "warning" ,
621- )
622- otlp_config = uvicorn .Config (
623- "agentevals.api.otlp_app:otlp_app" ,
624- host = host ,
625- port = otlp_port ,
626- reload = False ,
627- log_level = "warning" ,
628- )
629- main_server = uvicorn .Server (main_config )
630- otlp_server = uvicorn .Server (otlp_config )
631- _link_server_shutdown (main_server , otlp_server )
632- await asyncio .gather (main_server .serve (), otlp_server .serve ())
633-
634- asyncio .run (_run_ui_servers ())
616+ asyncio .run (_run_servers (host , port , otlp_port ))
635617 else :
636618 click .echo (f"agentevals API: http://{ host } :{ port } /api" )
637619 click .echo (f" OTLP HTTP: http://{ host } :{ otlp_port } " )
638620 click .echo ()
639621
640- async def _run_headless_servers ():
641- main_config = uvicorn .Config (
642- "agentevals.api.app:app" ,
643- host = host ,
644- port = port ,
645- reload = False ,
646- log_level = "warning" ,
647- )
648- otlp_config = uvicorn .Config (
649- "agentevals.api.otlp_app:otlp_app" ,
650- host = host ,
651- port = otlp_port ,
652- reload = False ,
653- log_level = "warning" ,
654- )
655- main_server = uvicorn .Server (main_config )
656- otlp_server = uvicorn .Server (otlp_config )
657- _link_server_shutdown (main_server , otlp_server )
658- await asyncio .gather (main_server .serve (), otlp_server .serve ())
659-
660- asyncio .run (_run_headless_servers ())
622+ asyncio .run (_run_servers (host , port , otlp_port ))
661623
662624
663625@main .command ("mcp" )
0 commit comments