In-Memory Memory Adapter
Zero-dependency recall/save adapter backed by a Map. Records vanish on process
restart.
When to use it
- Local development.
- Vitest / Playwright tests.
- Single-process demos where users don't need persistence.
When NOT to use it
- Production multi-process deployments — every worker has its own
Map; users get inconsistent memory. - Anything that needs survival across restarts.
For production, use redis() (see the tanstack-ai-memory-redis skill).
Setup
import { memoryMiddleware } from '@tanstack/ai-memory'
import { inMemory } from '@tanstack/ai-memory/in-memory'
const memory = inMemory()
// A static scope is fine for dev/tests; derive it from the session in real apps.
memoryMiddleware({
adapter: memory,
scope: { threadId: 'demo-thread', userId: 'alice' },
})
Options
inMemory(options?) accepts:
topK(default 6),minScore(default 0.15),kinds— recall tuning.embedder: { embed(text): Promise<number[]> }— enable semantic scoring (bothrecallandsaveembed through it).extract(turn, scope)— return derived facts to persist alongside the raw turn (e.g. call an LLM to pull out preferences). Without it,savestores the raw user/assistant messages andrecallscores them lexically + by recency.render(hits)— replace the built-in prompt renderer.
Capacity
The adapter scans every record in a scope per recall. Fine up to ~100k records; beyond
that, switch to Redis.