pub struct AiCredentialPool {
pub credentials: Vec<AiProviderAuth>,
pub strategy: AiPoolStrategy,
pub quarantine_secs: u64,
}Expand description
DW-080 (Ent): a credential pool for a provider — multiple API keys
rotated across to aggregate rate-limit headroom. Each entry is an
AiProviderAuth (same header+value shape as the singular auth
field). The pool is used INSTEAD of auth; validation rejects a
provider that sets both.
Fields§
§credentials: Vec<AiProviderAuth>One or more credential entries. Each entry has the same shape
as ai.providers[].auth (a header name + secret-bearing value).
At least two entries are required (a single-entry pool is
equivalent to auth — validation rejects it).
strategy: AiPoolStrategyRotation strategy (DW-080). round_robin (the default) cycles
through credentials in config order; weighted picks
proportionally to each entry’s weight (deterministic per
request id, same as canary splits). When a credential is
quarantined (429 from the provider), the pool skips it and
picks the next available one.
quarantine_secs: u64Quarantine duration in seconds for a credential that received a
429 from the provider. During quarantine, the pool skips the
credential; after the window expires, it re-enters rotation.
Default: 60 seconds. A provider’s Retry-After header, when
present, overrides this per-429 (capped at 600 seconds to
prevent a hostile provider from pinning a key out indefinitely).
Trait Implementations§
Source§impl Clone for AiCredentialPool
impl Clone for AiCredentialPool
Source§fn clone(&self) -> AiCredentialPool
fn clone(&self) -> AiCredentialPool
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for AiCredentialPool
impl Debug for AiCredentialPool
Source§impl<'de> Deserialize<'de> for AiCredentialPool
impl<'de> Deserialize<'de> for AiCredentialPool
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for AiCredentialPool
impl JsonSchema for AiCredentialPool
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreSource§impl PartialEq for AiCredentialPool
impl PartialEq for AiCredentialPool
Source§impl Serialize for AiCredentialPool
impl Serialize for AiCredentialPool
impl StructuralPartialEq for AiCredentialPool
Auto Trait Implementations§
impl Freeze for AiCredentialPool
impl RefUnwindSafe for AiCredentialPool
impl Send for AiCredentialPool
impl Sync for AiCredentialPool
impl Unpin for AiCredentialPool
impl UnwindSafe for AiCredentialPool
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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