{"record":{"id":"dc345d4e552cf613","repo":"deepset-ai/haystack","slug":"conditions-key-missing-in-condition","errorCode":null,"errorMessage":"'conditions' key missing in {condition}","messagePattern":"'conditions' key missing in (.+?)","errorType":"exception","errorClass":"FilterError","httpStatus":null,"severity":"error","filePath":"haystack/utils/filters.py","lineNumber":275,"sourceCode":"    \"!=\": _not_equal,\n    \">\": _greater_than,\n    \">=\": _greater_than_equal,\n    \"<\": _less_than,\n    \"<=\": _less_than_equal,\n    \"in\": _in,\n    \"not in\": _not_in,\n}\n\n\ndef _logic_condition(\n    condition: dict[str, Any], document: Document | ByteStream, strict_datetime_comparison: bool\n) -> bool:\n    if \"operator\" not in condition:\n        msg = f\"'operator' key missing in {condition}\"\n        raise FilterError(msg)\n    if \"conditions\" not in condition:\n        msg = f\"'conditions' key missing in {condition}\"\n        raise FilterError(msg)\n    operator: str = condition[\"operator\"]\n    if operator not in LOGICAL_OPERATORS:\n        msg = f\"Unknown logical operator '{operator}'. Valid operators are: {sorted(LOGICAL_OPERATORS)}\"\n        raise FilterError(msg)\n    conditions: list[dict[str, Any]] = condition[\"conditions\"]\n    return LOGICAL_OPERATORS[operator](\n        document=document, conditions=conditions, strict_datetime_comparison=strict_datetime_comparison\n    )\n\n\ndef _comparison_condition(\n    condition: dict[str, Any], document: Document | ByteStream, strict_datetime_comparison: bool\n) -> bool:\n    if \"field\" not in condition:\n        # 'field' key is only found in comparison dictionaries.\n        # We assume this is a logic dictionary since it's not present.\n        return _logic_condition(\n            condition=condition, document=document, strict_datetime_comparison=strict_datetime_comparison","sourceCodeStart":257,"sourceCodeEnd":293,"githubUrl":"https://github.com/deepset-ai/haystack/blob/e318778c9bf60a1963e3b5f451359655dd696c30/haystack/utils/filters.py#L257-L293","documentation":"A logical filter condition must include a 'conditions' key holding the list of sub-conditions. If 'operator' exists but 'conditions' is missing, _logic_condition raises this FilterError.","triggerScenarios":"Passing {\"operator\": \"AND\"} with no 'conditions' list, or a condition whose sub-conditions were stored under another key name.","commonSituations":"Typos like 'condition' or 'filters' instead of 'conditions'; partially constructed filters; deserialized configs with a wrong schema version.","solutions":["Add a \"conditions\" key containing a list of condition dicts.","Fix key typos (must be exactly 'conditions').","Build filters via the documented schema and validate nested lists before applying."],"exampleFix":"// before\nfilters = {\"operator\": \"AND\", \"condition\": [{\"field\": \"meta.x\", \"operator\": \"==\", \"value\": 1}]}\n// after\nfilters = {\"operator\": \"AND\", \"conditions\": [{\"field\": \"meta.x\", \"operator\": \"==\", \"value\": 1}]}","handlingStrategy":"validation","validationCode":"assert \"conditions\" in condition, f\"logical condition needs 'conditions' list: {condition}\"","typeGuard":"def has_conditions(c: dict) -> bool:\n    return isinstance(c.get(\"conditions\"), list) and len(c[\"conditions\"]) > 0","tryCatchPattern":"try:\n    ok = document_matches_filter(doc, filters)\nexcept FilterError as e:\n    raise ValueError(f\"malformed filter: {e}\") from e","preventionTips":["Spell the key exactly 'conditions' (plural).","Ensure each logical operator is paired with a non-empty conditions list.","Validate nested filter structures recursively."],"tags":["python","filters","schema-validation","haystack"],"backgroundTag":"missing-required-key","analyzedSha":"e318778c9bf60a1963e3b5f451359655dd696c30","analyzedAt":"2026-08-30T11:45:20.711Z","schemaVersion":2},"datasetVersion":"2026-08-30T13:17:10.514Z"}