Probing production surfaced three more inaccuracies:
- the allowlist row listed 'text' and 'keywords_search', which only exist on
the search endpoint, and omitted the get_all-only fields
- the time-field table listed 'eq', which every date field rejects with a 400,
and omitted 'expiration_date' entirely
- the nested AND/OR example filtered categories with a bare string, which the
API rejects with "'categories' value must be a dictionary"
Also scoped the OSS operator claim to the filter layer: Chroma falls back to
equality for contains/icontains and Pinecone maps neither.
These three capabilities exist on MemoryClient but have no OSS equivalent,
and the comparison table did not mention them. Verified absent from
Memory/AsyncMemory. Direct Import is deliberately not added: infer=False
works on OSS too, so it is not a difference.
Addresses review feedback on #6908 and fixes the same claims at their source.
- Flat multi-key v2 filters are implicitly ANDed. Verified against the
production API: an AND/OR/NOT wrapper is needed for OR/NOT semantics and
nested grouping, not merely to combine conditions.
- categories rejects eq and ne. Only in and contains are accepted.
- Platform restricts top-level filter keys to an allowlist and restricts
operators per field, while OSS accepts the full operator set on any
metadata key.
- AsyncMemory.add() raises ValueError, not Mem0ValidationError.
- Any explicit memory_type other than procedural_memory is rejected rather
than stored as an ordinary memory.
- Refresh the stale Memory Types llms.txt description.
nin is OSS-only (mem0/vector_stores/pgvector.py), absent from
docs/openapi.json and docs/platform/features/v2-memory-filters.mdx.
Nested AND/OR/NOT is also not identical: OSS implicitly ANDs flat
top-level filter keys, while Platform requires the explicit wrapper
once more than one condition is combined. Moves both into the
Configuration & data operations comparison table instead of the
shared "What's the same" list.