| 
									
										
										
										
											2024-05-27 20:25:25 -04:00
										 |  |  | from typing import Any, Mapping, Sequence | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-05 15:48:14 -04:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2024-06-04 10:00:05 -04:00
										 |  |  | from agnext.application import SingleThreadedAgentRuntime | 
					
						
							| 
									
										
										
										
											2024-06-18 14:53:18 -04:00
										 |  |  | from agnext.core import BaseAgent, CancellationToken | 
					
						
							| 
									
										
										
										
											2024-06-05 15:48:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 20:25:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 11:49:38 -07:00
										 |  |  | class StatefulAgent(BaseAgent): | 
					
						
							|  |  |  |     def __init__(self) -> None: | 
					
						
							| 
									
										
										
										
											2024-06-18 14:53:18 -04:00
										 |  |  |         super().__init__("A stateful agent", []) | 
					
						
							| 
									
										
										
										
											2024-05-27 20:25:25 -04:00
										 |  |  |         self.state = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @property | 
					
						
							|  |  |  |     def subscriptions(self) -> Sequence[type]: | 
					
						
							|  |  |  |         return [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 11:49:38 -07:00
										 |  |  |     async def on_message(self, message: Any, cancellation_token: CancellationToken) -> None: | 
					
						
							| 
									
										
										
										
											2024-05-27 20:25:25 -04:00
										 |  |  |         raise NotImplementedError | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def save_state(self) -> Mapping[str, Any]: | 
					
						
							|  |  |  |         return {"state": self.state} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def load_state(self, state: Mapping[str, Any]) -> None: | 
					
						
							|  |  |  |         self.state = state["state"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.asyncio | 
					
						
							|  |  |  | async def test_agent_can_save_state() -> None: | 
					
						
							|  |  |  |     runtime = SingleThreadedAgentRuntime() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 11:49:38 -07:00
										 |  |  |     agent1_id = await runtime.register_and_get("name1", StatefulAgent) | 
					
						
							| 
									
										
										
										
											2024-07-23 16:38:37 -07:00
										 |  |  |     agent1: StatefulAgent = await runtime.try_get_underlying_agent_instance(agent1_id, type=StatefulAgent) | 
					
						
							| 
									
										
										
										
											2024-05-27 20:25:25 -04:00
										 |  |  |     assert agent1.state == 0 | 
					
						
							|  |  |  |     agent1.state = 1 | 
					
						
							|  |  |  |     assert agent1.state == 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     agent1_state = agent1.save_state() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     agent1.state = 2 | 
					
						
							|  |  |  |     assert agent1.state == 2 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     agent1.load_state(agent1_state) | 
					
						
							|  |  |  |     assert agent1.state == 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @pytest.mark.asyncio | 
					
						
							|  |  |  | async def test_runtime_can_save_state() -> None: | 
					
						
							|  |  |  |     runtime = SingleThreadedAgentRuntime() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 11:49:38 -07:00
										 |  |  |     agent1_id = await runtime.register_and_get("name1", StatefulAgent) | 
					
						
							| 
									
										
										
										
											2024-07-23 16:38:37 -07:00
										 |  |  |     agent1: StatefulAgent = await runtime.try_get_underlying_agent_instance(agent1_id, type=StatefulAgent) | 
					
						
							| 
									
										
										
										
											2024-05-27 20:25:25 -04:00
										 |  |  |     assert agent1.state == 0 | 
					
						
							|  |  |  |     agent1.state = 1 | 
					
						
							|  |  |  |     assert agent1.state == 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 11:49:38 -07:00
										 |  |  |     runtime_state = await runtime.save_state() | 
					
						
							| 
									
										
										
										
											2024-05-27 20:25:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     runtime2 = SingleThreadedAgentRuntime() | 
					
						
							| 
									
										
										
										
											2024-07-23 11:49:38 -07:00
										 |  |  |     agent2_id = await runtime2.register_and_get("name1", StatefulAgent) | 
					
						
							| 
									
										
										
										
											2024-07-23 16:38:37 -07:00
										 |  |  |     agent2: StatefulAgent = await runtime2.try_get_underlying_agent_instance(agent2_id, type=StatefulAgent) | 
					
						
							| 
									
										
										
										
											2024-06-18 14:53:18 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-23 11:49:38 -07:00
										 |  |  |     await runtime2.load_state(runtime_state) | 
					
						
							| 
									
										
										
										
											2024-05-27 20:25:25 -04:00
										 |  |  |     assert agent2.state == 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |