{"record":{"id":"4c70fe1a9521632c","repo":"bytedance/deer-flow","slug":"search-not-supported-by-type-self-name","errorCode":null,"errorMessage":"search not supported by {type(self).__name__}","messagePattern":"search not supported by (.+?)","errorType":"exception","errorClass":"NotImplementedError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/manager.py","lineNumber":281,"sourceCode":"        \"\"\"\n        self.add(thread_id, messages, agent_name=agent_name, user_id=user_id)\n\n    def search(\n        self,\n        query: str,\n        top_k: int = 5,\n        *,\n        user_id: str | None = None,\n        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).\"\"\"","sourceCodeStart":263,"sourceCodeEnd":299,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/manager.py#L263-L299","documentation":"The base MemoryManager.search() deliberately raises NotImplementedError naming the backend class: search is an optional capability, and only backends that override search() AND set supports_search=True advertise it. This default exists so unsupported retrieval fails loudly and immediately instead of silently returning empty results that would look like 'no memories found'.","triggerScenarios":"Calling manager.search(query, ...) on a backend that did not override search (e.g. the noop backend, or a custom backend in middleware mode). In supported configurations the mode='tool' instantiation validator (error 636) blocks this earlier; direct calls (e.g. custom code, /api/memory search endpoints) can still reach it.","commonSituations":"Custom integration code calling search() unconditionally across backends; tool-mode attempts on a passive-only backend that slipped past construction (e.g. constructed directly instead of via the validating path).","solutions":["Check the backend's supports_search ClassVar before calling search()","Switch to a retrieval-capable backend ( DeerMem default file storage or honcho implement search) if you need programmatic search","In custom backends, override search() and set supports_search=True"],"exampleFix":"# before\nresults = manager.search('user preferences')\n\n# after\nresults = manager.search('user preferences') if type(manager).supports_search else []","handlingStrategy":"type-guard","validationCode":"from deerflow.agents.memory.manager import MemoryManager\nif type(manager).search is MemoryManager.search:\n    return []  # backend has no retrieval capability; skip the call\nreturn manager.search(query, top_k=5, user_id=user)","typeGuard":"def backend_can_search(manager) -> bool:\n    from deerflow.agents.memory.manager import MemoryManager\n    return type(manager).supports_search is True and type(manager).search is not MemoryManager.search","tryCatchPattern":"try:\n    results = manager.search(query, user_id=user)\nexcept NotImplementedError:\n    results = []  # retrieval unsupported on this backend; degrade gracefully","preventionTips":["Check the supports_search ClassVar before invoking search()","Do not build flows that silently depend on search across every backend","In custom backends without retrieval, leave search() and supports_search at their defaults so the guard works"],"tags":["memory","not-implemented","search","backend"],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}