Spaces:
Running
Running
| """ | |
| Filename: MetaGPT/examples/werewolf_game/evals/utils.py | |
| Created Date: Oct 11, 2023 | |
| Revised Date: Oct 20, 2023 | |
| Author: [Aria](https://github.com/ariafyy) | |
| """ | |
| import glob | |
| import os | |
| import re | |
| from pathlib import Path | |
| from metagpt.const import METAGPT_ROOT | |
| class Utils: | |
| """Utils: utils of logs""" | |
| def polish_log(in_logfile, out_txtfile): | |
| """polish logs for evaluation""" | |
| pattern_text = r"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}) \| (\w+) +\| ([\w\.]+:\w+:\d+) - (.*\S)" | |
| pattern_player = r"(Player(\d{1}): \w+)" | |
| pattern_start = False | |
| json_start = False | |
| with open(in_logfile, "r") as f, open(out_txtfile, "w") as out: | |
| for line in f.readlines(): | |
| matches = re.match(pattern_text, line) | |
| if matches: | |
| message = matches.group(4).strip() | |
| pattern_start = True | |
| json_start = False | |
| if ( | |
| "Moderator(Moderator) ready to InstructSpeak" not in message | |
| and "Moderator(Moderator) ready to ParseSpeak" not in message | |
| and "Total running cost:" not in message | |
| ): | |
| out.write("- " + message + "\n") | |
| else: | |
| out.write("\n") | |
| elif pattern_start and not matches: | |
| if "gpt-4 may update over time" in line: | |
| line = "" | |
| out.write(line) | |
| elif line.strip().startswith("{"): | |
| out.write(line.strip()) | |
| json_start = True | |
| elif json_start and not line.strip().endswith("}"): | |
| out.write(line.strip()) | |
| elif json_start and line.strip().endswith("}"): | |
| out.write(line.strip()) | |
| json_start = False | |
| elif ( | |
| line.startswith("(User):") or line.startswith("********** STEP:") or re.search(pattern_player, line) | |
| ): | |
| out.write(line) | |
| else: | |
| out.write("\n") | |
| def pick_vote_log(in_logfile, out_txtfile): | |
| """ | |
| pick the vote log from the log file. | |
| ready to AnnounceGameResult serves as the 'HINT_TEXT ' which indicates the end of the game. | |
| based on bservation and reflection, then discuss is not in vote session. | |
| """ | |
| pattern_vote = r"(Player\d+)\(([A-Za-z]+)\): (\d+) \| (I vote to eliminate Player\d+)" | |
| ignore_text = """reflection""" | |
| HINT_TEXT = r"ready to AnnounceGameResult" | |
| pattern_moderator = r"\[([^\]]+)\]\. Say ONLY: I vote to eliminate ..." | |
| in_valid_block = False | |
| with open(in_logfile, "r") as f: | |
| lines = f.read() | |
| split_lines = lines.split(HINT_TEXT) | |
| if len(split_lines) < 2: | |
| print(f"Key text :{HINT_TEXT} not found in {in_logfile}") | |
| return | |
| relevant_lines = split_lines[1].split("\n") | |
| with open(out_txtfile, "w") as out: | |
| for line in relevant_lines: | |
| if re.search(pattern_moderator, line): | |
| in_valid_block = True | |
| out.write(line.lstrip() + "\n") | |
| elif in_valid_block and re.search(pattern_vote, line): | |
| out.write(line + "\n") | |
| elif ignore_text in line: | |
| in_valid_block = False | |
| def get_file_list(path: str) -> list: | |
| file_pattern = os.path.join(path, "*.txt") | |
| files_list = glob.glob(file_pattern) | |
| return files_list | |
| def filename_to_foldername(out_txtfile: str): | |
| """ | |
| convert filename into its parent folder name | |
| input:"....../# 01-10_10132100.txt" | |
| output:# 01-10 | |
| """ | |
| s = Path(out_txtfile).stem | |
| pattern_folder = r"([^_]*)_" | |
| match = re.match(pattern_folder, s) | |
| if match: | |
| folder = match.group(1) | |
| return folder | |
| def float_to_percent(decimal: float) -> str: | |
| """ | |
| input: 1.00 | |
| output: 100.00% | |
| """ | |
| percent = decimal * 100 | |
| return f"{percent:.2f}%" | |
| if __name__ == "__main__": | |
| in_logfile = METAGPT_ROOT / "logs/log.txt" | |
| out_txtfile = "input your wish path" | |
| # Utils().polish_log(in_logfile, out_txtfile) | |
| Utils().pick_vote_log(in_logfile, out_txtfile) | |