Skip to content

Commit 6472b19

Browse files
improved logging
1 parent 35bd2d3 commit 6472b19

File tree

2 files changed

+25
-20
lines changed

2 files changed

+25
-20
lines changed

src/cohere/core/http_sse/_models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing import Any, Optional
44

55

6-
@dataclass
6+
@dataclass(frozen=True)
77
class ServerSentEvent:
88
event: str = "message"
99
data: str = ""

src/cohere/v2/raw_client.py

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import contextlib
44
from dataclasses import asdict
55
import json
6+
import logging
67
import typing
78
from json.decoder import JSONDecodeError
89

@@ -45,6 +46,8 @@
4546
from .types.v2embed_request_truncate import V2EmbedRequestTruncate
4647
from .types.v2rerank_response import V2RerankResponse
4748

49+
logger = logging.getLogger(__name__)
50+
4851
# this is used as the default value for optional parameters
4952
OMIT = typing.cast(typing.Any, ...)
5053

@@ -236,11 +239,17 @@ def _iter():
236239
),
237240
)
238241
except json.JSONDecodeError as e:
239-
print(f"JSON decode error: {e}, data: {repr(_sse.data)}")
240-
continue
242+
logger.warning(
243+
f"Skipping SSE event with invalid JSON: {e}, sse: {_sse!r}"
244+
)
245+
except (TypeError, ValueError, KeyError, AttributeError) as e:
246+
logger.warning(
247+
f"Skipping SSE event due to model construction error: {type(e).__name__}: {e}, sse: {_sse!r}"
248+
)
241249
except Exception as e:
242-
print(f"Parsing error: {e}, event: {_sse.event}, data: {repr(_sse.data)}")
243-
continue
250+
logger.error(
251+
f"Unexpected error processing SSE event: {type(e).__name__}: {e}, sse: {_sse!r}"
252+
)
244253

245254
return
246255

@@ -1327,29 +1336,25 @@ async def _iter():
13271336
_event_source = EventSource(_response)
13281337
async for _sse in _event_source.aiter_sse():
13291338
try:
1330-
# Skip empty events
1331-
if not _sse.data or _sse.data.strip() == "":
1332-
continue
1333-
1334-
# Handle [DONE] token from OpenAI-style APIs
1335-
if _sse.data.strip() == '[DONE]':
1336-
continue
1337-
1338-
parsed_data = json.loads(_sse.data)
1339-
13401339
yield typing.cast(
13411340
V2ChatStreamResponse,
13421341
construct_type(
13431342
type_=V2ChatStreamResponse, # type: ignore
1344-
object_=parsed_data,
1343+
object_=_sse.json(),
13451344
),
13461345
)
13471346
except json.JSONDecodeError as e:
1348-
print(f"JSON decode error: {e}, data: {repr(_sse.data)}")
1349-
continue
1347+
logger.warning(
1348+
f"Skipping SSE event with invalid JSON: {e}, sse: {_sse!r}"
1349+
)
1350+
except (TypeError, ValueError, KeyError, AttributeError) as e:
1351+
logger.warning(
1352+
f"Skipping SSE event due to model construction error: {type(e).__name__}: {e}, sse: {_sse!r}"
1353+
)
13501354
except Exception as e:
1351-
print(f"Parsing error: {e}, event: {_sse.event}, data: {repr(_sse.data)}")
1352-
continue
1355+
logger.error(
1356+
f"Unexpected error processing SSE event: {type(e).__name__}: {e}, sse: {_sse!r}"
1357+
)
13531358

13541359
return
13551360

0 commit comments

Comments
 (0)