33import traceback
44from collections .abc import Callable
55
6- from minisweagent import Model
76from minisweagent .agents .default import AgentConfig , DefaultAgent
8- from minisweagent .models import get_model
9- from minisweagent .models .test_models import DeterministicModel
10- from minisweagent .run .utils .save import save_traj
7+ from minisweagent .models import Model , get_model
118
129from codeclash import REPO_DIR
1310from codeclash .agents .player import Player
2118
2219
2320class ClashAgent (DefaultAgent ):
24- """
25- Slightly modified version of `DefaultAgent` from mini-SWE-agent
26- (https://github.com/SWE-agent/mini-swe-agent)
27- """
21+ """`DefaultAgent` from mini-SWE-agent (https://github.com/SWE-agent/mini-swe-agent)
22+ with per-player debug logging."""
2823
2924 def __init__ (
3025 self ,
@@ -38,9 +33,11 @@ def __init__(
3833 super ().__init__ (model , env , config_class = config_class , ** kwargs )
3934 self .logger = logger
4035
41- def add_message (self , role : str , content : str , ** kwargs ):
42- super ().add_message (role , content , ** kwargs )
43- self .logger .debug (f"[{ role } ] { content } " , extra = {"highlighter" : None })
36+ def add_messages (self , * messages : dict ) -> list [dict ]:
37+ result = super ().add_messages (* messages )
38+ for m in messages :
39+ self .logger .debug (f"[{ m .get ('role' )} ] { m .get ('content' )} " , extra = {"highlighter" : None })
40+ return result
4441
4542
4643class MiniSWEAgent (Player ):
@@ -50,26 +47,21 @@ def __init__(self, config: dict, environment: ContainerEnvironment, game_context
5047 super ().__init__ (config , environment = environment , game_context = game_context )
5148
5249 def run (self ):
53- # temporary workaround around https://github.com/SWE-agent/mini-swe-agent/issues/477
54- if "DeterministicModel" not in self .config ["config" ]["model" ].get ("model_class" , "" ):
55- model = get_model (config = self .config ["config" ]["model" ])
56- else :
57- model = DeterministicModel (outputs = self .config ["config" ]["model" ]["outputs" ])
50+ model = get_model (config = self .config ["config" ]["model" ])
5851 self .agent = ClashAgent (
5952 model = model ,
6053 env = self .environment ,
6154 logger = self .logger ,
6255 ** self .config ["config" ]["agent" ],
6356 )
6457 exit_status = None
65- result = None
6658 exc_message = None
6759 try :
68- exit_status , result = self .agent .run (task = "" , ** self .game_context .to_template_vars ())
60+ result = self .agent .run (task = "" , ** self .game_context .to_template_vars ())
61+ exit_status = result .get ("exit_status" , "" )
6962 except Exception as e :
7063 exit_status = str (e )
7164 exc_message = traceback .format_exc ()
72- result = exc_message
7365 self .logger .critical (exc_message )
7466 finally :
7567 traj_path = (
@@ -78,22 +70,16 @@ def run(self):
7870 / self .name
7971 / f"{ self .name } _r{ self .game_context .round } .traj.json"
8072 )
81- save_traj (
82- self .agent , # type: ignore
83- traj_path ,
84- exit_status = exit_status ,
85- result = result ,
86- print_fct = self .logger .debug ,
87- )
73+ self .agent .save (traj_path )
8874 copy_to_container (
8975 self .environment ,
9076 traj_path ,
9177 self .game_context .log_env / "edits" / traj_path .name ,
9278 )
9379 self ._metadata ["agent_stats" ][self .game_context .round ] = {
9480 "exit_status" : exit_status ,
95- "cost" : self .agent .model . cost ,
96- "api_calls" : self .agent .model . n_calls ,
81+ "cost" : self .agent .cost ,
82+ "api_calls" : self .agent .n_calls ,
9783 }
9884 if exit_status .lower ().strip () not in ["" , "submitted" , "limitsexceeded" ] and exc_message is not None :
9985 raise RuntimeError (f"Agent { self .name } failed with exit status: { exit_status } and exception: { exc_message } " )
0 commit comments