jeevesagent.memory.inmemory

Dict-backed memory for tests and tiny demos.

Recall is naive: filter episodes by substring + recency. Production deployments use PostgresMemory (Phase 4) which uses pgvector for semantic search and tracks bi-temporal facts.

Classes

InMemoryMemory

Dict-backed implementation of Memory.

Module Contents

class jeevesagent.memory.inmemory.InMemoryMemory(*, consolidator: jeevesagent.memory.consolidator.Consolidator | None = None, fact_store: jeevesagent.memory.facts.FactStore | None = None, max_users: int | None = _DEFAULT_MAX_USERS, user_idle_ttl_seconds: float | None = _DEFAULT_USER_TTL_SECONDS)[source]

Dict-backed implementation of Memory.

Multi-tenant accounting (M10): per-user working-block state is held in a bounded LRU + TTL container so a runaway tenant or one-shot user_id explosion can’t grow the in-process dict without limit. Defaults: max_users=100_000 and user_idle_ttl_seconds=86_400 (24h). Pass None to disable bounding for single-tenant or fixed-tenant deployments. Eviction drops a user’s working blocks; callers needing durable spill-to-disk should use SqliteMemory or a SQL-backed memory instead.

async append_block(name: str, content: str, *, user_id: str | None = None) None[source]
async consolidate() None[source]

Process unconsolidated episodes through the configured Consolidator, appending facts to self.facts.

async export(*, user_id: str | None = None) jeevesagent.core.types.MemoryExport[source]
async forget(*, user_id: str | None = None, session_id: str | None = None, before: datetime.datetime | None = None) int[source]
async profile(*, user_id: str | None = None) jeevesagent.core.types.MemoryProfile[source]
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]

Return user/assistant pairs from prior runs of this session.

Materialises each persisted Episode for the given session_id (within the user_id partition) into a [USER input, ASSISTANT output] pair, ordered oldest-first and capped at limit turns total — i.e. up to limit / 2 Q/A exchanges. Tool-call traces are not replayed; the final assistant text per turn is sufficient context for follow-ups.

snapshot() dict[str, Any][source]
async update_block(name: str, content: str, *, user_id: str | None = None) None[source]
async working(*, user_id: str | None = None) list[jeevesagent.core.types.MemoryBlock][source]
facts: jeevesagent.memory.facts.FactStore