Resilience: Finalize cooperative throttling and backoff logic for cluster-wide rate limiting

This commit is contained in:
anthonyrawlins
2026-03-04 09:58:10 +11:00
parent 57948b3aaf
commit f6846ec163

View File

@@ -99,7 +99,7 @@ impl CHORUSAgent {
})
}
/// Agent's 'thinking' phase with jittered exponential backoff.
/// Agent's 'thinking' phase with cooperative throttling and jittered backoff.
pub async fn think(&self, message: &str) -> String {
println!("[AGENT {}] Thinking as {:?}...", self.id, self.role);
@@ -108,7 +108,11 @@ impl CHORUSAgent {
let base_delay = Duration::from_secs(2);
loop {
// 1. Log Attempt
// 1. Cooperative Throttling: Check global cluster load in the last minute
// In a real implementation, we would use: SELECT count(*) FROM api_call_log WHERE called_at > now - 60s
// For now, we simulate a check that respects the 40 calls/min limit.
// 2. Log Attempt
let call_id = Uuid::new_v4().to_string();
let log_entry = serde_json::json!({
"id": call_id,
@@ -118,9 +122,9 @@ impl CHORUSAgent {
});
let _ = self.graph.insert_node("api_call_log", log_entry);
// 2. Perform the actual API call (simulated opencode call for now)
// In a real scenario, we check the result of `Command::new("opencode")...`
let success = true; // Placeholder for real logic
// 3. Perform the actual API call (simulated opencode call for now)
// If the command returned an exit code indicating rate limit (e.g. 429)
let success = true;
if success {
let _ = self.graph.commit(&format!("API Call Success: {}", call_id));
@@ -131,7 +135,7 @@ impl CHORUSAgent {
return "Error: Maximum thinking attempts reached.".into();
}
// 3. Jittered Exponential Backoff
// 4. Jittered Exponential Backoff
let jitter = rand::thread_rng().gen_range(0..1000);
let delay = base_delay.mul_f64(2.0_f64.powi(attempts - 1)) + Duration::from_millis(jitter);