turnabout-bench / scripts /evaluate.py
王致渊
Initial commit
57e0211
Raw
History Blame Contribute Delete
2.9 kB
#!/usr/bin/env python3
"""Batch evaluation runner for agents."""
import argparse
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).parent.parent))
from turnabout.agents.random_agent import RandomAgent, run_benchmark
from turnabout.envs.text_env import TextCourtEnv
def main():
parser = argparse.ArgumentParser(description="Evaluate agents on Turnabout cases")
parser.add_argument(
"case",
nargs="?",
default=str(Path(__file__).parent.parent / "turnabout" / "cases" / "stolen_prototype.json"),
help="Path to case JSON file",
)
parser.add_argument("-d", "--difficulty", choices=["easy", "hard"], default="easy")
parser.add_argument("-n", "--episodes", type=int, default=100)
parser.add_argument("--agent", choices=["random", "llm"], default="random")
parser.add_argument("--seed", type=int, default=42)
parser.add_argument("-v", "--verbose", action="store_true")
parser.add_argument("-o", "--output", help="Save results to JSON file")
args = parser.parse_args()
print(f"Evaluating {args.agent} agent on {Path(args.case).stem}")
print(f"Difficulty: {args.difficulty}, Episodes: {args.episodes}")
print()
if args.agent == "random":
results = run_benchmark(
case_path=args.case,
difficulty=args.difficulty,
n_episodes=args.episodes,
seed=args.seed,
verbose=args.verbose,
)
elif args.agent == "llm":
try:
from turnabout.agents.llm_agent import LLMAgent
except ImportError as e:
print(f"Error: {e}")
sys.exit(1)
agent = LLMAgent()
results_list = []
for i in range(args.episodes):
env = TextCourtEnv(case_path=args.case, difficulty=args.difficulty)
result = agent.run_episode(env, verbose=args.verbose and i == 0)
results_list.append(result)
print(f" Episode {i + 1}: {'WON' if result['won'] else 'LOST'} "
f"(score={result['composite_score']:.3f})")
wins = sum(r["won"] for r in results_list)
results = {
"n_episodes": args.episodes,
"win_rate": wins / args.episodes,
"avg_reward": sum(r["total_reward"] for r in results_list) / args.episodes,
"avg_steps": sum(r["steps"] for r in results_list) / args.episodes,
"avg_composite_score": sum(r["composite_score"] for r in results_list) / args.episodes,
}
print("Results:")
for k, v in results.items():
if isinstance(v, float):
print(f" {k}: {v:.4f}")
else:
print(f" {k}: {v}")
if args.output:
with open(args.output, "w") as f:
json.dump(results, f, indent=2)
print(f"\nSaved to {args.output}")
if __name__ == "__main__":
main()