11import json
2- from typing import Any , AsyncGenerator , Iterable , Optional , Type , TypeVar
2+ from typing import Any , AsyncGenerator , Iterable , Optional , Type , TypedDict , TypeVar , Union
33
44from pydantic import BaseModel
55
1212T = TypeVar ("T" , bound = BaseModel )
1313
1414
15+ class RedactionMessage (TypedDict ):
16+ redactedUserContent : str
17+ redactedAssistantContent : str
18+
19+
1520class MockedModelProvider (Model ):
1621 """A mock implementation of the Model interface for testing purposes.
1722
@@ -20,7 +25,7 @@ class MockedModelProvider(Model):
2025 to stream mock responses as events.
2126 """
2227
23- def __init__ (self , agent_responses : Messages ):
28+ def __init__ (self , agent_responses : list [ Union [ Message , RedactionMessage ]] ):
2429 self .agent_responses = agent_responses
2530 self .index = 0
2631
@@ -54,27 +59,36 @@ async def stream(
5459
5560 self .index += 1
5661
57- def map_agent_message_to_events (self , agent_message : Message ) -> Iterable [dict [str , Any ]]:
62+ def map_agent_message_to_events (self , agent_message : Union [ Message , RedactionMessage ] ) -> Iterable [dict [str , Any ]]:
5863 stop_reason : StopReason = "end_turn"
5964 yield {"messageStart" : {"role" : "assistant" }}
60- for content in agent_message ["content" ]:
61- if "text" in content :
62- yield {"contentBlockStart" : {"start" : {}}}
63- yield {"contentBlockDelta" : {"delta" : {"text" : content ["text" ]}}}
64- yield {"contentBlockStop" : {}}
65- if "toolUse" in content :
66- stop_reason = "tool_use"
67- yield {
68- "contentBlockStart" : {
69- "start" : {
70- "toolUse" : {
71- "name" : content ["toolUse" ]["name" ],
72- "toolUseId" : content ["toolUse" ]["toolUseId" ],
65+ if agent_message .get ("redactedAssistantContent" ):
66+ yield {"redactContent" : {"redactUserContentMessage" : agent_message ["redactedUserContent" ]}}
67+ yield {"contentBlockStart" : {"start" : {}}}
68+ yield {"contentBlockDelta" : {"delta" : {"text" : agent_message ["redactedAssistantContent" ]}}}
69+ yield {"contentBlockStop" : {}}
70+ stop_reason = "guardrail_intervened"
71+ else :
72+ for content in agent_message ["content" ]:
73+ if "text" in content :
74+ yield {"contentBlockStart" : {"start" : {}}}
75+ yield {"contentBlockDelta" : {"delta" : {"text" : content ["text" ]}}}
76+ yield {"contentBlockStop" : {}}
77+ if "toolUse" in content :
78+ stop_reason = "tool_use"
79+ yield {
80+ "contentBlockStart" : {
81+ "start" : {
82+ "toolUse" : {
83+ "name" : content ["toolUse" ]["name" ],
84+ "toolUseId" : content ["toolUse" ]["toolUseId" ],
85+ }
7386 }
7487 }
7588 }
76- }
77- yield {"contentBlockDelta" : {"delta" : {"toolUse" : {"input" : json .dumps (content ["toolUse" ]["input" ])}}}}
78- yield {"contentBlockStop" : {}}
89+ yield {
90+ "contentBlockDelta" : {"delta" : {"toolUse" : {"input" : json .dumps (content ["toolUse" ]["input" ])}}}
91+ }
92+ yield {"contentBlockStop" : {}}
7993
8094 yield {"messageStop" : {"stopReason" : stop_reason }}
0 commit comments