{"record":{"id":"7dd5b3bb70f1a59c","repo":"bytedance/deer-flow","slug":"mem0-api-key-env-must-be-a-non-empty-env-var-name","errorCode":null,"errorMessage":"mem0 api_key_env must be a non-empty env var name","messagePattern":"mem0 api_key_env must be a non-empty env var name","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py","lineNumber":111,"sourceCode":"            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":93,"sourceCodeEnd":125,"githubUrl":"https://github.com/bytedance/deer-flow/blob/1dd6ba1acb03700589994b0366c5d1c7d05e2eff/backend/packages/harness/deerflow/agents/memory/backends/mem0/config.py#L93-L125","documentation":"Raised by Mem0Config.from_backend_config when memory.backend_config.api_key_env is empty or whitespace-only after str() coercion. api_key_env names the environment variable that holds the mem0 API key (default MEM0_API_KEY) — the key value itself never appears in config.yaml. An empty name cannot resolve to anything, so it is rejected at parse time.","triggerScenarios":"api_key_env: \"\" or api_key_env: \"   \" in backend_config; a templating step that renders the key name to an empty string; YAML key present with no value (null coerces to 'None' which passes this check but fails later at resolve_api_key).","commonSituations":"Env-driven config templating (Helm values, .env substitution) where the variable holding the env-var NAME is unset; deleting the value while leaving the key; misunderstanding the setting as the key itself and blanking it.","solutions":["Set api_key_env to the real env var name, e.g. api_key_env: MEM0_API_KEY, and export that variable with the key value","Or remove the api_key_env key entirely to use the default MEM0_API_KEY","If config is templated, ensure the template variable for the env var name is set and non-empty"],"exampleFix":"# before (config.yaml)\nmemory:\n  backend_config:\n    api_key_env: \"${MEM0_KEY_ENV_VAR}\"   # unset template var -> empty string\n\n# after\nmemory:\n  backend_config:\n    api_key_env: MEM0_API_KEY","handlingStrategy":"validation","validationCode":"def api_key_env_ok(backend_config: dict) -> bool:\n    return str((backend_config or {}).get(\"api_key_env\", \"MEM0_API_KEY\")).strip() != \"\"","typeGuard":"def is_non_empty_env_name(v: object) -> bool:\n    return isinstance(v, str) and v.strip() != \"\"","tryCatchPattern":null,"preventionTips":["api_key_env holds an env var NAME (default MEM0_API_KEY), not the key value","In templated configs, assert the template variable for the name resolves non-empty before deploy"],"tags":["config","mem0","memory","validation","api-key"],"backgroundTag":null,"analyzedSha":"1dd6ba1acb03700589994b0366c5d1c7d05e2eff","analyzedAt":"2026-08-14T21:20:34.804Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}