Skip to main content

EmbeddingRouter

Struct EmbeddingRouter 

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

The embedding-based NLU router.

Pre-computes tool embeddings at initialization, then routes queries by embedding the query and computing cosine similarity against all tool embeddings. OATS refinement adjusts tool embeddings based on observed outcomes.

Implementations§

Source§

impl EmbeddingRouter

Source

pub fn new(embedder: Box<dyn Embedder>) -> Option<Self>

Create a new embedding router, pre-computing tool embeddings.

Returns None if:

  • The embedder is a stub (hash-based embeddings have no semantic meaning)
  • Batch embedding fails

This allows the caller to gracefully fall back to the TF-IDF router.

Source

pub fn with_descriptions( embedder: Box<dyn Embedder>, descriptions: Vec<(String, String)>, ) -> Option<Self>

Create a new embedding router from explicit (tool, description) pairs.

Unlike Self::new — which uses the static keyword profiles from nlu.rs (169 tools, keyword-mashup descriptions) — this accepts descriptions from the live tool registry (all 229 tools, prose descriptions). Sentence-style descriptions embed far better than bare keyword lists; the 2026-08-11 shadow run (42.6% disagreement) showed keyword-mashup top-1 selection collapsing onto arbitrary high-similarity tools.

Source

pub fn route(&self, query: &str) -> (String, f64)

Route a natural language query to a tool name and confidence score.

Returns ("gnosis", 0.0) for empty input or when no tool scores above the minimum threshold.

Source

pub fn route_with_margin(&self, query: &str) -> Option<(String, f64, f64)>

Route a query, returning (tool, confidence, margin).

margin is the score gap between the top-1 and top-2 tools. Small margins indicate the descriptions cannot separate intent — callers should defer to the TF-IDF router when margin < MIN_MARGIN.

Source

pub fn route_with_margin_and_embedding( &self, query: &str, ) -> Option<(String, f64, f64, Vec<f32>)>

Route a query, also returning the query embedding.

The embedding is what record_outcome_with_embedding needs — returning it here lets callers embed each query once instead of twice (embedder HTTP round-trips dominate NLU latency).

Source

pub fn record_outcome(&self, tool_name: &str, query: &str, success: bool)

Record a routing outcome for OATS refinement.

Call this after each tool dispatch to track whether the routing was correct. success = true means the tool was the right choice and executed successfully; false means it was wrong or failed.

Source

pub fn record_outcome_with_embedding( &self, tool_name: &str, query: &str, success: bool, query_emb: &[f32], )

Record a routing outcome reusing a query embedding already computed by the router.

Callers that routed through route_with_margin should pass the embedding back here so the query is embedded only once instead of twice (HTTP embedder round-trips dominate NLU latency).

Source

pub fn tool_count(&self) -> usize

Number of tool embeddings in the router.

Source

pub const fn dimension(&self) -> usize

Embedding dimensionality.

Source

pub fn backend_name(&self) -> &str

Embedder backend name.

Source

pub fn outcome_counts(&self) -> Vec<(String, usize, usize)>

Get a snapshot of outcome stats counts for observability.

Source

pub fn save_oats(&self) -> Option<String>

Serialize OATS outcome stats to JSON for persistence.

Source

pub fn load_oats(&self, json: &str)

Load OATS outcome stats from JSON (previously saved by save_oats).

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Sync + Send>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Fruit for T
where T: Send + Downcast,

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

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = !

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

fn try_from(value: U) -> Result<T, !>

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<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