OpenBMB/ChatDev · error · DesignError

'{legacy_key}' is deprecated. Use the new graph-level memory

Error message

'{legacy_key}' is deprecated. Use the new graph-level memory stores for node '{nid}'.

What it means

409 Conflict raised by POST /api/tools/local when the target .py file already exists in the function tools directory and the request did not set overwrite=true.

Source

Thrown at check/check.py:46


def _ensure_supported(graph: Dict[str, Any]) -> None:
    """Ensure the MVP constraints are satisfied for the provided graph."""
    for node in graph.get("nodes", []) or []:
        nid = node.get("id")
        ntype = node.get("type")
        allowed = _allowed_node_types()
        if ntype not in allowed:
            raise DesignError(
                f"Unsupported node type '{ntype}' for node '{nid}'. Only {allowed} nodes are supported."
            )
        if ntype == "agent":
            agent_cfg = node.get("config") or {}
            if not isinstance(agent_cfg, dict):
                raise DesignError(f"Agent node '{nid}' config must be an object")
            for legacy_key in ["memory"]:
                if legacy_key in agent_cfg:
                    raise DesignError(
                        f"'{legacy_key}' is deprecated. Use the new graph-level memory stores for node '{nid}'."
                    )


def load_config(
    config_path: Path,
    *,
    fn_module: Optional[str] = None,
    set_defaults: bool = True,
    vars_override: Optional[Dict[str, Any]] = None,
) -> DesignConfig:
    """Load, validate, and sanity-check a workflow file."""

    try:
        raw_data = read_yaml(config_path)
    except FileNotFoundError as exc:
        raise DesignError(f"Design file not found: {config_path}") from exc

View on GitHub (pinned to 4fb2db0ea9)

Solutions

  1. Set "overwrite": true in the request body when you intend to replace the file.
  2. Or pick a new unique filename.
  3. Make creation scripts idempotent by catching 409 and retrying with overwrite.

Example fix

# before
payload = {"filename": "my_tool", "content": code}
# after
payload = {"filename": "my_tool", "content": code, "overwrite": True}
Defensive patterns

Strategy: try-catch

Validate before calling

// check existence first via the tools listing endpoint if available

Try / catch

try { create(name) } catch (e) { if (e.status === 409) create(name, {overwrite: true}) else throw e }

Prevention

When it happens

Trigger: Creating a tool whose filename already exists on disk without {"overwrite": true} in the payload; re-running an upload script after a previous successful run.

Common situations: Idempotent deployment scripts that re-create tools; iterating on a tool and forgetting the overwrite flag; CI pipelines that replay creation requests.

Related errors


AI-assisted analysis of OpenBMB/ChatDev@4fb2db0ea9 (2026-08-27). Data as JSON: /api/errors/d62ced19e0fcf24b. Report an issue: GitHub.