pub struct RoutingClassifier { /* private fields */ }Expand description
Sends each question to the cheap adapter when its kind has earned it
and to the expensive adapter otherwise; see RoutingPolicy.
Under RoutingMode::Measured, one call:
- asks the cheap adapter the trusted kinds, in one batch;
- accepts each cheap answer that clears its
Thresholds; - asks the expensive adapter, in one second batch, the untrusted kinds plus every cheap answer that did not clear — or all the trusted ones if the cheap adapter failed;
- merges both under the ids asked.
An empty or malformed question set is rejected first, as the adapters
reject it. An expensive failure is the call’s error.
ask_routed says who answered each question and
why; ask returns the answers alone.
Measured answers mix confidence scales. In measured mode one call’s
answers can come from both adapters, and each answer’s
Answer::confidence is on its own adapter’s scale. A caller that
thresholds confidence must use ask_routed and
threshold per Routed::adapter, not the merged map ask returns.
profile: off, the expensive adapter’s; pinned,
the pinned adapter’s; measured, the expensive adapter’s
Calibration — a cheap answer is only served where it was measured
to agree with the expensive one — and the smaller of the two
max_state_chars, the least state any answer may have seen. In
measured mode that calibration describes the expensive answers only;
see above.
Implementations§
Source§impl RoutingClassifier
impl RoutingClassifier
Sourcepub fn new(
cheap: (AdapterId, Arc<dyn Classifier>),
expensive: (AdapterId, Arc<dyn Classifier>),
policy: RoutingPolicy,
accounting: Accounting,
) -> Result<Self, RoutingError>
pub fn new( cheap: (AdapterId, Arc<dyn Classifier>), expensive: (AdapterId, Arc<dyn Classifier>), policy: RoutingPolicy, accounting: Accounting, ) -> Result<Self, RoutingError>
A router over cheap and expensive.
§Errors
RoutingError when the policy pins or thresholds an adapter the
router does not hold, declares a calibration an adapter does not
report, or (measured) carries evidence about other adapters.
Sourcepub async fn ask_routed(
&self,
state: &str,
questions: &BTreeMap<String, Question>,
) -> Result<BTreeMap<String, Routed>, ClassifierError>
pub async fn ask_routed( &self, state: &str, questions: &BTreeMap<String, Question>, ) -> Result<BTreeMap<String, Routed>, ClassifierError>
Asks questions and says, per answer, which adapter gave it and why.
§Errors
The serving adapter’s ClassifierError: the expensive one’s, the
pinned one’s, or the expensive escalation’s. A cheap failure under
RoutingMode::Measured escalates instead.
Trait Implementations§
Source§impl Classifier for RoutingClassifier
impl Classifier for RoutingClassifier
Source§fn profile(&self) -> ClassifierProfile
fn profile(&self) -> ClassifierProfile
See RoutingClassifier: in measured mode the calibration is the
expensive adapter’s, and cheap answers are on the cheap adapter’s
scale.
Source§fn ask<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
state: &'life1 str,
questions: &'life2 BTreeMap<String, Question>,
) -> Pin<Box<dyn Future<Output = Result<BTreeMap<String, Answer>, ClassifierError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
fn ask<'life0, 'life1, 'life2, 'async_trait>(
&'life0 self,
state: &'life1 str,
questions: &'life2 BTreeMap<String, Question>,
) -> Pin<Box<dyn Future<Output = Result<BTreeMap<String, Answer>, ClassifierError>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
The answers of ask_routed without
who gave them. In measured mode they mix adapters’ confidence
scales: threshold confidence through ask_routed, per adapter.