{"record":{"id":"06a6c609df7d0e1d","repo":"mem0ai/mem0","slug":"filter-value-for-key-r-must-be-str-int-float-06a6c6","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/upstash_vector.py","lineNumber":24,"sourceCode":"\nfrom mem0.vector_stores.base import VectorStoreBase\n\ntry:\n    from upstash_vector import Index\nexcept ImportError:\n    raise ImportError(\"The 'upstash_vector' library is required. Please install it using 'pip install upstash_vector'.\")\n\n\nlogger = logging.getLogger(__name__)\n\n_SAFE_FILTER_KEY = re.compile(r\"[a-zA-Z_][a-zA-Z0-9_]*\\Z\")\n\n\ndef _validate_filter(key: str, value: Any) -> None:\n    if not isinstance(key, str) or not _SAFE_FILTER_KEY.fullmatch(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    if isinstance(value, str) and ('\"' in value or \"\\\\\" in value):\n        raise ValueError(\n            f\"Filter value for {key!r} contains prohibited characters \"\n            f\"(double quote or backslash): {value!r}\"\n        )\n\n\nclass OutputData(BaseModel):\n    id: Optional[str]  # memory id\n    score: Optional[float]  # is None for `get` method\n    payload: Optional[Dict]  # metadata\n\n\nclass UpstashVector(VectorStoreBase):\n    def __init__(","sourceCodeStart":6,"sourceCodeEnd":42,"githubUrl":"https://github.com/mem0ai/mem0/blob/001c235229be8795e3834520467bd0d661ed8f34/mem0/vector_stores/upstash_vector.py#L6-L42","documentation":"Raised by `_validate_filter` when a filter value's type is not one of str, int, float, bool. Because the filter is serialized into a query string (same injection concern as the key check), composite types — dict, list, None — are rejected outright; there is no JSON-encoding escape hatch. Note bool passes because it subclasses int.","triggerScenarios":"Filters like `{\"user_id\": [\"u1\", \"u2\"]}` (list for an IN), `{\"meta\": {\"a\": 1}}` (nested dict), or `{\"flag\": None}` — all unsupported value shapes for Upstash.","commonSituations":"Assuming list values give OR semantics like other mem0 backends (Qdrant treats a list as match-any); passing optional fields that default to None; reusing filter dicts written for a different vector store backend.","solutions":["Replace list values with multiple searches or precomputed membership: store a scalar field (e.g. set membership flattened into separate boolean/scalar keys) or query per value and merge results.","Drop None-valued keys before filtering: `{k: v for k, v in filters.items() if v is not None}`.","Flatten nested dicts into dotless top-level scalar fields at insert time."],"exampleFix":"# before\nfilters = {\"user_id\": [\"u1\", \"u2\"], \"run_id\": None}\n\n# after\nfilters = {\"user_id\": \"u1\"}  # one value per query; loop and merge for multiple\nresults = [r for uid in (\"u1\", \"u2\") for r in memory.search(\"q\", filters={\"user_id\": uid})]","handlingStrategy":"type-guard","validationCode":"def validate_filter_values(filters: dict) -> None:\n    for k, v in filters.items():\n        if not isinstance(v, (str, int, float, bool)):\n            raise ValueError(f\"Filter value for {k!r} must be scalar (str/int/float/bool), got {type(v).__name__}\")","typeGuard":"def is_scalar_filter_value(v) -> bool:\n    return isinstance(v, (str, int, float, bool)) and v is not None","tryCatchPattern":"try:\n    results = memory.search(\"q\", filters=filters)\nexcept ValueError as e:\n    if \"must be str, int, float, or bool\" in str(e):\n        raise BadRequest(f\"Scalar filter values only: {filters}\") from e\n    raise","preventionTips":["Never assume list values mean IN on Upstash — they are rejected; loop over values instead.","Strip None-valued keys before filtering.","Flatten nested metadata into scalar fields at insert time."],"tags":["filters","upstash","validation","type-error","vector-store"],"backgroundTag":null,"analyzedSha":"001c235229be8795e3834520467bd0d661ed8f34","analyzedAt":"2026-08-15T01:55:42.685Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}