headroomlabs-ai/headroom · error · ValueError

Failed to update memory: {e}

Error message

Failed to update memory: {e}

What it means

ValueError raised by Mem0SystemAdapter.update_memory() when the wrapped client.update(...) call (asyncio.to_thread) throws after all pre-checks passed (memory exists, ownership verified). The original exception is chained, so the '{e}' text is the real mem0/client error.

Source

Thrown at headroom/memory/backends/mem0_system_adapter.py:280

        if user_id and existing_user_id and existing_user_id != user_id:
            raise ValueError("Cannot update memories belonging to other users")

        # Build update metadata
        now = _utcnow()
        update_metadata: dict[str, Any] = {}
        if reason:
            update_metadata["update_reason"] = reason
            update_metadata["updated_at"] = now.isoformat()

        # Update via Mem0
        try:
            await asyncio.to_thread(
                client.update,
                memory_id=memory_id,
                data=new_content,
            )
        except Exception as e:
            raise ValueError(f"Failed to update memory: {e}") from e

        # Fetch the updated memory
        try:
            updated_data = await asyncio.to_thread(client.get, memory_id=memory_id)
        except Exception:
            updated_data = None

        if updated_data:
            return Memory(
                id=memory_id,
                content=updated_data.get("memory", new_content),
                user_id=updated_data.get("user_id", existing_user_id),
                importance=0.5,  # Mem0 doesn't store importance
                created_at=now,
                valid_from=now,
            )
        else:
            # Return a constructed memory object

View on GitHub (pinned to 322425c43b)

Solutions

  1. Inspect the embedded '{e}' message to identify the underlying failure
  2. Retry the update once for transient backend/network errors — the memory was verified to exist right before
  3. Check backend service health and collection state if errors persist
  4. Reinstall 'headroom-ai[memory-stack]' to realign mem0 version with the adapter's expectations

Example fix

# before
await adapter.update_memory(mem_id, 'new text')  # ValueError: Failed to update memory: connection refused

# after
for attempt in range(3):
    try:
        await adapter.update_memory(mem_id, 'new text')
        break
    except ValueError as e:
        if attempt == 2 or 'connection' not in str(e):
            raise
Defensive patterns

Strategy: retry

Validate before calling

# pre-verify backend reachability to catch connection issues early
client = await adapter._backend._ensure_client()
existing = await asyncio.to_thread(client.get, memory_id=memory_id)
assert existing, 'memory must exist before update'

Try / catch

async def safe_update(adapter, memory_id, content, retries=2):
    for attempt in range(retries + 1):
        try:
            return await adapter.update_memory(memory_id, content)
        except ValueError as e:
            transient = any(k in str(e) for k in ('timeout', 'connection', 'temporarily'))
            if attempt == retries or not transient:
                raise
            await asyncio.sleep(2 ** attempt)

Prevention

When it happens

Trigger: client.update(memory_id, data) failing at the mem0 layer: transient Qdrant/network errors, collection schema drift, or mem0 API changes — reached only when the earlier client.get succeeded.

Common situations: Qdrant restarting mid-update; mem0 package upgraded with incompatible update() semantics; oversized new_content rejected by the backend.

Related errors


AI-assisted analysis of headroomlabs-ai/headroom@322425c43b (2026-08-15). Data as JSON: /api/errors/6f100fb3f2fd5622. Report an issue: GitHub.