{"record":{"id":"1773688f59c144c8","repo":"headroomlabs-ai/headroom","slug":"unknown-embedder-backend-config-embedder-backend","errorCode":null,"errorMessage":"Unknown embedder backend: {config.embedder_backend}","messagePattern":"Unknown embedder backend: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"headroom/memory/factory.py","lineNumber":217,"sourceCode":"            embedder = OnnxLocalEmbedder()\n\n        elif config.embedder_backend == EmbedderBackend.OPENAI:\n            from headroom.memory.adapters.embedders import OpenAIEmbedder\n\n            embedder = OpenAIEmbedder(\n                api_key=config.openai_api_key,\n                model_name=config.embedder_model,\n            )\n\n        elif config.embedder_backend == EmbedderBackend.OLLAMA:\n            from headroom.memory.adapters.embedders import OllamaEmbedder\n\n            embedder = OllamaEmbedder(\n                base_url=config.ollama_base_url,\n                model_name=config.embedder_model,\n            )\n        else:\n            raise ValueError(f\"Unknown embedder backend: {config.embedder_backend}\")\n\n        _EMBEDDER_CACHE[key] = embedder\n        return embedder\n\n\ndef _reset_embedder_cache_for_tests() -> None:\n    \"\"\"Clear the process-wide embedder cache. Test-only seam.\"\"\"\n\n    with _EMBEDDER_CACHE_LOCK:\n        _EMBEDDER_CACHE.clear()\n\n\ndef _create_vector_index(config: MemoryConfig) -> VectorIndex:\n    \"\"\"Create a vector index backend.\n\n    Args:\n        config: Memory system configuration.\n","sourceCodeStart":199,"sourceCodeEnd":235,"githubUrl":"https://github.com/headroomlabs-ai/headroom/blob/322425c43bffde1ed0b64fecf3cf5951565dd82b/headroom/memory/factory.py#L199-L235","documentation":"`_create_embedder` handles OPENAI and OLLAMA embedder backends explicitly; anything else falls through to a defensive ValueError. Like the store fallback, this normally means config.embedder_backend is not a genuine EmbedderBackend enum member, or the installed headroom version's enum has members this factory branch does not handle.","triggerScenarios":"Passing a string (\"openai\") or a mock object as embedder_backend; a version-skew where the enum gained a member (e.g. ONNX) that the installed factory build does not construct.","commonSituations":"Mixed headroom-ai package versions in one environment; configs deserialized from YAML leaving a plain string; tests stubbing the enum.","solutions":["Set the field to a real enum member: config.embedder_backend = EmbedderBackend.OPENAI (and provide openai_api_key) or EmbedderBackend.OLLAMA","Reinstall headroom with matching versions across extras so enum and factory agree","Coerce deserialized values explicitly with EmbedderBackend(raw) and fail at config-load time"],"exampleFix":"# before\nconfig = MemoryConfig(embedder_backend=\"openai\")\n\n# after\nfrom headroom.memory.config import EmbedderBackend\nconfig = MemoryConfig(embedder_backend=EmbedderBackend.OPENAI,\n                      openai_api_key=os.environ[\"OPENAI_API_KEY\"])","handlingStrategy":"type-guard","validationCode":"from headroom.memory.config import EmbedderBackend\nassert isinstance(config.embedder_backend, EmbedderBackend), \\\n    f\"embedder_backend must be EmbedderBackend, got {config.embedder_backend!r}\"","typeGuard":"def is_embedder_backend(v: object) -> bool:\n    return isinstance(v, EmbedderBackend)","tryCatchPattern":"try:\n    system = await create_memory_system(config)\nexcept ValueError as e:\n    if \"Unknown embedder backend\" in str(e):\n        raise ConfigError(\"embedder_backend not a valid EmbedderBackend\") from e\n    raise","preventionTips":["Never assign strings to enum-typed config fields","Coerce at config boundary: EmbedderBackend(raw) with error mapping","Version-lock headroom packages so enum members match factory support"],"tags":["memory","embeddings","enums","configuration"],"backgroundTag":null,"analyzedSha":"322425c43bffde1ed0b64fecf3cf5951565dd82b","analyzedAt":"2026-08-15T01:03:05.481Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}