Spaces:
Paused
Paused
| #!/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) | |