Skip to main content

CascadeRetriever

Struct CascadeRetriever 

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

Cascading retrieval orchestrator.

Coordinates the 4-tier retrieval pipeline, falling back to API only when CPU-local tiers cannot satisfy the query.

Implementations§

Source§

impl CascadeRetriever

Source

pub fn new(config: CascadeConfig) -> Self

Create a new cascade retriever with given configuration.

Source

pub fn default_config() -> Self

Create a new cascade retriever with default configuration.

Source

pub fn add_episode(&mut self, id: &str, text: &str)

Add an episode to the retrieval index.

This indexes the episode in BM25 and encodes it for HDC similarity search. When the csm feature is not enabled, this just stores the episode data for later retrieval.

Source

pub fn clear(&mut self)

Clear all indexed episodes.

Source

pub fn len(&self) -> usize

Get the number of indexed episodes.

Source

pub fn is_empty(&self) -> bool

Check if the index is empty.

Source

pub fn retrieve(&self, query: &str) -> CascadeResult

Execute the cascading retrieval pipeline.

When the csm feature is enabled, this implements a 4-tier cascade:

  1. BM25 keyword search (CPU-local, 0 API calls)
  2. HDC similarity search (CPU-local, 0 API calls)
  3. ConceptGraph expansion (CPU-local, 0 API calls)
  4. API fallback (requires external embedding call)

Without csm, returns empty results (placeholder behavior).

Source

pub fn config(&self) -> &CascadeConfig

Get the configuration for this retriever.

Source

pub fn estimate_api_call_probability(&self, query: &str) -> f32

Estimate the probability that a query would require an API call.

Returns a value in [0.0, 1.0] where:

  • 0.0 means CPU-local tiers (BM25/HDC/ConceptGraph) are very likely to suffice
  • 1.0 means an API embedding call is almost certainly needed

Heuristic: short keyword-rich queries resolve via BM25 (low probability); long abstract queries with few known terms need semantic embedding (high probability).

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> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> SendAlias for T

Source§

impl<T> SendAlias for T

Source§

impl<T> SendSyncUnwindSafe for T
where T: Send + Sync + UnwindSafe + ?Sized,

Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> SyncAlias for T

Source§

impl<T> SyncAlias for T

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