#!/usr/bin/env python # -*- coding: utf-8 -*- # @Desc : entry of Stanford Town(ST/st) game # README see `metagpt/ext/stanford_town/README.md` import asyncio from typing import Optional import fire from metagpt.ext.stanford_town.roles.st_role import STRole from metagpt.ext.stanford_town.stanford_town import StanfordTown from metagpt.ext.stanford_town.utils.const import STORAGE_PATH from metagpt.ext.stanford_town.utils.mg_ga_transform import ( get_reverie_meta, write_curr_sim_code, write_curr_step, ) from metagpt.ext.stanford_town.utils.utils import copy_folder from metagpt.logs import logger async def startup( idea: str, fork_sim_code: str, sim_code: str, temp_storage_path: str, investment: float = 30.0, n_round: int = 500 ): town = StanfordTown() logger.info("StanfordTown init environment") # copy `storage/{fork_sim_code}` to `storage/{sim_code}` copy_folder(str(STORAGE_PATH.joinpath(fork_sim_code)), str(STORAGE_PATH.joinpath(sim_code))) # get role names from `storage/{simulation_name}/reverie/meta.json` and then init roles reverie_meta = get_reverie_meta(fork_sim_code) roles = [] sim_path = STORAGE_PATH.joinpath(sim_code) sim_path.mkdir(exist_ok=True) for idx, role_name in enumerate(reverie_meta["persona_names"]): has_inner_voice = True if idx == 0 else False role = STRole( name=role_name, profile=role_name, sim_code=sim_code, step=reverie_meta.get("step", 0), start_time=reverie_meta.get("start_date"), curr_time=reverie_meta.get("curr_time"), sec_per_step=reverie_meta.get("sec_per_step"), has_inner_voice=has_inner_voice, ) roles.append(role) # init temp_storage write_curr_sim_code({"sim_code": sim_code}, temp_storage_path) write_curr_step({"step": reverie_meta.get("step", 0)}, temp_storage_path) await town.hire(roles) town.invest(investment) town.run_project(idea) await town.run(n_round) def main( idea: str, fork_sim_code: str, sim_code: str, temp_storage_path: Optional[str] = None, investment: float = 30.0, n_round: int = 500, ): """ Args: idea: idea works as an `inner voice` to the first agent. fork_sim_code: old simulation name to start with, choose one inside `generative_agents/environment/frontend_server/storage/` sim_code: new simulation name to save simulation result temp_storage_path: generative_agents temp_storage path inside `environment/frontend_server` to interact. investment: the investment of running agents n_round: rounds to run agents """ asyncio.run( startup( idea=idea, fork_sim_code=fork_sim_code, sim_code=sim_code, temp_storage_path=temp_storage_path, investment=investment, n_round=n_round, ) ) if __name__ == "__main__": fire.Fire(main)