1- use std:: pin:: Pin ;
1+ use std:: { pin:: Pin , time :: Duration } ;
22
33use bytes:: Bytes ;
44use 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