pub struct QuotaTracker { /* private fields */ }Expand description
The QuotaTracker.
Implementations§
Source§impl QuotaTracker
impl QuotaTracker
Sourcepub fn new(config: TokenMaxingConfig) -> Self
pub fn new(config: TokenMaxingConfig) -> Self
Build a tracker from the user’s config. Providers not eligible under the metered-never rule are dropped from the budget.
Sourcepub fn reload(&self, config: TokenMaxingConfig)
pub fn reload(&self, config: TokenMaxingConfig)
Reload the config (e.g. on PUT /api/config). Preserves
tokens_used for providers that remain in the config.
Sourcepub fn availability(&self, provider: &str) -> Availability
pub fn availability(&self, provider: &str) -> Availability
The verdict for a single provider.
Sourcepub fn snapshots(&self) -> Vec<QuotaTrackerSnapshot>
pub fn snapshots(&self) -> Vec<QuotaTrackerSnapshot>
All providers (eligible or not), in declared order. Used by the orchestrator to build the live status panel and the report.
Sourcepub fn record_failure(
&self,
provider: &str,
class: FailureClass,
resets_at: Option<DateTime<Utc>>,
)
pub fn record_failure( &self, provider: &str, class: FailureClass, resets_at: Option<DateTime<Utc>>, )
Reactive override — record a failure class for provider from a
real agent run.
Cooldown policy (kept separate so a single transient hiccup doesn’t drain the pool for an hour):
QuotaExhausted→ full reset-window cooldown. The provider’s plan limit has been hit; waiting makes sense.Transient→ short cooldown (60s by default).classify.rslumps 429/rate-limit into the same bucket as 500/timeout/ network blip. We don’t want a single upstream hiccup to mark a providerCooledDownfor the whole reset window — that defeats the drain-by-rotating-across-providers loop. A short cooldown lets the next retry succeed on the same provider once the blip clears, while still preventing hot-looping.- Anything else (auth failure, model unavailable, etc.) → no cooldown. Those are recovery-coordinator concerns, not pool concerns.
Sourcepub fn clear_cooldown(&self, provider: &str)
pub fn clear_cooldown(&self, provider: &str)
Clear the cooldown for a provider (e.g. when a window is observed to have actually reset).
Sourcepub fn apply_recalibration(
&self,
provider: &str,
remaining_percent: Option<f64>,
resets_at: Option<DateTime<Utc>>,
outcome: RecalibrationOutcome,
) -> bool
pub fn apply_recalibration( &self, provider: &str, remaining_percent: Option<f64>, resets_at: Option<DateTime<Utc>>, outcome: RecalibrationOutcome, ) -> bool
Record a recalibration event and snap the budget to the new
state. Returns true if the snap was applied.
Sourcepub fn reserve(&self, provider: &str, tokens: u64) -> Result<(), ReserveError>
pub fn reserve(&self, provider: &str, tokens: u64) -> Result<(), ReserveError>
Reserve tokens against the self-tracked counter. Used by the TokenMaxer after dispatching each unit of work.
Sourcepub fn release(&self, provider: &str, tokens: u64)
pub fn release(&self, provider: &str, tokens: u64)
Release reserved tokens. Used on task failure / retry.
Sourcepub fn snapshot(&self, provider: &str) -> Option<ProviderSnapshot>
pub fn snapshot(&self, provider: &str) -> Option<ProviderSnapshot>
The full self-tracked state for a provider. Used by the report.
Sourcepub fn recalibration_history(&self) -> Vec<RecalibrationRecord>
pub fn recalibration_history(&self) -> Vec<RecalibrationRecord>
Recalibration history.
Sourcepub fn cooldown_history(&self) -> Vec<CooldownRecord>
pub fn cooldown_history(&self) -> Vec<CooldownRecord>
Cooldown records. Used by the report.
Sourcepub fn config(&self) -> TokenMaxingConfig
pub fn config(&self) -> TokenMaxingConfig
Read-only access to the current config.
Auto Trait Implementations§
impl !Freeze for QuotaTracker
impl !RefUnwindSafe for QuotaTracker
impl Send for QuotaTracker
impl Sync for QuotaTracker
impl Unpin for QuotaTracker
impl UnsafeUnpin for QuotaTracker
impl UnwindSafe for QuotaTracker
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 moreimpl<T> MaybeSendSync for T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.