agent-zero/run_ui.py
Alessandro 2afffe8edc
Some checks are pending
Build And Publish Docker Images / plan (push) Waiting to run
Build And Publish Docker Images / build (push) Blocked by required conditions
Overlap embedding warm-up with chat restoration
Load sentence-transformers on the existing cache miss and construct the
preloaded model off the shared background event loop. Start warm-up before
chat restoration inside extensible init_a0, preserving start-hook control
and sharing the loaded model with ordinary runtime requests.

Remove unused speech preload imports and dead warm-up functions. Seed APT
indexes only when absent, skipping the refresh on normal container boots.
Keep the existing Python tunnel service and its provider lifecycle.

Validation: 49 focused framework tests passed, including extension-hook
short-circuit behavior, concurrent embedding-cache reuse, APT cache states,
tunnel behavior and CSRF origins. Three cold Fable chat trials per version:
median submit-to-first-token 9.588s -> 4.234s;
local preparation 6.904s -> 1.197s;
HTTP readiness 42.637s -> 41.139s;
boot-to-first-token 52.093s -> 46.657s.
Provider timing varies; these are local repeated measurements. The live
baseline already omitted APT refresh, so it receives no timing credit.
2026-10-10 16:36:08 +02:00

87 lines
2.4 KiB
Python

import initialize
from helpers import dotenv, extension, runtime
from helpers.api import csrf_protect, requires_auth
from helpers.print_style import PrintStyle
from helpers.server_startup import run_uvicorn_with_retries
from helpers.ui_server import UiServerRuntime, configure_process_environment
def run():
configure_process_environment()
PrintStyle().print("Initializing Python framework...")
PrintStyle().print("Checking for data migration...")
run_migration_checks()
PrintStyle().print("Preparing web server runtime...")
server_runtime, host, port = prepare_web_runtime()
PrintStyle().print("Initializing Agent Zero components...")
init_a0()
PrintStyle().print("Starting UI/API server...")
start_web_server(server_runtime, host, port)
def run_migration_checks() -> None:
initialize.initialize_migration()
def prepare_web_runtime() -> tuple[UiServerRuntime, str, int]:
host = (
runtime.get_arg("host") or dotenv.get_dotenv_value("WEB_UI_HOST") or "localhost"
)
port = runtime.get_web_ui_port()
server_runtime = UiServerRuntime.create()
server_runtime.register_http_routes()
server_runtime.register_transport_handlers()
return server_runtime, host, port
def start_web_server(server_runtime: UiServerRuntime, host: str, port: int) -> None:
run_uvicorn_with_retries(
host=host,
port=port,
build_asgi_app=server_runtime.build_asgi_app,
flush_callback=create_flush_callback(),
access_log=server_runtime.access_log_enabled(),
ws="wsproto",
)
def create_flush_callback():
def flush_and_shutdown_callback() -> None:
"""
TODO(dev): add cleanup + flush-to-disk logic here.
"""
return
flush_ran = False
def _run_flush(reason: str) -> None:
nonlocal flush_ran
if flush_ran:
return
flush_ran = True
try:
flush_and_shutdown_callback()
except Exception as e:
PrintStyle.warning(f"Shutdown flush failed ({reason}): {e}")
return _run_flush
@extension.extensible
def init_a0():
initialize.initialize_preload()
init_chats = initialize.initialize_chats()
init_chats.result_sync()
initialize.initialize_mcp()
initialize.initialize_job_loop()
if __name__ == "__main__":
runtime.initialize()
dotenv.load_dotenv()
run()