feat: add retry for google (#1854)
This commit is contained in:
@@ -78,15 +78,49 @@ impl GoogleProvider {
|
|||||||
ProviderError::RequestFailed(format!("Failed to construct endpoint URL: {e}"))
|
ProviderError::RequestFailed(format!("Failed to construct endpoint URL: {e}"))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let response = self
|
let max_retries = 3;
|
||||||
.client
|
let mut retries = 0;
|
||||||
.post(url)
|
let base_delay = Duration::from_secs(2);
|
||||||
.header("CONTENT_TYPE", "application/json")
|
|
||||||
.json(&payload)
|
|
||||||
.send()
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
handle_response_google_compat(response).await
|
loop {
|
||||||
|
let response = self
|
||||||
|
.client
|
||||||
|
.post(url.clone()) // Clone the URL for each retry
|
||||||
|
.header("CONTENT_TYPE", "application/json")
|
||||||
|
.json(&payload)
|
||||||
|
.send()
|
||||||
|
.await;
|
||||||
|
|
||||||
|
match response {
|
||||||
|
Ok(res) => {
|
||||||
|
match handle_response_google_compat(res).await {
|
||||||
|
Ok(result) => return Ok(result),
|
||||||
|
Err(ProviderError::RateLimitExceeded(_)) => {
|
||||||
|
retries += 1;
|
||||||
|
if retries > max_retries {
|
||||||
|
return Err(ProviderError::RateLimitExceeded(
|
||||||
|
"Max retries exceeded for rate limit error".to_string(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let delay = 2u64.pow(retries);
|
||||||
|
let total_delay = Duration::from_secs(delay) + base_delay;
|
||||||
|
|
||||||
|
println!("Rate limit hit. Retrying in {:?}", total_delay);
|
||||||
|
tokio::time::sleep(total_delay).await;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Err(err) => return Err(err), // Other errors
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
return Err(ProviderError::RequestFailed(format!(
|
||||||
|
"Request failed: {}",
|
||||||
|
err
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user