FoundationAgents/MetaGPT · error · ValueError

Missing query bundle in extra info.

Error message

Missing query bundle in extra info.

What it means

ObjectSortPostprocessor._postprocess_nodes requires a QueryBundle because it sorts nodes independently of query similarity; llama-index calls postprocessors with query_bundle derived from the query string. If retrieval is invoked without a query (e.g. retrieval from an explicit node list, or a custom pipeline that passes query_bundle=None), this ValueError fires.

Source

Thrown at metagpt/rag/rankers/object_ranker.py:35

    Assumes nodes is list of ObjectNode with score.
    """

    field_name: str = Field(..., description="field name of the object, field's value must can be compared.")
    order: Literal["desc", "asc"] = Field(default="desc", description="the direction of order.")
    top_n: int = 5

    @classmethod
    def class_name(cls) -> str:
        return "ObjectSortPostprocessor"

    def _postprocess_nodes(
        self,
        nodes: list[NodeWithScore],
        query_bundle: Optional[QueryBundle] = None,
    ) -> list[NodeWithScore]:
        """Postprocess nodes."""
        if query_bundle is None:
            raise ValueError("Missing query bundle in extra info.")

        if not nodes:
            return []

        self._check_metadata(nodes[0].node)

        sort_key = lambda node: json.loads(node.node.metadata["obj_json"])[self.field_name]
        return self._get_sort_func()(self.top_n, nodes, key=sort_key)

    def _check_metadata(self, node: ObjectNode):
        try:
            obj_dict = json.loads(node.metadata.get("obj_json"))
        except Exception as e:
            raise ValueError(f"Invalid object json in metadata: {node.metadata}, error: {e}")

        if self.field_name not in obj_dict:
            raise ValueError(f"Field '{self.field_name}' not found in object: {obj_dict}")

View on GitHub (pinned to 11cdf466d0)

Solutions

  1. Always call retriever.retrieve("your query text") or query_engine.query(...) so a QueryBundle is built and passed through
  2. If driving the postprocessor manually, construct QueryBundle(query_str) and pass it as query_bundle
  3. Guard custom pipelines: skip or no-op the object ranker when no query string is available

Example fix

// before
nodes = retriever.retrieve(None)  # ValueError inside ObjectSortPostprocessor

// after
from llama_index.core import QueryBundle
nodes = retriever.retrieve("sort products by price")
Defensive patterns

Strategy: validation

Validate before calling

if not query_str:
    raise ValueError("a non-empty query string is required when the object ranker is in the pipeline")
nodes = retriever.retrieve(query_str)

Try / catch

try:
    nodes = retriever.retrieve(query)
except ValueError as e:
    if "Missing query bundle" in str(e):
        from llama_index.core import QueryBundle
        nodes = ranker.postprocess_nodes(retriever.retrieve_nodes_for_query(QueryBundle(query)), query_bundle=Bundle(query))
    raise

Prevention

When it happens

Trigger: Retriever.retrieve(...) called with no query argument so llama-index forwards query_bundle=None into the postprocessor; integrating ObjectSortPostprocessor into a query engine that was constructed without a query transformer that produces a QueryBundle.

Common situations: Using the object ranker in a custom llama-index pipeline or retriever that calls _postprocess_nodes directly; calling retriever.retrieve() with empty/None query during testing; embedding-only retrieval flows that skip query construction.

Related errors


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