@@ -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