import pytest import os import sys sys.path.append('../../tinytroupe/') sys.path.append('../../') sys.path.append('..') from tinytroupe.examples import create_oscar_the_architect, create_lisa_the_data_scientist from tinytroupe.agent import TinyPerson, TinyToolUse from tinytroupe.environment import TinyWorld from tinytroupe.control import Simulation import tinytroupe.control as control from tinytroupe.factory import TinyPersonFactory from tinytroupe.enrichment import TinyEnricher from tinytroupe.extraction import ArtifactExporter from tinytroupe.tools import TinyWordProcessor import logging logger = logging.getLogger("tinytroupe") import importlib from testing_utils import * def test_begin_checkpoint_end_with_agent_only(setup): # erase the file if it exists remove_file_if_exists("control_test.cache.json") control.reset() assert control._current_simulations["default"] is None, "There should be no simulation running at this point." # erase the file if it exists remove_file_if_exists("control_test.cache.json") control.begin("control_test.cache.json") assert control._current_simulations["default"].status == Simulation.STATUS_STARTED, "The simulation should be started at this point." exporter = ArtifactExporter(base_output_folder="./synthetic_data_exports_3/") enricher = TinyEnricher() tooluse_faculty = TinyToolUse(tools=[TinyWordProcessor(exporter=exporter, enricher=enricher)]) agent_1 = create_oscar_the_architect() agent_1.add_mental_faculties([tooluse_faculty]) agent_1.define("age", 19) agent_1.define("nationality", "Brazilian") agent_2 = create_lisa_the_data_scientist() agent_2.add_mental_faculties([tooluse_faculty]) agent_2.define("age", 80) agent_2.define("nationality", "Argentinian") assert control._current_simulations["default"].cached_trace is not None, "There should be a cached trace at this point." assert control._current_simulations["default"].execution_trace is not None, "There should be an execution trace at this point." control.checkpoint() agent_1.listen_and_act("How are you doing?") agent_2.listen_and_act("What's up?") # check if the file was created assert os.path.exists("control_test.cache.json"), "The checkpoint file should have been created." control.end() assert control._current_simulations["default"].status == Simulation.STATUS_STOPPED, "The simulation should be ended at this point." def test_begin_checkpoint_end_with_world(setup): # erase the file if it exists remove_file_if_exists("control_test_world.cache.json") control.reset() assert control._current_simulations["default"] is None, "There should be no simulation running at this point." control.begin("control_test_world.cache.json") assert control._current_simulations["default"].status == Simulation.STATUS_STARTED, "The simulation should be started at this point." world = TinyWorld("Test World", [create_oscar_the_architect(), create_lisa_the_data_scientist()]) world.make_everyone_accessible() assert control._current_simulations["default"].cached_trace is not None, "There should be a cached trace at this point." assert control._current_simulations["default"].execution_trace is not None, "There should be an execution trace at this point." world.run(2) control.checkpoint() # check if the file was created assert os.path.exists("control_test_world.cache.json"), "The checkpoint file should have been created." control.end() assert control._current_simulations["default"].status == Simulation.STATUS_STOPPED, "The simulation should be ended at this point." def test_begin_checkpoint_end_with_factory(setup): # erase the file if it exists remove_file_if_exists("control_test_personfactory.cache.json") control.reset() def aux_simulation_to_repeat(iteration, verbose=False): control.reset() assert control._current_simulations["default"] is None, "There should be no simulation running at this point." control.begin("control_test_personfactory.cache.json") assert control._current_simulations["default"].status == Simulation.STATUS_STARTED, "The simulation should be started at this point." factory = TinyPersonFactory("We are interested in experts in the production of the traditional Gazpacho soup.") assert control._current_simulations["default"].cached_trace is not None, "There should be a cached trace at this point." assert control._current_simulations["default"].execution_trace is not None, "There should be an execution trace at this point." agent = factory.generate_person("A Brazilian tourist who learned about Gazpaccho in a trip to Spain.") assert control._current_simulations["default"].cached_trace is not None, "There should be a cached trace at this point." assert control._current_simulations["default"].execution_trace is not None, "There should be an execution trace at this point." control.checkpoint() # check if the file was created assert os.path.exists("control_test_personfactory.cache.json"), "The checkpoint file should have been created." control.end() assert control._current_simulations["default"].status == Simulation.STATUS_STOPPED, "The simulation should be ended at this point." if verbose: logger.debug(f"###################################################################################### Sim Iteration:{iteration}") logger.debug(f"###################################################################################### Agent persona configs:{agent._persona}") return agent assert control.cache_misses() == 0, "There should be no cache misses in this test." assert control.cache_hits() == 0, "There should be no cache hits here" # FIRST simulation ######################################################## agent_1 = aux_simulation_to_repeat(1, verbose=True) age_1 = agent_1.get("age") nationality_1 = agent_1.get("nationality") minibio_1 = agent_1.minibio() print("minibio_1 =", minibio_1) # SECOND simulation ######################################################## logger.debug(">>>>>>>>>>>>>>>>>>>>>>>>>> Second simulation...") agent_2 = aux_simulation_to_repeat(2, verbose=True) age_2 = agent_2.get("age") nationality_2 = agent_2.get("nationality") minibio_2 = agent_2.minibio() print("minibio_2 =", minibio_2) assert control.cache_misses() == 0, "There should be no cache misses in this test." assert control.cache_hits() > 0, "There should be cache hits here." assert age_1 == age_2, "The age should be the same in both simulations." assert nationality_1 == nationality_2, "The nationality should be the same in both simulations." assert minibio_1 == minibio_2, "The minibio should be the same in both simulations." # # let's also check the contents of the cache file, as raw text, not dict # with open("control_test_personfactory.cache.json", "r") as f: cache_contents = f.read() assert "'_aux_model_call'" in cache_contents, "The cache file should contain the '_aux_model_call' call." assert "'_setup_agent'" in cache_contents, "The cache file should contain the '_setup_agent' call." assert "'define'" not in cache_contents, "The cache file should not contain the 'define' methods, as these are reentrant." assert "'define_several'" not in cache_contents, "The cache file should not contain the 'define_several' methods, as these are reentrant."