---
name: tanstack-tanstack-ai-memory-in-memory
description: "Use when wiring inMemory() from @tanstack/ai-memory/in-memory — explains setup, options (embedder, extract, topK/minScore), when to pick it (dev/tests/single-process demos), and what NOT to use it for (multi-process or persistent)."
license: "MIT"
metadata:
  decimalai-skill-id: "9c4c6f70-d9bc-4b05-884f-2e4c586cb6c3"
  decimalai-version-id: "3843cfef-4251-4b48-bb59-bc695a580b29"
  decimalai-version: "2"
  decimalai-body-sha256: "0a4740ee84fd184164249eca337730f442025eb7c00ada21704a61ff54f57fc8"
  decimalai-name: "tanstack/tanstack-ai-memory-in-memory"
  decimalai-format: "1"
  decimalai-invocation: "model"
  decimalai-category: "agent-tooling"
  decimalai-source: "https://app.decimal.ai/s/tanstack-tanstack-ai-memory-in-memory@2/SKILL.md"
---
# 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

```ts
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 (both
  `recall` and `save` embed 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, `save` stores the raw
  user/assistant messages and `recall` scores 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.
