jeevesagent.memory.redis¶
Redis-backed Memory.
Two flavours, picked at construction time:
vector mode (default when RediSearch is available) — episodes are stored as Redis hashes; a RediSearch
FT.CREATEindex withHNSWprovides cosine-similarity recall.brute-force mode (when RediSearch isn’t available, e.g. plain Redis) — episodes still go to hashes but recall scans every episode in process. Fine for small corpora; switch to the vector mode (RedisStack) for production scale.
Both modes use the redis.asyncio client. Working blocks live in
process memory; the redundancy of putting them in Redis isn’t worth
the extra round-trip for the small payloads we have.
Attributes¶
Classes¶
Redis-backed |
Module Contents¶
- class jeevesagent.memory.redis.RedisMemory(client: Any, *, embedder: jeevesagent.core.protocols.Embedder | None = None, key_prefix: str = DEFAULT_KEY_PREFIX, index_name: str = DEFAULT_INDEX_NAME, use_vector_index: bool = True, fact_store: Any | None = None)[source]¶
Redis-backed
Memory. Useconnect()to construct.- classmethod connect(url: str = 'redis://localhost:6379/0', *, embedder: jeevesagent.core.protocols.Embedder | None = None, key_prefix: str = DEFAULT_KEY_PREFIX, index_name: str = DEFAULT_INDEX_NAME, use_vector_index: bool = True, with_facts: bool = False, fact_key_prefix: str = 'jeeves:fact:') RedisMemory[source]¶
- Async:
Open an async Redis connection.
with_facts=Trueattaches aRedisFactStoresharing the same client; facts go to{fact_key_prefix}*keys so they don’t collide with episode keys.
- async ensure_index() None[source]¶
Create the RediSearch HNSW index, if not already present.
Skipped silently when
use_vector_index=Falseor when RediSearch isn’t available on the server.
- async recall(query: str, *, kind: str = 'episodic', limit: int = 5, time_range: tuple[datetime.datetime, datetime.datetime] | None = None, user_id: str | None = None) list[jeevesagent.core.types.Episode][source]¶
- async recall_facts(query: str, *, limit: int = 5, valid_at: datetime.datetime | None = None, user_id: str | None = None) list[jeevesagent.core.types.Fact][source]¶
- async remember(episode: jeevesagent.core.types.Episode) str[source]¶
- async session_messages(session_id: str, *, user_id: str | None = None, limit: int = 20) list[jeevesagent.core.types.Message][source]¶
- async working() list[jeevesagent.core.types.MemoryBlock][source]¶
- jeevesagent.memory.redis.DEFAULT_INDEX_NAME = 'jeeves_idx'¶
- jeevesagent.memory.redis.DEFAULT_KEY_PREFIX = 'jeeves:episode:'¶