{"record":{"id":"907cde043d64de2b","repo":"run-llama/llama_index","slug":"invalid-filter-condition-filter-condition","errorCode":null,"errorMessage":"Invalid filter condition: {filter_condition}","messagePattern":"Invalid filter condition: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"llama-index-core/llama_index/core/vector_stores/utils.py","lineNumber":191,"sourceCode":"                )\n            else:\n                filter_matches = _process_filter_match(\n                    operator=filter_.operator,\n                    value=filter_.value,\n                    metadata_value=metadata_value,\n                )\n\n            filter_matches_list.append(filter_matches)\n\n        if filter_condition == FilterCondition.AND:\n            return all(filter_matches_list)\n        if filter_condition == FilterCondition.OR:\n            return any(filter_matches_list)\n        if filter_condition == FilterCondition.NOT:\n            # Match when none of the filters match.\n            return not any(filter_matches_list)\n\n        raise ValueError(f\"Invalid filter condition: {filter_condition}\")\n\n    return filter_fn\n\n\n# TODO: Deprecated conversion functions\ndef legacy_metadata_dict_to_node(\n    metadata: dict, text_key: str = DEFAULT_TEXT_KEY\n) -> Tuple[dict, dict, dict]:\n    \"\"\"Common logic for loading Node data from metadata dict.\"\"\"\n    # make a copy first\n    if metadata is None:\n        metadata = {}\n    else:\n        metadata = metadata.copy()\n\n    # load node_info from json string\n    node_info_str = metadata.pop(\"node_info\", \"\")\n    if node_info_str == \"\":","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/run-llama/llama_index/blob/afd0fef371831f9bda13e5af7167cf4e981278ab/llama-index-core/llama_index/core/vector_stores/utils.py#L173-L209","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Pass the enum: `condition=FilterCondition.AND` (from `llama_index.core.vector_stores.types` / `llama_index.core.vector_stores`).","Convert strings explicitly for config-driven code: `FilterCondition(\"and\")` with error handling.","Always set a condition explicitly instead of None.","Keep llama-index-core and integration packs version-aligned."],"exampleFix":"# before\nf = MetadataFilters(filters=[...], condition=\"and\")\n\n# after\nfrom llama_index.core.vector_stores import FilterCondition\nf = MetadataFilters(filters=[...], condition=FilterCondition.AND)","handlingStrategy":"type-guard","validationCode":"from llama_index.core.vector_stores import FilterCondition\n\ndef coerce_condition(cond):\n    if isinstance(cond, FilterCondition):\n        return cond\n    try:\n        return FilterCondition(cond)\n    except ValueError:\n        raise ValueError(f\"unknown condition {cond!r}; valid: {[c.value for c in FilterCondition]}\")","typeGuard":"def is_valid_condition(cond) -> bool:\n    from llama_index.core.vector_stores import FilterCondition\n    return isinstance(cond, FilterCondition) and cond in list(FilterCondition)","tryCatchPattern":"try:\n    result = store.query(query)\nexcept ValueError as e:\n    if \"Invalid filter condition\" in str(e):\n        raise ValueError(\"pass FilterCondition.AND/OR/NOT enum, not strings\") from e\n    raise","preventionTips":["Always set condition explicitly with the FilterCondition enum.","Parse condition strings from config via FilterCondition(value).","Add a filter-schema validator for config- or LLM-driven filter construction."],"tags":["metadata-filters","enum","filter-condition","python"],"backgroundTag":null,"analyzedSha":"afd0fef371831f9bda13e5af7167cf4e981278ab","analyzedAt":"2026-08-15T05:42:58.429Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}