Skip to content

Commit 63ce719

Browse files
authored
Merge branch 'main' into dev/dotnet_workflow/add_handoff_sample
2 parents f7a9a97 + 64c68ca commit 63ce719

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

python/packages/core/agent_framework/_types.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2816,6 +2816,7 @@ def __init__(
28162816
cleanup_hooks if cleanup_hooks is not None else []
28172817
)
28182818
self._cleanup_run: bool = False
2819+
self._stream_error: Exception | None = None
28192820
self._inner_stream: ResponseStream[Any, Any] | None = None
28202821
self._inner_stream_source: ResponseStream[Any, Any] | Awaitable[ResponseStream[Any, Any]] | None = None
28212822
self._wrap_inner: bool = False
@@ -2948,8 +2949,12 @@ async def __anext__(self) -> UpdateT:
29482949
await self._run_cleanup_hooks()
29492950
await self.get_final_response()
29502951
raise
2951-
except Exception:
2952-
await self._run_cleanup_hooks()
2952+
except Exception as exc:
2953+
self._stream_error = exc
2954+
try:
2955+
await self._run_cleanup_hooks()
2956+
finally:
2957+
self._stream_error = None
29532958
raise
29542959
if self._map_update is not None:
29552960
update = self._map_update(update) # type: ignore[assignment]

python/packages/core/agent_framework/observability.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,6 +1323,12 @@ async def _finalize_stream() -> None:
13231323
from ._types import ChatResponse
13241324

13251325
try:
1326+
if result_stream._stream_error is not None: # pyright: ignore[reportPrivateUsage]
1327+
# Stream errored; skip get_final_response() to avoid firing
1328+
# result hooks such as after_run context providers on error
1329+
# paths. Capture the error on the span before returning.
1330+
capture_exception(span=span, exception=result_stream._stream_error, timestamp=time_ns()) # pyright: ignore[reportPrivateUsage]
1331+
return
13261332
response: ChatResponse[Any] = await result_stream.get_final_response()
13271333
duration = duration_state.get("duration")
13281334
response_attributes = _get_response_attributes(attributes, response)
@@ -1579,6 +1585,12 @@ async def _finalize_stream() -> None:
15791585
from ._types import AgentResponse
15801586

15811587
try:
1588+
if result_stream._stream_error is not None: # pyright: ignore[reportPrivateUsage]
1589+
# Stream errored; skip get_final_response() to avoid firing
1590+
# result hooks such as after_run context providers on error
1591+
# paths. Capture the error on the span before returning.
1592+
capture_exception(span=span, exception=result_stream._stream_error, timestamp=time_ns()) # pyright: ignore[reportPrivateUsage]
1593+
return
15821594
response: AgentResponse[Any] = await result_stream.get_final_response()
15831595
duration = duration_state.get("duration")
15841596
response_attributes = _get_response_attributes(

0 commit comments

Comments
 (0)