mem0ai/mem0 · error · Error
Either memoryId or all is required
Error message
Either memoryId or all is required
What it means
Thrown by the OSS (open-source) provider's delete() when neither a memoryId nor opts.all was given. In OSS mode deletion goes through the local memory provider; deleting nothing is treated as a caller bug and rejected before touching the vector store. This mirrors the platform backend's equivalent guard.
Source
Thrown at integrations/openclaw/providers.ts:622
if (metadata) {
// OSS provider doesn't support metadata-only updates — log warning
console.warn(
"providerToBackend: metadata updates are not supported in OSS mode, only text updates are applied",
);
}
return { id: memoryId, updated: true };
},
async delete(memoryId, opts = {}) {
if (opts.all) {
await provider.deleteAll(opts.userId ?? userId);
return { deleted: "all" };
}
if (memoryId) {
await provider.delete(memoryId);
return { deleted: memoryId };
}
throw new Error("Either memoryId or all is required");
},
async deleteEntities() {
throw new Error("Entity management is only available in platform mode.");
},
async status() {
return { connected: true, backend: "oss" };
},
async entities() {
throw new Error("Entity management is only available in platform mode.");
},
async listEvents() {
throw new Error("Event management is only available in platform mode.");
},
async getEvent() {
throw new Error("Event management is only available in platform mode.");
},
};View on GitHub (pinned to 001c235229)
Solutions
- Pass the memory id from the preceding search/list result: delete(memory.id).
- For flush-all semantics call delete(undefined, { all: true }) — OSS mode forwards to provider.deleteAll(userId).
- Guard upstream: only enable the delete action when an id exists.
Example fix
// before
if (selected) await provider.delete(selected); // selected can be undefined
// after
if (selected) await provider.delete(selected);
else if (confirmDeleteAll) await provider.delete(undefined, { all: true });
else throw new Error('select a memory or confirm delete-all'); Defensive patterns
Strategy: validation
Validate before calling
if (!memoryId && !opts?.all) {
throw new Error('select a memory to delete or pass { all: true }');
}
await provider.delete(memoryId, opts); Prevention
- Resolve ids via search/get_all before offering delete in agent flows.
- Never forward possibly-undefined ids from previous steps into delete().
When it happens
Trigger: Calling delete(undefined, {}) on the OSS provider; an agent tool deleting a memory whose id failed to resolve; passing opts.all = false explicitly while memoryId is empty.
Common situations: Agent flow: search returns no match, code still calls delete with the undefined id; UI delete button wired without a selected row; migrating from platform mode where delete-all had different semantics.
Related errors
- Either memoryId or --all is required
- Unknown LLM provider: ${providerId}
- Unknown embedder provider: ${providerId}
- At least one entity ID is required for deleteEntities.
- ${label} has unknown keys: ${unknown.join(", ")}
AI-assisted analysis of mem0ai/mem0@001c235229 (2026-08-15).
Data as JSON: /api/errors/455f462e300c70ec.
Report an issue: GitHub.