Skip to content

Commit 61f5260

Browse files
authored
Nicer errors under the capture_run_messages context (#2219)
1 parent 8f63ba3 commit 61f5260

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

pydantic_ai_slim/pydantic_ai/_agent_graph.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -815,14 +815,21 @@ def capture_run_messages() -> Iterator[list[_messages.ModelMessage]]:
815815
If you call `run`, `run_sync`, or `run_stream` more than once within a single `capture_run_messages` context,
816816
`messages` will represent the messages exchanged during the first call only.
817817
"""
818+
token = None
819+
messages: list[_messages.ModelMessage] = []
820+
821+
# Try to reuse existing message context if available
818822
try:
819-
yield _messages_ctx_var.get().messages
823+
messages = _messages_ctx_var.get().messages
820824
except LookupError:
821-
messages: list[_messages.ModelMessage] = []
825+
# No existing context, create a new one
822826
token = _messages_ctx_var.set(_RunMessages(messages))
823-
try:
824-
yield messages
825-
finally:
827+
828+
try:
829+
yield messages
830+
finally:
831+
# Clean up context if we created it
832+
if token is not None:
826833
_messages_ctx_var.reset(token)
827834

828835

tests/test_agent.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2673,6 +2673,18 @@ def test_double_capture_run_messages() -> None:
26732673
)
26742674

26752675

2676+
def test_capture_run_messages_with_user_exception_does_not_contain_internal_errors() -> None:
2677+
"""Test that user exceptions within capture_run_messages context have clean stack traces."""
2678+
agent = Agent('test')
2679+
2680+
try:
2681+
with capture_run_messages():
2682+
agent.run_sync('Hello')
2683+
raise ZeroDivisionError('division by zero')
2684+
except Exception as e:
2685+
assert e.__context__ is None
2686+
2687+
26762688
def test_dynamic_false_no_reevaluate():
26772689
"""When dynamic is false (default), the system prompt is not reevaluated
26782690
i.e: SystemPromptPart(

0 commit comments

Comments
 (0)