{"record":{"id":"13619aa0399d9837","repo":"bytedance/deer-flow","slug":"mem0-score-threshold-must-be-in-0-1","errorCode":null,"errorMessage":"mem0 score_threshold must be in [0, 1]","messagePattern":"mem0 score_threshold must be in \\[0, 1\\]","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py","lineNumber":105,"sourceCode":"            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()\n        if not key:\n            raise ValueError(f\"mem0 API key missing: environment variable {self.api_key_env} is unset or empty\")","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py#L87-L123","documentation":"Raised by Mem0Config.from_backend_config when memory.backend_config.score_threshold is outside [0.0, 1.0] after float() coercion. The value maps to mem0's relevance threshold for search() results — memories scoring below it are filtered out — so it must be a probability-style fraction.","triggerScenarios":"score_threshold: 10, score_threshold: -0.1, or score_threshold: 85 (using a 0-100 percent scale) in backend_config.","commonSituations":"Coming from systems where thresholds are expressed as percentages (0-100); copy-paste of a confidence value from another tool; sign typos.","solutions":["Express the threshold as a 0..1 fraction (default 0.1; e.g. 0.85 for 85%)","Raise it to reduce noisy memories, lower it toward 0.0 to admit more results","Divide any percent-style value by 100 before writing it into config"],"exampleFix":"# before (config.yaml)\nmemory:\n  backend_config:\n    score_threshold: 85   # percent scale -> out of range\n\n# after\nmemory:\n  backend_config:\n    score_threshold: 0.85","handlingStrategy":"validation","validationCode":"def score_threshold_ok(backend_config: dict) -> bool:\n    try:\n        return 0.0 <= float((backend_config or {}).get(\"score_threshold\", 0.1)) <= 1.0\n    except (TypeError, ValueError):\n        return False","typeGuard":"def is_valid_score_threshold(v: object) -> bool:\n    return isinstance(v, (int, float)) and not isinstance(v, bool) and 0.0 <= v <= 1.0","tryCatchPattern":null,"preventionTips":["Always write the threshold as a 0..1 fraction — percent scales from other tools are the usual cause","Convert percent values by dividing by 100 before writing config"],"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"}