{"record":{"id":"3f8c6dbff05c1311","repo":"bytedance/deer-flow","slug":"mem0-top-k-must-be-in-1-1000","errorCode":null,"errorMessage":"mem0 top_k must be in [1, 1000]","messagePattern":"mem0 top_k must be in \\[1, 1000\\]","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py","lineNumber":103,"sourceCode":"            api_key_env=str(cfg.get(\"api_key_env\", \"MEM0_API_KEY\")),\n            base_url=str(cfg.get(\"base_url\", \"https://api.mem0.ai\")).rstrip(\"/\"),\n            allow_insecure_http=allow_insecure_http,\n            top_k=int(cfg.get(\"top_k\", 8)),\n            score_threshold=float(cfg.get(\"score_threshold\", 0.1)),\n            max_injection_chars=int(cfg.get(\"max_injection_chars\", 12000)),\n            timeout_seconds=float(cfg.get(\"timeout_seconds\", 10.0)),\n            startup_policy=str(cfg.get(\"startup_policy\", \"fail_fast\")),\n            read_policy=str(failure_policy.get(\"read\", \"fail_open\")),\n            write_policy=str(failure_policy.get(\"write\", \"log_and_drop\")),\n        )\n        if config.startup_policy not in _STARTUP_POLICIES:\n            raise ValueError(f\"mem0 startup_policy must be one of {sorted(_STARTUP_POLICIES)}\")\n        if config.read_policy not in _READ_POLICIES:\n            raise ValueError(f\"mem0 failure_policy.read must be one of {sorted(_READ_POLICIES)}\")\n        if config.write_policy not in _WRITE_POLICIES:\n            raise ValueError(f\"mem0 failure_policy.write must be one of {sorted(_WRITE_POLICIES)}\")\n        if not 1 <= config.top_k <= 1000:\n            raise ValueError(\"mem0 top_k must be in [1, 1000]\")\n        if not 0.0 <= config.score_threshold <= 1.0:\n            raise ValueError(\"mem0 score_threshold must be in [0, 1]\")\n        if config.max_injection_chars <= 0:\n            raise ValueError(\"mem0 max_injection_chars must be positive\")\n        if config.timeout_seconds <= 0:\n            raise ValueError(\"mem0 timeout_seconds must be positive\")\n        if not config.api_key_env.strip():\n            raise ValueError(\"mem0 api_key_env must be a non-empty env var name\")\n        parsed_base_url = urlsplit(config.base_url)\n        if parsed_base_url.scheme not in {\"http\", \"https\"} or not parsed_base_url.netloc:\n            raise ValueError(\"mem0 base_url must be an absolute http:// or https:// URL\")\n        if parsed_base_url.scheme == \"http\" and not config.allow_insecure_http:\n            raise ValueError(\"mem0 base_url must use https:// because it carries the API key; set allow_insecure_http: true only for trusted local development\")\n        return config\n\n    def resolve_api_key(self) -> str:\n        \"\"\"Read the API key from the configured environment variable.\"\"\"\n        key = os.environ.get(self.api_key_env, \"\").strip()","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py#L85-L121","documentation":"Raised by Mem0Config.from_backend_config when memory.backend_config.top_k is outside [1, 1000] after int() coercion. top_k caps both the default search breadth and the number of memories injected by get_context, so 0 (disable) or >1000 (unbounded retrieval) are both rejected.","triggerScenarios":"top_k: 0 (often written intending to 'disable' memory — not supported), top_k: 5000, or a negative value in backend_config. Non-integer strings that still coerce (e.g. \"8\") are fine.","commonSituations":"Trying to disable memory injection via top_k instead of memory.injection_enabled: false; tuning retrieval very high for a big corpus; a templated default of 0 slipping through.","solutions":["Set top_k to a value within 1..1000 (default 8 is a sane starting point)","To disable memory injection entirely, use memory.injection_enabled: false rather than top_k: 0","If you genuinely need >1000 memories per turn, narrow the query/score_threshold instead — 1000 is a hard guardrail"],"exampleFix":"# before (config.yaml)\nmemory:\n  injection_enabled: true\n  backend_config:\n    top_k: 0   # out of range\n\n# after\nmemory:\n  injection_enabled: false   # the supported way to disable injection\n  backend_config:\n    top_k: 8","handlingStrategy":"validation","validationCode":"def top_k_ok(backend_config: dict) -> bool:\n    try:\n        return 1 <= int((backend_config or {}).get(\"top_k\", 8)) <= 1000\n    except (TypeError, ValueError):\n        return False","typeGuard":"def is_valid_top_k(v: object) -> bool:\n    return isinstance(v, int) and not isinstance(v, bool) and 1 <= v <= 1000","tryCatchPattern":null,"preventionTips":["top_k cannot disable memory — use memory.injection_enabled: false for that","Stay near the default (8) unless evals justify more; 1000 is a hard ceiling"],"tags":["config","mem0","memory","validation","range"],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}