run-llama/llama_index · error · ValueError

Invalid filter condition: {filter_condition}

Error message

Invalid filter condition: {filter_condition}

What it means

The final guard in the filter closure built by `build_metadata_filter_fn`: after evaluating all individual filters, their boolean results are combined according to `filter_condition`, but only FilterCondition.AND, OR, and NOT are implemented. Any other value — typically a raw string like "and", None, or an enum member unknown to this version — falls through to `raise ValueError(f"Invalid filter condition: {filter_condition}")`. As with the operator error, string-instead-of-enum is the most common cause.

Source

Thrown at llama-index-core/llama_index/core/vector_stores/utils.py:191

                )
            else:
                filter_matches = _process_filter_match(
                    operator=filter_.operator,
                    value=filter_.value,
                    metadata_value=metadata_value,
                )

            filter_matches_list.append(filter_matches)

        if filter_condition == FilterCondition.AND:
            return all(filter_matches_list)
        if filter_condition == FilterCondition.OR:
            return any(filter_matches_list)
        if filter_condition == FilterCondition.NOT:
            # Match when none of the filters match.
            return not any(filter_matches_list)

        raise ValueError(f"Invalid filter condition: {filter_condition}")

    return filter_fn


# TODO: Deprecated conversion functions
def legacy_metadata_dict_to_node(
    metadata: dict, text_key: str = DEFAULT_TEXT_KEY
) -> Tuple[dict, dict, dict]:
    """Common logic for loading Node data from metadata dict."""
    # make a copy first
    if metadata is None:
        metadata = {}
    else:
        metadata = metadata.copy()

    # load node_info from json string
    node_info_str = metadata.pop("node_info", "")
    if node_info_str == "":

View on GitHub (pinned to afd0fef371)

Solutions

  1. Pass the enum: `condition=FilterCondition.AND` (from `llama_index.core.vector_stores.types` / `llama_index.core.vector_stores`).
  2. Convert strings explicitly for config-driven code: `FilterCondition("and")` with error handling.
  3. Always set a condition explicitly instead of None.
  4. Keep llama-index-core and integration packs version-aligned.

Example fix

# before
f = MetadataFilters(filters=[...], condition="and")

# after
from llama_index.core.vector_stores import FilterCondition
f = MetadataFilters(filters=[...], condition=FilterCondition.AND)
Defensive patterns

Strategy: type-guard

Validate before calling

from llama_index.core.vector_stores import FilterCondition

def coerce_condition(cond):
    if isinstance(cond, FilterCondition):
        return cond
    try:
        return FilterCondition(cond)
    except ValueError:
        raise ValueError(f"unknown condition {cond!r}; valid: {[c.value for c in FilterCondition]}")

Type guard

def is_valid_condition(cond) -> bool:
    from llama_index.core.vector_stores import FilterCondition
    return isinstance(cond, FilterCondition) and cond in list(FilterCondition)

Try / catch

try:
    result = store.query(query)
except ValueError as e:
    if "Invalid filter condition" in str(e):
        raise ValueError("pass FilterCondition.AND/OR/NOT enum, not strings") from e
    raise

Prevention

When it happens

Trigger: Creating `MetadataFilters(filters=[...], condition="and")` or `condition=None` and running the query against a client-side-filtering store; passing a condition enum from a newer/older llama-index version than the one evaluating it.

Common situations: Config files or LLM tool schemas that supply condition as a string; version skew between llama-index-core and integration packages emitting different FilterCondition members; defaulting condition to None and relying on an implicit AND that this code path does not apply.

Related errors


AI-assisted analysis of run-llama/llama_index@afd0fef371 (2026-08-15). Data as JSON: /api/errors/907cde043d64de2b. Report an issue: GitHub.