Skip to main content

ReasoningMemory

Struct ReasoningMemory 

Source
pub struct ReasoningMemory { /* private fields */ }
Expand description

SQLite-backed store for distilled reasoning strategies.

Attach to crate::semantic::SemanticMemory via with_reasoning. All write operations are best-effort: SQLite errors are propagated as MemoryError, Qdrant failures are logged and silently ignored.

Implementations§

Source§

impl ReasoningMemory

Source

pub fn new(pool: DbPool, vector_store: Option<Arc<dyn VectorStore>>) -> Self

Create a new ReasoningMemory backed by the given SQLite pool.

Pass vector_store = Some(arc) to enable embedding-similarity retrieval via Qdrant. When None, Self::retrieve_by_embedding always returns an empty vec.

§Examples
use zeph_memory::reasoning::ReasoningMemory;

async fn demo(pool: zeph_db::DbPool) {
    let memory = ReasoningMemory::new(pool, None);
}
Source

pub async fn insert( &self, strategy: &ReasoningStrategy, embedding: Vec<f32>, ) -> Result<(), MemoryError>

Insert a new strategy into SQLite.

When a vector_store is configured, the strategy is also upserted into the Qdrant reasoning_strategies collection using the provided embedding. Qdrant failures are logged at warn level and do not fail the insert.

§Errors

Returns an error if the SQLite insert fails.

Source

pub async fn retrieve_by_embedding( &self, embedding: &[f32], top_k: u64, ) -> Result<Vec<ReasoningStrategy>, MemoryError>

Retrieve up to top_k strategies by embedding similarity.

This method is pure — it does not update use_count or last_used_at. Call Self::mark_used with the ids of strategies actually injected into the prompt (after budget truncation) to maintain accurate retrieval bookkeeping.

Returns an empty vec when no vector store is configured.

§Errors

Returns an error if the Qdrant search or SQLite fetch fails.

Source

pub async fn mark_used(&self, ids: &[String]) -> Result<(), MemoryError>

Increment use_count and update last_used_at for each id in the list.

Safe to call with an empty slice — no SQL is issued. The list is chunked into batches of [MAX_IDS_PER_QUERY] to respect SQLite’s variable limit.

§Errors

Returns an error if the database update fails.

Source

pub async fn evict_lru(&self, store_limit: usize) -> Result<usize, MemoryError>

Evict strategies when the table exceeds store_limit.

Normal path: delete rows with use_count <= HOT_STRATEGY_USE_COUNT, oldest first, until the table returns to store_limit.

Saturation path: when the normal path deletes nothing AND the table exceeds 2 × store_limit, bypass hot-row protection and delete oldest rows regardless of use_count. Emits a warn! with the eviction count so operators can tune store_limit upward or lower the hot threshold.

Returns the number of rows deleted.

§Errors

Returns an error if any database operation fails.

Source

pub async fn count(&self) -> Result<usize, MemoryError>

Return the total number of rows in reasoning_strategies.

§Errors

Returns an error if the database query fails.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more