pub struct RetryMiddleware { /* private fields */ }Expand description
Middleware that retries failed calls with exponential backoff.
Retry policy:
- Only errors with
ProviderError::is_retryableare retried; everything else propagates immediately. Self::wrap_generate: retries the full request up tomax_attemptstimes.Self::wrap_stream: retries opening the stream only. Once the stream is open (any item, includingcrate::language_model::StreamPart::Error, has been delivered), the retry policy stops; callers decide whether to re-issue the call.
Backoff is deterministic (no jitter); add jitter at the caller level if you have hundreds of concurrent retriers hitting the same upstream.
§Examples
ⓘ
use std::sync::Arc;
use std::time::Duration;
use llmsdk_provider::{wrap_language_model, LanguageModel, LanguageModelMiddleware};
use llmsdk_provider::middleware::RetryMiddleware;
fn add_retry(model: Arc<dyn LanguageModel>) -> Arc<dyn LanguageModel> {
let retry = RetryMiddleware::builder()
.max_attempts(5)
.initial_backoff(Duration::from_millis(200))
.build();
wrap_language_model(model, [Arc::new(retry) as Arc<dyn LanguageModelMiddleware>])
}Implementations§
Source§impl RetryMiddleware
impl RetryMiddleware
Sourcepub fn new() -> Self
pub fn new() -> Self
Build with default policy (DEFAULT_MAX_ATTEMPTS, 100ms initial,
x2 multiplier, 5s cap).
Sourcepub fn builder() -> RetryMiddlewareBuilder
pub fn builder() -> RetryMiddlewareBuilder
Open a builder for non-default tuning.
Trait Implementations§
Source§impl Clone for RetryMiddleware
impl Clone for RetryMiddleware
Source§impl Debug for RetryMiddleware
impl Debug for RetryMiddleware
Source§impl Default for RetryMiddleware
impl Default for RetryMiddleware
Source§impl LanguageModelMiddleware for RetryMiddleware
impl LanguageModelMiddleware for RetryMiddleware
Source§fn wrap_generate<'life0, 'life1, 'async_trait>(
&'life0 self,
next: &'life1 dyn LanguageModel,
params: CallOptions,
) -> Pin<Box<dyn Future<Output = Result<GenerateResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn wrap_generate<'life0, 'life1, 'async_trait>(
&'life0 self,
next: &'life1 dyn LanguageModel,
params: CallOptions,
) -> Pin<Box<dyn Future<Output = Result<GenerateResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Wrap a non-streaming generation. Read more
Source§fn wrap_stream<'life0, 'life1, 'async_trait>(
&'life0 self,
next: &'life1 dyn LanguageModel,
params: CallOptions,
) -> Pin<Box<dyn Future<Output = Result<StreamResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn wrap_stream<'life0, 'life1, 'async_trait>(
&'life0 self,
next: &'life1 dyn LanguageModel,
params: CallOptions,
) -> Pin<Box<dyn Future<Output = Result<StreamResult>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Wrap a streaming generation. Read more
Source§fn override_provider(&self, _inner: &dyn LanguageModel) -> Option<String>
fn override_provider(&self, _inner: &dyn LanguageModel) -> Option<String>
Override the provider id exposed by the wrapped model. Read more
Source§fn override_model_id(&self, _inner: &dyn LanguageModel) -> Option<String>
fn override_model_id(&self, _inner: &dyn LanguageModel) -> Option<String>
Override the model id exposed by the wrapped model. Read more
Source§fn override_supported_urls<'life0, 'life1, 'async_trait>(
&'life0 self,
_inner: &'life1 dyn LanguageModel,
) -> Pin<Box<dyn Future<Output = Option<SupportedUrls>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn override_supported_urls<'life0, 'life1, 'async_trait>(
&'life0 self,
_inner: &'life1 dyn LanguageModel,
) -> Pin<Box<dyn Future<Output = Option<SupportedUrls>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Override the supported-URL map exposed by the wrapped model. Read more
Source§fn transform_params<'life0, 'life1, 'async_trait>(
&'life0 self,
_kind: CallKind,
params: CallOptions,
_inner: &'life1 dyn LanguageModel,
) -> Pin<Box<dyn Future<Output = Result<CallOptions>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
fn transform_params<'life0, 'life1, 'async_trait>(
&'life0 self,
_kind: CallKind,
params: CallOptions,
_inner: &'life1 dyn LanguageModel,
) -> Pin<Box<dyn Future<Output = Result<CallOptions>> + Send + 'async_trait>>where
Self: 'async_trait,
'life0: 'async_trait,
'life1: 'async_trait,
Transform the call options before they reach the inner model. Read more
Auto Trait Implementations§
impl !Freeze for RetryMiddleware
impl RefUnwindSafe for RetryMiddleware
impl Send for RetryMiddleware
impl Sync for RetryMiddleware
impl Unpin for RetryMiddleware
impl UnsafeUnpin for RetryMiddleware
impl UnwindSafe for RetryMiddleware
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more