Skip to main content

tanstack-ai-memory-redis

Use when wiring redis() from @tanstack/ai-memory/redis in production — covers client setup (ioredis or node-redis via fromNodeRedis), the storage model, client-side ranking limits, and troubleshooting.

소스 정보

저장소
TanStack/ai
최근 소스 활동
2026년 9월 9일 06:08
감지된 SKILL.md 언어
영어
스타
3,199
포크
366

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
tanstack-ai-memory-redis
description
Use when wiring redis() from @tanstack/ai-memory/redis in production — covers client setup (ioredis or node-redis via fromNodeRedis), the storage model, client-side ranking limits, and troubleshooting.
# Redis Memory Adapter Production-grade `recall`/`save` adapter backed by plain Redis (no vector index required). Ranks client-side (lexical + optional cosine + recency + importance). ## Setup Bring your own Redis client. `ioredis` wires in directly; `redis` (node-redis v4+) needs a small wrapper. ### Option A: `ioredis` ```ts import Redis from 'ioredis' import { memoryMiddleware } from '@tanstack/ai-memory' import { redis } from '@tanstack/ai-memory/redis' const client = new Redis(process.env.REDIS_URL ?? 'redis://localhost:6379') const memory = redis({ redis: client, prefix: 'myapp:memory' }) // Resolve scope per request from the server-validated session — never from req.body. function memoryFor(session: { userId: string; threadId: string }) { return memoryMiddleware({ adapter: memory, scope: { threadId: session.threadId, userId: session.userId }, }) } ``` ### Option B: `redis` (node-redis v4+) ```ts import { createClient } from 'redis' import { memoryMiddleware } from '@tanstack/ai-memory' import { redis, fromNodeRedis } from '@tanstack/ai-memory/redis' const client = createClient({ url: process.env.REDIS_URL }) await client.connect() const memory = redis({ redis: fromNodeRedis(client), prefix: 'myapp:memory', }) function memoryFor(session: { userId: string; threadId: string }) { return memoryMiddleware({ adapter: memory, scope: { threadId: session.threadId, userId: session.userId }, }) } ``` node-redis exposes a camelCase API (`sAdd`, `mGet`); `fromNodeRedis` translates it to the lowercase `RedisLike` shape. Passing a raw node-redis client without the wrapper throws `client.sadd is not a function`. `redis()` accepts the same `topK` / `minScore` / `kinds` / `embedder` / `extract` options as `inMemory()`. ## Storage model ```text {prefix}:record:{id} -> JSON record {prefix}:index:{tenantId or _}:{userId or _}:{threadId} -> Set<id> ``` `save` writes the record and adds it to the scope's index set; `recall` loads the set, scores, and renders. Scope values are escaped (`:`, `\`, and `_`) so a delimiter or the unset placeholder inside a dim can't collide two scopes. **Hard cut:** there is no dual-read of older index layouts. If you previously wrote under a different shape (e.g. without `tenantId`), reindex or wipe — old keys are orphaned. Always pass the same `tenantId`/`userId`/`threadId` on write and read: missing optional dims become `_`, so omit ≠ "match any". ## Ranking limits Ranking is client-side: `recall` loads every record for the scope into Node and scores it. Fine up to ~10k records per scope. Beyond that, write a vector-index-aware adapter against the same `recall`/`save` contract. ## Troubleshooting - **Records not visible across processes:** ensure every process uses the same `REDIS_URL` and `prefix`. - **Malformed JSON rows:** a row whose JSON won't parse is skipped on read and **left in place** (never deleted) — the signal is a one-time `console.warn` per bad id. Fix or delete the offending `{prefix}:record:{id}` key to remediate.
GitHub에서 보기