1+ from email .utils import parsedate_to_datetime
12from json import JSONDecodeError
3+ from time import time
24from typing import Any , Literal , Optional , Union
35
46from httpx import Response
5355 # The request was invalid
5456 "bad_request" ,
5557 "invalid_file" ,
58+ "connection_error" ,
5659 ],
5760 str , # Using as a fallback to avoid validation error if an error code is added to the API
5861]
@@ -70,11 +73,34 @@ class ErrorResponse(BaseModel):
7073 task_run_id : Optional [str ] = None
7174
7275
76+ def _retry_after_to_delay_seconds (retry_after : Any ) -> Optional [float ]:
77+ if retry_after is None :
78+ return None
79+
80+ try :
81+ return float (retry_after )
82+ except ValueError :
83+ pass
84+ try :
85+ retry_after_date = parsedate_to_datetime (retry_after )
86+ current_time = time ()
87+ return retry_after_date .timestamp () - current_time
88+ except (TypeError , ValueError , OverflowError ):
89+ return None
90+
91+
7392class WorkflowAIError (Exception ):
74- def __init__ (self , response : Optional [Response ], error : BaseError , task_run_id : Optional [str ] = None ):
93+ def __init__ (
94+ self ,
95+ response : Optional [Response ],
96+ error : BaseError ,
97+ task_run_id : Optional [str ] = None ,
98+ retry_after_delay_seconds : Optional [float ] = None ,
99+ ):
75100 self .error = error
76101 self .task_run_id = task_run_id
77102 self .response = response
103+ self ._retry_after_delay_seconds = retry_after_delay_seconds
78104
79105 def __str__ (self ):
80106 return f"WorkflowAIError : [{ self .error .code } ] ({ self .error .status_code } ): [{ self .error .message } ]"
@@ -106,3 +132,13 @@ def from_response(cls, response: Response):
106132 ),
107133 task_run_id = task_run_id ,
108134 )
135+
136+ @property
137+ def retry_after_delay_seconds (self ) -> Optional [float ]:
138+ if self ._retry_after_delay_seconds :
139+ return self ._retry_after_delay_seconds
140+
141+ if self .response :
142+ return _retry_after_to_delay_seconds (self .response .headers .get ("Retry-After" ))
143+
144+ return None
0 commit comments