add() reports only stored memories
add() stops reporting memories the vector store never saved
If you run mem0 open source, the first fix in 2.2.1 is in add. Say add extracts three memories, and the vector store rejects the one about a penicillin allergy. Version 2.2.0 still returned all three as added, and wrote all three to history. Now only records that were actually inserted get a history entry, entity links, and a place in the results.
with Memory() works again
Memory and AsyncMemory work as context managers again
with Memory() as m:
...
async with AsyncMemory() as m:
...
The second core fix brings back a pattern some of you were already using. You can open a Memory in a with block again, and an AsyncMemory in an async with block. When the block ends, the instance is closed for you. Errors raised inside the block still reach your code.
Bedrock reads the text block
Claude reasoning models on AWS Bedrock stop failing with KeyError
"content": [
{"reasoningContent": {
"reasoningText": {"text": "step by step..."}}},
{"text": "final answer"}
]
On AWS Bedrock, a Claude reasoning model can answer with a reasoning block first and the text block second. The Anthropic path always read the first block, so these calls failed with a KeyError. It now returns the first block that carries text. An empty content list returns an empty string.
Turbopuffer applies every filter operator
Turbopuffer filters now apply all eight operators
Turbopuffer users get two fixes. The first is filters. The store only read greater than or equal, and less than or equal. Every other operator was dropped silently, so a not equal or an in filter came back unfiltered. Now all eight apply: equal, not equal, greater than, less than, the two inclusive ones, in, and not in.
Euclidean scores stay between 0 and 1
Euclidean search scores on Turbopuffer and S3 Vectors stay between 0 and 1
| Distance | Turbopuffer 2.2.01 − d | S3 Vectors 2.2.0max(0, 1 − d) | Both in 2.2.11 / (1 + d) |
|---|---|---|---|
| 0.5 | 0.5 | 0.5 | 0.67 |
| 2 | −1 | 0 | 0.33 |
| 4 | −3 | 0 | 0.2 |
Worked example from the formulas. Applies to euclidean_squared on Turbopuffer and euclidean on S3 Vectors; cosine scores are unchanged.
The second fix is search scores. Turbopuffer and S3 Vectors both turned a distance into a score as one minus the distance, which only works for cosine. With euclidean distances, Turbopuffer scores went negative past a distance of 1 and inverted ranking, and S3 Vectors collapsed most scores to zero. Both now use one over one plus the distance, which stays between zero and one.
Two calls can now raise
Two calls now raise errors instead of carrying on
Two of these fixes can raise an error where your code used to carry on. If the vector store rejects every extracted memory, add now raises a VectorStoreError instead of returning memories that were never stored. Your messages are still saved for a retry. And a Turbopuffer filter with an unsupported operator raises a value error.
Upgrade to 2.2.1
Upgrade to mem0ai 2.2.1, and catch VectorStoreError around add()
Upgrading is one command. Install mem0ai 2.2.1 from pip. Before you upgrade, check any code that assumes add always returns, and wrap it to catch the new error. After that, add stops reporting memories the vector store never saved.







