{"record":{"id":"632cb0df77397541","repo":"bytedance/deer-flow","slug":"mem0-max-injection-chars-must-be-positive","errorCode":null,"errorMessage":"mem0 max_injection_chars must be positive","messagePattern":"mem0 max_injection_chars must be positive","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py","lineNumber":107,"sourceCode":"            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\")\n        return key\n","sourceCodeStart":89,"sourceCodeEnd":125,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py#L89-L125","documentation":"Raised by Mem0Config.from_backend_config when memory.backend_config.max_injection_chars is <= 0 after int() coercion. This is a hard cap on the injection text returned by get_context; memories that do not fit whole are skipped (truncation happens on entry boundaries). Zero or negative would disable injection in an undocumented way, so it is rejected.","triggerScenarios":"max_injection_chars: 0 (attempting to disable injection via the cap), a negative value, or a templated empty default coercing to 0.","commonSituations":"Trying to turn off memory injection by zeroing the budget instead of memory.injection_enabled: false; decreasing the cap aggressively to save tokens and overshooting to 0.","solutions":["Set max_injection_chars to a positive budget (default 12000)","To stop injecting memory text, use memory.injection_enabled: false","If reducing prompt size, pick a small positive value (e.g. 2000) and let whole-entry truncation shed the rest"],"exampleFix":"# before (config.yaml)\nmemory:\n  backend_config:\n    max_injection_chars: 0   # must be positive\n\n# after\nmemory:\n  injection_enabled: false   # or a positive cap:\n  backend_config:\n    max_injection_chars: 4000","handlingStrategy":"validation","validationCode":"def max_injection_chars_ok(backend_config: dict) -> bool:\n    try:\n        return int((backend_config or {}).get(\"max_injection_chars\", 12000)) > 0\n    except (TypeError, ValueError):\n        return False","typeGuard":"def is_positive_int(v: object) -> bool:\n    return isinstance(v, int) and not isinstance(v, bool) and v > 0","tryCatchPattern":null,"preventionTips":["Use memory.injection_enabled: false to disable injection, never a zero budget","Truncation happens on whole-entry boundaries, so small positive budgets degrade gracefully"],"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"}