pub struct ProviderUsage {
pub provider: String,
pub api_provider: Option<String>,
pub account: Option<String>,
pub source: Option<String>,
pub account_info: Option<AccountInfo>,
pub fetched_at: Option<String>,
pub saved_resets: Option<SavedResets>,
pub usage: Option<Usage>,
pub error: Option<String>,
pub error_class: Option<String>,
}Expand description
One provider/account’s usage entry. The /usage response is an array of
these. A fetch failure becomes an entry carrying error (silent-degrade),
never a failure of the whole array.
Fields§
§provider: StringCodexBar provider name (e.g. “codex”), which consumers map to their own id.
api_provider: Option<String>Canonical API provider identifier — the models.dev slug for the same
provider (e.g. “openai” when provider == "codex", “anthropic” for
“claude”, “google” for “gemini”, “xai” for “grok”). Present when the
producer knows the canonical name; absent for providers with no models.dev
counterpart, where consumers fall back to provider. Lets every consumer
key on one canonical name instead of each maintaining its own
CodexBar-name → canonical map.
account: Option<String>§source: Option<String>Which retrieval path produced this (e.g. “oauth”) — observability only.
account_info: Option<AccountInfo>§fetched_at: Option<String>§saved_resets: Option<SavedResets>§usage: Option<Usage>§error: Option<String>Present only on a degraded entry. The consumer skips any entry with a
truthy error.
error_class: Option<String>A stable, machine-readable name for why a degraded entry failed,
published beside the human-readable error.
error is prose with no stability promise, so consumers are told not to
branch on it — which leaves them no way to separate failures that mean
something from failures that are a permanent, correct state. A host that
never configured a provider and a host whose credential broke this
morning both produce a degraded entry, and only the second is worth
anyone’s attention.
Classes currently produced:
| Value | Meaning |
|---|---|
credential_absent | No credential was found. Permanent and correct on a host that never configured this provider; nothing to fix. |
credential_unusable | A credential was found but cannot be used as it stands (empty, incomplete, or refused by the credential store). Someone configured this and it needs fixing. |
credential_rejected | The upstream rejected the credential (401/403). Usually means logging in again. |
no_quota_reported | The credential works and the account genuinely has no quota to report. Not a failure. |
upstream_failed | The upstream could not be reached or returned an error status. Usually transient. |
decode_failed | The response arrived but was not the expected shape. |
This list will grow. A consumer must render an unrecognised class as
a degraded entry with an unknown reason — never drop the entry, and
never fold it into an existing bucket. It is a String rather than an
enum for exactly that reason: on an observability surface, meeting an
unknown value must not turn into a parse failure that makes a provider
disappear at the moment its state changed.
Absent on healthy entries, and absent from any producer that predates this field.
Implementations§
Source§impl ProviderUsage
impl ProviderUsage
Sourcepub fn healthy(
provider: &str,
account: Option<String>,
source: &str,
usage: Usage,
) -> Self
pub fn healthy( provider: &str, account: Option<String>, source: &str, usage: Usage, ) -> Self
A healthy entry with resolved windows.
Sourcepub fn degraded(provider: &str, error: impl Display) -> Self
pub fn degraded(provider: &str, error: impl Display) -> Self
A degraded entry: the provider is named so the consumer can correlate, but it carries only an error string and no windows.
Sourcepub fn degraded_with_class(
provider: &str,
error: impl Display,
error_class: impl Into<String>,
) -> Self
pub fn degraded_with_class( provider: &str, error: impl Display, error_class: impl Into<String>, ) -> Self
A degraded entry that also names why it failed.
Prefer this over Self::degraded wherever the producer knows the
class: without it a consumer can only tell an unconfigured provider from
a broken one by reading prose it has been told not to parse. See
ProviderUsage::error_class for the classes and for the rule that an
unrecognised one must still render.
Trait Implementations§
Source§impl Clone for ProviderUsage
impl Clone for ProviderUsage
Source§fn clone(&self) -> ProviderUsage
fn clone(&self) -> ProviderUsage
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more