{"record":{"id":"04fcc37d367f03b6","repo":"bytedance/deer-flow","slug":"mem0-timeout-seconds-must-be-positive","errorCode":null,"errorMessage":"mem0 timeout_seconds must be positive","messagePattern":"mem0 timeout_seconds must be positive","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py","lineNumber":109,"sourceCode":"            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\")\n        return key\n","sourceCodeStart":91,"sourceCodeEnd":125,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py#L91-L125","documentation":"Raised by Mem0Config.from_backend_config when memory.backend_config.timeout_seconds is <= 0 after float() coercion. The value is the per-request HTTP timeout passed to the mem0 client (default 10.0); zero or negative would make every request fail immediately rather than mean 'no timeout', so it is rejected.","triggerScenarios":"timeout_seconds: 0 (sometimes written intending 'wait forever'), a negative value, or a units mistake like timeout_seconds: 10000 (milliseconds — accepted but absurd, 0 is the rejected case).","commonSituations":"Believing 0 means unlimited as in some HTTP libraries; misconfigured templates emitting 0; copying a millisecond value from another tool's config.","solutions":["Set a positive value in seconds (default 10.0; raise to 15-30 for slow memory endpoints)","There is no 'infinite timeout' option — pick the largest realistic bound (e.g. 60)","Verify the units are seconds, not milliseconds"],"exampleFix":"# before (config.yaml)\nmemory:\n  backend_config:\n    timeout_seconds: 0   # rejected\n\n# after\nmemory:\n  backend_config:\n    timeout_seconds: 15","handlingStrategy":"validation","validationCode":"def timeout_ok(backend_config: dict) -> bool:\n    try:\n        return float((backend_config or {}).get(\"timeout_seconds\", 10.0)) > 0\n    except (TypeError, ValueError):\n        return False","typeGuard":"def is_positive_timeout(v: object) -> bool:\n    return isinstance(v, (int, float)) and not isinstance(v, bool) and v > 0","tryCatchPattern":null,"preventionTips":["Units are seconds; there is no 0 = unlimited semantics here","Set the timeout from measured p99 latency of the mem0 endpoint, plus headroom"],"tags":["config","mem0","memory","validation","timeout"],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}