Commit ba341eb
fix: handle missing usage metadata on premature Anthropic stream termination
When the Anthropic API stream terminates before sending the
message_stop event (e.g. network timeout, connection reset), the code
crashes with AttributeError because event.message.usage is None.
The stream() method unconditionally accessed event.message.usage after
the async iteration loop, assuming a complete stream. Two failure modes:
1. Empty stream: 'event' variable is never assigned (UnboundLocalError)
2. Premature termination: event.message or event.message.usage is None
Fix: Initialize event=None before the loop, use safe attribute access
via getattr() chain, and emit zero-usage metadata with a warning log
when usage data is unavailable.
Added two regression tests:
- test_stream_premature_termination: stream ends without message.usage
- test_stream_empty_no_events: completely empty stream
Fixes #18681 parent fca208b commit ba341eb
File tree
2 files changed
+61
-3
lines changed- src/strands/models
- tests/strands/models
2 files changed
+61
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
405 | 405 | | |
406 | 406 | | |
407 | 407 | | |
| 408 | + | |
408 | 409 | | |
409 | 410 | | |
410 | 411 | | |
411 | 412 | | |
412 | | - | |
413 | | - | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
414 | 424 | | |
415 | 425 | | |
416 | 426 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
739 | 739 | | |
740 | 740 | | |
741 | 741 | | |
742 | | - | |
| 742 | + | |
| 743 | + | |
| 744 | + | |
| 745 | + | |
| 746 | + | |
| 747 | + | |
| 748 | + | |
| 749 | + | |
| 750 | + | |
| 751 | + | |
| 752 | + | |
| 753 | + | |
| 754 | + | |
| 755 | + | |
| 756 | + | |
| 757 | + | |
| 758 | + | |
| 759 | + | |
| 760 | + | |
| 761 | + | |
| 762 | + | |
| 763 | + | |
| 764 | + | |
| 765 | + | |
| 766 | + | |
| 767 | + | |
| 768 | + | |
| 769 | + | |
| 770 | + | |
| 771 | + | |
| 772 | + | |
| 773 | + | |
| 774 | + | |
| 775 | + | |
| 776 | + | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
| 781 | + | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
| 789 | + | |
| 790 | + | |
743 | 791 | | |
744 | 792 | | |
745 | 793 | | |
| |||
0 commit comments