mirror of
https://github.com/bytedance/deer-flow.git
synced 2026-06-10 09:25:57 +00:00
f725a963d5
* fix(runtime): protect sync singleton init/reset with threading.Lock * fix(runtime): serialize sync singleton init and reset * make format * test(runtime): assert store reset creates new singleton * Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * fix(runtime): load config outside singleton locks * fix(runtime): share checkpointer config loading helper --------- Co-authored-by: GODDiao <diaoshengjia@gmail.com> Co-authored-by: Willem Jiang <willem.jiang@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
"""Configuration for LangGraph checkpointer."""
|
|
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
CheckpointerType = Literal["memory", "sqlite", "postgres"]
|
|
|
|
|
|
class CheckpointerConfig(BaseModel):
|
|
"""Configuration for LangGraph state persistence checkpointer."""
|
|
|
|
type: CheckpointerType = Field(
|
|
description="Checkpointer backend type. "
|
|
"'memory' is in-process only (lost on restart). "
|
|
"'sqlite' persists to a local file (requires langgraph-checkpoint-sqlite). "
|
|
"'postgres' persists to PostgreSQL (install with deerflow-harness[postgres])."
|
|
)
|
|
connection_string: str | None = Field(
|
|
default=None,
|
|
description="Connection string for sqlite (file path) or postgres (DSN). "
|
|
"Optional for sqlite and defaults to 'store.db' when omitted. "
|
|
"Required for postgres. "
|
|
"For sqlite, use a file path like '.deer-flow/checkpoints.db' or ':memory:' for in-memory. "
|
|
"For postgres, use a DSN like 'postgresql://user:pass@localhost:5432/db'.",
|
|
)
|
|
|
|
|
|
# Global configuration instance — None means no checkpointer is configured.
|
|
_checkpointer_config: CheckpointerConfig | None = None
|
|
|
|
|
|
def get_checkpointer_config() -> CheckpointerConfig | None:
|
|
"""Get the current checkpointer configuration, or None if not configured."""
|
|
return _checkpointer_config
|
|
|
|
|
|
def set_checkpointer_config(config: CheckpointerConfig | None) -> None:
|
|
"""Set the checkpointer configuration."""
|
|
global _checkpointer_config
|
|
_checkpointer_config = config
|
|
|
|
|
|
def ensure_config_loaded() -> None:
|
|
"""Lazily load app config when checkpointer config has not been initialized."""
|
|
from deerflow.config.app_config import _app_config, get_app_config
|
|
|
|
config = get_checkpointer_config()
|
|
if config is not None or _app_config is not None:
|
|
return
|
|
|
|
try:
|
|
get_app_config()
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
|
|
def load_checkpointer_config_from_dict(config_dict: dict | None) -> None:
|
|
"""Load checkpointer configuration from a dictionary."""
|
|
global _checkpointer_config
|
|
if config_dict is None:
|
|
_checkpointer_config = None
|
|
return
|
|
_checkpointer_config = CheckpointerConfig(**config_dict)
|