bytedance/deer-flow · error · ValueError

mem0 timeout_seconds must be positive

Error message

mem0 timeout_seconds must be positive

What it means

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.

Source

Thrown at backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py:109

            timeout_seconds=float(cfg.get("timeout_seconds", 10.0)),
            startup_policy=str(cfg.get("startup_policy", "fail_fast")),
            read_policy=str(failure_policy.get("read", "fail_open")),
            write_policy=str(failure_policy.get("write", "log_and_drop")),
        )
        if config.startup_policy not in _STARTUP_POLICIES:
            raise ValueError(f"mem0 startup_policy must be one of {sorted(_STARTUP_POLICIES)}")
        if config.read_policy not in _READ_POLICIES:
            raise ValueError(f"mem0 failure_policy.read must be one of {sorted(_READ_POLICIES)}")
        if config.write_policy not in _WRITE_POLICIES:
            raise ValueError(f"mem0 failure_policy.write must be one of {sorted(_WRITE_POLICIES)}")
        if not 1 <= config.top_k <= 1000:
            raise ValueError("mem0 top_k must be in [1, 1000]")
        if not 0.0 <= config.score_threshold <= 1.0:
            raise ValueError("mem0 score_threshold must be in [0, 1]")
        if config.max_injection_chars <= 0:
            raise ValueError("mem0 max_injection_chars must be positive")
        if config.timeout_seconds <= 0:
            raise ValueError("mem0 timeout_seconds must be positive")
        if not config.api_key_env.strip():
            raise ValueError("mem0 api_key_env must be a non-empty env var name")
        parsed_base_url = urlsplit(config.base_url)
        if parsed_base_url.scheme not in {"http", "https"} or not parsed_base_url.netloc:
            raise ValueError("mem0 base_url must be an absolute http:// or https:// URL")
        if parsed_base_url.scheme == "http" and not config.allow_insecure_http:
            raise ValueError("mem0 base_url must use https:// because it carries the API key; set allow_insecure_http: true only for trusted local development")
        return config

    def resolve_api_key(self) -> str:
        """Read the API key from the configured environment variable."""
        key = os.environ.get(self.api_key_env, "").strip()
        if not key:
            raise ValueError(f"mem0 API key missing: environment variable {self.api_key_env} is unset or empty")
        return key

View on GitHub (pinned to 1dd6ba1acb)

Solutions

  1. Set a positive value in seconds (default 10.0; raise to 15-30 for slow memory endpoints)
  2. There is no 'infinite timeout' option — pick the largest realistic bound (e.g. 60)
  3. Verify the units are seconds, not milliseconds

Example fix

# before (config.yaml)
memory:
  backend_config:
    timeout_seconds: 0   # rejected

# after
memory:
  backend_config:
    timeout_seconds: 15
Defensive patterns

Strategy: validation

Validate before calling

def timeout_ok(backend_config: dict) -> bool:
    try:
        return float((backend_config or {}).get("timeout_seconds", 10.0)) > 0
    except (TypeError, ValueError):
        return False

Type guard

def is_positive_timeout(v: object) -> bool:
    return isinstance(v, (int, float)) and not isinstance(v, bool) and v > 0

Prevention

When it happens

Trigger: 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).

Common situations: Believing 0 means unlimited as in some HTTP libraries; misconfigured templates emitting 0; copying a millisecond value from another tool's config.

Understand the failure class

Related errors


AI-assisted analysis of bytedance/deer-flow@1dd6ba1acb (2026-08-14). Data as JSON: /api/errors/04fcc37d367f03b6. Report an issue: GitHub.