@@ -237,7 +237,7 @@ def process_round_results(round_results: dict[str, Any] | None) -> dict[str, Any
237237class TrajectoryInfo :
238238 """Information about a single trajectory"""
239239
240- player_id : int
240+ player_id : str # Changed from int to str to support player names
241241 round_num : int
242242 api_calls : int
243243 cost : float
@@ -322,16 +322,16 @@ def parse_game_metadata(self) -> GameMetadata:
322322 agent_info = agent_info ,
323323 )
324324
325- def parse_trajectory (self , player_id : int , round_num : int ) -> TrajectoryInfo | None :
325+ def parse_trajectory (self , player_name : str , round_num : int ) -> TrajectoryInfo | None :
326326 """Parse a specific trajectory file"""
327- # Look in players/$player_id / directory
328- player_dir = self .log_dir / "players" / f"p { player_id } "
327+ # Look in players/$player_name / directory
328+ player_dir = self .log_dir / "players" / player_name
329329 if not player_dir .exists ():
330330 return None
331331
332332 # Try both .json and .log extensions
333333 for ext in [".json" , ".log" ]:
334- traj_file = player_dir / f"p { player_id } _r{ round_num } .traj{ ext } "
334+ traj_file = player_dir / f"{ player_name } _r{ round_num } .traj{ ext } "
335335 if traj_file .exists ():
336336 try :
337337 data = json .loads (traj_file .read_text ())
@@ -340,7 +340,6 @@ def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | N
340340 model_stats = info .get ("model_stats" , {})
341341
342342 # Get diff data from player metadata if available
343- player_name = f"p{ player_id } "
344343 diff = None
345344 incremental_diff = None
346345 modified_files = None
@@ -362,7 +361,7 @@ def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | N
362361 )
363362
364363 return TrajectoryInfo (
365- player_id = player_id ,
364+ player_id = player_name , # Now stores player name instead of numeric ID
366365 round_num = round_num ,
367366 api_calls = model_stats .get ("api_calls" , 0 ),
368367 cost = model_stats .get ("instance_cost" , 0.0 ),
@@ -383,7 +382,7 @@ def parse_trajectory(self, player_id: int, round_num: int) -> TrajectoryInfo | N
383382 return None
384383
385384 def get_available_trajectories (self ) -> list [tuple ]:
386- """Get list of available trajectory files as (player_id , round_num) tuples"""
385+ """Get list of available trajectory files as (player_name , round_num) tuples"""
387386 trajectories = []
388387 players_dir = self .log_dir / "players"
389388
@@ -395,22 +394,18 @@ def get_available_trajectories(self) -> list[tuple]:
395394 if not player_dir .is_dir ():
396395 continue
397396
398- try :
399- # Extract player_id from directory name (e.g., "p1" -> 1)
400- player_id = int (player_dir .name [1 :]) # Remove 'p' prefix
401- except (ValueError , IndexError ):
402- continue
397+ player_name = player_dir .name
403398
404399 # Find trajectory files in this player's directory
405- for traj_file in player_dir .glob ("p *_r*.traj.*" ):
406- # Extract round from filename like p1_r2 .traj.json
400+ for traj_file in player_dir .glob ("*_r*.traj.*" ):
401+ # Extract round from filename like gpt5_r2 .traj.json
407402 parts = traj_file .stem .split ("." ) # Remove extension
408403 if parts :
409- name_part = parts [0 ] # p1_r2
404+ name_part = parts [0 ] # gpt5_r2
410405 try :
411406 _ , round_part = name_part .split ("_" )
412407 round_num = int (round_part [1 :]) # Remove 'r' prefix
413- trajectories .append ((player_id , round_num ))
408+ trajectories .append ((player_name , round_num ))
414409 except (ValueError , IndexError ):
415410 continue
416411
@@ -465,10 +460,10 @@ def index():
465460
466461 # Group trajectories by round
467462 trajectories_by_round = {}
468- for player_id , round_num in available_trajectories :
463+ for player_name , round_num in available_trajectories :
469464 if round_num not in trajectories_by_round :
470465 trajectories_by_round [round_num ] = []
471- trajectory = parser .parse_trajectory (player_id , round_num )
466+ trajectory = parser .parse_trajectory (player_name , round_num )
472467 if trajectory :
473468 trajectories_by_round [round_num ].append (trajectory )
474469
@@ -493,16 +488,16 @@ def game_picker():
493488 return render_template ("picker.html" , game_folders = game_folders , base_dir = str (logs_dir ))
494489
495490
496- @app .route ("/trajectory/<int:player_id >/<int:round_num>" )
497- def trajectory_detail (player_id : int , round_num : int ):
491+ @app .route ("/trajectory/<player_name >/<int:round_num>" )
492+ def trajectory_detail (player_name : str , round_num : int ):
498493 """Get detailed trajectory data"""
499494 selected_folder = request .args .get ("folder" )
500495 if not selected_folder :
501496 return jsonify ({"error" : "No folder specified" })
502497
503498 logs_dir = LOG_BASE_DIR
504499 parser = LogParser (logs_dir / selected_folder )
505- trajectory = parser .parse_trajectory (player_id , round_num )
500+ trajectory = parser .parse_trajectory (player_name , round_num )
506501
507502 if not trajectory :
508503 return jsonify ({"error" : "Trajectory not found" })
0 commit comments