{"record":{"id":"30ca70f67be8845d","repo":"mem0ai/mem0","slug":"filter-value-for-key-r-must-be-str-int-float-30ca70","errorCode":null,"errorMessage":"Filter value for {key!r} must be str, int, float, or bool, got {type(value).__name__}","messagePattern":"Filter value for (.+?) must be str, int, float, or bool, got (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mem0/vector_stores/neptune_analytics.py","lineNumber":26,"sourceCode":"\ntry:\n    from langchain_aws import NeptuneAnalyticsGraph\nexcept ImportError:\n    raise ImportError(\"langchain_aws is not installed. Please install it using pip install langchain_aws\")\n\nfrom mem0.vector_stores.base import VectorStoreBase\n\nlogger = logging.getLogger(__name__)\n\n_SAFE_FILTER_KEY = re.compile(r\"^[a-zA-Z_~][a-zA-Z0-9_]*$\")\n_VALID_IDENTIFIER = re.compile(r\"^[A-Za-z_][A-Za-z0-9_]*$\")\n\n\ndef _validate_filter(key: str, value: Any) -> None:\n    if not isinstance(key, str) or not _SAFE_FILTER_KEY.match(key):\n        raise ValueError(f\"Invalid filter key: {key!r}\")\n    if not isinstance(value, (str, int, float, bool)):\n        raise ValueError(\n            f\"Filter value for {key!r} must be str, int, float, or bool, \"\n            f\"got {type(value).__name__}\"\n        )\n\n\ndef _escape_cypher(value: str) -> str:\n    return value.replace(\"\\\\\", \"\\\\\\\\\").replace(\"'\", \"\\\\'\")\n\nclass OutputData(BaseModel):\n    id: Optional[str]  # memory id\n    score: Optional[float]  # distance\n    payload: Optional[Dict]  # metadata\n\n\nclass NeptuneAnalyticsVector(VectorStoreBase):\n    \"\"\"\n    Neptune Analytics vector store implementation for Mem0.\n    ","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0/vector_stores/neptune_analytics.py#L8-L44","documentation":"Neptune Analytics filter values are interpolated into openCypher literals, so only scalars (str, int, float, bool) are accepted. This error fires when a filter value is a list, dict, None-with-type, or any other object, because such values cannot be rendered as a safe Cypher literal and could enable injection or produce malformed queries.","triggerScenarios":"filters={\"user_id\": [\"a\",\"b\"]} (list, no $in support in this backend), {\"meta\": {\"k\":1}} (dict), or a custom object passed as a value on the Neptune Analytics backend.","commonSituations":"Porting multi-value filters from Qdrant-style backends that accept lists; forwarding untyped JSON payloads as filters; None values that bypass the earlier truthiness handling.","solutions":["Split multi-value filters into one of: run one search per value and merge results client-side","Keep every filter value a scalar; serialize complex values to a string before filtering","Validate the filters dict shape before calling search (see guard below)"],"exampleFix":"// before\nfilters = {\"user_id\": [\"a\", \"b\"]}\n\n// after\nresults = [r for v in [\"a\", \"b\"] for r in store.search(query, vec, top_k, {\"user_id\": v})]","handlingStrategy":"type-guard","validationCode":"def assert_scalar_filters(filters: dict) -> None:\n    bad = [k for k, v in (filters or {}).items() if not isinstance(v, (str, int, float, bool))]\n    if bad:\n        raise TypeError(f\"non-scalar filter values for {bad}\")\n\nassert_scalar_filters(filters)\nstore.search(query, vector, top_k, filters=filters)","typeGuard":"def is_scalar_filters(filters: dict) -> bool:\n    return all(isinstance(v, (str, int, float, bool)) for v in (filters or {}).values())","tryCatchPattern":"try:\n    store.search(q, vec, filters=filters)\nexcept ValueError as e:\n    if \"must be str, int, float, or bool\" in str(e):\n        filters = {k: v for k, v in filters.items() if isinstance(v, (str, int, float, bool))}\n        store.search(q, vec, filters=filters)\n    else:\n        raise","preventionTips":["Fan out multi-value filters into repeated single-value searches","Never pass nested objects as filter values on Neptune","Type the filters parameter in your own API as dict[str, str|int|float|bool]"],"tags":["neptune","aws","cypher-injection","security","filters","validation"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}