3
3
import threading
4
4
import warnings
5
5
from json import JSONDecodeError
6
- from typing import Dict , Iterator , Optional , Tuple , Union
6
+ from typing import Dict , Iterator , Optional , Tuple , Union , overload
7
7
from urllib .parse import urlencode , urlsplit , urlunsplit
8
8
9
9
import requests
10
+ from typing_extensions import Literal
10
11
11
12
import openai
12
13
from openai import error , util , version
@@ -99,15 +100,73 @@ def format_app_info(cls, info):
99
100
str += " (%s)" % (info ["url" ],)
100
101
return str
101
102
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
+
102
160
def request (
103
161
self ,
104
162
method ,
105
163
url ,
106
164
params = None ,
107
165
headers = None ,
108
166
files = None ,
109
- stream = False ,
167
+ stream : bool = False ,
110
168
request_id : Optional [str ] = None ,
169
+ request_timeout : Optional [Union [float , Tuple [float , float ]]] = None ,
111
170
) -> Tuple [Union [OpenAIResponse , Iterator [OpenAIResponse ]], bool , str ]:
112
171
result = self .request_raw (
113
172
method .lower (),
@@ -117,6 +176,7 @@ def request(
117
176
files = files ,
118
177
stream = stream ,
119
178
request_id = request_id ,
179
+ request_timeout = request_timeout ,
120
180
)
121
181
resp , got_stream = self ._interpret_response (result , stream )
122
182
return resp , got_stream , self .api_key
@@ -179,7 +239,11 @@ def handle_error_response(self, rbody, rcode, resp, rheaders, stream_error=False
179
239
return error .APIError (message , rbody , rcode , resp , rheaders )
180
240
else :
181
241
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 ,
183
247
)
184
248
185
249
def request_headers (
@@ -256,6 +320,7 @@ def request_raw(
256
320
files = None ,
257
321
stream : bool = False ,
258
322
request_id : Optional [str ] = None ,
323
+ request_timeout : Optional [Union [float , Tuple [float , float ]]] = None ,
259
324
) -> requests .Response :
260
325
abs_url = "%s%s" % (self .api_base , url )
261
326
headers = self ._validate_headers (supplied_headers )
@@ -295,15 +360,18 @@ def request_raw(
295
360
data = data ,
296
361
files = files ,
297
362
stream = stream ,
298
- timeout = TIMEOUT_SECS ,
363
+ timeout = request_timeout if request_timeout else TIMEOUT_SECS ,
299
364
)
365
+ except requests .exceptions .Timeout as e :
366
+ raise error .Timeout ("Request timed out" ) from e
300
367
except requests .exceptions .RequestException as e :
301
368
raise error .APIConnectionError ("Error communicating with OpenAI" ) from e
302
369
util .log_info (
303
370
"OpenAI API response" ,
304
371
path = abs_url ,
305
372
response_code = result .status_code ,
306
373
processing_ms = result .headers .get ("OpenAI-Processing-Ms" ),
374
+ request_id = result .headers .get ("X-Request-Id" ),
307
375
)
308
376
# Don't read the whole stream for debug logging unless necessary.
309
377
if openai .log == "debug" :
0 commit comments