diff --git a/backend/Cargo.lock b/backend/Cargo.lock
index 2b56b6f96..ffd79f502 100644
--- a/backend/Cargo.lock
+++ b/backend/Cargo.lock
@@ -2158,6 +2158,7 @@ dependencies = [
"async-stream",
"async-trait",
"base64",
+ "bytes",
"chrono",
"futures",
"gateway-admin",
diff --git a/backend/crates/providers/openai/src/credential/quota.rs b/backend/crates/providers/openai/src/credential/quota.rs
index e8255147b..425f8379e 100644
--- a/backend/crates/providers/openai/src/credential/quota.rs
+++ b/backend/crates/providers/openai/src/credential/quota.rs
@@ -658,23 +658,20 @@ impl CodexCredentialQuotaService {
if outcome == QuotaWriteOutcome::Conflict {
return Ok(false);
}
- let Some(current) = self.store.get_account(account.id()).await? else {
- return Ok(false);
- };
- if current.revision() != account.revision() {
- return Ok(false);
- }
+ // quota CAS 以 account.revision 为 fence,成功即证明该 revision 在写入时
+ // 仍是当前凭据;后续状态写回带同一 fence,轮换竞态下安全失败。
+ // 可用性判断使用选择时的账号快照,偏差在下一次响应或 quota 轮询收敛。
self.scheduling
- .observe(current.id().clone(), current.revision(), observed_at, fact);
+ .observe(account.id().clone(), account.revision(), observed_at, fact);
if let Some(availability) = quota_success_availability(
- current.availability(),
- current.cooldown_until(),
+ account.availability(),
+ account.cooldown_until(),
fact.exhausted(),
observed_at,
) {
self.repository
.apply_state(
- ¤t,
+ account,
availability,
fact.exhausted().then_some("quota_exhausted".to_owned()),
None,
diff --git a/backend/crates/providers/xai/Cargo.toml b/backend/crates/providers/xai/Cargo.toml
index 850c2d09b..077c53bea 100644
--- a/backend/crates/providers/xai/Cargo.toml
+++ b/backend/crates/providers/xai/Cargo.toml
@@ -11,6 +11,7 @@ autotests = false
async-stream = "0.3.6"
async-trait = "0.1.89"
base64 = "0.22.1"
+bytes = "1.9.0"
chrono = { version = "0.4.45", features = ["clock", "serde"] }
futures = "0.3.32"
gateway-admin = { path = "../../gateway-admin" }
diff --git a/backend/crates/providers/xai/src/provider.rs b/backend/crates/providers/xai/src/provider.rs
index c0e912481..dac144992 100644
--- a/backend/crates/providers/xai/src/provider.rs
+++ b/backend/crates/providers/xai/src/provider.rs
@@ -989,7 +989,7 @@ async fn next_grok_chunk(
selector: &dyn GrokSessionSelector,
session: &SelectedGrokSession,
context: &AttemptContext,
-) -> Result