(self)
| 53 | yield from self._decoder.iter_bytes(self.response.iter_bytes()) |
| 54 | |
| 55 | def __stream__(self) -> Iterator[_T]: |
| 56 | cast_to = cast(Any, self._cast_to) |
| 57 | response = self.response |
| 58 | process_data = self._client._process_response_data |
| 59 | iterator = self._iter_events() |
| 60 | |
| 61 | try: |
| 62 | for sse in iterator: |
| 63 | if sse.data.startswith("[DONE]"): |
| 64 | break |
| 65 | |
| 66 | # we have to special case the Assistants `thread.` events since we won't have an "event" key in the data |
| 67 | if sse.event and sse.event.startswith("thread."): |
| 68 | data = sse.json() |
| 69 | |
| 70 | if sse.event == "error" and is_mapping(data) and data.get("error"): |
| 71 | message = None |
| 72 | error = data.get("error") |
| 73 | if is_mapping(error): |
| 74 | message = error.get("message") |
| 75 | if not message or not isinstance(message, str): |
| 76 | message = "An error occurred during streaming" |
| 77 | |
| 78 | raise APIError( |
| 79 | message=message, |
| 80 | request=self.response.request, |
| 81 | body=data["error"], |
| 82 | ) |
| 83 | |
| 84 | yield process_data(data={"data": data, "event": sse.event}, cast_to=cast_to, response=response) |
| 85 | else: |
| 86 | data = sse.json() |
| 87 | if is_mapping(data) and data.get("error"): |
| 88 | message = None |
| 89 | error = data.get("error") |
| 90 | if is_mapping(error): |
| 91 | message = error.get("message") |
| 92 | if not message or not isinstance(message, str): |
| 93 | message = "An error occurred during streaming" |
| 94 | |
| 95 | raise APIError( |
| 96 | message=message, |
| 97 | request=self.response.request, |
| 98 | body=data["error"], |
| 99 | ) |
| 100 | |
| 101 | yield process_data( |
| 102 | data={"data": data, "event": sse.event} |
| 103 | if self._options is not None and self._options.synthesize_event_and_data |
| 104 | else data, |
| 105 | cast_to=cast_to, |
| 106 | response=response, |
| 107 | ) |
| 108 | finally: |
| 109 | # Ensure the response is closed even if the consumer doesn't read all data |
| 110 | response.close() |
| 111 | |
| 112 | def __enter__(self) -> Self: |
no test coverage detected