{"record":{"id":"d62ced19e0fcf24b","repo":"OpenBMB/ChatDev","slug":"legacy-key-is-deprecated-use-the-new-graph-le","errorCode":null,"errorMessage":"'{legacy_key}' is deprecated. Use the new graph-level memory stores for node '{nid}'.","messagePattern":"'(.+?)' is deprecated\\. Use the new graph-level memory stores for node '(.+?)'\\.","errorType":"validation","errorClass":"DesignError","httpStatus":null,"severity":"error","filePath":"check/check.py","lineNumber":46,"sourceCode":"\n\ndef _ensure_supported(graph: Dict[str, Any]) -> None:\n    \"\"\"Ensure the MVP constraints are satisfied for the provided graph.\"\"\"\n    for node in graph.get(\"nodes\", []) or []:\n        nid = node.get(\"id\")\n        ntype = node.get(\"type\")\n        allowed = _allowed_node_types()\n        if ntype not in allowed:\n            raise DesignError(\n                f\"Unsupported node type '{ntype}' for node '{nid}'. Only {allowed} nodes are supported.\"\n            )\n        if ntype == \"agent\":\n            agent_cfg = node.get(\"config\") or {}\n            if not isinstance(agent_cfg, dict):\n                raise DesignError(f\"Agent node '{nid}' config must be an object\")\n            for legacy_key in [\"memory\"]:\n                if legacy_key in agent_cfg:\n                    raise DesignError(\n                        f\"'{legacy_key}' is deprecated. Use the new graph-level memory stores for node '{nid}'.\"\n                    )\n\n\ndef load_config(\n    config_path: Path,\n    *,\n    fn_module: Optional[str] = None,\n    set_defaults: bool = True,\n    vars_override: Optional[Dict[str, Any]] = None,\n) -> DesignConfig:\n    \"\"\"Load, validate, and sanity-check a workflow file.\"\"\"\n\n    try:\n        raw_data = read_yaml(config_path)\n    except FileNotFoundError as exc:\n        raise DesignError(f\"Design file not found: {config_path}\") from exc\n","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/OpenBMB/ChatDev/blob/4fb2db0ea90375ce1059f44fe03ffbd191a7a169/check/check.py#L28-L64","documentation":"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.","triggerScenarios":"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.","commonSituations":"Idempotent deployment scripts that re-create tools; iterating on a tool and forgetting the overwrite flag; CI pipelines that replay creation requests.","solutions":["Set \"overwrite\": true in the request body when you intend to replace the file.","Or pick a new unique filename.","Make creation scripts idempotent by catching 409 and retrying with overwrite."],"exampleFix":"# before\npayload = {\"filename\": \"my_tool\", \"content\": code}\n# after\npayload = {\"filename\": \"my_tool\", \"content\": code, \"overwrite\": True}","handlingStrategy":"try-catch","validationCode":"// check existence first via the tools listing endpoint if available","typeGuard":null,"tryCatchPattern":"try { create(name) } catch (e) { if (e.status === 409) create(name, {overwrite: true}) else throw e }","preventionTips":["Pass overwrite:true for idempotent scripts","Use unique names per deployment"],"tags":["conflict","duplicate","fastapi","tools"],"backgroundTag":"resource-already-exists","analyzedSha":"4fb2db0ea90375ce1059f44fe03ffbd191a7a169","analyzedAt":"2026-08-27T14:35:29.622Z","schemaVersion":2},"datasetVersion":"2026-08-27T19:17:21.184Z"}