From 372257924bece8f8d1ffabe866af9d3eafbc6193 Mon Sep 17 00:00:00 2001 From: Jordan Wu <101218661+jordan-wu-97@users.noreply.github.com> Date: Tue, 3 Sep 2024 12:11:50 -0700 Subject: [PATCH 1/2] feat(internal): handle streaming error (#119) Co-authored-by: Jordan Wu <101218661+jordan-definitive@users.noreply.github.com> --- src/groq/_streaming.py | 79 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/groq/_streaming.py b/src/groq/_streaming.py index 73cf6841..01defb2a 100755 --- a/src/groq/_streaming.py +++ b/src/groq/_streaming.py @@ -9,7 +9,8 @@ import httpx -from ._utils import extract_type_var_from_base +from ._utils import is_mapping, extract_type_var_from_base +from ._exceptions import APIError if TYPE_CHECKING: from ._client import Groq, AsyncGroq @@ -57,7 +58,43 @@ def __stream__(self) -> Iterator[_T]: for sse in iterator: if sse.data.startswith("[DONE]"): break - yield process_data(data=sse.json(), cast_to=cast_to, response=response) + + if sse.event is None: + data = sse.json() + if is_mapping(data) and data.get("error"): + message = None + error = data.get("error") + if is_mapping(error): + message = error.get("message") + if not message or not isinstance(message, str): + message = "An error occurred during streaming" + + raise APIError( + message=message, + request=self.response.request, + body=data["error"], + ) + + yield process_data(data=data, cast_to=cast_to, response=response) + + else: + data = sse.json() + + if sse.event == "error" and is_mapping(data) and data.get("error"): + message = None + error = data.get("error") + if is_mapping(error): + message = error.get("message") + if not message or not isinstance(message, str): + message = "An error occurred during streaming" + + raise APIError( + message=message, + request=self.response.request, + body=data["error"], + ) + + yield process_data(data={"data": data, "event": sse.event}, cast_to=cast_to, response=response) # Ensure the entire stream is consumed for _sse in iterator: @@ -123,7 +160,43 @@ async def __stream__(self) -> AsyncIterator[_T]: async for sse in iterator: if sse.data.startswith("[DONE]"): break - yield process_data(data=sse.json(), cast_to=cast_to, response=response) + + if sse.event is None: + data = sse.json() + if is_mapping(data) and data.get("error"): + message = None + error = data.get("error") + if is_mapping(error): + message = error.get("message") + if not message or not isinstance(message, str): + message = "An error occurred during streaming" + + raise APIError( + message=message, + request=self.response.request, + body=data["error"], + ) + + yield process_data(data=data, cast_to=cast_to, response=response) + + else: + data = sse.json() + + if sse.event == "error" and is_mapping(data) and data.get("error"): + message = None + error = data.get("error") + if is_mapping(error): + message = error.get("message") + if not message or not isinstance(message, str): + message = "An error occurred during streaming" + + raise APIError( + message=message, + request=self.response.request, + body=data["error"], + ) + + yield process_data(data={"data": data, "event": sse.event}, cast_to=cast_to, response=response) # Ensure the entire stream is consumed async for _sse in iterator: From e60b69ebef36fb8ab9b2761e7fb7e03cbb9c2a1f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 19:12:04 +0000 Subject: [PATCH 2/2] release: 0.11.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- src/groq/_version.py | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 091cfb12..f7014c35 100755 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.10.0" + ".": "0.11.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index cf9f3c8d..aee292b2 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.11.0 (2024-09-03) + +Full Changelog: [v0.10.0...v0.11.0](https://github.com/groq/groq-python/compare/v0.10.0...v0.11.0) + +### Features + +* **internal:** handle streaming error ([#119](https://github.com/groq/groq-python/issues/119)) ([3722579](https://github.com/groq/groq-python/commit/372257924bece8f8d1ffabe866af9d3eafbc6193)) + ## 0.10.0 (2024-08-27) Full Changelog: [v0.9.0...v0.10.0](https://github.com/groq/groq-python/compare/v0.9.0...v0.10.0) diff --git a/pyproject.toml b/pyproject.toml index d1e5b902..9196a481 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "groq" -version = "0.10.0" +version = "0.11.0" description = "The official Python library for the groq API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/groq/_version.py b/src/groq/_version.py index a1ef95d5..653c26fe 100755 --- a/src/groq/_version.py +++ b/src/groq/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "groq" -__version__ = "0.10.0" # x-release-please-version +__version__ = "0.11.0" # x-release-please-version