"""Gradio deploy entrypoint for the customized FastChat UI.""" import os from pathlib import Path import traceback from types import SimpleNamespace import gradio as gr from fastchat.serve.gradio_global_state import Context from fastchat.serve.gradio_web_server import get_model_list import fastchat.serve.gradio_web_server_multi as web_multi from fastchat.serve.gradio_web_server_multi import ( build_demo, set_global_vars, set_global_vars_anony, set_global_vars_named, ) def _to_bool(value: str, default: bool) -> bool: if value is None: return default return value.strip().lower() in {"1", "true", "yes", "on"} def _get_server_port(): """Use explicit platform ports when provided; otherwise let Gradio pick locally.""" env_port = os.getenv("GRADIO_SERVER_PORT") or os.getenv("PORT") if not env_port: return None return int(env_port) def create_demo(): repo_root = Path(__file__).resolve().parent register_file = os.getenv("FASTCHAT_REGISTER_API_FILE", "api_endpoint.json") register_path = repo_root / register_file register_api_file = str(register_path) if register_path.exists() else None server_port = _get_server_port() args = SimpleNamespace( host="0.0.0.0", port=server_port or 7860, share=False, controller_url=os.getenv("FASTCHAT_CONTROLLER_URL", ""), concurrency_count=int(os.getenv("FASTCHAT_CONCURRENCY", "10")), model_list_mode=os.getenv("FASTCHAT_MODEL_LIST_MODE", "once"), moderate=_to_bool(os.getenv("FASTCHAT_MODERATE"), False), show_terms_of_use=False, vision_arena=_to_bool(os.getenv("FASTCHAT_VISION_ARENA"), False), random_questions=None, register_api_endpoint_file=register_api_file, gradio_auth_path=None, elo_results_file=None, leaderboard_table_file=None, arena_hard_table=None, gradio_root_path=None, ga_id=None, use_remote_storage=False, password=None, show_visualizer=False, hide_arena_battle=_to_bool(os.getenv("FASTCHAT_HIDE_ARENA_BATTLE"), True), ) print( "Space startup config:", { "controller_url": args.controller_url or None, "register_api_endpoint_file": args.register_api_endpoint_file, "model_list_mode": args.model_list_mode, "vision_arena": args.vision_arena, "hide_arena_battle": args.hide_arena_battle, "port": args.port, }, flush=True, ) # gradio_web_server_multi references a module-level `args`. web_multi.args = args set_global_vars(args.controller_url, args.moderate, args.use_remote_storage) set_global_vars_named(args.moderate) set_global_vars_anony(args.moderate) text_models, all_text_models = get_model_list( args.controller_url, args.register_api_endpoint_file, vision_arena=False, ) vision_models, all_vision_models = get_model_list( args.controller_url, args.register_api_endpoint_file, vision_arena=True, ) models = text_models + [ model for model in vision_models if model not in text_models ] all_models = all_text_models + [ model for model in all_vision_models if model not in all_text_models ] print( "Discovered models:", { "text_models": text_models, "vision_models": vision_models, "all_models": all_models, }, flush=True, ) context = Context( text_models, all_text_models, vision_models, all_vision_models, models, all_models, ) demo = build_demo( context, args.elo_results_file, args.leaderboard_table_file, args.arena_hard_table, ) return demo.queue( default_concurrency_limit=args.concurrency_count, status_update_rate=10, api_open=False, ) try: demo = create_demo() except Exception: error_trace = traceback.format_exc() print("Space startup failed:\n", error_trace) with gr.Blocks(title="Oulution Demo Startup Error") as demo: gr.Markdown("## Oulution Demo failed to start") gr.Markdown( "The app encountered an initialization error. " "Check Space logs and fix configuration." ) gr.Code(error_trace, language="python") if __name__ == "__main__": launch_kwargs = {"server_name": "0.0.0.0"} server_port = _get_server_port() if server_port is not None: launch_kwargs["server_port"] = server_port demo.launch(**launch_kwargs)