mirror of
https://github.com/kolbytn/mindcraft.git
synced 2025-08-06 15:25:42 +02:00
fix restart and the issue where the server sometimes doesn't get deleted properly
This commit is contained in:
parent
19bedf0593
commit
192d92bc06
4 changed files with 125 additions and 13 deletions
|
@ -10,6 +10,9 @@ import os
|
||||||
import time
|
import time
|
||||||
import filecmp
|
import filecmp
|
||||||
import json
|
import json
|
||||||
|
import glob
|
||||||
|
|
||||||
|
from tqdm import tqdm
|
||||||
|
|
||||||
BLOCKED_ACTIONS_COOKING = [
|
BLOCKED_ACTIONS_COOKING = [
|
||||||
'!activate', '!attackPlayer', '!checkBlueprint', '!checkBlueprintLevel',
|
'!activate', '!attackPlayer', '!checkBlueprint', '!checkBlueprintLevel',
|
||||||
|
@ -35,6 +38,83 @@ BLOCKED_ACTIONS_CONSTRUCTION = [
|
||||||
'!stop', '!takeFromChest', '!viewChest'
|
'!stop', '!takeFromChest', '!viewChest'
|
||||||
]
|
]
|
||||||
|
|
||||||
|
def analyze_json_file(file_path):
|
||||||
|
"""
|
||||||
|
Analyzes a single JSON file to extract the task outcome.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
file_path (str): Path to the JSON file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
str or None: The task outcome string if found, otherwise None.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with open(file_path, 'r') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
if 'turns' in data and isinstance(data['turns'], list):
|
||||||
|
for turn in reversed(data['turns']): # Check turns from the end
|
||||||
|
if turn.get('role') == 'system' and isinstance(turn.get('content'), str):
|
||||||
|
if "Task successful ended with code : 2" in turn['content'] or "Task ended with score : 1" in turn["content"] or "Task ended in score: 1" in turn["content"]:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
except FileNotFoundError:
|
||||||
|
print(f"Error: File not found: {file_path}")
|
||||||
|
return None
|
||||||
|
except json.JSONDecodeError:
|
||||||
|
print(f"Error: Invalid JSON format in: {file_path}")
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
print(f"An unexpected error occurred while processing {file_path}: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def extract_result(folder_path):
|
||||||
|
folder_name = os.path.basename(folder_path)
|
||||||
|
json_files = glob.glob(os.path.join(folder_path, "*.json"))
|
||||||
|
# assert len(json_files) == 2, f"Expected 2 json files in {folder_name}, found {len(json_files)}"
|
||||||
|
|
||||||
|
if not json_files:
|
||||||
|
print(f"No JSON files found in {folder_name}")
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
outcome = False
|
||||||
|
for json_file in json_files:
|
||||||
|
outcome = analyze_json_file(json_file)
|
||||||
|
if outcome:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def aggregate_results(local_folders):
|
||||||
|
"""
|
||||||
|
Aggregates the analysis results for each folder.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
local_folders (list): List of local folder paths containing the JSON files.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
dict: A dictionary where keys are folder names and values are the aggregated outcomes.
|
||||||
|
"""
|
||||||
|
aggregated_data = {}
|
||||||
|
|
||||||
|
total = 0
|
||||||
|
successful = 0
|
||||||
|
for folder_path in tqdm(local_folders):
|
||||||
|
folder_name = os.path.basename(folder_path)
|
||||||
|
|
||||||
|
try:
|
||||||
|
result = extract_result(folder_path)
|
||||||
|
if result is not None:
|
||||||
|
total += 1
|
||||||
|
successful += int(result)
|
||||||
|
success = int(extract_result(folder_path))
|
||||||
|
successful += success
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error processing {folder_name}: {e}")
|
||||||
|
|
||||||
|
return {
|
||||||
|
"total": total,
|
||||||
|
"successful": successful,
|
||||||
|
}
|
||||||
|
|
||||||
def read_settings(file_path):
|
def read_settings(file_path):
|
||||||
"""Read and parse the settings.js file to get agent profiles."""
|
"""Read and parse the settings.js file to get agent profiles."""
|
||||||
with open(file_path, 'r', encoding='utf-8') as file:
|
with open(file_path, 'r', encoding='utf-8') as file:
|
||||||
|
@ -155,11 +235,15 @@ def launch_parallel_experiments(task_path,
|
||||||
task_type=task_type)
|
task_type=task_type)
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
|
||||||
for i in range(20):
|
# total_num_tasks = len(task_ids)
|
||||||
for i in range(len(servers)):
|
# total_num_experiments = total_num_tasks * num_exp
|
||||||
session_name = str(servers[i][1] - 55916)
|
# total_run = 0
|
||||||
subprocess.run(["tmux", "send-keys", "-t", "server_" + session_name, f"/op @a", "C-m"])
|
# while total_run < total_num_experiments:
|
||||||
time.sleep(10)
|
# results = aggregate_results([f"{experiments_folder}/{task_id}" for task_id in task_ids])
|
||||||
|
# total_run = results["total"]
|
||||||
|
# print(f"Total tasks run: {total_run}/{total_num_experiments}")
|
||||||
|
# print(results)
|
||||||
|
# time.sleep(15)
|
||||||
|
|
||||||
def launch_server_experiment(task_path,
|
def launch_server_experiment(task_path,
|
||||||
task_ids,
|
task_ids,
|
||||||
|
@ -404,6 +488,8 @@ def clean_up_server_files(num_copies):
|
||||||
dest_path = f"./server_data_{i}/"
|
dest_path = f"./server_data_{i}/"
|
||||||
delete_server_files(dest_path)
|
delete_server_files(dest_path)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def copy_server_files(source_path, dest_path):
|
def copy_server_files(source_path, dest_path):
|
||||||
"""Copy server files to the specified location."""
|
"""Copy server files to the specified location."""
|
||||||
try:
|
try:
|
||||||
|
@ -436,6 +522,13 @@ def delete_server_files(dest_path):
|
||||||
print(f"Server files deleted from {dest_path}")
|
print(f"Server files deleted from {dest_path}")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error deleting server files: {e}")
|
print(f"Error deleting server files: {e}")
|
||||||
|
delete_server_files(dest_path)
|
||||||
|
if not os.path.exists(dest_path):
|
||||||
|
print("Server files deleted successfully.")
|
||||||
|
else:
|
||||||
|
print("Error deleting server files.")
|
||||||
|
delete_server_files(dest_path)
|
||||||
|
|
||||||
|
|
||||||
def launch_world(server_path="./server_data/", agent_names=["andy", "jill"], session_name="server"):
|
def launch_world(server_path="./server_data/", agent_names=["andy", "jill"], session_name="server"):
|
||||||
"""Launch the Minecraft world."""
|
"""Launch the Minecraft world."""
|
||||||
|
|
|
@ -25,6 +25,8 @@ export class Agent {
|
||||||
|
|
||||||
console.log('Starting agent initialization with profile:', profile_fp);
|
console.log('Starting agent initialization with profile:', profile_fp);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Initialize components with more detailed error handling
|
// Initialize components with more detailed error handling
|
||||||
console.log('Initializing action manager...');
|
console.log('Initializing action manager...');
|
||||||
this.actions = new ActionManager(this);
|
this.actions = new ActionManager(this);
|
||||||
|
@ -45,7 +47,21 @@ export class Agent {
|
||||||
console.log('Initializing examples...');
|
console.log('Initializing examples...');
|
||||||
await this.prompter.initExamples();
|
await this.prompter.initExamples();
|
||||||
console.log('Initializing task...');
|
console.log('Initializing task...');
|
||||||
this.task = new Task(this, task_path, task_id);
|
|
||||||
|
// load mem first before doing task
|
||||||
|
let save_data = null;
|
||||||
|
if (load_mem) {
|
||||||
|
save_data = this.history.load();
|
||||||
|
}
|
||||||
|
console.log(save_data);
|
||||||
|
let taskStart = null;
|
||||||
|
if (save_data) {
|
||||||
|
taskStart = save_data.taskStart;
|
||||||
|
} else {
|
||||||
|
taskStart = Date.now();
|
||||||
|
}
|
||||||
|
// incorporate new restart time into task
|
||||||
|
this.task = new Task(this, task_path, task_id, taskStart);
|
||||||
this.blocked_actions = settings.blocked_actions.concat(this.task.blocked_actions || []);
|
this.blocked_actions = settings.blocked_actions.concat(this.task.blocked_actions || []);
|
||||||
blacklistCommands(this.blocked_actions);
|
blacklistCommands(this.blocked_actions);
|
||||||
|
|
||||||
|
@ -56,10 +72,7 @@ export class Agent {
|
||||||
|
|
||||||
initModes(this);
|
initModes(this);
|
||||||
|
|
||||||
let save_data = null;
|
|
||||||
if (load_mem) {
|
|
||||||
save_data = this.history.load();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.bot.on('login', () => {
|
this.bot.on('login', () => {
|
||||||
console.log(this.name, 'logged in!');
|
console.log(this.name, 'logged in!');
|
||||||
|
|
|
@ -86,6 +86,7 @@ export class History {
|
||||||
turns: this.turns,
|
turns: this.turns,
|
||||||
self_prompting_state: this.agent.self_prompter.state,
|
self_prompting_state: this.agent.self_prompter.state,
|
||||||
self_prompt: this.agent.self_prompter.isStopped() ? null : this.agent.self_prompter.prompt,
|
self_prompt: this.agent.self_prompter.isStopped() ? null : this.agent.self_prompter.prompt,
|
||||||
|
taskStart: this.agent.task.taskStartTime,
|
||||||
last_sender: this.agent.last_sender
|
last_sender: this.agent.last_sender
|
||||||
};
|
};
|
||||||
writeFileSync(this.memory_fp, JSON.stringify(data, null, 2));
|
writeFileSync(this.memory_fp, JSON.stringify(data, null, 2));
|
||||||
|
|
|
@ -149,11 +149,16 @@ class CookingCraftingTaskValidator {
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Task {
|
export class Task {
|
||||||
constructor(agent, task_path, task_id) {
|
constructor(agent, task_path, task_id, taskStartTime = null) {
|
||||||
this.agent = agent;
|
this.agent = agent;
|
||||||
this.data = null;
|
this.data = null;
|
||||||
this.taskTimeout = 300;
|
console.log("task start time", taskStartTime);
|
||||||
|
if (taskStartTime !== null)
|
||||||
|
this.taskStartTime = taskStartTime;
|
||||||
|
else
|
||||||
this.taskStartTime = Date.now();
|
this.taskStartTime = Date.now();
|
||||||
|
|
||||||
|
console.log(this.taskStartTime);
|
||||||
this.validator = null;
|
this.validator = null;
|
||||||
this.reset_function = null;
|
this.reset_function = null;
|
||||||
this.blocked_actions = [];
|
this.blocked_actions = [];
|
||||||
|
|
Loading…
Add table
Reference in a new issue