|
19 | 19 | _T = TypeVar("_T") |
20 | 20 |
|
21 | 21 |
|
| 22 | +def _raise_if_stream_error(data: object, response: httpx.Response) -> None: |
| 23 | + if is_mapping(data) and data.get("error"): |
| 24 | + message = None |
| 25 | + error = data.get("error") |
| 26 | + if is_mapping(error): |
| 27 | + message = error.get("message") |
| 28 | + if not message or not isinstance(message, str): |
| 29 | + message = "An error occurred during streaming" |
| 30 | + |
| 31 | + raise APIError( |
| 32 | + message=message, |
| 33 | + request=response.request, |
| 34 | + body=data["error"], |
| 35 | + ) |
| 36 | + |
| 37 | + |
22 | 38 | class Stream(Generic[_T]): |
23 | 39 | """Provides the core interface to iterate over a synchronous stream response.""" |
24 | 40 |
|
@@ -64,36 +80,12 @@ def __stream__(self) -> Iterator[_T]: |
64 | 80 | if sse.event and sse.event.startswith("thread."): |
65 | 81 | data = sse.json() |
66 | 82 |
|
67 | | - if sse.event == "error" and is_mapping(data) and data.get("error"): |
68 | | - message = None |
69 | | - error = data.get("error") |
70 | | - if is_mapping(error): |
71 | | - message = error.get("message") |
72 | | - if not message or not isinstance(message, str): |
73 | | - message = "An error occurred during streaming" |
74 | | - |
75 | | - raise APIError( |
76 | | - message=message, |
77 | | - request=self.response.request, |
78 | | - body=data["error"], |
79 | | - ) |
| 83 | + _raise_if_stream_error(data, response) |
80 | 84 |
|
81 | 85 | yield process_data(data={"data": data, "event": sse.event}, cast_to=cast_to, response=response) |
82 | 86 | else: |
83 | 87 | data = sse.json() |
84 | | - if is_mapping(data) and data.get("error"): |
85 | | - message = None |
86 | | - error = data.get("error") |
87 | | - if is_mapping(error): |
88 | | - message = error.get("message") |
89 | | - if not message or not isinstance(message, str): |
90 | | - message = "An error occurred during streaming" |
91 | | - |
92 | | - raise APIError( |
93 | | - message=message, |
94 | | - request=self.response.request, |
95 | | - body=data["error"], |
96 | | - ) |
| 88 | + _raise_if_stream_error(data, response) |
97 | 89 |
|
98 | 90 | yield process_data(data=data, cast_to=cast_to, response=response) |
99 | 91 |
|
@@ -167,36 +159,12 @@ async def __stream__(self) -> AsyncIterator[_T]: |
167 | 159 | if sse.event and sse.event.startswith("thread."): |
168 | 160 | data = sse.json() |
169 | 161 |
|
170 | | - if sse.event == "error" and is_mapping(data) and data.get("error"): |
171 | | - message = None |
172 | | - error = data.get("error") |
173 | | - if is_mapping(error): |
174 | | - message = error.get("message") |
175 | | - if not message or not isinstance(message, str): |
176 | | - message = "An error occurred during streaming" |
177 | | - |
178 | | - raise APIError( |
179 | | - message=message, |
180 | | - request=self.response.request, |
181 | | - body=data["error"], |
182 | | - ) |
| 162 | + _raise_if_stream_error(data, response) |
183 | 163 |
|
184 | 164 | yield process_data(data={"data": data, "event": sse.event}, cast_to=cast_to, response=response) |
185 | 165 | else: |
186 | 166 | data = sse.json() |
187 | | - if is_mapping(data) and data.get("error"): |
188 | | - message = None |
189 | | - error = data.get("error") |
190 | | - if is_mapping(error): |
191 | | - message = error.get("message") |
192 | | - if not message or not isinstance(message, str): |
193 | | - message = "An error occurred during streaming" |
194 | | - |
195 | | - raise APIError( |
196 | | - message=message, |
197 | | - request=self.response.request, |
198 | | - body=data["error"], |
199 | | - ) |
| 167 | + _raise_if_stream_error(data, response) |
200 | 168 |
|
201 | 169 | yield process_data(data=data, cast_to=cast_to, response=response) |
202 | 170 |
|
|
0 commit comments