mirror of
https://github.com/agent0ai/agent-zero.git
synced 2026-10-19 07:23:51 +00:00
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.
87 lines
2.4 KiB
Python
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()
|