pub enum MemoryHandle {
Log(LogMemory),
Vector(Arc<VectorMemory<SharedEmbedder>>),
Reranked {
inner: Box<MemoryHandle>,
reranker: SharedReranker,
},
Custom(Arc<dyn DynMemory>),
}Expand description
The front door to agent memory: remember, recall, improve, forget. Built by
Laser::memory, or Laser::memory_with for an explicit
MemoryBackend. Hold one instance per namespace and reuse it so recall
stays incremental across calls.
Variants§
Log(LogMemory)
The durable stream model: every write publishes to the memory topic, and a deployment materializes it into the versioned key-value read view.
Vector(Arc<VectorMemory<SharedEmbedder>>)
The in-process vector backend, shared so the handle stays cheap to clone while the index lives across calls.
Reranked
Custom(Arc<dyn DynMemory>)
An external durable backend plugged in through
Laser::memory_custom.
Implementations§
Source§impl MemoryHandle
impl MemoryHandle
Sourcepub fn backend(&self) -> &'static str
pub fn backend(&self) -> &'static str
Which backend this handle resolved to: "log" for the durable stream
model (the default), "vector" for the in-process similarity index.
Sourcepub fn vector(embedder: impl Embedder + Sync + 'static) -> Self
pub fn vector(embedder: impl Embedder + Sync + 'static) -> Self
A standalone in-process vector handle over embedder, with no Laser
and no governance. For a governed vector handle use
Laser::memory_with with MemoryBackend::Vector.
Sourcepub fn embedder(self, embedder: impl Embedder + Sync + 'static) -> Self
pub fn embedder(self, embedder: impl Embedder + Sync + 'static) -> Self
Register the embedding seam for similarity recall. It configures the
in-process vector index. The durable log model recalls by recency, so an
embedder on a log handle is unused (build with
memory_with(.., MemoryBackend::Vector) for similarity recall).
Sourcepub fn reranker(self, reranker: impl Reranker + Sync + 'static) -> Self
pub fn reranker(self, reranker: impl Reranker + Sync + 'static) -> Self
Wrap recall with a rerank second stage, exactly as RerankedMemory
does: the backend retrieves, the reranker reorders when the query
carries its semantic text. Composition, not configuration.
Source§impl MemoryHandle
impl MemoryHandle
Sourcepub async fn set(
&self,
key: impl AsRef<str>,
payload: impl Into<Vec<u8>>,
) -> Result<(), LaserError>
pub async fn set( &self, key: impl AsRef<str>, payload: impl Into<Vec<u8>>, ) -> Result<(), LaserError>
The simple altitude: write named point state under your own key.
remember/recall address items by content and relevance.
set/fetch/update/remove address them by name, the working-note
shape (“the current plan”, “the user’s tier”). Every write is a durable
event on the memory topic, like the rest of memory, so a deployment
materializes it and other consumers see it. The in-process vector handle
has no key space and refuses typed.
Sourcepub async fn fetch(
&self,
key: impl AsRef<str>,
) -> Result<Option<Vec<u8>>, LaserError>
pub async fn fetch( &self, key: impl AsRef<str>, ) -> Result<Option<Vec<u8>>, LaserError>
Point-read the named item written by set, or None.
Sourcepub async fn fetch_folded(
&self,
key: impl AsRef<str>,
) -> Result<Option<Vec<u8>>, LaserError>
pub async fn fetch_folded( &self, key: impl AsRef<str>, ) -> Result<Option<Vec<u8>>, LaserError>
Point-read the named item by folding the topic in process, the opt-in path
for a deployment with no managed read view. Prefer fetch,
which reads the materialized key-value view.
Sourcepub async fn update(
&self,
key: impl AsRef<str>,
patch: impl Into<Vec<u8>>,
) -> Result<(), LaserError>
pub async fn update( &self, key: impl AsRef<str>, patch: impl Into<Vec<u8>>, ) -> Result<(), LaserError>
Merge-patch the named item (RFC 7386 over a JSON value): fields in
patch overwrite, null removes. Reads the current value, merges, and
writes the result back as one event. For a whole-value overwrite use
set.
Sourcepub async fn remove(&self, key: impl AsRef<str>) -> Result<(), LaserError>
pub async fn remove(&self, key: impl AsRef<str>) -> Result<(), LaserError>
Delete the named item. Idempotent: removing an absent key is fine.
Sourcepub fn remember(&self, payload: impl Into<Vec<u8>>) -> RememberBuilder<'_>
pub fn remember(&self, payload: impl Into<Vec<u8>>) -> RememberBuilder<'_>
Start a fluent remember. Chain .scope/.agent/.durable/.dedup and
finish with .send().await.
Sourcepub async fn recall_folded(
&self,
scope: &MemoryScope,
query: &MemoryQuery,
) -> Result<Vec<MemoryItem>, LaserError>
pub async fn recall_folded( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>
Recall by folding the topic in process (the opt-in behind
RecallBuilder::folded). The log backend folds, the vector backend is
already in process, and a reranked backend folds its inner then reranks.
Sourcepub fn recall(
&self,
conversation: impl Into<Option<ConversationId>>,
) -> RecallBuilder<'_>
pub fn recall( &self, conversation: impl Into<Option<ConversationId>>, ) -> RecallBuilder<'_>
Start a fluent recall in conversation, or across every conversation
of the namespace with None. Chain .semantic/.limit and finish with
.fetch().await (or await the builder itself).
Sourcepub async fn context(
&self,
conversation: ConversationId,
token_budget: Option<usize>,
) -> Result<String, LaserError>
pub async fn context( &self, conversation: ConversationId, token_budget: Option<usize>, ) -> Result<String, LaserError>
The one-call context altitude: recall conversation’s most relevant
items and render them as one prompt-ready block under an optional token
budget (see to_context_block). The 90% case above the deep
recall builder: assembled, budgeted, ready to prompt.
Sourcepub async fn consolidate(
&self,
scope: &MemoryScope,
max_items: usize,
) -> Result<ConsolidationReport, LaserError>
pub async fn consolidate( &self, scope: &MemoryScope, max_items: usize, ) -> Result<ConsolidationReport, LaserError>
One consolidation pass over scope with the default policy: keep the
newest max_items, prune the rest. For the summarize and invalidation
passes build a DefaultConsolidator with its seams and run it
directly. This is the one-call altitude.
Sourcepub async fn consolidate_with(
&self,
scope: &MemoryScope,
max_items: usize,
summarizer: impl Summarizer + Sync,
prune_summarized: bool,
) -> Result<ConsolidationReport, LaserError>
pub async fn consolidate_with( &self, scope: &MemoryScope, max_items: usize, summarizer: impl Summarizer + Sync, prune_summarized: bool, ) -> Result<ConsolidationReport, LaserError>
consolidate with the summarize pass: the
Message items in scope are first folded through summarizer into one
durable summary per conversation, and prune_summarized forgets the
folded items so the summary replaces them.
Sourcepub async fn improve(
&self,
scope: &MemoryScope,
feedback: Feedback,
) -> Result<MemoryId, LaserError>
pub async fn improve( &self, scope: &MemoryScope, feedback: Feedback, ) -> Result<MemoryId, LaserError>
Record feedback on a recalled item under scope.
Sourcepub async fn forget(
&self,
scope: &MemoryScope,
id: MemoryId,
) -> Result<(), LaserError>
pub async fn forget( &self, scope: &MemoryScope, id: MemoryId, ) -> Result<(), LaserError>
Forget the item id under scope.
Trait Implementations§
Source§impl Memory for MemoryHandle
impl Memory for MemoryHandle
Source§async fn remember(
&self,
scope: &MemoryScope,
payload: Vec<u8>,
) -> Result<MemoryId, LaserError>
async fn remember( &self, scope: &MemoryScope, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>
payload to the memory under scope. The body is opaque bytes,
so encode it with whatever codec you like before calling.Source§async fn append(
&self,
scope: &MemoryScope,
id: MemoryId,
kind: MemoryKind,
payload: Vec<u8>,
) -> Result<MemoryId, LaserError>
async fn append( &self, scope: &MemoryScope, id: MemoryId, kind: MemoryKind, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>
async fn recall( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>
Source§async fn improve(
&self,
scope: &MemoryScope,
feedback: Feedback,
) -> Result<MemoryId, LaserError>
async fn improve( &self, scope: &MemoryScope, feedback: Feedback, ) -> Result<MemoryId, LaserError>
feedback on a recalled item, the log-native signal a ranking
backend folds into future recall. Returns the feedback record’s id.async fn forget( &self, scope: &MemoryScope, id: MemoryId, ) -> Result<(), LaserError>
Source§impl Memory for &MemoryHandle
impl Memory for &MemoryHandle
Source§async fn remember(
&self,
scope: &MemoryScope,
payload: Vec<u8>,
) -> Result<MemoryId, LaserError>
async fn remember( &self, scope: &MemoryScope, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>
payload to the memory under scope. The body is opaque bytes,
so encode it with whatever codec you like before calling.Source§fn append(
&self,
scope: &MemoryScope,
id: MemoryId,
kind: MemoryKind,
payload: Vec<u8>,
) -> impl Future<Output = Result<MemoryId, LaserError>> + Sendwhere
Self: Sync,
fn append(
&self,
scope: &MemoryScope,
id: MemoryId,
kind: MemoryKind,
payload: Vec<u8>,
) -> impl Future<Output = Result<MemoryId, LaserError>> + Sendwhere
Self: Sync,
async fn recall( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>
Source§async fn improve(
&self,
scope: &MemoryScope,
feedback: Feedback,
) -> Result<MemoryId, LaserError>
async fn improve( &self, scope: &MemoryScope, feedback: Feedback, ) -> Result<MemoryId, LaserError>
feedback on a recalled item, the log-native signal a ranking
backend folds into future recall. Returns the feedback record’s id.async fn forget( &self, scope: &MemoryScope, id: MemoryId, ) -> Result<(), LaserError>
Auto Trait Implementations§
impl !Freeze for MemoryHandle
impl !RefUnwindSafe for MemoryHandle
impl !UnwindSafe for MemoryHandle
impl Send for MemoryHandle
impl Sync for MemoryHandle
impl Unpin for MemoryHandle
impl UnsafeUnpin for MemoryHandle
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<M> DynMemory for M
impl<M> DynMemory for M
Source§fn remember<'a>(
&'a self,
scope: &'a MemoryScope,
payload: Vec<u8>,
) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
fn remember<'a>( &'a self, scope: &'a MemoryScope, payload: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
Memory::remember.Source§fn append<'a>(
&'a self,
scope: &'a MemoryScope,
id: MemoryId,
kind: MemoryKind,
payload: Vec<u8>,
) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
fn append<'a>( &'a self, scope: &'a MemoryScope, id: MemoryId, kind: MemoryKind, payload: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
Source§fn recall<'a>(
&'a self,
scope: &'a MemoryScope,
query: &'a MemoryQuery,
) -> Pin<Box<dyn Future<Output = Result<Vec<MemoryItem>, LaserError>> + Send + 'a>>
fn recall<'a>( &'a self, scope: &'a MemoryScope, query: &'a MemoryQuery, ) -> Pin<Box<dyn Future<Output = Result<Vec<MemoryItem>, LaserError>> + Send + 'a>>
Memory::recall.Source§fn improve<'a>(
&'a self,
scope: &'a MemoryScope,
feedback: Feedback,
) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
fn improve<'a>( &'a self, scope: &'a MemoryScope, feedback: Feedback, ) -> Pin<Box<dyn Future<Output = Result<MemoryId, LaserError>> + Send + 'a>>
Memory::improve.Source§fn forget<'a>(
&'a self,
scope: &'a MemoryScope,
id: MemoryId,
) -> Pin<Box<dyn Future<Output = Result<(), LaserError>> + Send + 'a>>
fn forget<'a>( &'a self, scope: &'a MemoryScope, id: MemoryId, ) -> Pin<Box<dyn Future<Output = Result<(), LaserError>> + Send + 'a>>
Memory::forget.Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<TraitVariantBlanketType> LocalMemory for TraitVariantBlanketTypewhere
TraitVariantBlanketType: Memory,
impl<TraitVariantBlanketType> LocalMemory for TraitVariantBlanketTypewhere
TraitVariantBlanketType: Memory,
Source§async fn remember(
&self,
scope: &MemoryScope,
payload: Vec<u8>,
) -> Result<MemoryId, LaserError>
async fn remember( &self, scope: &MemoryScope, payload: Vec<u8>, ) -> Result<MemoryId, LaserError>
payload to the memory under scope. The body is opaque bytes,
so encode it with whatever codec you like before calling.Source§fn append(
&self,
scope: &MemoryScope,
id: MemoryId,
kind: MemoryKind,
payload: Vec<u8>,
) -> impl Future<Output = Result<MemoryId, LaserError>>where
TraitVariantBlanketType: Sync,
fn append(
&self,
scope: &MemoryScope,
id: MemoryId,
kind: MemoryKind,
payload: Vec<u8>,
) -> impl Future<Output = Result<MemoryId, LaserError>>where
TraitVariantBlanketType: Sync,
async fn recall( &self, scope: &MemoryScope, query: &MemoryQuery, ) -> Result<Vec<MemoryItem>, LaserError>
Source§async fn improve(
&self,
scope: &MemoryScope,
feedback: Feedback,
) -> Result<MemoryId, LaserError>
async fn improve( &self, scope: &MemoryScope, feedback: Feedback, ) -> Result<MemoryId, LaserError>
feedback on a recalled item, the log-native signal a ranking
backend folds into future recall. Returns the feedback record’s id.async fn forget( &self, scope: &MemoryScope, id: MemoryId, ) -> Result<(), LaserError>
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.