{"record":{"id":"a84bcc7eb80629d8","repo":"FoundationAgents/MetaGPT","slug":"creator-not-registered-for-key-key","errorCode":null,"errorMessage":"Creator not registered for key: {key}","messagePattern":"Creator not registered for key: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"metagpt/rag/factories/base.py","lineNumber":32,"sourceCode":"        self._creators = creators or {}\n\n    def get_instances(self, keys: list[Any], **kwargs) -> list[Any]:\n        \"\"\"Get instances by keys.\"\"\"\n        return [self.get_instance(key, **kwargs) for key in keys]\n\n    def get_instance(self, key: Any, **kwargs) -> Any:\n        \"\"\"Get instance by key.\n\n        Raise Exception if key not found.\n        \"\"\"\n        creator = self._creators.get(key)\n        if creator:\n            return creator(**kwargs)\n\n        self._raise_for_key(key)\n\n    def _raise_for_key(self, key: Any):\n        raise ValueError(f\"Creator not registered for key: {key}\")\n\n\nclass ConfigBasedFactory(GenericFactory):\n    \"\"\"Designed to get objects based on object type.\"\"\"\n\n    def get_instance(self, key: Any, **kwargs) -> Any:\n        \"\"\"Get instance by the type of key.\n\n        Key is config, such as a pydantic model, call func by the type of key, and the key will be passed to func.\n        Raise Exception if key not found.\n        \"\"\"\n        creator = self._creators.get(type(key))\n        if creator:\n            return creator(key, **kwargs)\n\n        self._raise_for_key(key)\n\n    def _raise_for_key(self, key: Any):","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/FoundationAgents/MetaGPT/blob/11cdf466d042aece04fc6cfd13b28e1a70341b1f/metagpt/rag/factories/base.py#L14-L50","documentation":"GenericFactory.get_instance looks up a creator callable registered under the exact key you pass; if no creator was registered for that key, it delegates to _raise_for_key which throws ValueError('Creator not registered for key: ...'). In the RAG stack this typically means the retriever/ranker/embedding type you requested has no registered constructor in that factory.","triggerScenarios":"Passing a retriever_configs/ranker_configs entry whose type or enum value is not in the factory's registry, e.g. an exotic BaseRetrieverConfig subclass or a typo'd constant, when SimpleEngine builds its retrievers/rankers.","commonSituations":"Custom retriever configs added without registering a corresponding creator, version mismatches where supported types were renamed, or composing configs from llama-index extensions MetaGPT does not know.","solutions":["Use only the config types the factory registers (e.g. VectorIndexRetrieverConfig, BM25RetrieverConfig, RerankRetrieverConfig, LLMRankerConfig).","For custom retrievers, register a creator: factory.register(type(MyConfig), lambda cfg: MyRetriever(cfg)) before building the engine.","Print factory._creators.keys() to see what is actually registered in your environment.","Upgrade metagpt if the type you need was added in a later version."],"exampleFix":"# before\nengine = SimpleEngine.from_input(input_dir='./data', retriever_configs=[MyCustomRetrieverConfig()])\n# ValueError: Creator not registered for key: ...\n\n# after\nfrom metagpt.rag.factories.retriever import get_retriever_factory  # illustrative\nget_retriever_factory().register(MyCustomRetrieverConfig, lambda cfg: MyCustomRetriever(cfg))\nengine = SimpleEngine.from_input(input_dir='./data', retriever_configs=[MyCustomRetrieverConfig()])","handlingStrategy":"validation","validationCode":"def ensure_registered(factory, key):\n    if key not in factory._creators:\n        raise ValueError(\n            f\"{type(key).__name__} not registered; known: {list(map(str, factory._creators))}\"\n        )\n\nfor cfg in retriever_configs + ranker_configs:\n    ensure_registered(factory, cfg)","typeGuard":null,"tryCatchPattern":"try:\n    engine = SimpleEngine.from_input(input_dir=d, retriever_configs=configs, ranker_configs=rankers)\nexcept ValueError as e:\n    if \"Creator not registered\" in str(e):\n        register_custom_configs()  # factory.register(type(cfg), creator)\n        engine = SimpleEngine.from_input(input_dir=d, retriever_configs=configs, ranker_configs=rankers)\n    else:\n        raise","preventionTips":["Register creators for custom configs before building engines","Keep a whitelist of supported retriever/ranker configs in your app","Log factory._creators keys when debugging registration issues"],"tags":["rag","factory-pattern","registry","extensibility"],"backgroundTag":null,"analyzedSha":"11cdf466d042aece04fc6cfd13b28e1a70341b1f","analyzedAt":"2026-08-14T23:20:02.994Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}