{"record":{"id":"34c0bb38c22dbbca","repo":"FoundationAgents/MetaGPT","slug":"in-bm25retrieverconfig-objs-must-not-be-empty","errorCode":null,"errorMessage":"In BM25RetrieverConfig, Objs must not be empty.","messagePattern":"In BM25RetrieverConfig, Objs must not be empty\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"metagpt/rag/engines/simple.py","lineNumber":161,"sourceCode":"        llm: LLM = None,\n        retriever_configs: list[BaseRetrieverConfig] = None,\n        ranker_configs: list[BaseRankerConfig] = None,\n    ) -> \"SimpleEngine\":\n        \"\"\"From objs.\n\n        Args:\n            objs: List of RAGObject.\n            transformations: Parse documents to nodes. Default [SentenceSplitter].\n            embed_model: Parse nodes to embedding. Must supported by llama index. Default OpenAIEmbedding.\n            llm: Must supported by llama index. Default OpenAI.\n            retriever_configs: Configuration for retrievers. If more than one config, will use SimpleHybridRetriever.\n            ranker_configs: Configuration for rankers.\n        \"\"\"\n        objs = objs or []\n        retriever_configs = retriever_configs or []\n\n        if not objs and any(isinstance(config, BM25RetrieverConfig) for config in retriever_configs):\n            raise ValueError(\"In BM25RetrieverConfig, Objs must not be empty.\")\n\n        nodes = cls.get_obj_nodes(objs)\n\n        return cls._from_nodes(\n            nodes=nodes,\n            transformations=transformations,\n            embed_model=embed_model,\n            llm=llm,\n            retriever_configs=retriever_configs,\n            ranker_configs=ranker_configs,\n        )\n\n    @classmethod\n    def from_index(\n        cls,\n        index_config: BaseIndexConfig,\n        embed_model: BaseEmbedding = None,\n        llm: LLM = None,","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/FoundationAgents/MetaGPT/blob/11cdf466d042aece04fc6cfd13b28e1a70341b1f/metagpt/rag/engines/simple.py#L143-L179","documentation":"SimpleEngine.from_objs builds a BM25 index (keyword retrieval) purely from the in-memory objects you pass in — there is no persistence path for BM25 in this factory. If objs is empty while a BM25RetrieverConfig is present in retriever_configs, construction would create a useless empty BM25 index, so MetaGPT raises ValueError up front.","triggerScenarios":"Calling SimpleEngine.from_objs(objs=[] or None, retriever_configs=[BM25RetrieverConfig(...)]) — e.g. loading objects from a store that returned nothing, or copy-pasting hybrid-retriever config into an object-less pipeline.","commonSituations":"Migrating a from_input pipeline to from_objs but keeping the BM25 config, objects loaded from a database/API returning empty results, or first-run pipelines where the object source has not been populated yet.","solutions":["Supply the objects: SimpleEngine.from_objs(objs=my_objects, retriever_configs=[BM25RetrieverConfig()]).","If you have no objects, drop BM25RetrieverConfig from retriever_configs.","For document files instead of Python objects, use SimpleEngine.from_input instead of from_objs.","Check the upstream loader actually returned items before building the engine."],"exampleFix":"# before\nengine = SimpleEngine.from_objs(objs=[], retriever_configs=[BM25RetrieverConfig()])\n\n# after\nengine = SimpleEngine.from_objs(objs=documents, retriever_configs=[BM25RetrieverConfig()])","handlingStrategy":"validation","validationCode":"from metagpt.rag.retrievers.bm25_retriever import BM25RetrieverConfig\n\nif not objs and any(isinstance(c, BM25RetrieverConfig) for c in retriever_configs):\n    retriever_configs = [c for c in retriever_configs if not isinstance(c, BM25RetrieverConfig)]\n    # or: assert objs, \"BM25 requires objects\"","typeGuard":null,"tryCatchPattern":"try:\n    engine = SimpleEngine.from_objs(objs=objs, retriever_configs=retriever_configs)\nexcept ValueError as e:\n    if \"Objs must not be empty\" in str(e):\n        engine = SimpleEngine.from_objs(objs=load_objects(), retriever_configs=retriever_configs)\n    else:\n        raise","preventionTips":["Ensure object loaders return data before building BM25 engines","Strip BM25RetrieverConfig when no runtime objects are available","Use from_input for file-based corpora"],"tags":["rag","bm25","validation","retriever"],"backgroundTag":null,"analyzedSha":"11cdf466d042aece04fc6cfd13b28e1a70341b1f","analyzedAt":"2026-08-14T23:20:02.994Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}