Exemple #1
0
    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 _interpret_response_line(self, rbody, rcode, rheaders,
                              stream: bool) -> OpenAIResponse:
     if rcode == 503:
         raise error.ServiceUnavailableError(
             "The server is overloaded or not ready yet.",
             rbody,
             rcode,
             headers=rheaders)
     try:
         if hasattr(rbody, "decode"):
             rbody = rbody.decode("utf-8")
         data = json.loads(rbody)
     except (JSONDecodeError, UnicodeDecodeError):
         raise error.APIError(f"HTTP code {rcode} from API ({rbody})",
                              rbody,
                              rcode,
                              headers=rheaders)
     resp = OpenAIResponse(data, rheaders)
     # In the future, we might add a "status" parameter to errors
     # to better handle the "error while streaming" case.
     stream_error = stream and "error" in resp.data
     if stream_error or not 200 <= rcode < 300:
         raise self.handle_error_response(rbody,
                                          rcode,
                                          resp.data,
                                          rheaders,
                                          stream_error=stream_error)
     return resp
Exemple #3
0
    def interpret_response_line(self, rbody, rcode, rheaders, stream=False):
        try:
            if hasattr(rbody, "decode"):
                rbody = rbody.decode("utf-8")
            resp = OpenAIResponse(rbody, rcode, rheaders)
        except Exception:
            raise error.APIError(
                "Invalid response body from API: %s "
                "(HTTP response code was %d)" % (rbody, rcode),
                rbody,
                rcode,
                rheaders,
            )
        # In the future, we might add a "status" parameter to errors
        # to better handle the "error while streaming" case.
        stream_error = stream and "error" in resp.data
        if stream_error or not 200 <= rcode < 300:
            raise self.handle_error_response(
                rbody, rcode, resp.data, rheaders, stream_error=stream_error
            )

        return resp