Skip to content

Commit d50b1d4

Browse files
committed
test updates and typed event param removed as discussed
1 parent a1f4ea4 commit d50b1d4

File tree

3 files changed

+114
-38
lines changed

3 files changed

+114
-38
lines changed

src/strands/event_loop/streaming.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,7 @@ def handle_content_block_delta(
173173

174174
elif redacted_content := delta_content["reasoningContent"].get("redactedContent"):
175175
state["redactedContent"] = state.get("redactedContent", b"") + redacted_content
176-
typed_event = ReasoningRedactedContentStreamEvent(
177-
redacted_content=redacted_content, delta=delta_content, reasoning=True
178-
)
176+
typed_event = ReasoningRedactedContentStreamEvent(redacted_content=redacted_content, delta=delta_content)
179177

180178
return state, typed_event
181179

src/strands/types/_events.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,9 @@ def __init__(self, delta: ContentBlockDelta, reasoning_text: str | None) -> None
172172
class ReasoningRedactedContentStreamEvent(ModelStreamEvent):
173173
"""Event emitted during redacted content streaming."""
174174

175-
def __init__(self, delta: ContentBlockDelta, redacted_content: bytes | None, reasoning: bool = False) -> None:
175+
def __init__(self, delta: ContentBlockDelta, redacted_content: bytes | None) -> None:
176176
"""Initialize with delta and redacted content."""
177-
super().__init__({"reasoningRedactedContent": redacted_content, "delta": delta, "reasoning": reasoning})
177+
super().__init__({"reasoningRedactedContent": redacted_content, "delta": delta, "reasoning": True})
178178

179179

180180
class ReasoningSignatureStreamEvent(ModelStreamEvent):

tests/strands/event_loop/test_streaming.py

Lines changed: 111 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -511,35 +511,77 @@ async def test_process_stream(response, exp_events, agenerator, alist):
511511

512512

513513
@pytest.mark.parametrize(
514-
"response",
514+
("response", "exp_events"),
515515
[
516516
# Redacted Message
517-
[
518-
{"messageStart": {"role": "assistant"}},
519-
{
520-
"contentBlockStart": {"start": {}},
521-
},
522-
{
523-
"contentBlockDelta": {"delta": {"text": "Hello!"}},
524-
},
525-
{"contentBlockStop": {}},
526-
{
527-
"messageStop": {"stopReason": "guardrail_intervened"},
528-
},
529-
{
530-
"redactContent": {
531-
"redactUserContentMessage": "REDACTED",
532-
"redactAssistantContentMessage": "REDACTED.",
533-
}
534-
},
535-
{
536-
"metadata": {
537-
"usage": {"inputTokens": 1, "outputTokens": 1, "totalTokens": 1},
538-
"metrics": {"latencyMs": 1},
539-
}
540-
},
541-
],
542-
pytest.param(
517+
(
518+
[
519+
{"messageStart": {"role": "assistant"}},
520+
{
521+
"contentBlockStart": {"start": {}},
522+
},
523+
{
524+
"contentBlockDelta": {"delta": {"text": "Hello!"}},
525+
},
526+
{"contentBlockStop": {}},
527+
{
528+
"messageStop": {"stopReason": "guardrail_intervened"},
529+
},
530+
{
531+
"redactContent": {
532+
"redactUserContentMessage": "REDACTED",
533+
"redactAssistantContentMessage": "REDACTED.",
534+
}
535+
},
536+
{
537+
"metadata": {
538+
"usage": {
539+
"inputTokens": 1,
540+
"outputTokens": 1,
541+
"totalTokens": 1,
542+
},
543+
"metrics": {"latencyMs": 1},
544+
}
545+
},
546+
],
547+
[
548+
{"event": {"messageStart": {"role": "assistant"}}},
549+
{"event": {"contentBlockStart": {"start": {}}}},
550+
{"event": {"contentBlockDelta": {"delta": {"text": "Hello!"}}}},
551+
{"data": "Hello!", "delta": {"text": "Hello!"}},
552+
{"event": {"contentBlockStop": {}}},
553+
{"event": {"messageStop": {"stopReason": "guardrail_intervened"}}},
554+
{
555+
"event": {
556+
"redactContent": {
557+
"redactUserContentMessage": "REDACTED",
558+
"redactAssistantContentMessage": "REDACTED.",
559+
}
560+
}
561+
},
562+
{
563+
"event": {
564+
"metadata": {
565+
"usage": {
566+
"inputTokens": 1,
567+
"outputTokens": 1,
568+
"totalTokens": 1,
569+
},
570+
"metrics": {"latencyMs": 1},
571+
}
572+
}
573+
},
574+
{
575+
"stop": (
576+
"guardrail_intervened",
577+
{"role": "assistant", "content": [{"text": "REDACTED."}]},
578+
{"inputTokens": 1, "outputTokens": 1, "totalTokens": 1},
579+
{"latencyMs": 1},
580+
)
581+
},
582+
],
583+
),
584+
(
543585
[
544586
{"messageStart": {"role": "assistant"}},
545587
{
@@ -554,23 +596,59 @@ async def test_process_stream(response, exp_events, agenerator, alist):
554596
},
555597
{
556598
"metadata": {
557-
"usage": {"inputTokens": 1, "outputTokens": 1, "totalTokens": 1},
599+
"usage": {
600+
"inputTokens": 1,
601+
"outputTokens": 1,
602+
"totalTokens": 1,
603+
},
558604
"metrics": {"latencyMs": 1},
559605
}
560606
},
561607
],
562-
marks=pytest.mark.skip(reason="Implementation has undefined callback_handler"),
608+
[
609+
{"event": {"messageStart": {"role": "assistant"}}},
610+
{"event": {"contentBlockStart": {"start": {}}}},
611+
{"event": {"contentBlockDelta": {"delta": {"reasoningContent": {"redactedContent": b"encoded_data"}}}}},
612+
{
613+
"reasoningRedactedContent": b"encoded_data",
614+
"delta": {"reasoningContent": {"redactedContent": b"encoded_data"}},
615+
"reasoning": True,
616+
},
617+
{"event": {"contentBlockStop": {}}},
618+
{"event": {"messageStop": {"stopReason": "end_turn"}}},
619+
{
620+
"event": {
621+
"metadata": {
622+
"usage": {
623+
"inputTokens": 1,
624+
"outputTokens": 1,
625+
"totalTokens": 1,
626+
},
627+
"metrics": {"latencyMs": 1},
628+
}
629+
}
630+
},
631+
{
632+
"stop": (
633+
"end_turn",
634+
{
635+
"role": "assistant",
636+
"content": [{"reasoningContent": {"redactedContent": b"encoded_data"}}],
637+
},
638+
{"inputTokens": 1, "outputTokens": 1, "totalTokens": 1},
639+
{"latencyMs": 1},
640+
)
641+
},
642+
],
563643
),
564644
],
565645
)
566646
@pytest.mark.asyncio
567-
async def test_process_stream_redacted(response, agenerator, alist):
647+
async def test_process_stream_redacted(response, exp_events, agenerator, alist):
568648
stream = strands.event_loop.streaming.process_stream(agenerator(response))
569649

570650
tru_events = await alist(stream)
571-
572-
# Verify the structure matches expected redacted content behavior
573-
assert len(tru_events) > 0
651+
assert tru_events == exp_events
574652

575653
# Ensure that we're getting typed events coming out of process_stream
576654
non_typed_events = [event for event in tru_events if not isinstance(event, TypedEvent)]

0 commit comments

Comments
 (0)