Skip to content

Commit eaa6227

Browse files
Update the files
1 parent 64bd5e5 commit eaa6227

3 files changed

Lines changed: 51 additions & 19 deletions

File tree

workflowai/core/client/api.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import json
1+
from json import JSONDecodeError
22
from typing import Any, AsyncIterator, Literal, Optional, TypeVar, Union, overload
33

44
import httpx
@@ -91,13 +91,9 @@ async def delete(self, path: str) -> None:
9191

9292
def _extract_error(self, data: Union[bytes, str], exception: Optional[Exception] = None) -> WorkflowAIError:
9393
try:
94-
data_dict = json.loads(data)
95-
if next(iter(data_dict.keys())) == "detail":
96-
data_dict = {"error": {"detail": data_dict["detail"]}}
97-
data = json.dumps(data_dict)
9894
res = ErrorResponse.model_validate_json(data)
9995
return WorkflowAIError(res.error, task_run_id=res.task_run_id)
100-
except ValidationError:
96+
except JSONDecodeError:
10197
raise WorkflowAIError(
10298
error=BaseError(
10399
message="Unknown error" if exception is None else str(exception),
@@ -129,5 +125,25 @@ async def stream(
129125
raise self._extract_error(payload, e) from None
130126

131127
async def raise_for_status(self, response: httpx.Response):
132-
if response.status_code != 200:
133-
raise self._extract_error(response.content) from None
128+
if response.status_code < 200 and response.status_code >= 300:
129+
try:
130+
response_json = response.json()
131+
r_error = response_json.get("error",{})
132+
error_message = response_json.get("detail", {}) or r_error.get("message", "Unknown Error")
133+
details = r_error.get("details", {})
134+
error_code = r_error.get("code", "unknown_error")
135+
status_code = r_error.get("status_code", response.status_code)
136+
except JSONDecodeError:
137+
error_message = "Unknown error"
138+
details = {"raw": response.content.decode()}
139+
error_code ="unknown_error"
140+
status_code = response.status_code
141+
142+
raise WorkflowAIError(
143+
error=BaseError(
144+
message=error_message,
145+
details=details,
146+
status_code=status_code,
147+
code=error_code,
148+
),
149+
) from None

workflowai/core/client/utils.py

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
import asyncio
55
import re
66
from email.utils import parsedate_to_datetime
7+
from json import JSONDecodeError
78
from time import time
89
from typing import Any, Optional
910

1011
from httpx import HTTPStatusError
1112

13+
from workflowai.core.domain.errors import BaseError, WorkflowAIError
14+
1215
delimiter = re.compile(r'\}\n\ndata: \{"')
1316

1417

@@ -61,8 +64,29 @@ async def _wait_for_exception(e: HTTPStatusError):
6164
retry_after = retry_after_to_delay_seconds(e.response.headers.get("Retry-After"))
6265
leftover_delay = _leftover_delay()
6366
if not retry_after or leftover_delay < 0 or retry_count >= max_retry_count:
64-
# TODO: convert error to WorkflowAIError
65-
raise e
67+
# Convert error to WorkflowAIError
68+
try:
69+
response_json = e.response.json()
70+
r_err = response_json.get("error", {})
71+
error_message = response_json.get("detail", {}) or r_err.get("message", "Unknown Error")
72+
details = r_err.get("details", {})
73+
error_code = r_err.get("code", "unknown_error")
74+
status_code = r_err.get("status_code", e.response.status_code)
75+
except JSONDecodeError:
76+
error_message = "Unknown error"
77+
details = {"raw": e.response.content.decode()}
78+
error_code = "unknown_error"
79+
status_code = e.response.status_code
80+
81+
raise WorkflowAIError(
82+
error=BaseError(
83+
message=error_message,
84+
details=details,
85+
status_code=status_code,
86+
code=error_code,
87+
),
88+
) from None
89+
6690
await asyncio.sleep(retry_after)
6791
retry_count += 1
6892

workflowai/core/domain/errors.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import json
21
from typing import Any, Literal, Optional, Union
32

43
from pydantic import BaseModel
@@ -74,11 +73,4 @@ def __init__(self, error: BaseError, task_run_id: Optional[str] = None):
7473
self.task_run_id = task_run_id
7574

7675
def __str__(self):
77-
error_dict = {
78-
"message": self.error.message,
79-
"code": self.error.code,
80-
"status_code": self.error.status_code,
81-
"details": self.error.details,
82-
"task_run_id": self.task_run_id,
83-
}
84-
return f"WorkflowAIError : {json.dumps(error_dict, indent=4)}, Task Run ID : {self.task_run_id}"
76+
return f"WorkflowAIError : [{self.error.code}] ({self.error.status_code}): [{self.error.message}]"

0 commit comments

Comments
 (0)