Skip to main content

CascadeFailover

Struct CascadeFailover 

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

Priority-ordered cascade failover across named worker tiers.

Tries tiers from highest priority (index 0) to lowest. Within each tier the configured number of retries is attempted before advancing to the next. Each attempt is individually time-bounded by the tier’s timeout.

§Typical tier ordering

1. Premium (e.g. Anthropic)  — lowest latency, highest cost, short timeout
2. Standard (e.g. OpenAI)    — medium cost, medium timeout
3. Local fallback (LlamaCpp) — zero cost, longer timeout

§Example

use std::time::Duration;
use tokio_prompt_orchestrator::config::WorkerKind;
use tokio_prompt_orchestrator::routing::cascade::{CascadeFailover, FailoverTier};

let failover = CascadeFailover::new(vec![
    FailoverTier::new("premium",  WorkerKind::Anthropic, Duration::from_secs(10), 0),
    FailoverTier::new("standard", WorkerKind::OpenAi,    Duration::from_secs(20), 1),
    FailoverTier::new("local",    WorkerKind::LlamaCpp,  Duration::from_secs(60), 2),
]);

let result = failover.call(|kind| async move {
    // Your inference call here
    Ok::<String, String>(format!("response from {:?}", kind))
}).await;

match result {
    Ok(r) => println!("Succeeded on tier '{}': {}", r.tier_name, r.value),
    Err(e) => eprintln!("All tiers failed: {e}"),
}

Implementations§

Source§

impl CascadeFailover

Source

pub fn new(tiers: Vec<FailoverTier>) -> Self

Create a new failover chain. Tiers are tried in slice order.

§Panics

This function does not panic.

Source

pub fn with_tier(self, tier: FailoverTier) -> Self

Builder pattern: append a tier.

§Panics

This function does not panic.

Source

pub fn tier_count(&self) -> usize

Return the number of configured tiers.

§Panics

This function does not panic.

Source

pub fn is_empty(&self) -> bool

Return true if no tiers are configured.

§Panics

This function does not panic.

Source

pub async fn call<F, Fut, T>( &self, f: F, ) -> Result<FailoverResult<T>, FailoverExhausted>
where F: Fn(WorkerKind) -> Fut, Fut: Future<Output = Result<T, String>>,

Execute f against tiers in priority order, respecting per-tier timeouts and retries.

f receives the WorkerKind of the current tier and must return a future that resolves to Ok(T) on success or Err(String) on failure.

§Errors

Returns FailoverExhausted if every attempt on every tier fails.

§Panics

This function does not panic.

Trait Implementations§

Source§

impl Debug for CascadeFailover

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

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
§

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

§

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

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FutureExt for T

§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
§

impl<T> Instrument for T

§

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

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

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

Source§

fn into_request(self) -> Request<T>

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

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

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + 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
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + 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
§

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 = 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.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

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