-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
118 lines (101 loc) · 4.5 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# !/usr/bin/env python3
# usage: main.py [-h] [--name NAME]
import os
import sys
import asyncio
import random
from typing import Optional, List
sys.path.append(os.path.join(os.path.abspath("."), "among-agents"))
import argparse
import datetime
import subprocess
from amongagents.envs.configs.agent_config import ALL_LLM
from amongagents.envs.configs.game_config import FIVE_MEMBER_GAME, SEVEN_MEMBER_GAME, FIVE_MEMBER_GAME
from amongagents.envs.configs.map_config import map_coords
from amongagents.envs.game import AmongUs
from amongagents.UI.MapUI import MapUI
from dotenv import load_dotenv
from utils import setup_experiment
ROOT_PATH = os.path.abspath(".")
LOGS_PATH = os.path.join(ROOT_PATH, "expt-logs")
ASSETS_PATH = os.path.join(ROOT_PATH, "among-agents", "amongagents", "assets")
BLANK_MAP_IMAGE = os.path.join(ASSETS_PATH, "blankmap.png")
load_dotenv()
DATE = datetime.datetime.now().strftime("%Y-%m-%d")
COMMIT_HASH = (
subprocess.check_output(["git", "rev-parse", "HEAD"]).strip().decode("utf-8")
)
BIG_LIST_OF_MODELS: List[str] = [
"microsoft/phi-4",
"anthropic/claude-3.5-sonnet",
"anthropic/claude-3.7-sonnet:thinking",
"openai/o3-mini-high",
"openai/gpt-4o-mini",
"deepseek/deepseek-r1-distill-llama-70b",
"qwen/qwen-2.5-7b-instruct",
"mistralai/mistral-7b-instruct",
"deepseek/deepseek-r1",
"meta-llama/llama-3.3-70b-instruct",
"google/gemini-2.0-flash-001",
]
ARGS = {
"game_config": SEVEN_MEMBER_GAME,
"include_human": False,
"test": False,
"personality": False,
"agent_config": {
"Impostor": "LLM",
"Crewmate": "LLM",
# "IMPOSTOR_LLM_CHOICES": ["meta-llama/llama-3.3-70b-instruct"],
# "CREWMATE_LLM_CHOICES": ["meta-llama/llama-3.3-70b-instruct"],
"IMPOSTOR_LLM_CHOICES": BIG_LIST_OF_MODELS,
"CREWMATE_LLM_CHOICES": BIG_LIST_OF_MODELS,
},
"UI": False,
"Streamlit": False,
}
async def multiple_games(experiment_name=None, num_games=1, rate_limit=50):
experiment_name = setup_experiment(experiment_name, LOGS_PATH, DATE, COMMIT_HASH, ARGS)
ui = MapUI(BLANK_MAP_IMAGE, map_coords, debug=False) if ARGS["UI"] else None
with open(os.path.join(os.environ["EXPERIMENT_PATH"], "experiment-details.txt"), "a") as experiment_file:
experiment_file.write(f"\nExperiment args: {ARGS}\n")
semaphore = asyncio.Semaphore(rate_limit)
async def run_limited_game(game_index):
async with semaphore:
if ARGS.get("tournament_style") == "1on1":
# Randomly select one model for each role for this specific game
game_config = ARGS["agent_config"].copy()
game_config["CREWMATE_LLM_CHOICES"] = [random.choice(BIG_LIST_OF_MODELS)]
game_config["IMPOSTOR_LLM_CHOICES"] = [random.choice(BIG_LIST_OF_MODELS)]
else:
game_config = ARGS["agent_config"]
game = AmongUs(
game_config=ARGS["game_config"],
include_human=ARGS["include_human"],
test=ARGS["test"],
personality=ARGS["personality"],
agent_config=game_config,
UI=ui,
game_index=game_index,
)
await game.run_game()
tasks = [run_limited_game(i) for i in range(1, num_games+1)]
await asyncio.gather(*tasks)
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Run an AmongUs experiment.")
parser.add_argument("--name", type=str, default=None, help="Optional name for the experiment.")
parser.add_argument("--num_games", type=int, default=2, help="Number of games to run.")
parser.add_argument("--display_ui", type=bool, default=False, help="Display UI.")
parser.add_argument("--crewmate_llm", type=str, default=None, help="Crewmate LLM model.")
parser.add_argument("--impostor_llm", type=str, default=None, help="Impostor LLM model.")
parser.add_argument("--streamlit", type=bool, default=False, help="Streamlit.")
parser.add_argument("--tournament_style", type=str, default="random", help="random or 1on1.")
args = parser.parse_args()
if args.num_games > 1 or args.display_ui == False:
ARGS["UI"] = False
if args.crewmate_llm:
ARGS["agent_config"]["CREWMATE_LLM_CHOICES"] = [args.crewmate_llm]
if args.impostor_llm:
ARGS["agent_config"]["IMPOSTOR_LLM_CHOICES"] = [args.impostor_llm]
ARGS["tournament_style"] = args.tournament_style
asyncio.run(multiple_games(experiment_name=args.name, num_games=args.num_games))