FoundationAgents/MetaGPT · error · ValueError
In BM25RetrieverConfig, Objs must not be empty.
Error message
In BM25RetrieverConfig, Objs must not be empty.
What it means
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.
Source
Thrown at metagpt/rag/engines/simple.py:161
llm: LLM = None,
retriever_configs: list[BaseRetrieverConfig] = None,
ranker_configs: list[BaseRankerConfig] = None,
) -> "SimpleEngine":
"""From objs.
Args:
objs: List of RAGObject.
transformations: Parse documents to nodes. Default [SentenceSplitter].
embed_model: Parse nodes to embedding. Must supported by llama index. Default OpenAIEmbedding.
llm: Must supported by llama index. Default OpenAI.
retriever_configs: Configuration for retrievers. If more than one config, will use SimpleHybridRetriever.
ranker_configs: Configuration for rankers.
"""
objs = objs or []
retriever_configs = retriever_configs or []
if not objs and any(isinstance(config, BM25RetrieverConfig) for config in retriever_configs):
raise ValueError("In BM25RetrieverConfig, Objs must not be empty.")
nodes = cls.get_obj_nodes(objs)
return cls._from_nodes(
nodes=nodes,
transformations=transformations,
embed_model=embed_model,
llm=llm,
retriever_configs=retriever_configs,
ranker_configs=ranker_configs,
)
@classmethod
def from_index(
cls,
index_config: BaseIndexConfig,
embed_model: BaseEmbedding = None,
llm: LLM = None,View on GitHub (pinned to 11cdf466d0)
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.
Example fix
# before engine = SimpleEngine.from_objs(objs=[], retriever_configs=[BM25RetrieverConfig()]) # after engine = SimpleEngine.from_objs(objs=documents, retriever_configs=[BM25RetrieverConfig()])
Defensive patterns
Strategy: validation
Validate before calling
from metagpt.rag.retrievers.bm25_retriever import BM25RetrieverConfig
if not objs and any(isinstance(c, BM25RetrieverConfig) for c in retriever_configs):
retriever_configs = [c for c in retriever_configs if not isinstance(c, BM25RetrieverConfig)]
# or: assert objs, "BM25 requires objects" Try / catch
try:
engine = SimpleEngine.from_objs(objs=objs, retriever_configs=retriever_configs)
except ValueError as e:
if "Objs must not be empty" in str(e):
engine = SimpleEngine.from_objs(objs=load_objects(), retriever_configs=retriever_configs)
else:
raise Prevention
- Ensure object loaders return data before building BM25 engines
- Strip BM25RetrieverConfig when no runtime objects are available
- Use from_input for file-based corpora
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- Must have at least one retriever of type {required_type.__na
- The retriever is not of type {required_type.__name__}: {type
- Must provide either `input_dir` or `input_files`.
- Unsupported file types: {[str(i) for i in excludes]}
- "{str(file_or_path)}" not exists
AI-assisted analysis of FoundationAgents/MetaGPT@11cdf466d0 (2026-08-14).
Data as JSON: /api/errors/34c0bb38c22dbbca.
Report an issue: GitHub.