Skip to main content

FallbackModel

Struct FallbackModel 

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

Tries each model in order. Moves on when a request fails with a retryable error or when the answer is unusable:

Rejected answers are recorded in ModelResponse::rejected and their cost still counts toward budgets. With usability checks enabled, streaming is buffered per attempt so a rejected answer never reaches the caller.

Implementations§

Source§

impl FallbackModel

Source

pub fn new(models: Vec<Arc<dyn Model>>) -> Self

Source

pub fn keep_last_answer(self) -> Self

When every model’s answer is unusable, return the last one anyway instead of failing the call.

For agents with a finish_schema: a final answer that is not quite valid JSON then reaches the agent’s corrective retry, which usually fixes it on the same cheap model, rather than ending the run. Transport and API errors still fail.

Source

pub fn accept_truncated(self) -> Self

Keep answers that hit the token limit.

Source

pub fn accept_empty(self) -> Self

Keep answers with no text and no tool calls.

Source

pub fn require_json_fields(self, fields: &[&str]) -> Self

Final answers (no tool calls) must contain a JSON object with these top-level fields, e.g. ["summary", "work", "risks", "confidence"].

Source

pub fn require( self, check: impl Fn(&ModelResponse) -> Result<(), String> + Send + Sync + 'static, ) -> Self

Custom usability check; return Err(reason) to try the next model.

Source

pub fn check(&self, r: &ModelResponse) -> Result<(), String>

Why a response is unusable, if it is.

Trait Implementations§

Source§

impl Model for FallbackModel

Source§

fn stream<'life0, 'life1, 'async_trait>( &'life0 self, request: &'life1 ModelRequest, ) -> Pin<Box<dyn Future<Output = Result<ModelStream, ModelError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Fails over only while opening the stream; once tokens flow, errors are surfaced to the caller.

Source§

fn pricing(&self) -> Option<Pricing>

Conservative (field-wise maximum) pricing across all models, or None if any model is unpriced.

Source§

fn cost_usd(&self, response: &ModelResponse) -> Option<f64>

Prices the response with the model that actually served it; falls back to the conservative maximum rather than ever under-counting. Cost of the answer (priced on the model that served it, else the conservative maximum) plus every rejected attempt.

Source§

fn max_call_cost(&self, input_tokens: u64, output_tokens: u64) -> Option<f64>

Every model may be tried (and paid for) in one call.

Source§

fn id(&self) -> String

Identifier such as anthropic:claude-opus-5-5.
Source§

fn complete<'life0, 'life1, 'async_trait>( &'life0 self, request: &'life1 ModelRequest, ) -> Pin<Box<dyn Future<Output = Result<ModelResponse, ModelError>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Source§

fn unpriced_models(&self) -> Vec<String>

Ids of models (including any inside a composite) that have no pricing. A USD budget cannot be enforced while this is non-empty.

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