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

  1. Supply the objects: SimpleEngine.from_objs(objs=my_objects, retriever_configs=[BM25RetrieverConfig()]).
  2. If you have no objects, drop BM25RetrieverConfig from retriever_configs.
  3. For document files instead of Python objects, use SimpleEngine.from_input instead of from_objs.
  4. 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

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


AI-assisted analysis of FoundationAgents/MetaGPT@11cdf466d0 (2026-08-14). Data as JSON: /api/errors/34c0bb38c22dbbca. Report an issue: GitHub.