"""Runtime checks shared by the controller's interpreter probe and workers.""" from __future__ import annotations import importlib def storage_backend(config) -> str: """Return the effective LangGraph persistence adapter selected by config.""" checkpoint = getattr(config, "checkpointer", None) if checkpoint is not None: if checkpoint.type == "postgres": from deerflow.runtime.checkpointer.async_provider import _use_postgres_enabled return "postgres" if _use_postgres_enabled(checkpoint) else "sqlite" if checkpoint.type == "sqlite": return "sqlite" return "memory" database = getattr(config, "database", None) backend = getattr(database, "backend", "memory") return backend if backend in {"postgres", "sqlite"} else "memory" def verify_storage_dependencies(config) -> str: """Verify the adapters the configured runtime will import, without DB access.""" backend = storage_backend(config) modules = { "postgres": ( "langgraph.checkpoint.postgres.aio", "langgraph.store.postgres.aio", "psycopg.rows", "psycopg_pool", ), "sqlite": ( "langgraph.checkpoint.sqlite.aio", "langgraph.store.sqlite.aio", ), }.get(backend, ()) for module in modules: try: importlib.import_module(module) except ImportError as exc: install = ( "langgraph-checkpoint-postgres psycopg[binary] psycopg-pool" if backend == "postgres" else "langgraph-checkpoint-sqlite aiosqlite" ) raise RuntimeError( f"Worker Python is missing {module} required by the configured " f"{backend} chat store; install {install} in the main service " "runtime and ensure Workers use that same Python environment" ) from exc return backend