{"record":{"id":"6f084763be4b7341","repo":"langchain-ai/langchain","slug":"received-disallowed-comparator-func-allowed-com","errorCode":null,"errorMessage":"Received disallowed comparator {func}. Allowed comparators are {self.allowed_comparators}","messagePattern":"Received disallowed comparator (.+?)\\. Allowed comparators are (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"libs/core/langchain_core/structured_query.py","lineNumber":44,"sourceCode":"            isinstance(func, Operator)\n            and self.allowed_operators is not None\n            and func not in self.allowed_operators\n        ):\n            msg = (\n                f\"Received disallowed operator {func}. Allowed \"\n                f\"comparators are {self.allowed_operators}\"\n            )\n            raise ValueError(msg)\n        if (\n            isinstance(func, Comparator)\n            and self.allowed_comparators is not None\n            and func not in self.allowed_comparators\n        ):\n            msg = (\n                f\"Received disallowed comparator {func}. Allowed \"\n                f\"comparators are {self.allowed_comparators}\"\n            )\n            raise ValueError(msg)\n\n    @abstractmethod\n    def visit_operation(self, operation: Operation) -> Any:\n        \"\"\"Translate an Operation.\n\n        Args:\n            operation: Operation to translate.\n        \"\"\"\n\n    @abstractmethod\n    def visit_comparison(self, comparison: Comparison) -> Any:\n        \"\"\"Translate a Comparison.\n\n        Args:\n            comparison: Comparison to translate.\n        \"\"\"\n\n    @abstractmethod","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/langchain-ai/langchain/blob/e32fa9a52eab3b61ad7a45399bfde59b3e580fc4/libs/core/langchain_core/structured_query.py#L26-L62","documentation":"The comparator half of the structured-query translator validation: a `Comparison` node using a comparator (e.g. `LIKE`, `CONTAINS`, `GT`) that is not in the translator's `allowed_comparators` raises this ValueError during `visit_comparison`. Vector-store translators declare which comparators their search API can express, and anything outside that set is rejected.","triggerScenarios":"A self-query retriever's LLM emits a `like`/`between` filter against a vector store whose translator only allows `eq`/`ne`/`lt`/`lte`/`gt`/`gte`; calling `visitor.visit_comparison(Comparison('like', 'title', 'foo'))` on a translator without `LIKE` in `allowed_comparators`.","commonSituations":"`SelfQueryRetriever` on stores with limited comparator support (the LLM happily generates 'like' because the schema mentions text fields); migrating a filter pipeline between backends with different comparator sets; custom metadata field descriptions inducing unsupported comparisons.","solutions":["Look up `allowed_comparators` on the store's translator and restrict the self-query prompt or metadata info so the LLM only emits supported comparators.","Rewrite the filter using allowed comparators (e.g. `like` → `contains` if supported, or drop the predicate and post-filter in Python).","For custom translators, add the comparator to `allowed_comparators` and implement its translation in `visit_comparison`."],"exampleFix":"# before\nComparison('like', 'title', '%report%')  # translator lacks Comparator.LIKE\n# after\nComparison('eq', 'doc_type', 'report')  # use a comparator the store supports","handlingStrategy":"validation","validationCode":"allowed = set(translator.allowed_comparators or [])\ncomps = collect_comparisons(filter_expr)\nunsupported = comps - allowed\nif unsupported:\n    filter_expr = rewrite_comparisons(filter_expr, allowed)","typeGuard":"def comparator_allowed(translator, comp) -> bool:\n    return translator.allowed_comparators is None or comp in translator.allowed_comparators","tryCatchPattern":"try:\n    out = translator.visit_comparison(comp_node)\nexcept ValueError as e:\n    if 'disallowed comparator' in str(e):\n        out = None  # drop predicate, post-filter results in Python instead\n    else:\n        raise","preventionTips":["Check allowed_comparators for your vector store before using self-query.","Keep metadata descriptions from inviting unsupported comparisons ('text like...').","Fall back to Python-side filtering for unsupported predicates."],"tags":["structured-query","self-query-retriever","comparator","vector-store"],"backgroundTag":null,"analyzedSha":"e32fa9a52eab3b61ad7a45399bfde59b3e580fc4","analyzedAt":"2026-08-14T18:42:09.092Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}