symfonic.memory.layers.episodic¶
episodic ¶
EpisodicLayer -- narrative events and timestamped history.
Wraps a VectorBackend for event storage and similarity-based retrieval. Implements BaseMemoryStore with link as a no-op (episodes are vector-stored).
EpisodicLayer ¶
EpisodicLayer(vector_backend: VectorBackend, embedding_provider: EmbeddingProvider, telemetry_sink: EpisodicTelemetrySink | None = None)
Bases: EpisodicEventsMixin
Episodic memory layer for narrative events and history.
BaseMemoryStore contract
- retrieve: queries events by vector similarity
- write: stores an event with its embedding
- summarize: returns empty string (delegates to compaction engine)
- link: no-op (episodes are vector-stored, not graph-linked)
- delete: removes an event from the vector store
Source code in symfonic/memory/layers/episodic.py
delete
async
¶
link
async
¶
render_for_prompt ¶
render_for_prompt(entry: Any, scrubber: Callable[[dict[str, Any]], dict[str, Any]] | None = None) -> str
Render an episodic entry for MEMORY_CONTEXT.
v7.7: when metadata['speaker'] is present (per-message row
introduced in Phase B), emit [episodic] <speaker>: <content>
so the LLM sees a clean speaker-prefixed line. Pre-v7.7 rows
(no speaker) or rows tagged speaker == 'legacy' fall back
to :func:render_legacy for byte-identical pre-v7.7 output
and prompt-cache parity.
Source code in symfonic/memory/layers/episodic.py
retrieve
async
¶
Retrieve episodic events matching the query.
v7.22 T-7.22.8: emits :class:MultiScopeIgnoredWarning on first
encounter of a scope with inherits_from. Episodic events are
speaker-attributed timestamped records bound to a single
(tenant, sub_tenant) pair; merging inherited scopes would
corrupt per-tenant cost accounting and break GDPR scope
guarantees (v5.5.0 Gate 3).