aboutsummaryrefslogtreecommitdiff
path: root/gn3/llms/errors.py
blob: e9f7c02e8ffcc18348dcbf95b61a8724279e7b65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# pylint: skip-file
import json

from requests import HTTPError


class UnprocessableEntity(HTTPError):
    """An HTTP 422 Unprocessable Entity error occurred.

    https://help.helpjuice.com/en_US/api-v3/api-v3#errors

    The request could not be processed, usually due to a missing or invalid parameter.

    The response will also include an error object with an explanation of fields that
    are missing or invalid. Here is an example:

    .. code-block::

        HTTP/1.1 422 Unprocessable Entity


        {
          "errors": [
            {
              "email": "is not valid."
            }
          ]
        }
    """

    def __init__(self, request, response):
        """UnprocessableEntity constructor.

        Parses out error information from the error object and passes on to the
        :obj:`HTTPError` constructor.

        Args:
            exc (:obj:`HTTPError`): Original exception.
        """
        rq_json = next(iter(json.loads(request.body.decode()).values()))
        errors = response.json()

        for field, error in errors.items():
            rq_field = rq_json.get(field, None)
            if not rq_field:
                continue

            if isinstance(error, list):
                error = error.insert(0, rq_field)
            elif isinstance(error, str):
                error = f"{rq_field} {error}"

        msg = json.dumps(errors)
        super(HTTPError, self).__init__(
            msg, request=request, response=response)


class LLMError(HTTPError):
    def __init__(self, request, response, msg):
        super(HTTPError, self).__init__(
            msg, request=request, response=response)