Skip to content

Commit 4d4cd56

Browse files
committed
Archive generated scripts output if exists
1 parent eaff412 commit 4d4cd56

4 files changed

Lines changed: 80 additions & 4 deletions

File tree

agentic/libe_agent_basic.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import subprocess
2121
import argparse
2222
import shutil
23+
import time
2324
from pathlib import Path
2425
from langchain_openai import ChatOpenAI
2526
from langchain.agents import create_agent
@@ -52,6 +53,9 @@ def create_llm(model, temperature=0, base_url=None):
5253
# Show prompts flag (set by command line)
5354
SHOW_PROMPTS = False
5455

56+
# Directory where existing generated_scripts runs are moved (create if missing)
57+
ARCHIVE_RUNS_DIR = "archive_runs"
58+
5559
# Files and directories to archive after each run
5660
# Can include directory names and glob patterns (e.g., "*.npy", "ensemble/", "*.log")
5761
ARCHIVE_ITEMS = [
@@ -131,6 +135,20 @@ def archive_run_outputs(output_dir, archive_name, error_msg=""):
131135
if filepath.is_file():
132136
shutil.move(str(filepath), str(run_output_dir / filepath.name))
133137

138+
def archive_existing_output_dir(output_dir, archive_parent=None):
139+
"""If output_dir exists, move it to archive_parent/output_dir_<unique>, then create fresh output_dir."""
140+
output_dir = Path(output_dir)
141+
archive_dir = Path(archive_parent or ARCHIVE_RUNS_DIR)
142+
if not output_dir.exists():
143+
output_dir.mkdir(parents=True, exist_ok=True)
144+
return
145+
archive_dir.mkdir(parents=True, exist_ok=True)
146+
dest = archive_dir / f"{output_dir.name}_{hex(time.time_ns())[2:10]}"
147+
shutil.move(str(output_dir), str(dest))
148+
print(f"Moved existing {output_dir} to {dest}")
149+
output_dir.mkdir(parents=True, exist_ok=True)
150+
151+
134152
def detect_run_script(directory):
135153
"""Find the run script in directory (first run_*.py file)"""
136154
directory = Path(directory)
@@ -225,7 +243,10 @@ async def main():
225243

226244
SHOW_PROMPTS = args.show_prompts
227245
output_dir = "generated_scripts"
228-
246+
247+
# If output_dir already exists, move it to archive_runs/generated_scripts_<hash>, then create fresh
248+
archive_existing_output_dir(output_dir)
249+
229250
# Copy existing scripts
230251
current_scripts = copy_existing_scripts(args.scripts, output_dir)
231252
run_script_name = detect_run_script(output_dir)

agentic/libe_agent_basic_auto.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import subprocess
2020
import argparse
2121
import shutil
22+
import time
2223
from pathlib import Path
2324
from typing import Optional
2425
from pydantic import BaseModel, Field
@@ -57,6 +58,9 @@ def create_llm(model, temperature=0, base_url=None):
5758
# Current archive name (scripts and their output go together)
5859
CURRENT_ARCHIVE = None
5960

61+
# Directory where existing generated_scripts runs are moved (create if missing)
62+
ARCHIVE_RUNS_DIR = "archive_runs"
63+
6064
# Files and directories to archive after each run
6165
ARCHIVE_ITEMS = [
6266
"ensemble", # libEnsemble output directory
@@ -67,6 +71,20 @@ def create_llm(model, temperature=0, base_url=None):
6771
]
6872

6973

74+
def archive_existing_output_dir(output_dir, archive_parent=None):
75+
"""If output_dir exists, move it to archive_parent/output_dir_<unique>, then create fresh output_dir."""
76+
output_dir = Path(output_dir)
77+
archive_dir = Path(archive_parent or ARCHIVE_RUNS_DIR)
78+
if not output_dir.exists():
79+
output_dir.mkdir(parents=True, exist_ok=True)
80+
return
81+
archive_dir.mkdir(parents=True, exist_ok=True)
82+
dest = archive_dir / f"{output_dir.name}_{hex(time.time_ns())[2:10]}"
83+
shutil.move(str(output_dir), str(dest))
84+
print(f"Moved existing {output_dir} to {dest}")
85+
output_dir.mkdir(parents=True, exist_ok=True)
86+
87+
7088
# Tool schemas
7189
class RunScriptInput(BaseModel):
7290
script_name: str = Field(description="Name of the Python script to run (e.g., 'run_libe.py')")
@@ -227,8 +245,8 @@ def setup_work_directory(scripts_dir: str) -> Path:
227245
"""Copy scripts to working directory and archive initial version"""
228246
global WORK_DIR
229247
scripts_dir = Path(scripts_dir)
248+
archive_existing_output_dir("generated_scripts")
230249
work_dir = Path("generated_scripts")
231-
work_dir.mkdir(exist_ok=True)
232250
WORK_DIR = work_dir
233251

234252
# Copy all Python files to work dir

agentic/libe_agent_interactive_llm_first.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import subprocess
2121
import argparse
2222
import shutil
23+
import time
2324
from pathlib import Path
2425
from pydantic import BaseModel, Field
2526
from langchain_openai import ChatOpenAI
@@ -39,6 +40,23 @@
3940
MODEL = DEFAULT_ANTHROPIC_MODEL
4041
SHOW_PROMPTS = False
4142

43+
# Directory where existing generated_scripts runs are moved (create if missing)
44+
ARCHIVE_RUNS_DIR = "archive_runs"
45+
46+
47+
def archive_existing_output_dir(output_dir, archive_parent=None):
48+
"""If output_dir exists, move it to archive_parent/output_dir_<unique>, then create fresh output_dir."""
49+
output_dir = Path(output_dir)
50+
archive_dir = Path(archive_parent or ARCHIVE_RUNS_DIR)
51+
if not output_dir.exists():
52+
output_dir.mkdir(parents=True, exist_ok=True)
53+
return
54+
archive_dir.mkdir(parents=True, exist_ok=True)
55+
dest = archive_dir / f"{output_dir.name}_{hex(time.time_ns())[2:10]}"
56+
shutil.move(str(output_dir), str(dest))
57+
print(f"Moved existing {output_dir} to {dest}")
58+
output_dir.mkdir(parents=True, exist_ok=True)
59+
4260

4361
def create_llm(model, temperature=0, base_url=None):
4462
"""Create LLM — ChatAnthropic for Claude models, ChatOpenAI otherwise."""
@@ -256,8 +274,8 @@ async def main():
256274

257275
SHOW_PROMPTS = args.show_prompts
258276
interactive = args.interactive
277+
archive_existing_output_dir("generated_scripts")
259278
WORK_DIR = Path("generated_scripts")
260-
WORK_DIR.mkdir(exist_ok=True)
261279

262280
# Connect to MCP server
263281
mcp_server = find_mcp_server(args.mcp_server)

agentic/libe_agent_with_script_generator.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import subprocess
2525
import argparse
2626
import shutil
27+
import time
2728
from pathlib import Path
2829
from datetime import datetime
2930
from langchain_openai import ChatOpenAI
@@ -36,6 +37,9 @@
3637
# Maximum retry attempts for fixing failed scripts
3738
MAX_RETRIES = 2
3839

40+
# Directory where existing generated_scripts runs are moved (create if missing)
41+
ARCHIVE_RUNS_DIR = "archive_runs"
42+
3943
# LLM model to use — default depends on which API key is available
4044
DEFAULT_OPENAI_MODEL = "gpt-4o-mini"
4145
DEFAULT_ANTHROPIC_MODEL = "claude-sonnet-4-20250514"
@@ -233,6 +237,20 @@ def detect_run_script(directory):
233237
return None
234238
return run_scripts[0].name
235239

240+
def archive_existing_output_dir(output_dir, archive_parent=None):
241+
"""If output_dir exists, move it to archive_parent/output_dir_<unique>, then create fresh output_dir."""
242+
output_dir = Path(output_dir)
243+
archive_dir = Path(archive_parent or ARCHIVE_RUNS_DIR)
244+
if not output_dir.exists():
245+
output_dir.mkdir(parents=True, exist_ok=True)
246+
return
247+
archive_dir.mkdir(parents=True, exist_ok=True)
248+
dest = archive_dir / f"{output_dir.name}_{hex(time.time_ns())[2:10]}"
249+
shutil.move(str(output_dir), str(dest))
250+
print(f"Moved existing {output_dir} to {dest}")
251+
output_dir.mkdir(parents=True, exist_ok=True)
252+
253+
236254
def copy_existing_scripts(scripts_dir, output_dir):
237255
"""Copy scripts from existing directory and return as formatted text"""
238256
print(f"Using existing scripts from: {scripts_dir}")
@@ -368,7 +386,8 @@ async def main():
368386
SHOW_PROMPTS = args.show_prompts
369387

370388
output_dir = "generated_scripts"
371-
389+
archive_existing_output_dir(output_dir)
390+
372391
# Copy existing scripts if provided
373392
archive_counter = 1
374393
if args.scripts:

0 commit comments

Comments
 (0)