33import traceback
44from collections .abc import Callable
55
6- from minisweagent import Model
76from minisweagent .agents .default import AgentConfig , DefaultAgent
87from minisweagent .environments .docker import DockerEnvironment
9- from minisweagent .models import get_model
10- from minisweagent .models .test_models import DeterministicModel
11- from minisweagent .run .utils .save import save_traj
8+ from minisweagent .models import Model , get_model
129
1310from codeclash import REPO_DIR
1411from codeclash .agents .player import Player
2219
2320
2421class ClashAgent (DefaultAgent ):
25- """
26- Slightly modified version of `DefaultAgent` from mini-SWE-agent
27- (https://github.com/SWE-agent/mini-swe-agent)
28- """
22+ """`DefaultAgent` from mini-SWE-agent (https://github.com/SWE-agent/mini-swe-agent)
23+ with per-player debug logging."""
2924
3025 def __init__ (
3126 self ,
@@ -39,9 +34,11 @@ def __init__(
3934 super ().__init__ (model , env , config_class = config_class , ** kwargs )
4035 self .logger = logger
4136
42- def add_message (self , role : str , content : str , ** kwargs ):
43- super ().add_message (role , content , ** kwargs )
44- self .logger .debug (f"[{ role } ] { content } " , extra = {"highlighter" : None })
37+ def add_messages (self , * messages : dict ) -> list [dict ]:
38+ result = super ().add_messages (* messages )
39+ for m in messages :
40+ self .logger .debug (f"[{ m .get ('role' )} ] { m .get ('content' )} " , extra = {"highlighter" : None })
41+ return result
4542
4643
4744class MiniSWEAgent (Player ):
@@ -51,26 +48,21 @@ def __init__(self, config: dict, environment: DockerEnvironment, game_context: G
5148 super ().__init__ (config , environment = environment , game_context = game_context )
5249
5350 def run (self ):
54- # temporary workaround around https://github.com/SWE-agent/mini-swe-agent/issues/477
55- if "DeterministicModel" not in self .config ["config" ]["model" ].get ("model_class" , "" ):
56- model = get_model (config = self .config ["config" ]["model" ])
57- else :
58- model = DeterministicModel (outputs = self .config ["config" ]["model" ]["outputs" ])
51+ model = get_model (config = self .config ["config" ]["model" ])
5952 self .agent = ClashAgent (
6053 model = model ,
6154 env = self .environment ,
6255 logger = self .logger ,
6356 ** self .config ["config" ]["agent" ],
6457 )
6558 exit_status = None
66- result = None
6759 exc_message = None
6860 try :
69- exit_status , result = self .agent .run (task = "" , ** self .game_context .to_template_vars ())
61+ result = self .agent .run (task = "" , ** self .game_context .to_template_vars ())
62+ exit_status = result .get ("exit_status" , "" )
7063 except Exception as e :
7164 exit_status = str (e )
7265 exc_message = traceback .format_exc ()
73- result = exc_message
7466 self .logger .critical (exc_message )
7567 finally :
7668 traj_path = (
@@ -79,22 +71,16 @@ def run(self):
7971 / self .name
8072 / f"{ self .name } _r{ self .game_context .round } .traj.json"
8173 )
82- save_traj (
83- self .agent , # type: ignore
84- traj_path ,
85- exit_status = exit_status ,
86- result = result ,
87- print_fct = self .logger .debug ,
88- )
74+ self .agent .save (traj_path )
8975 copy_to_container (
9076 self .environment ,
9177 traj_path ,
9278 self .game_context .log_env / "edits" / traj_path .name ,
9379 )
9480 self ._metadata ["agent_stats" ][self .game_context .round ] = {
9581 "exit_status" : exit_status ,
96- "cost" : self .agent .model . cost ,
97- "api_calls" : self .agent .model . n_calls ,
82+ "cost" : self .agent .cost ,
83+ "api_calls" : self .agent .n_calls ,
9884 }
9985 if exit_status .lower ().strip () not in ["" , "submitted" , "limitsexceeded" ] and exc_message is not None :
10086 raise RuntimeError (f"Agent { self .name } failed with exit status: { exit_status } and exception: { exc_message } " )
0 commit comments