{"record":{"id":"d9a2126ec915c7b6","repo":"bytedance/deer-flow","slug":"get-memory-not-supported-by-type-self-name","errorCode":null,"errorMessage":"get_memory not supported by {type(self).__name__}","messagePattern":"get_memory not supported by (.+?)","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/manager.py","lineNumber":290,"sourceCode":"        agent_name: str | None = None,\n        category: str | None = None,\n    ) -> list[dict[str, Any]]:\n        \"\"\"Search the bucket's memory for facts matching ``query``; return up to\n        ``top_k`` ranked by relevance. ``category`` (optional) filters BEFORE the\n        ``top_k`` slice so a category-scoped search is not starved by other\n        categories' higher-ranked facts. Default: unsupported (raise); backends\n        with retrieval override AND set ``supports_search = True`` (required for\n        ``mode='tool'``).\"\"\"\n        raise NotImplementedError(f\"search not supported by {type(self).__name__}\")\n\n    def get_memory(\n        self,\n        *,\n        user_id: str | None = None,\n        agent_name: str | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Return the full memory document for the bucket. Default: unsupported.\"\"\"\n        raise NotImplementedError(f\"get_memory not supported by {type(self).__name__}\")\n\n    def delete_memory(\n        self,\n        *,\n        user_id: str | None = None,\n        agent_name: str | None = None,\n    ) -> None:\n        \"\"\"Delete the entire memory document for the bucket. Default: unsupported\n        (dead contract -- zero callers).\"\"\"\n        raise NotImplementedError(f\"delete_memory not supported by {type(self).__name__}\")\n\n    def clear_memory(\n        self,\n        *,\n        user_id: str | None = None,\n        agent_name: str | None = None,\n    ) -> dict[str, Any]:\n        \"\"\"Clear the bucket's memory; return the cleared (now-empty) document.","sourceCodeStart":272,"sourceCodeEnd":308,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/manager.py#L272-L308","documentation":"The base MemoryManager.get_memory() raises NotImplementedError naming the backend class: returning the full memory document is an optional capability that backends must opt into by overriding. The default keeps the contract honest — an unsupported read cannot be mistaken for an empty memory document.","triggerScenarios":"Calling manager.get_memory(user_id=..., agent_name=...) on a backend that does not override get_memory (the base default). Reachable via programmatic callers such as memory inspection endpoints or custom code; middleware-mode backends without whole-document reads hit it.","commonSituations":"Settings/UI code or scripts assuming every backend can dump the full memory document; custom backends that implement only add() and injection.","solutions":["Guard the call with a capability check (hasattr/overridden test against MemoryManager.get_memory) or a backend-specific flag","Use a backend that implements get_memory (e.g. DeerMem file storage) if whole-document reads are required","In custom backends, override get_memory() to return the merged document"],"exampleFix":"# before\nmemory_doc = manager.get_memory(user_id='default')\n\n# after\nis_overridden = type(manager).get_memory is not MemoryManager.get_memory\nmemory_doc = manager.get_memory(user_id='default') if is_overridden else {\"user\": {}, \"history\": {}, \"facts\": []}","handlingStrategy":"type-guard","validationCode":"from deerflow.agents.memory.manager import MemoryManager\nif type(manager).get_memory is MemoryManager.get_memory:\n    return {\"supported\": False}  # whole-document read unavailable on this backend\nreturn manager.get_memory(user_id=user)","typeGuard":"def backend_can_get_memory(manager) -> bool:\n    from deerflow.agents.memory.manager import MemoryManager\n    return type(manager).get_memory is not MemoryManager.get_memory","tryCatchPattern":"try:\n    doc = manager.get_memory(user_id=user)\nexcept NotImplementedError:\n    doc = None  # treat as 'view not supported' rather than empty memory","preventionTips":["Treat NotImplementedError from optional MemoryManager reads as 'unsupported', never as 'empty memory'","Advertise the memory-inspection feature only for backends that override get_memory()"],"tags":["memory","not-implemented","api-surface","backend"],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}