1010import pytest
1111from dapr .ext .workflow import DaprWorkflowContext
1212
13- from dapr_agents .agents .durableagent .agent import DurableAgent
14- from dapr_agents .agents .durableagent .schemas import (
15- AgentTaskResponse ,
16- BroadcastMessage ,
13+ from dapr_agents import (
14+ DurableAgent
1715)
18- from dapr_agents .agents .storage import (
19- Storage ,
16+ from dapr_agents .agents .memory_store import (
2017 DurableAgentMessage ,
21- DurableAgentWorkflowEntry ,
2218 DurableAgentWorkflowState ,
19+ MemoryStore
20+ )
21+ from dapr_agents .agents .durableagent .schemas import (
22+ AgentTaskResponse ,
23+ BroadcastMessage ,
2324)
2425from dapr_agents .llm import OpenAIChatClient
2526from dapr_agents .tool .base import AgentTool
2829 LLMChatCandidate ,
2930 LLMChatResponse ,
3031 ToolExecutionRecord ,
31- ToolMessage ,
3232)
3333
3434
@@ -66,17 +66,6 @@ def mock_agentic_post_init(self, __context: Any) -> None:
6666 self ._client .get_state .return_value = (False , None )
6767 # Configure the mock for save_state method
6868 self ._client .save_state .return_value = None
69- self ._agent_metadata = {
70- "name" : getattr (self , "name" , "TestAgent" ),
71- "role" : getattr (self , "role" , "Test Role" ),
72- "goal" : getattr (self , "goal" , "Test Goal" ),
73- "instructions" : getattr (self , "instructions" , []),
74- "topic_name" : getattr (
75- self , "agent_topic_name" , getattr (self , "name" , "TestAgent" )
76- ),
77- "pubsub_name" : getattr (self , "message_bus_name" , "testpubsub" ),
78- "orchestrator" : False ,
79- }
8069 self ._workflow_name = "AgenticWorkflow"
8170 self ._is_running = False
8271 self ._shutdown_event = asyncio .Event ()
@@ -137,11 +126,10 @@ def setup_env(self, monkeypatch):
137126 mock_client = MockDaprClient ()
138127 mock_client .get_state .return_value = Mock (data = None ) # Default empty state
139128
140- # Patch both the client import locations
129+ # Patch DaprClient factory to return our mock; MemoryStore will pick it up
141130 monkeypatch .setattr ("dapr.clients.DaprClient" , lambda : mock_client )
142- monkeypatch .setattr (
143- "dapr_agents.storage.daprstores.statestore.DaprClient" , lambda : mock_client
144- )
131+ from dapr_agents .agents .memory_store import MemoryStore as _MS
132+ monkeypatch .setattr (_MS , "_update_session_index" , lambda self , instance_id : None )
145133
146134 yield
147135 if "OPENAI_API_KEY" in os .environ :
@@ -184,7 +172,7 @@ def mock_workflow_context(self):
184172 @pytest .fixture
185173 def basic_durable_agent (self , mock_llm ):
186174 """Create a basic durable agent instance for testing."""
187- storage = Storage . model_construct (
175+ memory_store = MemoryStore (
188176 name = "teststatestore" , session_id = "test_session"
189177 )
190178 return DurableAgent (
@@ -193,15 +181,15 @@ def basic_durable_agent(self, mock_llm):
193181 goal = "Help with testing" ,
194182 instructions = ["Be helpful" , "Test things" ],
195183 llm = mock_llm ,
196- storage = storage ,
184+ memory_store = memory_store ,
197185 max_iterations = 5 ,
198186 message_bus_name = "testpubsub" ,
199187 )
200188
201189 @pytest .fixture
202190 def durable_agent_with_tools (self , mock_llm , mock_tool ):
203191 """Create a durable agent with tools for testing."""
204- storage = Storage . model_construct (
192+ memory_store = MemoryStore (
205193 name = "teststatestore" , session_id = "test_session"
206194 )
207195 return DurableAgent (
@@ -210,22 +198,22 @@ def durable_agent_with_tools(self, mock_llm, mock_tool):
210198 goal = "Execute tools" ,
211199 instructions = ["Use tools when needed" ],
212200 llm = mock_llm ,
213- storage = storage ,
201+ memory_store = memory_store ,
214202 tools = [mock_tool ],
215203 max_iterations = 5 ,
216204 message_bus_name = "testpubsub" ,
217205 )
218206
219207 def test_durable_agent_initialization (self , mock_llm ):
220208 """Test durable agent initialization with basic parameters."""
221- storage = Storage . model_construct (name = "teststatestore" )
209+ memory_store = MemoryStore (name = "teststatestore" )
222210 agent = DurableAgent (
223211 name = "TestDurableAgent" ,
224212 role = "Test Durable Assistant" ,
225213 goal = "Help with testing" ,
226214 instructions = ["Be helpful" ],
227215 llm = mock_llm ,
228- storage = storage ,
216+ memory_store = memory_store ,
229217 message_bus_name = "testpubsub" ,
230218 )
231219
@@ -243,13 +231,13 @@ def test_durable_agent_initialization(self, mock_llm):
243231
244232 def test_durable_agent_initialization_with_custom_topic (self , mock_llm ):
245233 """Test durable agent initialization with custom topic name."""
246- storage = Storage . model_construct (name = "teststatestore" )
234+ memory_store = MemoryStore (name = "teststatestore" )
247235 agent = DurableAgent (
248236 name = "TestDurableAgent" ,
249237 role = "Test Durable Assistant" ,
250238 goal = "Help with testing" ,
251239 llm = mock_llm ,
252- storage = storage ,
240+ memory_store = memory_store ,
253241 agent_topic_name = "custom-topic" ,
254242 message_bus_name = "testpubsub" ,
255243 )
@@ -258,30 +246,18 @@ def test_durable_agent_initialization_with_custom_topic(self, mock_llm):
258246
259247 def test_durable_agent_initialization_name_from_role (self , mock_llm ):
260248 """Test durable agent initialization with name derived from role."""
261- storage = Storage . model_construct (name = "teststatestore" )
249+ memory_store = MemoryStore (name = "teststatestore" )
262250 agent = DurableAgent (
263251 role = "Test Durable Assistant" ,
264252 goal = "Help with testing" ,
265253 llm = mock_llm ,
266- storage = storage ,
254+ memory_store = memory_store ,
267255 message_bus_name = "testpubsub" ,
268256 )
269257
270258 assert agent .name == "Test Durable Assistant"
271259 assert agent .agent_topic_name == "Test Durable Assistant"
272260
273- def test_durable_agent_metadata (self , basic_durable_agent ):
274- """Test durable agent metadata creation."""
275- metadata = basic_durable_agent ._agent_metadata
276-
277- assert metadata is not None
278- assert metadata ["name" ] == "TestDurableAgent"
279- assert metadata ["role" ] == "Test Durable Assistant"
280- assert metadata ["goal" ] == "Help with testing"
281- assert metadata ["topic_name" ] == "TestDurableAgent"
282- assert metadata ["pubsub_name" ] == "testpubsub"
283- assert metadata ["orchestrator" ] is False
284-
285261 @pytest .fixture
286262 def mock_wf_client (self ):
287263 client = Mock ()
@@ -315,7 +291,7 @@ async def test_call_llm_activity(self, basic_durable_agent):
315291
316292 instance_id = "test-instance-123"
317293 # set up a minimal instance record
318- basic_durable_agent .storage ._current_state ["instances" ] = {
294+ basic_durable_agent .memory_store ._current_state ["instances" ] = {
319295 instance_id : {
320296 "input" : "Test task" ,
321297 "source" : "test_source" ,
@@ -378,7 +354,7 @@ async def test_finish_workflow_activity(self, basic_durable_agent):
378354 """Test finishing workflow activity."""
379355 instance_id = "test-instance-123"
380356 final_output = "Final response"
381- basic_durable_agent .storage ._current_state ["instances" ] = {
357+ basic_durable_agent .memory_store ._current_state ["instances" ] = {
382358 instance_id : {
383359 "input" : "Test task" ,
384360 "source" : "test_source" ,
@@ -396,7 +372,7 @@ async def test_finish_workflow_activity(self, basic_durable_agent):
396372 basic_durable_agent .finalize_workflow (
397373 instance_id , final_output , "2024-01-01T00:00:00Z"
398374 )
399- instance_data = basic_durable_agent .storage ._current_state ["instances" ][
375+ instance_data = basic_durable_agent .memory_store ._current_state ["instances" ][
400376 instance_id
401377 ]
402378 assert instance_data ["output" ] == final_output
@@ -418,7 +394,7 @@ async def test_run_tool(self, basic_durable_agent, mock_tool):
418394 mock_run_tool .return_value = "tool_result"
419395
420396 # Set up instance state
421- basic_durable_agent .storage ._current_state ["instances" ] = {
397+ basic_durable_agent .memory_store ._current_state ["instances" ] = {
422398 instance_id : {
423399 "input" : "Test task" ,
424400 "source" : "test_source" ,
@@ -448,7 +424,7 @@ async def test_run_tool(self, basic_durable_agent, mock_tool):
448424 assert result ["execution_result" ] == "tool_result"
449425
450426 # Verify state was updated atomically
451- instance_data = basic_durable_agent .storage ._current_state ["instances" ][
427+ instance_data = basic_durable_agent .memory_store ._current_state ["instances" ][
452428 instance_id
453429 ]
454430 assert len (instance_data ["messages" ]) == 1 # Tool message added
@@ -489,8 +465,8 @@ def test_record_initial_entry(self, basic_durable_agent):
489465 )
490466
491467 # Verify instance was created
492- assert instance_id in basic_durable_agent .storage ._current_state ["instances" ]
493- instance_data = basic_durable_agent .storage ._current_state ["instances" ][
468+ assert instance_id in basic_durable_agent .memory_store ._current_state ["instances" ]
469+ instance_data = basic_durable_agent .memory_store ._current_state ["instances" ][
494470 instance_id
495471 ]
496472 assert instance_data ["input" ] == input_data
@@ -518,8 +494,8 @@ def test_ensure_instance_exists(self, basic_durable_agent):
518494 instance_id , "Test input" , triggering_workflow_instance_id , test_time
519495 )
520496
521- assert instance_id in basic_durable_agent .storage ._current_state ["instances" ]
522- instance_data = basic_durable_agent .storage ._current_state ["instances" ][
497+ assert instance_id in basic_durable_agent .memory_store ._current_state ["instances" ]
498+ instance_data = basic_durable_agent .memory_store ._current_state ["instances" ][
523499 instance_id
524500 ]
525501 assert (
@@ -532,7 +508,7 @@ def test_ensure_instance_exists(self, basic_durable_agent):
532508
533509 # Test that existing instance is not overwritten
534510 original_input = "Original input"
535- basic_durable_agent .storage ._current_state ["instances" ][instance_id ][
511+ basic_durable_agent .memory_store ._current_state ["instances" ][instance_id ][
536512 "input"
537513 ] = original_input
538514
@@ -542,7 +518,7 @@ def test_ensure_instance_exists(self, basic_durable_agent):
542518
543519 # Input should remain unchanged
544520 assert (
545- basic_durable_agent .storage ._current_state ["instances" ][instance_id ][
521+ basic_durable_agent .memory_store ._current_state ["instances" ][instance_id ][
546522 "input"
547523 ]
548524 == original_input
@@ -555,7 +531,7 @@ def test_process_user_message(self, basic_durable_agent):
555531 user_message_copy = {"role" : "user" , "content" : "Hello, world!" }
556532
557533 # Set up instance
558- basic_durable_agent .storage ._current_state ["instances" ][instance_id ] = {
534+ basic_durable_agent .memory_store ._current_state ["instances" ][instance_id ] = {
559535 "input" : "Test task" ,
560536 "source" : "test_source" ,
561537 "triggering_workflow_instance_id" : None ,
@@ -568,14 +544,14 @@ def test_process_user_message(self, basic_durable_agent):
568544 "trace_context" : None ,
569545 }
570546
571- # Mock storage .add_message
572- with patch .object (type (basic_durable_agent .storage ), "add_message" ):
547+ # Mock memory_store .add_message
548+ with patch .object (type (basic_durable_agent .memory_store ), "add_message" ):
573549 basic_durable_agent ._process_user_message (
574550 instance_id , task , user_message_copy
575551 )
576552
577553 # Verify message was added to instance
578- instance_data = basic_durable_agent .storage ._current_state ["instances" ][
554+ instance_data = basic_durable_agent .memory_store ._current_state ["instances" ][
579555 instance_id
580556 ]
581557 assert len (instance_data ["messages" ]) == 1
@@ -589,7 +565,7 @@ def test_save_assistant_message(self, basic_durable_agent):
589565 assistant_message = {"role" : "assistant" , "content" : "Hello back!" }
590566
591567 # Set up instance
592- basic_durable_agent .storage ._current_state ["instances" ][instance_id ] = {
568+ basic_durable_agent .memory_store ._current_state ["instances" ][instance_id ] = {
593569 "input" : "Test task" ,
594570 "source" : "test_source" ,
595571 "triggering_workflow_instance_id" : None ,
@@ -602,12 +578,12 @@ def test_save_assistant_message(self, basic_durable_agent):
602578 "trace_context" : None ,
603579 }
604580
605- # Mock storage .add_message
606- with patch .object (type (basic_durable_agent .storage ), "add_message" ):
581+ # Mock memory_store .add_message
582+ with patch .object (type (basic_durable_agent .memory_store ), "add_message" ):
607583 basic_durable_agent ._save_assistant_message (instance_id , assistant_message )
608584
609585 # Verify message was added to instance
610- instance_data = basic_durable_agent .storage ._current_state ["instances" ][
586+ instance_data = basic_durable_agent .memory_store ._current_state ["instances" ][
611587 instance_id
612588 ]
613589 assert len (instance_data ["messages" ]) == 1
@@ -620,7 +596,7 @@ def test_get_last_message_from_state(self, basic_durable_agent):
620596 instance_id = "test-instance-123"
621597
622598 # Set up instance with last_message
623- basic_durable_agent .storage ._current_state ["instances" ][instance_id ] = {
599+ basic_durable_agent .memory_store ._current_state ["instances" ][instance_id ] = {
624600 "input" : "Test task" ,
625601 "source" : "test_source" ,
626602 "triggering_workflow_instance_id" : None ,
@@ -680,7 +656,7 @@ def test_append_tool_message_to_instance(self, basic_durable_agent):
680656 instance_id = "test-instance-123"
681657
682658 # Set up instance
683- basic_durable_agent .storage ._current_state ["instances" ][instance_id ] = {
659+ basic_durable_agent .memory_store ._current_state ["instances" ][instance_id ] = {
684660 "input" : "Test task" ,
685661 "source" : "test_source" ,
686662 "triggering_workflow_instance_id" : None ,
@@ -707,7 +683,7 @@ def test_append_tool_message_to_instance(self, basic_durable_agent):
707683 )
708684
709685 # Verify instance was updated
710- instance_data = basic_durable_agent .storage ._current_state ["instances" ][
686+ instance_data = basic_durable_agent .memory_store ._current_state ["instances" ][
711687 instance_id
712688 ]
713689 assert len (instance_data ["messages" ]) == 1
@@ -721,7 +697,7 @@ def test_construct_messages_with_instance_history(self, basic_durable_agent):
721697 input_data = "Test input"
722698
723699 # Set up instance with messages
724- basic_durable_agent .storage ._current_state ["instances" ][instance_id ] = {
700+ basic_durable_agent .memory_store ._current_state ["instances" ][instance_id ] = {
725701 "input" : "Test task" ,
726702 "source" : "test_source" ,
727703 "triggering_workflow_instance_id" : None ,
@@ -791,7 +767,7 @@ def test_register_agent(self, basic_durable_agent):
791767 store_name = "test_store" ,
792768 store_key = "agent_registry" ,
793769 agent_name = basic_durable_agent .name ,
794- agent_metadata = basic_durable_agent . _agent_metadata ,
770+ agent_metadata = "test metadata" ,
795771 )
796772
797773 @pytest .mark .asyncio
@@ -820,8 +796,8 @@ def test_durable_agent_workflow_name(self, basic_durable_agent):
820796 def test_durable_agent_state_initialization (self , basic_durable_agent ):
821797 """Test that the agent state is properly initialized."""
822798 validated_state = DurableAgentWorkflowState .model_validate (
823- basic_durable_agent .state
799+ basic_durable_agent .memory_store . _current_state
824800 )
825801 assert isinstance (validated_state , DurableAgentWorkflowState )
826- assert "instances" in basic_durable_agent .state
827- assert basic_durable_agent .storage ._current_state ["instances" ] == {}
802+ assert "instances" in basic_durable_agent .memory_store . _current_state
803+ assert basic_durable_agent .memory_store ._current_state ["instances" ] == {}
0 commit comments