Skip to content

Commit 31d11ce

Browse files
committed
use retry after if present in header
1 parent 9a61c41 commit 31d11ce

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

async-openai/src/client.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::pin::Pin;
1+
use std::{pin::Pin, time::Duration};
22

33
use bytes::Bytes;
44
use futures::{stream::StreamExt, Stream};
@@ -360,6 +360,13 @@ impl<C: Config> Client<C> {
360360
.map_err(OpenAIError::Reqwest)
361361
.map_err(backoff::Error::Permanent)?;
362362

363+
let retry_after = response
364+
.headers()
365+
.get("retry-after")
366+
.and_then(|h| h.to_str().ok())
367+
.and_then(|s| s.parse::<u64>().ok())
368+
.map(Duration::from_secs);
369+
363370
let status = response.status();
364371

365372
match read_response(response).await {
@@ -370,7 +377,7 @@ impl<C: Config> Client<C> {
370377
if status.is_server_error() {
371378
Err(backoff::Error::Transient {
372379
err: OpenAIError::ApiError(api_error),
373-
retry_after: None,
380+
retry_after,
374381
})
375382
} else if status.as_u16() == 429
376383
&& api_error.r#type != Some("insufficient_quota".to_string())
@@ -379,7 +386,7 @@ impl<C: Config> Client<C> {
379386
tracing::warn!("Rate limited: {}", api_error.message);
380387
Err(backoff::Error::Transient {
381388
err: OpenAIError::ApiError(api_error),
382-
retry_after: None,
389+
retry_after,
383390
})
384391
} else {
385392
Err(backoff::Error::Permanent(OpenAIError::ApiError(api_error)))

0 commit comments

Comments
 (0)