Memory
How Daydreams stores and retrieves information, from working memory and logs to persistent memories and episodes.
Overview
Daydreams provides a unified memory system that lets agents remember, recall, and organize information over time. It combines:
- Persistent storage (key–value, vector, and graph)
- Per-context working memory that holds the current session’s logs
- Episodic memory that captures conversation “episodes” for later retrieval and export (see Episodes)
At runtime, agents write logs into working memory (inputs, outputs, actions, etc.). As conversations progress, Daydreams can form episodes and index them for search and analysis.
Storage Layers
The MemorySystem wires together multiple providers and exposes simple APIs:
- Key–Value:
memory.kvfor structured state under string keys. - Vector:
memory.vectorfor similarity search over text (with optional embeddings/metadata). - Graph:
memory.graphfor entities and relationships. - Episodic:
memory.episodesfor creating and retrieving conversation episodes.
Common operations:
// Store a simple text snippet (auto-indexed in vector memory)
await agent.memory.remember("User likes Neapolitan pizza", {
scope: "context", // or "global"
contextId: ctx.id,
type: "preference",
metadata: { salience: 0.8 },
});
// Recall similar content later
const results = await agent.memory.recall("pizza preferences", {
contextId: ctx.id,
topK: 5,
include: { content: true, metadata: true },
});
// Or get just the top match
const best = await agent.memory.recallOne("neapolitan", { contextId: ctx.id });Notes on storage behavior:
- Scoping and keys: when storing strings, Daydreams creates IDs like
memory:context:<contextId>:<timestamp>-<rand>(ormemory:global:...). When passing structured records torememberRecord, you can provide your ownid,namespace, andmetadata. - Metadata: for vector documents, Daydreams stores
scope,contextId,type,timestamp, and any custom metadata you provide. - Search weighting: recall supports salience and recency boosts via
weighting, plus grouping/deduping viagroupByanddedupeBy. - Batch ingest: use
rememberBatch(records, { chunk })for naive chunking of large text.
Working Memory
Working memory is per-context, short‑term state that holds the live log stream:
- Stored under
working-memory:<contextId>in key–value storage. - Automatically created and updated by the agent runtime.
- Useful for prompt construction, short‑term reasoning, and UI inspection.
Structure (arrays of timestamped refs):
inputs,outputs,thoughtscalls(action calls),results(action results)events,steps,runs
Utilities:
getContextWorkingMemory(agent, contextId)andsaveContextWorkingMemory(...)to read/write the whole structure.getWorkingMemoryLogs(memory, includeThoughts?)to get sorted logs used for prompts.getWorkingMemoryAllLogs(memory, includeThoughts?)to includesteps/runsas well.
Summarization hooks and pruning policies can be layered on top via a MemoryManager (e.g., compress long histories, keep the most recent N inputs/outputs, etc.).
Logs
Each entry in working memory is a strongly typed “ref” with ref, id, timestamp, and relevant fields:
input: inbound messages/events captured by inputsoutput: agent responses produced by outputsthought: internal reasoning tracesaction_callandaction_result: tool invocations and their resultsevent: domain eventsstepandrun: orchestration milestones
These references are pushed in order and can be formatted for display or prompt inclusion. You generally won’t push them manually—agent execution collects and stores them as it runs.
Episodes
Episodes are coherent spans of interaction (e.g., “user asks X → agent reasons → calls tools → replies”). Daydreams can collect logs into an episode, generate a summary, and persist it.
Key points:
- Creation: episodes are formed from working-memory logs via default heuristics or custom hooks (
EpisodeHooks) for when to start/end and how to summarize. - Storage: episodes are saved in key–value storage and indexed into vector memory for retrieval. By default, Daydreams indexes the summary and (optionally chunked) conversation logs under
namespace = episodes:<contextId>. - Retrieval: use
memory.episodes.get(id),getByContext(contextId), andfindSimilar(contextId, query). - Export: export episodes to JSON/JSONL or Markdown via the export manager.
Learn more:
- Conceptual: Episodes
- Conceptual: Episode export and formats
- API: Episodic Memory and Episode Hooks
Housekeeping
Remove old or unwanted data as needed:
// Delete by key pattern, context, or time
await agent.memory.forget({ pattern: "memory:global:*" });
await agent.memory.forget({ context: ctx.id });
await agent.memory.forget({ olderThan: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) });
// Clear episodic data for a context
await agent.memory.episodes.clearContext(ctx.id);That’s the core: working memory for the live run, persistent stores for long‑term recall, and episodes to capture complete interactions you can search and export.