33import threading
44import warnings
55from json import JSONDecodeError
6- from typing import Dict , Iterator , Optional , Tuple , Union
6+ from typing import Dict , Iterator , Optional , Tuple , Union , overload
77from urllib .parse import urlencode , urlsplit , urlunsplit
88
99import requests
10+ from typing_extensions import Literal
1011
1112import openai
1213from openai import error , util , version
@@ -99,15 +100,73 @@ def format_app_info(cls, info):
99100 str += " (%s)" % (info ["url" ],)
100101 return str
101102
103+ @overload
104+ def request (
105+ self ,
106+ method ,
107+ url ,
108+ params ,
109+ headers ,
110+ files ,
111+ stream : Literal [True ],
112+ request_id : Optional [str ] = ...,
113+ request_timeout : Optional [Union [float , Tuple [float , float ]]] = ...,
114+ ) -> Tuple [Iterator [OpenAIResponse ], bool , str ]:
115+ pass
116+
117+ @overload
118+ def request (
119+ self ,
120+ method ,
121+ url ,
122+ params = ...,
123+ headers = ...,
124+ files = ...,
125+ * ,
126+ stream : Literal [True ],
127+ request_id : Optional [str ] = ...,
128+ request_timeout : Optional [Union [float , Tuple [float , float ]]] = ...,
129+ ) -> Tuple [Iterator [OpenAIResponse ], bool , str ]:
130+ pass
131+
132+ @overload
133+ def request (
134+ self ,
135+ method ,
136+ url ,
137+ params = ...,
138+ headers = ...,
139+ files = ...,
140+ stream : Literal [False ] = ...,
141+ request_id : Optional [str ] = ...,
142+ request_timeout : Optional [Union [float , Tuple [float , float ]]] = ...,
143+ ) -> Tuple [OpenAIResponse , bool , str ]:
144+ pass
145+
146+ @overload
147+ def request (
148+ self ,
149+ method ,
150+ url ,
151+ params = ...,
152+ headers = ...,
153+ files = ...,
154+ stream : bool = ...,
155+ request_id : Optional [str ] = ...,
156+ request_timeout : Optional [Union [float , Tuple [float , float ]]] = ...,
157+ ) -> Tuple [Union [OpenAIResponse , Iterator [OpenAIResponse ]], bool , str ]:
158+ pass
159+
102160 def request (
103161 self ,
104162 method ,
105163 url ,
106164 params = None ,
107165 headers = None ,
108166 files = None ,
109- stream = False ,
167+ stream : bool = False ,
110168 request_id : Optional [str ] = None ,
169+ request_timeout : Optional [Union [float , Tuple [float , float ]]] = None ,
111170 ) -> Tuple [Union [OpenAIResponse , Iterator [OpenAIResponse ]], bool , str ]:
112171 result = self .request_raw (
113172 method .lower (),
@@ -117,6 +176,7 @@ def request(
117176 files = files ,
118177 stream = stream ,
119178 request_id = request_id ,
179+ request_timeout = request_timeout ,
120180 )
121181 resp , got_stream = self ._interpret_response (result , stream )
122182 return resp , got_stream , self .api_key
@@ -179,7 +239,11 @@ def handle_error_response(self, rbody, rcode, resp, rheaders, stream_error=False
179239 return error .APIError (message , rbody , rcode , resp , rheaders )
180240 else :
181241 return error .APIError (
182- error_data .get ("message" ), rbody , rcode , resp , rheaders
242+ f"{ error_data .get ('message' )} { rbody } { rcode } { resp } { rheaders } " ,
243+ rbody ,
244+ rcode ,
245+ resp ,
246+ rheaders ,
183247 )
184248
185249 def request_headers (
@@ -256,6 +320,7 @@ def request_raw(
256320 files = None ,
257321 stream : bool = False ,
258322 request_id : Optional [str ] = None ,
323+ request_timeout : Optional [Union [float , Tuple [float , float ]]] = None ,
259324 ) -> requests .Response :
260325 abs_url = "%s%s" % (self .api_base , url )
261326 headers = self ._validate_headers (supplied_headers )
@@ -295,15 +360,18 @@ def request_raw(
295360 data = data ,
296361 files = files ,
297362 stream = stream ,
298- timeout = TIMEOUT_SECS ,
363+ timeout = request_timeout if request_timeout else TIMEOUT_SECS ,
299364 )
365+ except requests .exceptions .Timeout as e :
366+ raise error .Timeout ("Request timed out" ) from e
300367 except requests .exceptions .RequestException as e :
301368 raise error .APIConnectionError ("Error communicating with OpenAI" ) from e
302369 util .log_info (
303370 "OpenAI API response" ,
304371 path = abs_url ,
305372 response_code = result .status_code ,
306373 processing_ms = result .headers .get ("OpenAI-Processing-Ms" ),
374+ request_id = result .headers .get ("X-Request-Id" ),
307375 )
308376 # Don't read the whole stream for debug logging unless necessary.
309377 if openai .log == "debug" :
0 commit comments