mirror of
https://github.com/fawney19/Aether.git
synced 2026-10-04 08:27:46 +08:00
style: format quota and response changes
This commit is contained in:
@@ -34,8 +34,8 @@ pub use providers::{
|
||||
WINDSURF_MODEL_CONFIGS_PATH, WINDSURF_RATE_LIMIT_PATH, WINDSURF_USER_STATUS_PATH,
|
||||
};
|
||||
pub use quota::{
|
||||
provider_pool_key_account_quota_exhausted, provider_pool_key_quota_hard_blocked,
|
||||
provider_pool_key_model_quota_exhausted, provider_pool_key_model_quota_hard_blocked,
|
||||
provider_pool_key_account_quota_exhausted, provider_pool_key_model_quota_exhausted,
|
||||
provider_pool_key_model_quota_hard_blocked, provider_pool_key_quota_hard_blocked,
|
||||
provider_pool_key_scheduling_label, provider_pool_member_quota_snapshot,
|
||||
provider_pool_quota_metadata_provider_type, provider_pool_quota_metadata_updated_at,
|
||||
provider_pool_quota_snapshot_updated_at,
|
||||
@@ -1005,14 +1005,12 @@ mod tests {
|
||||
}
|
||||
}));
|
||||
|
||||
let alpha = service.member_signals(
|
||||
"codex",
|
||||
&key,
|
||||
None,
|
||||
Some("vendor-alpha-model"),
|
||||
);
|
||||
let alpha = service.member_signals("codex", &key, None, Some("vendor-alpha-model"));
|
||||
let beta = service.member_signals("codex", &key, None, Some("vendor-beta-model"));
|
||||
assert!(!alpha.quota_exhausted, "one available alpha window must keep it usable");
|
||||
assert!(
|
||||
!alpha.quota_exhausted,
|
||||
"one available alpha window must keep it usable"
|
||||
);
|
||||
assert!(beta.quota_exhausted);
|
||||
assert!(!beta.quota_hard_blocked);
|
||||
}
|
||||
@@ -1062,12 +1060,7 @@ mod tests {
|
||||
}
|
||||
}));
|
||||
|
||||
let signals = service.member_signals(
|
||||
"codex",
|
||||
&key,
|
||||
None,
|
||||
Some("gpt-5.3-codex-spark"),
|
||||
);
|
||||
let signals = service.member_signals("codex", &key, None, Some("gpt-5.3-codex-spark"));
|
||||
assert!(
|
||||
!signals.quota_exhausted,
|
||||
"a compact bucket name should match a token in the selected model"
|
||||
@@ -1093,12 +1086,7 @@ mod tests {
|
||||
}
|
||||
}));
|
||||
|
||||
let signals = service.member_signals(
|
||||
"codex",
|
||||
&key,
|
||||
None,
|
||||
Some("gpt-5.4-codex-spark"),
|
||||
);
|
||||
let signals = service.member_signals("codex", &key, None, Some("gpt-5.4-codex-spark"));
|
||||
assert!(signals.quota_exhausted);
|
||||
}
|
||||
|
||||
|
||||
@@ -7,8 +7,8 @@ use serde_json::{Map, Value};
|
||||
use crate::capability::{ProviderPoolCapabilities, ProviderPoolCapability};
|
||||
use crate::plan::{derive_plan_tier, normalize_provider_plan_tier};
|
||||
use crate::quota::{
|
||||
provider_pool_account_blocked, provider_pool_quota_reset_seconds,
|
||||
provider_pool_model_quota_exhausted, provider_pool_quota_snapshot_exhausted_decision,
|
||||
provider_pool_account_blocked, provider_pool_model_quota_exhausted,
|
||||
provider_pool_quota_reset_seconds, provider_pool_quota_snapshot_exhausted_decision,
|
||||
provider_pool_quota_usage_ratio,
|
||||
};
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@ use crate::provider::{
|
||||
};
|
||||
use crate::quota::{
|
||||
provider_pool_current_unix_secs, provider_pool_json_bool, provider_pool_json_f64,
|
||||
provider_pool_metadata_bucket, provider_pool_quota_snapshot_exhausted_decision,
|
||||
provider_pool_model_quota_exhausted, provider_pool_reset_deadline_elapsed,
|
||||
provider_pool_metadata_bucket, provider_pool_model_quota_exhausted,
|
||||
provider_pool_quota_snapshot_exhausted_decision, provider_pool_reset_deadline_elapsed,
|
||||
provider_pool_timestamp_unix_secs,
|
||||
};
|
||||
use crate::quota_refresh::ProviderPoolQuotaRequestSpec;
|
||||
|
||||
@@ -8,8 +8,8 @@ use crate::provider::{
|
||||
};
|
||||
use crate::quota::{
|
||||
provider_pool_current_unix_secs, provider_pool_json_bool, provider_pool_json_f64,
|
||||
provider_pool_metadata_bucket, provider_pool_quota_snapshot_exhausted_decision,
|
||||
provider_pool_model_quota_exhausted, provider_pool_reset_deadline_elapsed,
|
||||
provider_pool_metadata_bucket, provider_pool_model_quota_exhausted,
|
||||
provider_pool_quota_snapshot_exhausted_decision, provider_pool_reset_deadline_elapsed,
|
||||
provider_pool_timestamp_unix_secs,
|
||||
};
|
||||
|
||||
|
||||
@@ -106,10 +106,8 @@ pub(crate) fn provider_pool_model_quota_exhausted(
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
if !model_matches.is_empty() {
|
||||
let exhausted = provider_pool_explicit_model_windows_exhausted(
|
||||
model_matches,
|
||||
observed_at,
|
||||
);
|
||||
let exhausted =
|
||||
provider_pool_explicit_model_windows_exhausted(model_matches, observed_at);
|
||||
if resolved.is_none()
|
||||
|| provider_pool_should_replace_model_quota_resolution(
|
||||
resolved.as_ref().and_then(|(observed_at, _)| *observed_at),
|
||||
@@ -130,10 +128,7 @@ pub(crate) fn provider_pool_model_quota_exhausted(
|
||||
.filter(|window| provider_pool_window_family_matches_model(window, &requested))
|
||||
.collect::<Vec<_>>();
|
||||
if !family_matches.is_empty() {
|
||||
let exhausted = provider_pool_any_window_exhausted(
|
||||
family_matches,
|
||||
observed_at,
|
||||
);
|
||||
let exhausted = provider_pool_any_window_exhausted(family_matches, observed_at);
|
||||
if resolved.is_none()
|
||||
|| provider_pool_should_replace_model_quota_resolution(
|
||||
resolved.as_ref().and_then(|(observed_at, _)| *observed_at),
|
||||
@@ -234,7 +229,10 @@ fn provider_pool_window_is_generic(window: &Map<String, Value>) -> bool {
|
||||
return false;
|
||||
}
|
||||
|
||||
let code = window.get("code").and_then(Value::as_str).unwrap_or_default();
|
||||
let code = window
|
||||
.get("code")
|
||||
.and_then(Value::as_str)
|
||||
.unwrap_or_default();
|
||||
let family = code
|
||||
.split_once(['_', ':', '/'])
|
||||
.map(|(prefix, _)| prefix)
|
||||
@@ -248,8 +246,17 @@ fn provider_pool_window_is_generic(window: &Map<String, Value>) -> bool {
|
||||
.is_some_and(|scope| scope.trim().eq_ignore_ascii_case("account"));
|
||||
}
|
||||
[
|
||||
"weekly", "5h", "daily", "monthly", "primary", "secondary", "account", "quota",
|
||||
"window", "rate", "reset",
|
||||
"weekly",
|
||||
"5h",
|
||||
"daily",
|
||||
"monthly",
|
||||
"primary",
|
||||
"secondary",
|
||||
"account",
|
||||
"quota",
|
||||
"window",
|
||||
"rate",
|
||||
"reset",
|
||||
]
|
||||
.contains(&family.as_str())
|
||||
}
|
||||
@@ -301,8 +308,7 @@ fn provider_pool_window_family_matches_model(
|
||||
.map(|scope| scope.trim().to_ascii_lowercase());
|
||||
// A model-scoped window without an explicit model must not accidentally
|
||||
// match a token from its opaque code.
|
||||
if explicit_scope.as_deref() == Some("model")
|
||||
|| provider_pool_window_has_explicit_model(window)
|
||||
if explicit_scope.as_deref() == Some("model") || provider_pool_window_has_explicit_model(window)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -373,9 +379,26 @@ fn provider_pool_is_specific_model_token(token: &str) -> bool {
|
||||
token.len() >= 4
|
||||
&& !token.chars().all(|character| character.is_ascii_digit())
|
||||
&& ![
|
||||
"auto", "base", "claude", "codex", "default", "fast", "flash", "free",
|
||||
"gemini", "gpt", "latest", "mini", "model", "plus", "pro", "reasoning",
|
||||
"team", "think", "thinking", "vendor",
|
||||
"auto",
|
||||
"base",
|
||||
"claude",
|
||||
"codex",
|
||||
"default",
|
||||
"fast",
|
||||
"flash",
|
||||
"free",
|
||||
"gemini",
|
||||
"gpt",
|
||||
"latest",
|
||||
"mini",
|
||||
"model",
|
||||
"plus",
|
||||
"pro",
|
||||
"reasoning",
|
||||
"team",
|
||||
"think",
|
||||
"thinking",
|
||||
"vendor",
|
||||
]
|
||||
.contains(&token)
|
||||
}
|
||||
@@ -394,9 +417,9 @@ fn provider_pool_window_has_explicit_model(window: &Map<String, Value>) -> bool
|
||||
.iter()
|
||||
.any(|key| match window.get(*key) {
|
||||
Some(Value::String(value)) => !value.trim().is_empty(),
|
||||
Some(Value::Array(values)) => values.iter().any(|value| {
|
||||
value.as_str().is_some_and(|value| !value.trim().is_empty())
|
||||
}),
|
||||
Some(Value::Array(values)) => values
|
||||
.iter()
|
||||
.any(|value| value.as_str().is_some_and(|value| !value.trim().is_empty())),
|
||||
_ => false,
|
||||
})
|
||||
}
|
||||
@@ -610,8 +633,12 @@ fn provider_pool_quota_window_is_exhausted(window: &Map<String, Value>) -> bool
|
||||
provider_pool_json_bool(window.get("is_exhausted"))
|
||||
.or_else(|| provider_pool_json_bool(window.get("exhausted")))
|
||||
.or_else(|| {
|
||||
provider_pool_json_f64(window.get("used_ratio").or_else(|| window.get("usage_ratio")))
|
||||
.map(|value| value >= 1.0 - 1e-6)
|
||||
provider_pool_json_f64(
|
||||
window
|
||||
.get("used_ratio")
|
||||
.or_else(|| window.get("usage_ratio")),
|
||||
)
|
||||
.map(|value| value >= 1.0 - 1e-6)
|
||||
})
|
||||
.or_else(|| {
|
||||
provider_pool_json_f64(window.get("used_percent")).map(|value| value >= 100.0 - 1e-6)
|
||||
@@ -625,8 +652,7 @@ fn provider_pool_quota_window_is_exhausted(window: &Map<String, Value>) -> bool
|
||||
.map(|value| value <= 1e-6)
|
||||
})
|
||||
.or_else(|| {
|
||||
provider_pool_json_f64(window.get("remaining_percent"))
|
||||
.map(|value| value <= 1e-6)
|
||||
provider_pool_json_f64(window.get("remaining_percent")).map(|value| value <= 1e-6)
|
||||
})
|
||||
.or_else(|| {
|
||||
let remaining = provider_pool_json_f64(
|
||||
|
||||
Reference in New Issue
Block a user