def handle_error_response(self, rbody, rcode, resp, rheaders, stream_error=False): try: error_data = resp["error"] except (KeyError, TypeError): raise error.APIError( "Invalid response object from API: %r (HTTP response code " "was %d)" % (rbody, rcode), rbody, rcode, resp, ) if "internal_message" in error_data: error_data["message"] += "\n\n" + error_data["internal_message"] util.log_info( "OpenAI API error received", error_code=error_data.get("code"), error_type=error_data.get("type"), error_message=error_data.get("message"), error_param=error_data.get("param"), stream_error=stream_error, ) # Rate limits were previously coded as 400's with code 'rate_limit' if rcode == 429: return error.RateLimitError( error_data.get("message"), rbody, rcode, resp, rheaders ) elif rcode in [400, 404, 415]: return error.InvalidRequestError( error_data.get("message"), error_data.get("param"), error_data.get("code"), rbody, rcode, resp, rheaders, ) elif rcode == 401: return error.AuthenticationError( error_data.get("message"), rbody, rcode, resp, rheaders ) elif rcode == 403: return error.PermissionError( error_data.get("message"), rbody, rcode, resp, rheaders ) elif rcode == 409: return error.TryAgain( error_data.get("message"), rbody, rcode, resp, rheaders ) elif stream_error: # TODO: we will soon attach status codes to stream errors parts = [error_data.get("message"), "(Error occurred while streaming.)"] message = " ".join([p for p in parts if p is not None]) return error.APIError(message, rbody, rcode, resp, rheaders) else: return error.APIError( error_data.get("message"), rbody, rcode, resp, rheaders )
def request_raw( self, method, url, params=None, supplied_headers=None, stream=False ): """ Mechanism for issuing an API call """ if self.api_key: my_api_key = self.api_key else: from openai import api_key my_api_key = api_key if my_api_key is None: raise error.AuthenticationError( "No API key provided. (HINT: set your API key using in code using " '"openai.api_key = <API-KEY>", or you can set the environment variable OPENAI_API_KEY=<API-KEY>). You can generate API keys ' "in the OpenAI web interface. See https://onboard.openai.com " "for details, or email [email protected] if you have any " "questions." ) abs_url = "%s%s" % (self.api_base, url) headers = {} compress = None progress_meter = False if method == "get" or method == "delete": if params: encoded_params = url_encode_params(params) abs_url = _build_api_url(abs_url, encoded_params) else: encoded_params = None post_data = None elif method in {"post", "put"}: if ( supplied_headers is not None and supplied_headers.get("Content-Type") == "multipart/form-data" ): generator = MultipartDataGenerator() generator.add_params(params or {}) post_data = generator.get_post_data() content_type = "multipart/form-data; boundary=%s" % ( generator.boundary, ) # We will overrite Content-Type supplied_headers.pop("Content-Type") progress_meter = True # compress = "gzip" compress = None else: post_data = json.dumps(params).encode() content_type = "application/json" headers["Content-Type"] = content_type encoded_params = post_data if progress_meter: post_data = BufferReader(post_data, desc="Upload progress") if compress == "gzip": if not hasattr(post_data, "read"): post_data = BytesIO(post_data) headers["Content-Encoding"] = "gzip" from openai.gzip_stream import GZIPCompressedStream post_data = GZIPCompressedStream(post_data, compression_level=9) else: raise error.APIConnectionError( "Unrecognized HTTP method %r. This may indicate a bug in the " "OpenAI bindings. Please contact [email protected] for " "assistance." % (method,) ) headers = self.request_headers(my_api_key, method, headers) if supplied_headers is not None: for key, value in six.iteritems(supplied_headers): headers[key] = value util.log_info("Request to OpenAI API", method=method, path=abs_url) util.log_debug( "Post details", post_data=encoded_params, api_version=self.api_version ) rbody, rcode, rheaders, stream = self._client.request_with_retries( method, abs_url, headers, post_data, stream=stream ) util.log_info( "OpenAI API response", path=abs_url, response_code=rcode, processing_ms=rheaders.get("OpenAI-Processing-Ms"), ) util.log_debug("API response body", body=rbody, headers=rheaders) if "Request-Id" in rheaders: request_id = rheaders["Request-Id"] util.log_debug( "Dashboard link for request", link=util.dashboard_link(request_id) ) return rbody, rcode, rheaders, stream, my_api_key