"""Patch config.yaml for the MySQL business DB + SQLite checkpointer split.""" from __future__ import annotations import argparse from pathlib import Path import yaml def _parse_args() -> argparse.Namespace: parser = argparse.ArgumentParser(description="Switch DeerFlow config.yaml to MySQL business storage") parser.add_argument("--config", required=True, help="Path to config.yaml") parser.add_argument("--mysql-url-env", default="MYSQL_DATABASE_URL", help="Environment variable referenced by database.mysql_url") parser.add_argument("--checkpointer-sqlite", required=True, help="SQLite deerflow.db path used by LangGraph checkpointer") parser.add_argument("--pool-size", type=int, default=10) return parser.parse_args() def main() -> None: args = _parse_args() config_path = Path(args.config) data = yaml.safe_load(config_path.read_text(encoding="utf-8")) or {} if not isinstance(data, dict): raise SystemExit(f"Expected a mapping in {config_path}") database = dict(data.get("database") or {}) database["backend"] = "mysql" database["mysql_url"] = f"${args.mysql_url_env}" database.setdefault("pool_size", args.pool_size) database.setdefault("echo_sql", False) data["database"] = database data["checkpointer"] = { "type": "sqlite", "connection_string": args.checkpointer_sqlite, } config_path.write_text( yaml.safe_dump(data, allow_unicode=True, sort_keys=False), encoding="utf-8", ) print(f"Updated {config_path}: database.backend=mysql, checkpointer.type=sqlite") if __name__ == "__main__": main()