Merge branch 'constructionTaskRevision' of https://github.com/icwhite/mindcraft into constructionTaskRevision

merge
This commit is contained in:
Mehul Maheshwari 2025-03-20 14:04:44 -07:00
commit a61c6da134
56 changed files with 104057 additions and 3622 deletions

View file

@ -76,7 +76,7 @@ def analyze_json_file(file_path):
if 'turns' in data and isinstance(data['turns'], list): if 'turns' in data and isinstance(data['turns'], list):
for turn in reversed(data['turns']): # Check turns from the end for turn in reversed(data['turns']): # Check turns from the end
if turn.get('role') == 'system' and isinstance(turn.get('content'), str): if turn.get('role') == 'system' and isinstance(turn.get('content'), str):
if "Task successful ended with code : 2" in turn['content'] or "Task ended in score: 1" in turn["content"]: 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 True
return False return False
except FileNotFoundError: except FileNotFoundError:
@ -155,7 +155,7 @@ def aggregate_results(local_folders):
success = int(extract_result(folder_path)) success = int(extract_result(folder_path))
successful += success successful += success
if "missing" in folder_path: if "missing" in folder_path and not is_base(folder_path):
missing_successful += success missing_successful += success
missing_total += 1 missing_total += 1
if is_base(folder_path): if is_base(folder_path):

View file

@ -0,0 +1,39 @@
import boto3
import os
import json
import re
from botocore.exceptions import ClientError
import json
import argparse
from tqdm import tqdm
import glob
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 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

222
analyze_cooking_tasks.py Normal file
View file

@ -0,0 +1,222 @@
import os
import json
import re
from collections import defaultdict
def extract_cooking_items(exp_dir):
"""Extract cooking items from experiment directory name."""
# Remove prefix and blocked access part
clean_name = re.sub(r'^multiagent_cooking_', '', exp_dir)
clean_name = re.sub(r'_blocked_access_[0-9_]+$', '', clean_name)
# Extract individual items
items = []
for item_match in re.finditer(r'([0-9]+)_([a-zA-Z_]+)', clean_name):
count = int(item_match.group(1))
item = item_match.group(2)
# Remove trailing underscores to fix the item name issue
item = item.rstrip('_')
items.append(item)
return items
def analyze_experiments(root_dir):
# Store results by number of blocked agents
blocked_access_results = defaultdict(lambda: {
"success": 0,
"total": 0,
"cake_success": 0,
"cake_total": 0,
"non_cake_success": 0,
"non_cake_total": 0
})
# Store results by cooking item
cooking_item_results = defaultdict(lambda: {
"success": 0,
"total": 0
})
# Keep track of all unique cooking items
all_cooking_items = set()
# Get a list of all experiment directories
experiment_dirs = [d for d in os.listdir(root_dir) if os.path.isdir(os.path.join(root_dir, d))
and d.startswith("multiagent_cooking_")]
for exp_dir in experiment_dirs:
# Extract cooking items
cooking_items = extract_cooking_items(exp_dir)
# Add to unique items set
all_cooking_items.update(cooking_items)
# Check if experiment involves cake
has_cake = any(item == "cake" for item in cooking_items)
# Extract blocked access information from directory name
blocked_access_match = re.search(r'blocked_access_([0-9_]+)$', exp_dir)
if blocked_access_match:
blocked_access_str = blocked_access_match.group(1)
# Count how many agents have blocked access
num_blocked_agents = len(blocked_access_str.split('_'))
blocked_key = f"{num_blocked_agents} agent(s)"
else:
# No agents blocked
blocked_key = "0 agent(s)"
# Check if the task was successful
is_successful = False
full_exp_path = os.path.join(root_dir, exp_dir)
# Get all JSON files in the experiment directory
agent_files = [f for f in os.listdir(full_exp_path) if f.endswith(".json")]
# Check each agent file for success information
for agent_file in agent_files:
agent_file_path = os.path.join(full_exp_path, agent_file)
try:
with open(agent_file_path, 'r') as f:
agent_data = json.load(f)
# Check for success in the turns data
if "turns" in agent_data:
for turn in agent_data["turns"]:
if turn.get("role") == "system" and "content" in turn:
if isinstance(turn["content"], str) and "Task ended with score : 1" in turn["content"]:
is_successful = True
break
# If we found success, no need to check other files
if is_successful:
break
except (json.JSONDecodeError, IOError) as e:
print(f"Error reading {agent_file_path}: {e}")
# Continue to check other agent files instead of failing
continue
# Update cooking item results
for item in cooking_items:
cooking_item_results[item]["total"] += 1
if is_successful:
cooking_item_results[item]["success"] += 1
# Update the appropriate blocked access counters
# First update the category-specific counters
if has_cake:
blocked_access_results[blocked_key]["cake_total"] += 1
if is_successful:
blocked_access_results[blocked_key]["cake_success"] += 1
else:
blocked_access_results[blocked_key]["non_cake_total"] += 1
if is_successful:
blocked_access_results[blocked_key]["non_cake_success"] += 1
# Only count non-cake experiments in the main totals
blocked_access_results[blocked_key]["total"] += 1
if is_successful:
blocked_access_results[blocked_key]["success"] += 1
return blocked_access_results, cooking_item_results, all_cooking_items
def print_blocked_results(results):
print("\nExperiment Results by Number of Agents with Blocked Access (Excluding Cake Experiments):")
print("=" * 80)
print(f"{'Blocked Agents':<15} | {'Success Rate':<15} | {'Success/Total':<15} | {'Cake Tasks':<15} | {'Non-Cake Tasks':<15}")
print("-" * 80)
# Calculate totals
total_success = 0
total_experiments = 0
total_cake = 0
total_non_cake = 0
# Sort by number of blocked agents
for key in sorted(results.keys(), key=lambda x: int(x.split()[0])):
success = results[key]["success"]
total = results[key]["total"]
cake_total = results[key]["cake_total"]
non_cake_total = results[key]["non_cake_total"]
# Verify that non_cake_total matches total
if non_cake_total != total:
print(f"Warning: Non-cake total ({non_cake_total}) doesn't match the total ({total}) for {key}")
total_success += success
total_experiments += total
total_cake += cake_total
total_non_cake += non_cake_total
success_rate = (success / total * 100) if total > 0 else 0
print(f"{key:<15} | {success_rate:>6.2f}% | {success}/{total:<13} | {cake_total:<15} | {non_cake_total:<15}")
# Calculate overall success rate (excluding cake experiments)
overall_success_rate = (total_success / total_experiments * 100) if total_experiments > 0 else 0
print("-" * 80)
print(f"{'Overall':<15} | {overall_success_rate:>6.2f}% | {total_success}/{total_experiments:<13} | {total_cake:<15} | {total_non_cake:<15}")
# Print cake experiment details
print("\nCake Experiment Details:")
print("=" * 60)
print(f"{'Blocked Agents':<15} | {'Success Rate':<15} | {'Success/Total':<15}")
print("-" * 60)
cake_total_success = 0
cake_total_experiments = 0
for key in sorted(results.keys(), key=lambda x: int(x.split()[0])):
cake_success = results[key]["cake_success"]
cake_total = results[key]["cake_total"]
cake_total_success += cake_success
cake_total_experiments += cake_total
cake_success_rate = (cake_success / cake_total * 100) if cake_total > 0 else 0
print(f"{key:<15} | {cake_success_rate:>6.2f}% | {cake_success}/{cake_total}")
cake_overall_success_rate = (cake_total_success / cake_total_experiments * 100) if cake_total_experiments > 0 else 0
print("-" * 60)
print(f"{'Overall':<15} | {cake_overall_success_rate:>6.2f}% | {cake_total_success}/{cake_total_experiments}")
def print_cooking_items(cooking_items):
print("\nUnique Cooking Items Found:")
print("=" * 60)
print(", ".join(sorted(cooking_items)))
print(f"Total unique items: {len(cooking_items)}")
def print_item_results(item_results):
print("\nExperiment Results by Cooking Item:")
print("=" * 60)
print(f"{'Cooking Item':<20} | {'Success Rate':<15} | {'Success/Total':<15}")
print("-" * 60)
# Sort by item name
for item in sorted(item_results.keys()):
success = item_results[item]["success"]
total = item_results[item]["total"]
success_rate = (success / total * 100) if total > 0 else 0
print(f"{item:<20} | {success_rate:>6.2f}% | {success}/{total}")
print("-" * 60)
def main():
# Update this path to your experiments directory
experiments_root = "../results/llama_70b_hells_kitchen_cooking_tasks"
print(f"Analyzing experiments in: {os.path.abspath(experiments_root)}")
blocked_results, item_results, unique_items = analyze_experiments(experiments_root)
print_blocked_results(blocked_results)
print_cooking_items(unique_items)
print_item_results(item_results)
if __name__ == "__main__":
main()

View file

@ -8,6 +8,111 @@ import re
import sys import sys
import os import os
import time import time
import filecmp
import json
import glob
import socket
from tqdm import tqdm
import boto3
BLOCKED_ACTIONS_COOKING = [
'!activate', '!attackPlayer', '!checkBlueprint', '!checkBlueprintLevel',
'!clearChat', '!clearFurnace', '!consume', '!craftable', '!discard', '!endConversation',
'!endGoal', '!entities', '!equip', '!followPlayer', '!getBlueprint', '!getBlueprintLevel',
'!goToBed', '!help', '!modes', '!moveAway', '!newAction', '!placeHere', '!putInChest',
'!restart', '!setMode', '!stay', '!stfu', '!stop'
]
BLOCKED_ACTIONS_CRAFTING = [
'!activate', '!attack', '!attackPlayer', '!checkBlueprint', '!checkBlueprintLevel',
'!clearChat', '!clearFurnace', '!consume', '!craftable', '!discard', '!endConversation',
'!endGoal', '!entities', '!followPlayer', '!getBlueprint', '!getBlueprintLevel',
'!goToBed', '!help', '!modes', '!newAction', '!putInChest', '!restart',
'!searchForEntity', '!setMode', '!stay', '!stfu', '!stop', '!takeFromChest',
'!viewChest'
]
BLOCKED_ACTIONS_CONSTRUCTION = [
'!activate', '!attackPlayer', '!clearChat', '!clearFurnace', '!collectBlocks',
'!consume', '!craftable', '!discard', '!endConversation', '!endGoal', '!entities',
'!equip', '!followPlayer', '!getBlueprint', '!getBlueprintLevel', '!goToBed',
'!help', '!modes', '!moveAway', '!newAction', '!placeHere', '!putInChest',
'!restart', '!searchForBlock', '!searchForEntity', '!setMode', '!stay', '!stfu',
'!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:
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)
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."""
@ -71,35 +176,8 @@ def check_task_completion(agents):
except (FileNotFoundError, json.JSONDecodeError) as e: except (FileNotFoundError, json.JSONDecodeError) as e:
print(f"Error reading memory for agent {agent}: {e}") print(f"Error reading memory for agent {agent}: {e}")
continue continue
return False # Default to failure if no conclusive result found return False # Default to failure if no conclusive result found
def update_results_file(task_id, success_count, total_count, time_taken, experiment_results, results_filename):
"""Update the results file with current success ratio and time taken."""
success_ratio = success_count / total_count
with open(results_filename, 'w') as f: # 'w' mode overwrites the file each time
f.write(f"Task ID: {task_id}\n")
f.write(f"Experiments completed: {total_count}\n")
f.write(f"Successful experiments: {success_count}\n")
f.write(f"Success ratio: {success_ratio:.2f}\n")
f.write(f"Time taken for last experiment: {time_taken:.2f} seconds\n")
# Write individual experiment results
for i, result in enumerate(experiment_results, 1):
f.write(f"Experiment {i}: {'Success' if result['success'] else 'Failure'}, Time taken: {result['time_taken']:.2f} seconds\n")
# Write aggregated metrics
total_time = sum(result['time_taken'] for result in experiment_results)
f.write(f"\nAggregated metrics:\n")
f.write(f"Total experiments: {total_count}\n")
f.write(f"Total successful experiments: {success_count}\n")
f.write(f"Overall success ratio: {success_ratio:.2f}\n")
f.write(f"Total time taken: {total_time:.2f} seconds\n")
f.write(f"Average time per experiment: {total_time / total_count:.2f} seconds\n")
f.write(f"Last updated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
def set_environment_variable_tmux_session(session_name, key, value): def set_environment_variable_tmux_session(session_name, key, value):
"""Set an environment variable for the current process.""" """Set an environment variable for the current process."""
subprocess.run(["tmux", "send-keys", "-t", session_name, f"export {key}={value}", "C-m"]) subprocess.run(["tmux", "send-keys", "-t", session_name, f"export {key}={value}", "C-m"])
@ -114,9 +192,10 @@ def launch_parallel_experiments(task_path,
s3=False, s3=False,
bucket_name="mindcraft-experiments", bucket_name="mindcraft-experiments",
template_profile="profiles/tasks/collab_profile.json", template_profile="profiles/tasks/collab_profile.json",
world_name="Forest",
insecure_coding=False, insecure_coding=False,
url="http://127.0.0.1:8000/v1"): url="http://127.0.0.1:8000/v1",
max_messages=15,
num_examples=2):
with open(task_path, 'r', encoding='utf-8') as file: with open(task_path, 'r', encoding='utf-8') as file:
content = file.read() content = file.read()
@ -124,15 +203,33 @@ def launch_parallel_experiments(task_path,
task_ids = json_data.keys() task_ids = json_data.keys()
task_type = json_data[list(task_ids)[0]]["type"]
# split the task_ids into num_parallel groups # split the task_ids into num_parallel groups
task_ids = list(task_ids) task_ids = list(task_ids)
task_ids_split = [task_ids[i::num_parallel] for i in range(num_parallel)] task_ids_split = [task_ids[i::num_parallel] for i in range(num_parallel)]
if task_type == "cooking":
world_name = "Superflat"
elif task_type == "techtree":
world_name = "Forest"
elif task_type == "construction":
world_name = "Superflat"
servers = create_server_files("./server_data/", num_parallel, world_name=world_name) servers = create_server_files("./server_data/", num_parallel, world_name=world_name)
date_time = datetime.now().strftime("%m-%d_%H-%M") date_time = datetime.now().strftime("%m-%d_%H-%M")
experiments_folder = f"experiments/{exp_name}_{date_time}" experiments_folder = f"experiments/{exp_name}_{date_time}"
exp_name = f"{exp_name}_{date_time}" exp_name = f"{exp_name}_{date_time}"
split_task_path = task_path.split("/")
if len(split_task_path) > 1:
task_path_name = split_task_path[-2]
else:
task_path_name = "tasks"
s3_path = f"{bucket_name}/{task_type}/{model}/{task_path_name}/{exp_name}"
# start wandb # start wandb
os.makedirs(experiments_folder, exist_ok=True) os.makedirs(experiments_folder, exist_ok=True)
for i, server in enumerate(servers): for i, server in enumerate(servers):
@ -149,9 +246,39 @@ def launch_parallel_experiments(task_path,
api=api, api=api,
insecure_coding=insecure_coding, insecure_coding=insecure_coding,
num_agents=num_agents, num_agents=num_agents,
url=url) url=url,
task_type=task_type,
s3_path=s3_path,
max_messages=max_messages,
num_examples=num_examples)
time.sleep(5) time.sleep(5)
total_num_tasks = len(task_ids)
total_num_experiments = total_num_tasks * num_exp
total_run = 0
while total_run < total_num_experiments:
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)
results["exp_name"] = exp_name
results["template_profile"] = template_profile
results["model"] = model
results["api"] = api
results["num_agents"] = num_agents
results["task_path"] = task_path
results["task_type"] = task_type
results["max_messages"] = max_messages
results["num_examples"] = num_examples
with open(f"{experiments_folder}/results.txt", "w") as file:
file.write(str(results))
if s3:
cmd = f"aws s3 cp {experiments_folder}/results.txt s3://{s3_path}/results.txt"
print(cmd)
subprocess.run(cmd.split())
time.sleep(60)
def launch_server_experiment(task_path, def launch_server_experiment(task_path,
task_ids, task_ids,
num_exp, num_exp,
@ -165,7 +292,12 @@ def launch_server_experiment(task_path,
bucket_name="mindcraft-experiments", bucket_name="mindcraft-experiments",
template_profile="profiles/tasks/collab_profile.json", template_profile="profiles/tasks/collab_profile.json",
insecure_coding=False, insecure_coding=False,
url="http://127.0.0.1:8000/v1"): url="http://127.0.0.1:8000/v1",
task_type="techtree",
s3_path="",
max_messages=15,
num_examples=2):
""" """
Launch a Minecraft server and run experiments on it. Launch a Minecraft server and run experiments on it.
@param task_path: Path to the task file @param task_path: Path to the task file
@ -194,7 +326,9 @@ def launch_server_experiment(task_path,
models = [model] * 2 models = [model] * 2
apis = [api] * 2 apis = [api] * 2
else: else:
agent_names = [f"Andy_{session_name}", f"Jill_{session_name}", f"Bob_{session_name}"] agent_names = []
for i in range(num_agents):
agent_names.append(f"Agent_{i}_{session_name}")
models = [model] * 3 models = [model] * 3
apis = [api] * 3 apis = [api] * 3
make_profiles(agent_names, models, apis, template_profile=template_profile, url=url) make_profiles(agent_names, models, apis, template_profile=template_profile, url=url)
@ -205,29 +339,38 @@ def launch_server_experiment(task_path,
agent_profiles_str = f"'[\"{agent_profiles[0]}\"]'" agent_profiles_str = f"'[\"{agent_profiles[0]}\"]'"
elif num_agents == 2: elif num_agents == 2:
agent_profiles_str = f"'[\"{agent_profiles[0]}\", \"{agent_profiles[1]}\"]'" agent_profiles_str = f"'[\"{agent_profiles[0]}\", \"{agent_profiles[1]}\"]'"
else:
agent_profiles_str = "'["
for agent in agent_profiles[:-1]:
agent_profiles_str += f'\"{agent}\", '
agent_profiles_str += f"\"{agent_profiles[-1]}\"]'"
print(agent_profiles_str) print(agent_profiles_str)
launch_world(server_path, session_name="server_" + session_name, agent_names=agent_names) launch_world(server_path, session_name="server_" + session_name, agent_names=agent_names, port=server_port)
subprocess.run(['tmux', 'new-session', '-d', '-s', session_name], check=True) subprocess.run(['tmux', 'new-session', '-d', '-s', session_name], check=True)
# set environment variables # set environment variables
set_environment_variable_tmux_session(session_name, "MINECRAFT_PORT", server_port) set_environment_variable_tmux_session(session_name, "MINECRAFT_PORT", server_port)
set_environment_variable_tmux_session(session_name, "MINDSERVER_PORT", mindserver_port) set_environment_variable_tmux_session(session_name, "MINDSERVER_PORT", mindserver_port)
set_environment_variable_tmux_session(session_name, "PROFILES", agent_profiles_str) set_environment_variable_tmux_session(session_name, "PROFILES", agent_profiles_str)
set_environment_variable_tmux_session(session_name, "MAX_MESSAGES", str(max_messages))
set_environment_variable_tmux_session(session_name, "NUM_EXAMPLES", str(num_examples))
if insecure_coding: if insecure_coding:
set_environment_variable_tmux_session(session_name, "INSECURE_CODING", "true") set_environment_variable_tmux_session(session_name, "INSECURE_CODING", "true")
make_ops(agent_names, session_name)
# you need to add the bots to the world first before you can add them as op
cmd = f"node main.js --task_path example_tasks.json --task_id debug_multi_agent_timeout"
subprocess.run(["tmux", "send-keys", "-t", session_name, cmd, "C-m"])
time.sleep(20)
# add the bots as op # add the bots as op
for agent in agent_names: # op_script_content = "sleep 5\n\op @p" * 20
subprocess.run(["tmux", "send-keys", "-t", "server_" + session_name, f"/op {agent}", "C-m"]) # op_script_file = f"./tmp/op_script_{session_name}.sh"
time.sleep(1) # make_script_file_and_run(op_script_content, "server_" + session_name, op_script_file)
if task_type == "cooking":
set_environment_variable_tmux_session(session_name, "BLOCKED_ACTIONS", BLOCKED_ACTIONS_COOKING)
elif task_type == "techtree":
set_environment_variable_tmux_session(session_name, "BLOCKED_ACTIONS", BLOCKED_ACTIONS_CRAFTING)
elif task_type == "construction":
set_environment_variable_tmux_session(session_name, "BLOCKED_ACTIONS", BLOCKED_ACTIONS_CONSTRUCTION)
script_content = "" script_content = ""
for task_id in task_ids: for task_id in task_ids:
@ -250,8 +393,7 @@ def launch_server_experiment(task_path,
script_content += f"{cp_cmd}\n" script_content += f"{cp_cmd}\n"
script_content += "sleep 1\n" script_content += "sleep 1\n"
if s3: if s3:
s3_cmd = f"aws s3 cp {agent_file_path} s3://{bucket_name}/{exp_name}/{task_id}/{agent}_{_}.json" s3_cmd = f"aws s3 cp {agent_file_path} s3://{s3_path}/{task_id}/{agent}_{_}.json"
s3_upload_experiment = f"aws s3 cp {agent_file_path} s3://{bucket_name}/{exp_name}/{task_id}/{agent}_{_}.json"
script_content += f"echo 'Uploading {agent_file_path} to S3'\n" script_content += f"echo 'Uploading {agent_file_path} to S3'\n"
script_content += f"echo '{s3_cmd}'\n" script_content += f"echo '{s3_cmd}'\n"
script_content += f"{s3_cmd}\n" script_content += f"{s3_cmd}\n"
@ -259,27 +401,58 @@ def launch_server_experiment(task_path,
script_content += f"sleep 10\n" script_content += f"sleep 10\n"
if s3: if s3:
for agent in agent_names: for agent in agent_names:
script_content += f"aws s3 cp bots/{agent} s3://{bucket_name}/{exp_name}/bots/{agent} --recursive\n" script_content += f"aws s3 cp bots/{agent} s3://{s3_path}/bots/{agent} --recursive\n"
# Create a temporary shell script file # Create a temporary shell script file
script_file = f"./tmp/experiment_script_{session_name}.sh" script_file = f"./tmp/experiment_script_{session_name}.sh"
make_script_file_and_run(script_content, session_name, script_file)
script_dir = os.path.dirname(script_file) def make_ops(agent_names, session_name):
"""Make the agents operators in the Minecraft world."""
print('Making agents operators...')
cmd = f"node main.js --task_path example_tasks.json --task_id debug_{len(agent_names)}_agent_timeout"
subprocess.run(["tmux", "send-keys", "-t", session_name, cmd, "C-m"])
time.sleep(30)
subprocess.run(["tmux", "send-keys", "-t", "server_" + session_name, f"/op @a", "C-m"])
agents_op = check_agent_ops(agent_names, ops_file=f"./server_data_{session_name}/ops.json")
if agents_op:
print("Agents are operators! You are good to go :D")
else:
print("Agents are not operators! Something went wrong :(")
make_ops(agent_names, session_name)
def check_agent_ops(agent_names, ops_file="ops.json"):
with open(ops_file, "r") as f:
ops_data = json.load(f)
ops_names = [op["name"] for op in ops_data]
for agent in agent_names:
if agent not in ops_names:
return False
return True
def make_script_file_and_run(script_content, session_name, file_name):
script_dir = os.path.dirname(file_name)
os.makedirs(script_dir, exist_ok=True) os.makedirs(script_dir, exist_ok=True)
assert os.path.exists(script_dir), f"Script directory {script_dir} was not created" assert os.path.exists(script_dir), f"Script directory {script_dir} was not created"
print(f"Created script directory: {script_dir}") print(f"Created script directory: {script_dir}")
# Call the function before writing the script file # Call the function before writing the script file
with open(script_file, 'w') as f: with open(file_name, 'w') as f:
f.write(script_content) f.write(script_content)
assert os.path.exists(script_file), f"Script file {script_file} was not created" assert os.path.exists(file_name), f"Script file {file_name} was not created"
script_file_run = "bash " + script_file script_file_run = "bash " + file_name
# Execute the shell script using subprocess # Execute the shell script using subprocess
subprocess.run(["tmux", "send-keys", "-t", session_name, script_file_run, "C-m"]) subprocess.run(["tmux", "send-keys", "-t", session_name, script_file_run, "C-m"])
# subprocess.run(["tmux", "send-keys", "-t", session_name, f"/op {agent_names[0]}", "C-m"]) # subprocess.run(["tmux", "send-keys", "-t", session_name, f"/op {agent_names[0]}", "C-m"])
def make_profiles(agent_names, models, apis, template_profile="profiles/collab_profile.json", url="http://127.0.0.1:8000/v1"): def make_profiles(agent_names, models, apis, template_profile="profiles/collab_profile.json", url="http://127.0.0.1:8000/v1"):
@ -298,6 +471,12 @@ def make_profiles(agent_names, models, apis, template_profile="profiles/collab_p
"model": models[index], "model": models[index],
"url": url "url": url
} }
elif apis[index] == "ollama":
profile["model"] = {
"api": "ollama",
"model": models[index],
"embedding": "ollama"
}
else: else:
profile["model"] = models[index] profile["model"] = models[index]
@ -347,6 +526,23 @@ def copy_server_files(source_path, dest_path):
print(f"Server files copied to {dest_path}") print(f"Server files copied to {dest_path}")
except Exception as e: except Exception as e:
print(f"Error copying server files: {e}") print(f"Error copying server files: {e}")
time.sleep(10)
same_files = check_same_files(source_path, dest_path)
if not same_files:
copy_server_files(source_path, dest_path)
print("The destination path does not contain all the same files as the source path.")
else:
print("The destination path contains all the same files as the source path.")
def check_same_files(d1, d2):
items1 = set(os.listdir(d1))
items2 = set(os.listdir(d2))
if items1 != items2:
return False
return True
def delete_server_files(dest_path): def delete_server_files(dest_path):
"""Delete server files from the specified location.""" """Delete server files from the specified location."""
@ -355,17 +551,35 @@ 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}")
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", port=55916):
"""Launch the Minecraft world.""" """Launch the Minecraft world."""
print(server_path) print(f"Launching Minecraft world with port {port}...")
cmd = f"cd {server_path} && java -jar server.jar" cmd = f"cd {server_path} && java -jar server.jar"
subprocess.run(['tmux', 'new-session', '-d', '-s', session_name], check=True) subprocess.run(['tmux', 'new-session', '-d', '-s', session_name], check=True)
subprocess.run(["tmux", "send-keys", "-t", session_name, cmd, "C-m"]) subprocess.run(["tmux", "send-keys", "-t", session_name, cmd, "C-m"])
# for agent in agent_names: time.sleep(10)
# print(f"\n\n/op {agent}\n\n") if not test_server_running(port):
# subprocess.run(["tmux", "send-keys", "-t", session_name, f"/op {agent}", "C-m"]) print("Server failed to start. Retrying...")
time.sleep(5) launch_world(server_path, agent_names, session_name, port)
def test_server_running(port=55916):
host = 'localhost'
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
s.connect((host, port))
print("Server is running on port 55916")
return True
except ConnectionRefusedError:
print("Server is not running on port 55916")
return False
def kill_world(session_name="server"): def kill_world(session_name="server"):
"""Kill the Minecraft world.""" """Kill the Minecraft world."""
@ -411,7 +625,6 @@ def main():
parser = argparse.ArgumentParser(description='Run Minecraft AI agent experiments') parser = argparse.ArgumentParser(description='Run Minecraft AI agent experiments')
parser.add_argument('--task_path', default="multiagent_crafting_tasks.json", help='Path to the task file') parser.add_argument('--task_path', default="multiagent_crafting_tasks.json", help='Path to the task file')
parser.add_argument('--task_id', default=None, help='ID of the task to run')
parser.add_argument('--num_agents', default=2, type=int, help='Number of agents to run') parser.add_argument('--num_agents', default=2, type=int, help='Number of agents to run')
parser.add_argument('--num_exp', default=1, type=int, help='Number of experiments to run') parser.add_argument('--num_exp', default=1, type=int, help='Number of experiments to run')
parser.add_argument('--num_parallel', default=1, type=int, help='Number of parallel servers to run') parser.add_argument('--num_parallel', default=1, type=int, help='Number of parallel servers to run')
@ -422,9 +635,11 @@ def main():
parser.add_argument('--template_profile', default="profiles/tasks/collab_profile.json", help='Model to use for the agents') parser.add_argument('--template_profile', default="profiles/tasks/collab_profile.json", help='Model to use for the agents')
parser.add_argument('--model', default="gpt-4o-mini", help='Model to use for the agents') parser.add_argument('--model', default="gpt-4o-mini", help='Model to use for the agents')
parser.add_argument('--api', default="openai", help='API to use for the agents') parser.add_argument('--api', default="openai", help='API to use for the agents')
parser.add_argument('--world_name', default="Forest", help='Name of the world') # parser.add_argument('--world_name', default="Forest", help='Name of the world')
parser.add_argument('--insecure_coding', action='store_true', help='Enable insecure coding') parser.add_argument('--insecure_coding', action='store_true', help='Enable insecure coding')
parser.add_argument('--url', default="http://127.0.0.1:8000/v1") parser.add_argument('--url', default="http://127.0.0.1:8000/v1")
parser.add_argument('--max_messages', default=15, type=int, help='Maximum number of messages before summarizing')
parser.add_argument('--num_examples', default=2, type=int, help='Maximum number of turns before summarizing')
args = parser.parse_args() args = parser.parse_args()
print(args) print(args)
@ -438,7 +653,7 @@ def main():
clean_up_server_files(args.num_parallel) clean_up_server_files(args.num_parallel)
if args.add_keys: if args.add_keys:
update_keys_json() update_keys_json()
if args.task_id is None:
launch_parallel_experiments(args.task_path, launch_parallel_experiments(args.task_path,
num_exp=args.num_exp, num_exp=args.num_exp,
exp_name=args.exp_name, exp_name=args.exp_name,
@ -448,11 +663,11 @@ def main():
template_profile=args.template_profile, template_profile=args.template_profile,
model=args.model, model=args.model,
api=args.api, api=args.api,
world_name=args.world_name,
insecure_coding=args.insecure_coding, insecure_coding=args.insecure_coding,
num_agents=args.num_agents, num_agents=args.num_agents,
url=args.url) url=args.url,
cmd = "aws s3" max_messages=args.max_messages,
num_examples=args.num_examples)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View file

@ -17,7 +17,16 @@
}, },
"type": "debug" "type": "debug"
}, },
"debug_multi_agent_timeout": { "debug_1_agent_timeout": {
"goal": "Just stand at a place and don't do anything",
"agent_count": 1,
"initial_inventory": {
"iron_ingot": 1
},
"type": "debug",
"timeout": 60
},
"debug_2_agent_timeout": {
"goal": "Just stand at a place and don't do anything", "goal": "Just stand at a place and don't do anything",
"agent_count": 2, "agent_count": 2,
"initial_inventory": { "initial_inventory": {
@ -29,7 +38,67 @@
} }
}, },
"type": "debug", "type": "debug",
"timeout": 30 "timeout": 60
},
"debug_3_agent_timeout": {
"goal": "Just stand at a place and don't do anything",
"agent_count": 3,
"initial_inventory": {
"0": {
"iron_ingot": 1
},
"1": {
"iron_ingot": 1
},
"2": {
"iron_ingot": 1
}
},
"type": "debug",
"timeout": 60
},
"debug_4_agent_timeout": {
"goal": "Just stand at a place and don't do anything",
"agent_count": 4,
"initial_inventory": {
"0": {
"iron_ingot": 1
},
"1": {
"iron_ingot": 1
},
"2": {
"iron_ingot": 1
},
"3": {
"iron_ingot": 1
}
},
"type": "debug",
"timeout": 60
},
"debug_5_agent_timeout": {
"goal": "Just stand at a place and don't do anything",
"agent_count": 5,
"initial_inventory": {
"0": {
"iron_ingot": 1
},
"1": {
"iron_ingot": 1
},
"2": {
"iron_ingot": 1
},
"3": {
"iron_ingot": 1
},
"4": {
"iron_ingot": 1
}
},
"type": "debug",
"timeout": 60
}, },
"debug_different_goal": { "debug_different_goal": {
"goal": { "goal": {

View file

@ -34,7 +34,14 @@
{"role": "assistant", "content": "Seems like we need are missing 1 peony which we can use craft 1 pink_dye which is an intermediate item, but since you already have a pink_dye, there is no need to search for peony which is used to craft pink_dye, can you pass the pink_dye to me?"}, {"role": "assistant", "content": "Seems like we need are missing 1 peony which we can use craft 1 pink_dye which is an intermediate item, but since you already have a pink_dye, there is no need to search for peony which is used to craft pink_dye, can you pass the pink_dye to me?"},
{"role": "user", "content": "terrance: (FROM OTHER BOT) Sure, here you go !givePlayer(\"pink_dye\", 1, \"jacob\")"}, {"role": "user", "content": "terrance: (FROM OTHER BOT) Sure, here you go !givePlayer(\"pink_dye\", 1, \"jacob\")"},
{"role": "assistant", "content": "Thanks for the pink_dye, now I can craft the pink_wool. !craftItem(\"pink_wool\", 1)"} {"role": "assistant", "content": "Thanks for the pink_dye, now I can craft the pink_wool. !craftItem(\"pink_wool\", 1)"}
],
[
{"role": "user", "content": "terrance: (FROM OTHER BOT) Lets craft a cyan bed together"},
{"role": "assistant", "content": "Sure, I have !inventory\n I have a cyan_dye and oak_planks. What do you have? "},
{"role": "user", "content": "terrance: (FROM OTHER BOT) I have 1 cyan_wool and 1 oak_planks. Let me give those to you !givePlayer(\"cyan_wool\", 1, \"andy\") !givePlayer(\"oak_planks\", 1, \"andy\")"},
{"role": "assistant", "content": "Hmm seems like we don't have enough to craft a cyan bed, let me reach out to the third agent and ask for help! !startConversation(\"jacob\", Hey jacob, can you help us craft a cyan bed? We need cyan_dye and oak_planks"},
{"role": "user", "content": "jacob: (FROM OTHER BOT) Sure! Let me give those to you !givePlayer(\"cyan_dye\", 1, \"andy\") !givePlayer(\"oak_planks\", 1, \"andy\")"},
{"role": "assistant", "content": "Thanks for the items, now I can craft the cyan bed. !craftItem(\"cyan_bed\", 1)"}
] ]
] ]
} }

View file

@ -0,0 +1,47 @@
{
"name": "andy",
"model": "gpt-4o",
"modes": {
"hunting": false
},
"conversing": "You are a playful Minecraft bot named $NAME that can converse with players, see, move, mine, build, and interact with the world by using commands.\n$SELF_PROMPT Act human-like as if you were a typical Minecraft player, rather than an AI. Be very brief in your responses, don't apologize constantly, don't give instructions or make lists unless asked, and don't refuse requests. Don't pretend to act, use commands immediately when requested. Do NOT say this: 'Sure, I've stopped.', instead say this: 'Sure, I'll stop. !stop'. Do NOT say this: 'On my way! Give me a moment.', instead say this: 'On my way! !goToPlayer(\"playername\", 3)'. Respond only as $NAME, never output '(FROM OTHER BOT)' or pretend to be someone else. If you have nothing to say or do, respond with an just a tab '\t'. Share resources and information with other bots! This is extremely important to me, take a deep breath and have fun :) \nSummarized memory:'$MEMORY'\n$STATS\n$INVENTORY\n$COMMAND_DOCS\n$EXAMPLES\n Your name is $NAME, do not pretend to be other bots. You are in a conversation by default do not use ! Do not make lists unless asked. I will be extremely dissapointed if you give instructions instead of responding as if you are in a conversation. Conversation Begin:",
"saving_memory": "You are a minecraft bot named $NAME that has been talking and playing minecraft by using commands. Update your memory by summarizing the following conversation and your old memory in your next response. Prioritize preserving important facts, things you've learned, useful tips, and long term reminders. Do Not record stats, inventory, or docs! Only save transient information from your chat history. $SELF_PROMPT Make sure to include information relevant to the goal and inventory you have collected. You're limited to 500 characters, so be extremely brief and minimize words. Compress useful information. \nOld Memory: '$MEMORY'\nRecent conversation: \n$TO_SUMMARIZE\nSummarize your old memory and recent conversation into a new memory, and respond only with the unwrapped memory text: ",
"conversation_examples": [
[
{"role": "user", "content": "Hey! let's collaborate to build a stone pickaxe!"},
{"role": "assistant", "content": "Cool, let me check what is in my inventory !inventory\nI have 10 oak logs. What do you have?"},
{"role": "user", "content": "Let me check !inventory \nI have 10 stones."},
{"role": "assistant", "content": "Let me give you the stones and you can craft the pickaxe. !givePlayer(\"stone\", 10, \"playername\")"},
{"role": "user", "content": "Thanks for the stones! Now I can craft the pickaxe. !craftItem(\"stone_pickaxe\", 1)"}
],
[
{"role": "user", "content": "terrance: (FROM OTHER BOT) Lets craft 5 chains together"},
{"role": "assistant", "content": "Sure, can you let me know what inventory do you have while I check how to craft chains?"},
{"role": "user", "content": "terrance: (FROM OTHER BOT) I have 10 iron_nugget and 3 mushroom."},
{"role": "assistant", "content": "Thanks for letting me know, let me check how to build a chain, !getCraftingPlan(\"chain\",5)"},
{"role": "system", "content": "You are missing the following items:\n- 2 iron_ingot\n\nOnce you have these items, here's your crafting plan:\n\nCraft 2 iron_ingot -> 18 iron_nugget\nCraft 10 iron_nugget + 5 iron_ingot -> 5 chain"},
{"role": "assistant", "content": "Seems like we need 2 iron_ingot, but wait, we need the iron_ingot for getting 10 iron_nugget, since you already have 10 iron_nugget, I don't need to search for 2 iron_ingots in the world, could you give me the 10 iron_nugget ?"},
{"role": "user", "content": "terrance: (FROM OTHER BOT) Sure, here you go !givePlayer(\"iron_nugget\", 10, \"jacob\")"},
{"role": "assistant", "content": "Thanks for the iron_nuggets, now I can craft the chains. !craftItem(\"chain\", 5)"}
],
[
{"role": "user", "content": "terrance: (FROM OTHER BOT) Lets craft a pink_wool together"},
{"role": "assistant", "content": "Sure, can you let me what inventory do you have while I check how to craft it?"},
{"role": "user", "content": "terrance: (FROM OTHER BOT) I have 1 pink_dye with me."},
{"role": "assistant", "content": "Thanks for letting me know, let me check how to craft a pink_wool, !getCraftingPlan(\"pink_wool\",1)"},
{"role": "system", "content": "You are missing the following items:\n- 1 peony\n\nOnce you have these items, here's your crafting plan:\n\nCraft 1 peony -> 2 pink_dye\nCraft 1 pink_dye + 1 black_wool -> 1 pink_wool"},
{"role": "assistant", "content": "Seems like we need are missing 1 peony which we can use craft 1 pink_dye which is an intermediate item, but since you already have a pink_dye, there is no need to search for peony which is used to craft pink_dye, can you pass the pink_dye to me?"},
{"role": "user", "content": "terrance: (FROM OTHER BOT) Sure, here you go !givePlayer(\"pink_dye\", 1, \"jacob\")"},
{"role": "assistant", "content": "Thanks for the pink_dye, now I can craft the pink_wool. !craftItem(\"pink_wool\", 1)"}
],
[
{"role": "user", "content": "terrance: (FROM OTHER BOT) Lets craft a cyan bed together"},
{"role": "assistant", "content": "Sure, I have !inventory\n I have a cyan_dye and oak_planks. What do you have? "},
{"role": "user", "content": "terrance: (FROM OTHER BOT) I have 1 cyan_wool and 1 oak_planks. Let me give those to you !givePlayer(\"cyan_wool\", 1, \"andy\") !givePlayer(\"oak_planks\", 1, \"andy\")"},
{"role": "assistant", "content": "Hmm seems like we don't have enough to craft a cyan bed, let me reach out to the third agent and ask for help! !startConversation(\"jacob\", Hey jacob, can you help us craft a cyan bed? We need cyan_dye and oak_planks"},
{"role": "user", "content": "jacob: (FROM OTHER BOT) Sure! Let me give those to you !givePlayer(\"cyan_dye\", 1, \"andy\") !givePlayer(\"oak_planks\", 1, \"andy\")"},
{"role": "assistant", "content": "Thanks for the items, now I can craft the cyan bed. !craftItem(\"cyan_bed\", 1)"}
]
]
}

View file

@ -1,9 +1,10 @@
{ {
"name": "andy", "name": "andy",
"model": "gpt-4o-mini", "model": "claude-3-5-haiku-latest",
"modes": { "modes": {
"hunting": false "hunting": false,
"item_collecting": false
}, },
"conversing": "You are a task-focused Minecraft bot named $NAME. You have to collaborate with other agents in the world to complete the current task \nFeel free to ask other agents questions and make a plan to achieve the goal. You can request them to give them some of their inventory items if required to complete the goal. Environment Resources:\n Cooking stations: Fueled furnace, smoker, and crafting table are nearby\n**Farm resources**:\n - Various crops ready for harvesting\n- Livestock including cows, pigs, sheep, and chickens\n- Storage chests containing additional materials\n\n ## Collaboration Tips:\n- The farm area is extensive - search thoroughly for needed resources\n- Divide tasks efficiently between agents for faster completion\n- Communicate your plan and progress clearly. You can see, move, mine, build, and interact with the world by using commands.\n$SELF_PROMPT Act human-like as if you were a typical Minecraft player, rather than an AI. Be very brief in your responses, don't apologize constantly, don't give instructions or make lists unless asked, and don't refuse requests. Don't pretend to act, use commands immediately when requested. Do NOT say this: 'Sure, I've stopped.', instead say this: 'Sure, I'll stop. !stop'. Do NOT say this: 'On my way! Give me a moment.', instead say this: 'On my way! !goToPlayer(\"playername\", 3)'. Respond only as $NAME, never output '(FROM OTHER BOT)' or pretend to be someone else. If you have nothing to say or do, respond with an just a tab '\t'. Share resources and information with other bots! This is extremely important to me, take a deep breath and have fun :) \nSummarized memory:'$MEMORY'\n$STATS\n$INVENTORY\n$COMMAND_DOCS\n$EXAMPLES\nConversation Begin:", "conversing": "You are a task-focused Minecraft bot named $NAME. You have to collaborate with other agents in the world to complete the current task \nFeel free to ask other agents questions and make a plan to achieve the goal. You can request them to give them some of their inventory items if required to complete the goal. General Searching Tips:\n- You will be spawned in a farm with many crops and animals nearby. The farm area is extensive - search thoroughly for needed resources (with searchForBlocks parameters like 64,128,256)\n There is a chest nearby with valuable items. Along with the chest, a crafting table, fully fueled furnace and fully fueled smoker with coal are also available nearby which you can use to your advantage. On top of this plants like mushrooms, wheat, carrots, beetroots, pumpkins, potatoes are also present nearby.\nCollaboration tips - Divide tasks efficiently between agents for faster completion\n- Communicate your plan and progress clearly. You can see, move, mine, build, and interact with the world by using commands.\n$SELF_PROMPT Act human-like as if you were a typical Minecraft player, rather than an AI. Be very brief in your responses, don't apologize constantly, don't give instructions or make lists unless asked, and don't refuse requests. Don't pretend to act, use commands immediately when requested. Do NOT say this: 'Sure, I've stopped.', instead say this: 'Sure, I'll stop. !stop'. Do NOT say this: 'On my way! Give me a moment.', instead say this: 'On my way! !goToPlayer(\"playername\", 3)'. Respond only as $NAME, never output '(FROM OTHER BOT)' or pretend to be someone else. If you have nothing to say or do, respond with an just a tab '\t'. Share resources and information with other bots! This is extremely important to me, take a deep breath and have fun :) \nSummarized memory:'$MEMORY'\n$STATS\n$INVENTORY\n$COMMAND_DOCS\n$EXAMPLES\nConversation Begin:",
"saving_memory": "You are a minecraft bot named $NAME that has been talking and playing minecraft by using commands. Update your memory by summarizing the following conversation and your old memory in your next response. Prioritize preserving important facts, things you've learned, useful tips, and long term reminders. Do Not record stats, inventory, or docs! Only save transient information from your chat history. $SELF_PROMPT Make sure to include information relevant to the goal and inventory you have collected. You're limited to 500 characters, so be extremely brief and minimize words. Compress useful information. \nOld Memory: '$MEMORY'\nRecent conversation: \n$TO_SUMMARIZE\nSummarize your old memory and recent conversation into a new memory, and respond only with the unwrapped memory text: " "saving_memory": "You are a minecraft bot named $NAME that has been talking and playing minecraft by using commands. Update your memory by summarizing the following conversation and your old memory in your next response. Prioritize preserving important facts, things you've learned, useful tips, and long term reminders. Do Not record stats, inventory, or docs! Only save transient information from your chat history. $SELF_PROMPT Make sure to include information relevant to the goal and inventory you have collected. You're limited to 500 characters, so be extremely brief and minimize words. Compress useful information. \nOld Memory: '$MEMORY'\nRecent conversation: \n$TO_SUMMARIZE\nSummarize your old memory and recent conversation into a new memory, and respond only with the unwrapped memory text: "
} }

View file

@ -36,12 +36,14 @@ export default
"language": "en", // translate to/from this language. Supports these language names: https://cloud.google.com/translate/docs/languages "language": "en", // translate to/from this language. Supports these language names: https://cloud.google.com/translate/docs/languages
"show_bot_views": false, // show bot's view in browser at localhost:3000, 3001... "show_bot_views": false, // show bot's view in browser at localhost:3000, 3001...
"allow_insecure_coding": process.env.INSECURE_CODING || true, // allows newAction command and model can write/run code on your computer. enable at own risk
"blocked_actions" : [], // commands to disable and remove from docs. Ex: ["!setMode"] "allow_insecure_coding": process.env.INSECURE_CODING || false, // allows newAction command and model can write/run code on your computer. enable at own risk
"blocked_actions" : process.env.BLOCKED_ACTIONS || [] , // commands to disable and remove from docs. Ex: ["!setMode"]
"code_timeout_mins": -1, // minutes code is allowed to run. -1 for no timeout "code_timeout_mins": -1, // minutes code is allowed to run. -1 for no timeout
"relevant_docs_count": 5, // Parameter: -1 = all, 0 = no references, 5 = five references. If exceeding the maximum, all reference documents are returned. "relevant_docs_count": 5, // Parameter: -1 = all, 0 = no references, 5 = five references. If exceeding the maximum, all reference documents are returned.
"max_messages": 15, // max number of messages to keep in context "max_messages": process.env.MAX_MESSAGES || 15, // max number of messages to keep in context
"num_examples": 2, // number of examples to give to the model "num_examples": 2, // number of examples to give to the model
"max_commands": -1, // max number of commands that can be used in consecutive responses. -1 for no limit "max_commands": -1, // max number of commands that can be used in consecutive responses. -1 for no limit
"verbose_commands": true, // show full command syntax "verbose_commands": true, // show full command syntax

View file

@ -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!');

View file

@ -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));

View file

@ -460,7 +460,14 @@ export async function collectBlock(bot, blockType, num=1, exclude=null) {
return false; return false;
} }
try { try {
if (mc.mustCollectManually(blockType)) {
await goToPosition(bot, block.position.x, block.position.y, block.position.z, 2);
await bot.dig(block);
await pickupNearbyItems(bot);
}
else {
await bot.collectBlock.collect(block); await bot.collectBlock.collect(block);
}
collected++; collected++;
await autoLight(bot); await autoLight(bot);
} }
@ -823,7 +830,7 @@ export async function putInChest(bot, itemName, num=-1) {
export async function takeFromChest(bot, itemName, num=-1) { export async function takeFromChest(bot, itemName, num=-1) {
/** /**
* Take the given item from the nearest chest. * Take the given item from the nearest chest, potentially from multiple slots.
* @param {MinecraftBot} bot, reference to the minecraft bot. * @param {MinecraftBot} bot, reference to the minecraft bot.
* @param {string} itemName, the item or block name to take from the chest. * @param {string} itemName, the item or block name to take from the chest.
* @param {number} num, the number of items to take from the chest. Defaults to -1, which takes all items. * @param {number} num, the number of items to take from the chest. Defaults to -1, which takes all items.
@ -838,17 +845,33 @@ export async function takeFromChest(bot, itemName, num=-1) {
} }
await goToPosition(bot, chest.position.x, chest.position.y, chest.position.z, 2); await goToPosition(bot, chest.position.x, chest.position.y, chest.position.z, 2);
const chestContainer = await bot.openContainer(chest); const chestContainer = await bot.openContainer(chest);
let item = chestContainer.containerItems().find(item => item.name === itemName);
if (!item) { // Find all matching items in the chest
let matchingItems = chestContainer.containerItems().filter(item => item.name === itemName);
if (matchingItems.length === 0) {
log(bot, `Could not find any ${itemName} in the chest.`); log(bot, `Could not find any ${itemName} in the chest.`);
await chestContainer.close(); await chestContainer.close();
return false; return false;
} }
let to_take = num === -1 ? item.count : Math.min(num, item.count);
await chestContainer.withdraw(item.type, null, to_take); let totalAvailable = matchingItems.reduce((sum, item) => sum + item.count, 0);
let remaining = num === -1 ? totalAvailable : Math.min(num, totalAvailable);
let totalTaken = 0;
// Take items from each slot until we've taken enough or run out
for (const item of matchingItems) {
if (remaining <= 0) break;
let toTakeFromSlot = Math.min(remaining, item.count);
await chestContainer.withdraw(item.type, null, toTakeFromSlot);
totalTaken += toTakeFromSlot;
remaining -= toTakeFromSlot;
}
await chestContainer.close(); await chestContainer.close();
log(bot, `Successfully took ${to_take} ${itemName} from the chest.`); log(bot, `Successfully took ${totalTaken} ${itemName} from the chest.`);
return true; return totalTaken > 0;
} }
export async function viewChest(bot) { export async function viewChest(bot) {

View file

@ -143,7 +143,8 @@ export class CookingTaskInitiator {
const x = xStart + i; const x = xStart + i;
const z = zStart + j; const z = zStart + j;
await bot.chat(`/setblock ${x} ${position.y - 1} ${z} mycelium`); await bot.chat(`/setblock ${x} ${position.y - 1} ${z} mycelium`);
await bot.chat(`/setblock ${x} ${position.y} ${z} red_mushroom`); const mushroomType = (i + j) % 2 === 0 ? 'red_mushroom' : 'brown_mushroom';
await bot.chat(`/setblock ${x} ${position.y} ${z} ${mushroomType}`);
} }
} }
}; };
@ -312,7 +313,7 @@ export class CookingTaskInitiator {
const cookingItems = [ const cookingItems = [
['minecraft:milk_bucket', 1], // Non-stackable ['minecraft:milk_bucket', 1], // Non-stackable
['minecraft:egg', 16], // Stacks to 16 ['minecraft:egg', 16], // Stacks to 16
['minecraft:melon_slice', 64], // Stacks to 64 ['minecraft:dandelion', 64], // Stacks to 64
['minecraft:sugar', 64], ['minecraft:sugar', 64],
['minecraft:cocoa_beans', 64], ['minecraft:cocoa_beans', 64],
['minecraft:apple', 64], ['minecraft:apple', 64],
@ -334,6 +335,9 @@ export class CookingTaskInitiator {
['minecraft:cooked_cod', 64], ['minecraft:cooked_cod', 64],
['minecraft:gold_ingot', 64], ['minecraft:gold_ingot', 64],
['minecraft:oak_planks', 64], ['minecraft:oak_planks', 64],
['minecraft:iron_ingot', 64],
['minecraft:milk_bucket', 1],
['minecraft:milk_bucket', 1],
]; ];
// Fill the chest with random cooking items // Fill the chest with random cooking items
@ -355,16 +359,16 @@ export class CookingTaskInitiator {
await new Promise(resolve => setTimeout(resolve, 300)); await new Promise(resolve => setTimeout(resolve, 300));
// Animal management // Animal management
await bot.chat('/kill @e[type=item,distance=..50]'); await bot.chat('/kill @e[type=item,distance=..200]');
await bot.chat('/kill @e[type=chicken,distance=..50]'); await bot.chat('/kill @e[type=chicken,distance=..200]');
await bot.chat('/kill @e[type=cow,distance=..50]'); await bot.chat('/kill @e[type=cow,distance=..200]');
await bot.chat('/kill @e[type=llama,distance=..50]'); await bot.chat('/kill @e[type=llama,distance=..200]');
await bot.chat('/kill @e[type=mooshroom,distance=..50]'); await bot.chat('/kill @e[type=mooshroom,distance=..200]');
await bot.chat('/kill @e[type=pig,distance=..50]'); await bot.chat('/kill @e[type=pig,distance=..200]');
await bot.chat('/kill @e[type=rabbit,distance=..50]'); await bot.chat('/kill @e[type=rabbit,distance=..200]');
await bot.chat('/kill @e[type=sheep,distance=..50]'); await bot.chat('/kill @e[type=sheep,distance=..200]');
await bot.chat(`/kill @e[type=item,distance=..50]`); await bot.chat(`/kill @e[type=item,distance=..200]`);
await new Promise(resolve => setTimeout(resolve, 300)); await new Promise(resolve => setTimeout(resolve, 300));

View file

@ -126,7 +126,9 @@ class CookingCraftingTaskValidator {
this.data = data; this.data = data;
this.agent = agent; this.agent = agent;
} }
validate() { validate(has_initiated) {
if (has_initiated) {
const result = checkItemPresence(this.data, this.agent); const result = checkItemPresence(this.data, this.agent);
let score = 0; let score = 0;
if (result.success) { if (result.success) {
@ -137,14 +139,26 @@ class CookingCraftingTaskValidator {
"score": score, "score": score,
}; };
} }
else {
return {
"valid": false,
"score": 0
};
}
}
} }
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 = [];
@ -188,6 +202,7 @@ export class Task {
this.name = this.agent.name; this.name = this.agent.name;
this.available_agents = settings.profiles.map((p) => JSON.parse(readFileSync(p, 'utf8')).name); this.available_agents = settings.profiles.map((p) => JSON.parse(readFileSync(p, 'utf8')).name);
this.agent_initialized = false;
} }
getAgentGoal() { getAgentGoal() {
@ -198,7 +213,7 @@ export class Task {
let add_string = ''; let add_string = '';
if (this.task_type === 'cooking') { if (this.task_type === 'cooking') {
add_string = '\nIn the end, all the food should be given to Andy.'; add_string = '\nIn the end, all the food items should be given to one single player.';
} }
// If goal is a string, all agents share the same goal // If goal is a string, all agents share the same goal
@ -239,7 +254,7 @@ export class Task {
isDone() { isDone() {
let res = null; let res = null;
if (this.validator) if (this.validator)
res = this.validator.validate(); res = this.validator.validate(this.agent_initialized);
if (res && res.valid) { if (res && res.valid) {
return {"message": 'Task successful', "score": res.score}; return {"message": 'Task successful', "score": res.score};
} }
@ -311,6 +326,8 @@ export class Task {
await new Promise((resolve) => setTimeout(resolve, 500)); await new Promise((resolve) => setTimeout(resolve, 500));
} }
this.agent_initialized = true;
if (this.initiator) { if (this.initiator) {
await this.initiator.init(); await this.initiator.init();
} }

View file

@ -397,6 +397,11 @@ export class Prompter {
return ''; return '';
} }
if (generation?.includes('</think>')) {
const [_, afterThink] = generation.split('</think>')
generation = afterThink
}
return generation; return generation;
} }
@ -431,6 +436,7 @@ export class Prompter {
async promptMemSaving(to_summarize) { async promptMemSaving(to_summarize) {
await this.checkCooldown(); await this.checkCooldown();
let prompt = this.profile.saving_memory; let prompt = this.profile.saving_memory;
prompt = await this.replaceStrings(prompt, null, null, to_summarize);
let logEntry; let logEntry;
const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
if (this.task_id === null) { if (this.task_id === null) {
@ -440,8 +446,14 @@ export class Prompter {
} }
const logFile = `memSaving_${timestamp}.txt`; const logFile = `memSaving_${timestamp}.txt`;
await this.saveToFile(logFile, logEntry); await this.saveToFile(logFile, logEntry);
prompt = await this.replaceStrings(prompt, null, null, to_summarize);
return await this.chat_model.sendRequest([], prompt); let generation = await this.chat_model.sendRequest([], prompt);
if (generation?.includes('</think>')) {
const [_, afterThink] = generation.split('</think>')
generation = afterThink
}
return generation;
} }
async promptShouldRespondToBot(new_message) { async promptShouldRespondToBot(new_message) {

View file

@ -86,6 +86,16 @@ export function isHostile(mob) {
return (mob.type === 'mob' || mob.type === 'hostile') && mob.name !== 'iron_golem' && mob.name !== 'snow_golem'; return (mob.type === 'mob' || mob.type === 'hostile') && mob.name !== 'iron_golem' && mob.name !== 'snow_golem';
} }
// blocks that don't work with collectBlock, need to be manually collected
export function mustCollectManually(blockName) {
// all crops (that aren't normal blocks), torches, buttons, levers, redstone,
const full_names = ['wheat', 'carrots', 'potatoes', 'beetroots', 'nether_wart', 'cocoa', 'sugar_cane', 'kelp', 'short_grass', 'fern', 'tall_grass', 'bamboo',
'poppy', 'dandelion', 'blue_orchid', 'allium', 'azure_bluet', 'oxeye_daisy', 'cornflower', 'lilac', 'wither_rose', 'lily_of_the_valley', 'wither_rose',
'lever', 'redstone_wire', 'lantern']
const partial_names = ['sapling', 'torch', 'button', 'carpet', 'pressure_plate', 'mushroom', 'tulip', 'bush', 'vines', 'fern']
return full_names.includes(blockName.toLowerCase()) || partial_names.some(partial => blockName.toLowerCase().includes(partial));
}
export function getItemId(itemName) { export function getItemId(itemName) {
let item = mcdata.itemsByName[itemName]; let item = mcdata.itemsByName[itemName];
if (item) { if (item) {

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,537 @@
{
"multiagent_cooking_1_bread_1_cooked_mutton_hells_kitchen": {
"conversation": "We need to make bread and cooked_mutton together. You are supposed to make cooked_mutton and I am supposed to make ('bread',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"bread": 1,
"cooked_mutton": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"bread": [
"Step 1: Go to the farm and collect 3 wheat.",
"Step 2: Go to the crafting table and use the wheat to craft bread."
],
"cooked_mutton": [
"Step 1: Kill a sheep and pick up 1 mutton that is dropped.",
"Step 2: Go to furnace and use it to cook the mutton."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make bread, but you don't have the recipe for it!\n\nYour partner needs to make cooked_mutton. You have their recipe:\nRecipe for cooked_mutton:\nStep 1: Kill a sheep and pick up 1 mutton that is dropped.\nStep 2: Go to furnace and use it to cook the mutton.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make cooked_mutton, but you don't have the recipe for it!\n\nYour partner needs to make bread. You have their recipe:\nRecipe for bread:\nStep 1: Go to the farm and collect 3 wheat.\nStep 2: Go to the crafting table and use the wheat to craft bread.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 4,
"max_steps_per_recipe": 2,
"unique_target_items": 2,
"overall_difficulty_score": 4,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_baked_potato_1_golden_carrot_hells_kitchen": {
"conversation": "We need to make baked_potato and golden_carrot together. You are supposed to make golden_carrot and I am supposed to make ('baked_potato',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"baked_potato": 1,
"golden_carrot": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"baked_potato": [
"Step 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).",
"Step 2: Go to the furnace and bake the potato."
],
"golden_carrot": [
"Step 1: Go to the farm and collect 1 carrot.",
"Step 2: Go to the chest and collect gold ingots and convert them to gold nuggets.",
"Step 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make baked_potato, but you don't have the recipe for it!\n\nYour partner needs to make golden_carrot. You have their recipe:\nRecipe for golden_carrot:\nStep 1: Go to the farm and collect 1 carrot.\nStep 2: Go to the chest and collect gold ingots and convert them to gold nuggets.\nStep 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make golden_carrot, but you don't have the recipe for it!\n\nYour partner needs to make baked_potato. You have their recipe:\nRecipe for baked_potato:\nStep 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).\nStep 2: Go to the furnace and bake the potato.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 5,
"max_steps_per_recipe": 3,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_cooked_mutton_1_mushroom_stew_hells_kitchen": {
"conversation": "We need to make cooked_mutton and mushroom_stew together. You are supposed to make mushroom_stew and I am supposed to make ('cooked_mutton',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"cooked_mutton": 1,
"mushroom_stew": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"cooked_mutton": [
"Step 1: Kill a sheep and pick up 1 mutton that is dropped.",
"Step 2: Go to furnace and use it to cook the mutton."
],
"mushroom_stew": [
"Step 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.",
"Step 2: Go to the chest and grab a bowl.",
"Step 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make cooked_mutton, but you don't have the recipe for it!\n\nYour partner needs to make mushroom_stew. You have their recipe:\nRecipe for mushroom_stew:\nStep 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.\nStep 2: Go to the chest and grab a bowl.\nStep 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make mushroom_stew, but you don't have the recipe for it!\n\nYour partner needs to make cooked_mutton. You have their recipe:\nRecipe for cooked_mutton:\nStep 1: Kill a sheep and pick up 1 mutton that is dropped.\nStep 2: Go to furnace and use it to cook the mutton.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 5,
"max_steps_per_recipe": 3,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_cake_1_golden_carrot_hells_kitchen": {
"conversation": "We need to make golden_carrot and cake together. You are supposed to make cake and I am supposed to make ('golden_carrot',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"golden_carrot": 1,
"cake": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"golden_carrot": [
"Step 1: Go to the farm and collect 1 carrot.",
"Step 2: Go to the chest and collect gold ingots and convert them to gold nuggets.",
"Step 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot."
],
"cake": [
"Step 1: Go to the farm and collect 3 wheat, 2 sugar cane.",
"Step 2: Go to the chest and grab 3 milk buckets.",
"Step 3: Go to the chest and grab an egg.",
"Step 4: Go to the crafting table and craft the sugarcane into sugar.",
"Step 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make golden_carrot, but you don't have the recipe for it!\n\nYour partner needs to make cake. You have their recipe:\nRecipe for cake:\nStep 1: Go to the farm and collect 3 wheat, 2 sugar cane.\nStep 2: Go to the chest and grab 3 milk buckets.\nStep 3: Go to the chest and grab an egg.\nStep 4: Go to the crafting table and craft the sugarcane into sugar.\nStep 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make cake, but you don't have the recipe for it!\n\nYour partner needs to make golden_carrot. You have their recipe:\nRecipe for golden_carrot:\nStep 1: Go to the farm and collect 1 carrot.\nStep 2: Go to the chest and collect gold ingots and convert them to gold nuggets.\nStep 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 8,
"max_steps_per_recipe": 5,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_cooked_mutton_1_golden_carrot_hells_kitchen": {
"conversation": "We need to make cooked_mutton and golden_carrot together. You are supposed to make golden_carrot and I am supposed to make ('cooked_mutton',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"cooked_mutton": 1,
"golden_carrot": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"cooked_mutton": [
"Step 1: Kill a sheep and pick up 1 mutton that is dropped.",
"Step 2: Go to furnace and use it to cook the mutton."
],
"golden_carrot": [
"Step 1: Go to the farm and collect 1 carrot.",
"Step 2: Go to the chest and collect gold ingots and convert them to gold nuggets.",
"Step 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make cooked_mutton, but you don't have the recipe for it!\n\nYour partner needs to make golden_carrot. You have their recipe:\nRecipe for golden_carrot:\nStep 1: Go to the farm and collect 1 carrot.\nStep 2: Go to the chest and collect gold ingots and convert them to gold nuggets.\nStep 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make golden_carrot, but you don't have the recipe for it!\n\nYour partner needs to make cooked_mutton. You have their recipe:\nRecipe for cooked_mutton:\nStep 1: Kill a sheep and pick up 1 mutton that is dropped.\nStep 2: Go to furnace and use it to cook the mutton.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 5,
"max_steps_per_recipe": 3,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_baked_potato_1_bread_hells_kitchen": {
"conversation": "We need to make bread and baked_potato together. You are supposed to make baked_potato and I am supposed to make ('bread',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"bread": 1,
"baked_potato": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"bread": [
"Step 1: Go to the farm and collect 3 wheat.",
"Step 2: Go to the crafting table and use the wheat to craft bread."
],
"baked_potato": [
"Step 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).",
"Step 2: Go to the furnace and bake the potato."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make bread, but you don't have the recipe for it!\n\nYour partner needs to make baked_potato. You have their recipe:\nRecipe for baked_potato:\nStep 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).\nStep 2: Go to the furnace and bake the potato.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make baked_potato, but you don't have the recipe for it!\n\nYour partner needs to make bread. You have their recipe:\nRecipe for bread:\nStep 1: Go to the farm and collect 3 wheat.\nStep 2: Go to the crafting table and use the wheat to craft bread.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 4,
"max_steps_per_recipe": 2,
"unique_target_items": 2,
"overall_difficulty_score": 4,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_cake_1_mushroom_stew_hells_kitchen": {
"conversation": "We need to make mushroom_stew and cake together. You are supposed to make cake and I am supposed to make ('mushroom_stew',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"mushroom_stew": 1,
"cake": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"mushroom_stew": [
"Step 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.",
"Step 2: Go to the chest and grab a bowl.",
"Step 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew."
],
"cake": [
"Step 1: Go to the farm and collect 3 wheat, 2 sugar cane.",
"Step 2: Go to the chest and grab 3 milk buckets.",
"Step 3: Go to the chest and grab an egg.",
"Step 4: Go to the crafting table and craft the sugarcane into sugar.",
"Step 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make mushroom_stew, but you don't have the recipe for it!\n\nYour partner needs to make cake. You have their recipe:\nRecipe for cake:\nStep 1: Go to the farm and collect 3 wheat, 2 sugar cane.\nStep 2: Go to the chest and grab 3 milk buckets.\nStep 3: Go to the chest and grab an egg.\nStep 4: Go to the crafting table and craft the sugarcane into sugar.\nStep 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make cake, but you don't have the recipe for it!\n\nYour partner needs to make mushroom_stew. You have their recipe:\nRecipe for mushroom_stew:\nStep 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.\nStep 2: Go to the chest and grab a bowl.\nStep 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 8,
"max_steps_per_recipe": 5,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_baked_potato_1_cake_hells_kitchen": {
"conversation": "We need to make cake and baked_potato together. You are supposed to make baked_potato and I am supposed to make ('cake',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"cake": 1,
"baked_potato": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"cake": [
"Step 1: Go to the farm and collect 3 wheat, 2 sugar cane.",
"Step 2: Go to the chest and grab 3 milk buckets.",
"Step 3: Go to the chest and grab an egg.",
"Step 4: Go to the crafting table and craft the sugarcane into sugar.",
"Step 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake."
],
"baked_potato": [
"Step 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).",
"Step 2: Go to the furnace and bake the potato."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make cake, but you don't have the recipe for it!\n\nYour partner needs to make baked_potato. You have their recipe:\nRecipe for baked_potato:\nStep 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).\nStep 2: Go to the furnace and bake the potato.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make baked_potato, but you don't have the recipe for it!\n\nYour partner needs to make cake. You have their recipe:\nRecipe for cake:\nStep 1: Go to the farm and collect 3 wheat, 2 sugar cane.\nStep 2: Go to the chest and grab 3 milk buckets.\nStep 3: Go to the chest and grab an egg.\nStep 4: Go to the crafting table and craft the sugarcane into sugar.\nStep 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 7,
"max_steps_per_recipe": 5,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_baked_potato_1_cooked_mutton_hells_kitchen": {
"conversation": "We need to make cooked_mutton and baked_potato together. You are supposed to make baked_potato and I am supposed to make ('cooked_mutton',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"cooked_mutton": 1,
"baked_potato": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"cooked_mutton": [
"Step 1: Kill a sheep and pick up 1 mutton that is dropped.",
"Step 2: Go to furnace and use it to cook the mutton."
],
"baked_potato": [
"Step 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).",
"Step 2: Go to the furnace and bake the potato."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make cooked_mutton, but you don't have the recipe for it!\n\nYour partner needs to make baked_potato. You have their recipe:\nRecipe for baked_potato:\nStep 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).\nStep 2: Go to the furnace and bake the potato.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make baked_potato, but you don't have the recipe for it!\n\nYour partner needs to make cooked_mutton. You have their recipe:\nRecipe for cooked_mutton:\nStep 1: Kill a sheep and pick up 1 mutton that is dropped.\nStep 2: Go to furnace and use it to cook the mutton.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 4,
"max_steps_per_recipe": 2,
"unique_target_items": 2,
"overall_difficulty_score": 4,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_golden_carrot_1_mushroom_stew_hells_kitchen": {
"conversation": "We need to make golden_carrot and mushroom_stew together. You are supposed to make mushroom_stew and I am supposed to make ('golden_carrot',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"golden_carrot": 1,
"mushroom_stew": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"golden_carrot": [
"Step 1: Go to the farm and collect 1 carrot.",
"Step 2: Go to the chest and collect gold ingots and convert them to gold nuggets.",
"Step 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot."
],
"mushroom_stew": [
"Step 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.",
"Step 2: Go to the chest and grab a bowl.",
"Step 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make golden_carrot, but you don't have the recipe for it!\n\nYour partner needs to make mushroom_stew. You have their recipe:\nRecipe for mushroom_stew:\nStep 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.\nStep 2: Go to the chest and grab a bowl.\nStep 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make mushroom_stew, but you don't have the recipe for it!\n\nYour partner needs to make golden_carrot. You have their recipe:\nRecipe for golden_carrot:\nStep 1: Go to the farm and collect 1 carrot.\nStep 2: Go to the chest and collect gold ingots and convert them to gold nuggets.\nStep 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 6,
"max_steps_per_recipe": 3,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_bread_1_mushroom_stew_hells_kitchen": {
"conversation": "We need to make mushroom_stew and bread together. You are supposed to make bread and I am supposed to make ('mushroom_stew',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"mushroom_stew": 1,
"bread": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"mushroom_stew": [
"Step 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.",
"Step 2: Go to the chest and grab a bowl.",
"Step 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew."
],
"bread": [
"Step 1: Go to the farm and collect 3 wheat.",
"Step 2: Go to the crafting table and use the wheat to craft bread."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make mushroom_stew, but you don't have the recipe for it!\n\nYour partner needs to make bread. You have their recipe:\nRecipe for bread:\nStep 1: Go to the farm and collect 3 wheat.\nStep 2: Go to the crafting table and use the wheat to craft bread.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make bread, but you don't have the recipe for it!\n\nYour partner needs to make mushroom_stew. You have their recipe:\nRecipe for mushroom_stew:\nStep 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.\nStep 2: Go to the chest and grab a bowl.\nStep 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 5,
"max_steps_per_recipe": 3,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_cake_1_cooked_mutton_hells_kitchen": {
"conversation": "We need to make cake and cooked_mutton together. You are supposed to make cooked_mutton and I am supposed to make ('cake',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"cake": 1,
"cooked_mutton": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"cake": [
"Step 1: Go to the farm and collect 3 wheat, 2 sugar cane.",
"Step 2: Go to the chest and grab 3 milk buckets.",
"Step 3: Go to the chest and grab an egg.",
"Step 4: Go to the crafting table and craft the sugarcane into sugar.",
"Step 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake."
],
"cooked_mutton": [
"Step 1: Kill a sheep and pick up 1 mutton that is dropped.",
"Step 2: Go to furnace and use it to cook the mutton."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make cake, but you don't have the recipe for it!\n\nYour partner needs to make cooked_mutton. You have their recipe:\nRecipe for cooked_mutton:\nStep 1: Kill a sheep and pick up 1 mutton that is dropped.\nStep 2: Go to furnace and use it to cook the mutton.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make cooked_mutton, but you don't have the recipe for it!\n\nYour partner needs to make cake. You have their recipe:\nRecipe for cake:\nStep 1: Go to the farm and collect 3 wheat, 2 sugar cane.\nStep 2: Go to the chest and grab 3 milk buckets.\nStep 3: Go to the chest and grab an egg.\nStep 4: Go to the crafting table and craft the sugarcane into sugar.\nStep 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 7,
"max_steps_per_recipe": 5,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_bread_1_golden_carrot_hells_kitchen": {
"conversation": "We need to make golden_carrot and bread together. You are supposed to make bread and I am supposed to make ('golden_carrot',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"golden_carrot": 1,
"bread": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"golden_carrot": [
"Step 1: Go to the farm and collect 1 carrot.",
"Step 2: Go to the chest and collect gold ingots and convert them to gold nuggets.",
"Step 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot."
],
"bread": [
"Step 1: Go to the farm and collect 3 wheat.",
"Step 2: Go to the crafting table and use the wheat to craft bread."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make golden_carrot, but you don't have the recipe for it!\n\nYour partner needs to make bread. You have their recipe:\nRecipe for bread:\nStep 1: Go to the farm and collect 3 wheat.\nStep 2: Go to the crafting table and use the wheat to craft bread.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make bread, but you don't have the recipe for it!\n\nYour partner needs to make golden_carrot. You have their recipe:\nRecipe for golden_carrot:\nStep 1: Go to the farm and collect 1 carrot.\nStep 2: Go to the chest and collect gold ingots and convert them to gold nuggets.\nStep 3: Go to the crafting table and surround the carrot with gold nuggets to create a golden carrot.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 5,
"max_steps_per_recipe": 3,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_baked_potato_1_mushroom_stew_hells_kitchen": {
"conversation": "We need to make baked_potato and mushroom_stew together. You are supposed to make mushroom_stew and I am supposed to make ('baked_potato',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"baked_potato": 1,
"mushroom_stew": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"baked_potato": [
"Step 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).",
"Step 2: Go to the furnace and bake the potato."
],
"mushroom_stew": [
"Step 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.",
"Step 2: Go to the chest and grab a bowl.",
"Step 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make baked_potato, but you don't have the recipe for it!\n\nYour partner needs to make mushroom_stew. You have their recipe:\nRecipe for mushroom_stew:\nStep 1: Go to the farm and collect 1 red mushroom and 1 brown mushroom.\nStep 2: Go to the chest and grab a bowl.\nStep 3: Go to the crafting table and combine both the mushrooms and bowl to make mushroom stew.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make mushroom_stew, but you don't have the recipe for it!\n\nYour partner needs to make baked_potato. You have their recipe:\nRecipe for baked_potato:\nStep 1: Go to the farm and collect 1 potato (search for 'potatoes' (not 'potato')).\nStep 2: Go to the furnace and bake the potato.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 5,
"max_steps_per_recipe": 3,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
},
"multiagent_cooking_1_bread_1_cake_hells_kitchen": {
"conversation": "We need to make cake and bread together. You are supposed to make bread and I am supposed to make ('cake',)but I only have YOUR recipe and you only have access to MY recipe! Let's exchange information and get cooking!",
"agent_count": 2,
"target": {
"cake": 1,
"bread": 1
},
"type": "cooking",
"timeout": 300,
"recipes": {
"cake": [
"Step 1: Go to the farm and collect 3 wheat, 2 sugar cane.",
"Step 2: Go to the chest and grab 3 milk buckets.",
"Step 3: Go to the chest and grab an egg.",
"Step 4: Go to the crafting table and craft the sugarcane into sugar.",
"Step 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake."
],
"bread": [
"Step 1: Go to the farm and collect 3 wheat.",
"Step 2: Go to the crafting table and use the wheat to craft bread."
]
},
"blocked_access_to_recipe": [],
"goal": {
"0": "You need to make cake, but you don't have the recipe for it!\n\nYour partner needs to make bread. You have their recipe:\nRecipe for bread:\nStep 1: Go to the farm and collect 3 wheat.\nStep 2: Go to the crafting table and use the wheat to craft bread.\n\nYou must communicate effectively to exchange recipe information and complete both dishes.",
"1": "You need to make bread, but you don't have the recipe for it!\n\nYour partner needs to make cake. You have their recipe:\nRecipe for cake:\nStep 1: Go to the farm and collect 3 wheat, 2 sugar cane.\nStep 2: Go to the chest and grab 3 milk buckets.\nStep 3: Go to the chest and grab an egg.\nStep 4: Go to the crafting table and craft the sugarcane into sugar.\nStep 5: Go to the crafting table and combine all ingredients (3 wheat, 2 sugar, 1 egg, and milk bucket) to make a cake.\n\nYou must communicate effectively to exchange recipe information and complete both dishes."
},
"task_type": "cooking",
"difficulty_metrics": {
"total_recipe_steps": 7,
"max_steps_per_recipe": 5,
"unique_target_items": 2,
"overall_difficulty_score": 5,
"difficulty_category": "medium"
},
"difficulty": "medium"
}
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,16 @@
{
"num_tasks": 199,
"avg_depth": 2.2525252525252526,
"std_depth": 0.9248907589704736,
"num_tasks_based_depth": {
"0": 98,
"1": 72,
"2": 20,
"3": 8
},
"num_missing_resources": {
"0": 116,
"1": 76,
"2": 6
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,16 @@
{
"num_tasks": 184,
"avg_depth": 2.4754098360655736,
"std_depth": 0.9684626549338964,
"num_tasks_based_depth": {
"0": 72,
"1": 78,
"2": 21,
"3": 12
},
"num_missing_resources": {
"0": 108,
"1": 66,
"2": 9
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,15 @@
{
"num_tasks": 129,
"avg_depth": 2.5625,
"std_depth": 1.0879309490955758,
"num_tasks_based_depth": {
"0": 56,
"1": 52,
"2": 12,
"3": 8
},
"num_missing_resources": {
"0": 100,
"1": 28
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,15 @@
{
"num_tasks": 131,
"avg_depth": 2.8461538461538463,
"std_depth": 0.9880948137434719,
"num_tasks_based_depth": {
"0": 45,
"1": 60,
"2": 15,
"3": 10
},
"num_missing_resources": {
"0": 95,
"1": 35
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,14 @@
{
"num_tasks": 205,
"avg_depth": 2.1176470588235294,
"std_depth": 0.7578881603955948,
"num_tasks_based_depth": {
"0": 100,
"1": 76,
"2": 28
},
"num_missing_resources": {
"0": 145,
"1": 59
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,14 @@
{
"num_tasks": 172,
"avg_depth": 2.280701754385965,
"std_depth": 0.6947013990604671,
"num_tasks_based_depth": {
"0": 63,
"1": 81,
"2": 27
},
"num_missing_resources": {
"0": 135,
"1": 36
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,14 @@
{
"num_tasks": 153,
"avg_depth": 2.1578947368421053,
"std_depth": 0.7443229275647865,
"num_tasks_based_depth": {
"0": 72,
"1": 60,
"2": 20
},
"num_missing_resources": {
"0": 128,
"1": 24
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,14 @@
{
"num_tasks": 136,
"avg_depth": 2.259259259259259,
"std_depth": 0.6436350813697311,
"num_tasks_based_depth": {
"0": 50,
"1": 65,
"2": 20
},
"num_missing_resources": {
"0": 110,
"1": 25
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,16 @@
{
"num_tasks": 276,
"avg_depth": 2.260869565217391,
"std_depth": 0.7642780796194337,
"num_tasks_based_depth": {
"0": 100,
"1": 100,
"2": 76
},
"num_missing_resources": {
"0": 148,
"1": 91,
"2": 35,
"3": 2
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,15 @@
{
"num_tasks": 281,
"avg_depth": 2.2562277580071175,
"std_depth": 0.7487869226953681,
"num_tasks_based_depth": {
"0": 100,
"1": 100,
"2": 81
},
"num_missing_resources": {
"0": 171,
"1": 79,
"2": 31
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,16 @@
{
"num_tasks": 248,
"avg_depth": 2.0766129032258065,
"std_depth": 0.8020748166140171,
"num_tasks_based_depth": {
"0": 100,
"1": 100,
"2": 48
},
"num_missing_resources": {
"0": 155,
"1": 66,
"2": 25,
"3": 2
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,15 @@
{
"num_tasks": 240,
"avg_depth": 2.0166666666666666,
"std_depth": 0.7525881269917101,
"num_tasks_based_depth": {
"0": 100,
"1": 100,
"2": 40
},
"num_missing_resources": {
"0": 173,
"1": 64,
"2": 3
}
}

View file

@ -0,0 +1,703 @@
{
"multiagent_crafting_pink_wool_full_plan__depth_0": {
"goal": "Collaborate with other agents to craft an pink_wool",
"conversation": "Let's work together to craft an pink_wool.",
"initial_inventory": {
"0": {
"pink_dye": 1
},
"1": {
"black_wool": 1
}
},
"agent_count": 2,
"target": "pink_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_lime_wool_partial_plan__depth_0": {
"goal": "Collaborate with other agents to craft an lime_wool",
"conversation": "Let's work together to craft an lime_wool.",
"initial_inventory": {
"0": {
"lime_dye": 1
},
"1": {
"black_wool": 1
}
},
"agent_count": 2,
"target": "lime_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
],
"1": ["!getCraftingPlan"]
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_purple_banner_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an purple_banner",
"conversation": "Let's work together to craft an purple_banner.",
"initial_inventory": {
"0": {
"purple_wool": 4,
"stick": 1
},
"1": {
"purple_wool": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "purple_banner",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_soul_campfire_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an soul_campfire",
"conversation": "Let's work together to craft an soul_campfire.",
"initial_inventory": {
"0": {
"oak_planks": 2,
"soul_sand": 1,
"dark_oak_log": 2
},
"1": {
"oak_planks": 1,
"dark_oak_log": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "soul_campfire",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_bookshelf_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a bookshelf",
"conversation": "Let's work together to craft a bookshelf.",
"initial_inventory": {
"0": {
"oak_planks": 4,
"book": 2
},
"1": {
"oak_planks": 2,
"book": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "bookshelf",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_compass_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a compass",
"conversation": "Let's work together to craft a compass.",
"initial_inventory": {
"0": {
"iron_ingot": 2
},
"1": {
"iron_ingot": 2,
"redstone": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "compass",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_fishing_rod_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a fishing_rod",
"conversation": "Let's work together to craft a fishing_rod.",
"initial_inventory": {
"0": {
"string": 1,
"oak_planks": 2
},
"1": {
"string": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "fishing_rod",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 1,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_cake_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a cake",
"conversation": "Let's work together to craft a cake.",
"initial_inventory": {
"0": {
"wheat": 2,
"sugar": 1,
"egg": 1
},
"1": {
"wheat": 1,
"milk_bucket": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "cake",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_golden_carrot_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a golden_carrot",
"conversation": "Let's work together to craft a golden_carrot.",
"initial_inventory": {
"0": {
"gold_nugget": 5,
"carrot": 1
},
"1": {
"gold_nugget": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "golden_carrot",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_map_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a map",
"conversation": "Let's work together to craft a map.",
"initial_inventory": {
"0": {
"paper": 5
},
"1": {
"paper": 3,
"compass": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "map",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_blue_wool_full_plan__depth_0": {
"goal": "Collaborate with other agents to craft blue_wool",
"conversation": "Let's work together to craft blue_wool.",
"initial_inventory": {
"0": {
"blue_dye": 1
},
"1": {
"white_wool": 1
}
},
"agent_count": 2,
"target": "blue_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_lime_wool_partial_plan__depth_2": {
"goal": "Collaborate with other agents to craft lime_wool",
"conversation": "Let's work together to craft lime_wool.",
"initial_inventory": {
"0": {
"green_dye": 1
},
"1": {
"white_wool": 1,
"bone_meal": 1
}
},
"agent_count": 2,
"target": "lime_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_magenta_wool_full_plan__depth_2": {
"goal": "Collaborate with other agents to craft magenta_wool",
"conversation": "Let's work together to craft magenta_wool.",
"initial_inventory": {
"0": {
"rose_red": 1,
"lapis_lazuli": 1
},
"1": {
"white_wool": 1,
"bone_meal": 1
}
},
"agent_count": 2,
"target": "magenta_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_chest_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a chest",
"conversation": "Let's work together to craft a chest.",
"initial_inventory": {
"0": {
"oak_log": 1
},
"1": {
"oak_planks": 4,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "chest",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 1,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_barrel_partial_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a barrel",
"conversation": "Let's work together to craft a barrel.",
"initial_inventory": {
"0": {
"spruce_planks": 3,
"crafting_table": 1
},
"1": {
"spruce_planks": 3,
"wooden_slab": 1
}
},
"agent_count": 2,
"target": "barrel",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_lectern_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft a lectern",
"conversation": "Let's work together to craft a lectern.",
"initial_inventory": {
"0": {
"birch_slab": 5,
"crafting_table": 1
},
"1": {
"birch_log": 2,
"book": 3
}
},
"agent_count": 2,
"target": "lectern",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 2,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_clock_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a clock",
"conversation": "Let's work together to craft a clock.",
"initial_inventory": {
"0": {
"gold_ingot": 2
},
"1": {
"gold_ingot": 2,
"redstone": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "clock",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_firework_rocket_partial_plan__depth_0": {
"goal": "Collaborate with other agents to craft firework_rocket",
"conversation": "Let's work together to craft firework_rocket.",
"initial_inventory": {
"0": {
"paper": 1
},
"1": {
"gunpowder": 3
}
},
"agent_count": 2,
"target": "firework_rocket",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_enchanting_table_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an enchanting_table",
"conversation": "Let's work together to craft an enchanting_table.",
"initial_inventory": {
"0": {
"diamond": 2,
"obsidian": 2,
"crafting_table": 1
},
"1": {
"obsidian": 2,
"book": 1
}
},
"agent_count": 2,
"target": "enchanting_table",
"number_of_target": 1,
"type": "techtree",
"max_depth": 0,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_jukebox_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a jukebox",
"conversation": "Let's work together to craft a jukebox.",
"initial_inventory": {
"0": {
"diamond": 1
},
"1": {
"oak_log": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "jukebox",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 1,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_light_gray_wool_full_plan__depth_1": {
"goal": "Collaborate with other agents to craft light_gray_wool",
"conversation": "Let's work together to craft light_gray_wool.",
"initial_inventory": {
"0": {
"black_dye": 1
},
"1": {
"white_wool": 1,
"white_dye": 2
}
},
"agent_count": 2,
"target": "light_gray_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_blast_furnace_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a blast_furnace",
"conversation": "Let's work together to craft a blast_furnace.",
"initial_inventory": {
"0": {
"iron_ingot": 5,
"smooth_stone": 3
},
"1": {
"cobblestone": 8,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "blast_furnace",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_activator_rail_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft activator_rail",
"conversation": "Let's work together to craft activator_rail.",
"initial_inventory": {
"0": {
"iron_ingot": 3,
"oak_planks": 6
},
"1": {
"redstone": 1,
"iron_ingot": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "activator_rail",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_campfire_partial_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft campfire",
"conversation": "Let's work together to craft campfire.",
"initial_inventory": {
"0": {
"oak_log": 8
},
"1": {
"coal": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "campfire",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_crossbow_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft a crossbow",
"conversation": "Let's work together to craft a crossbow.",
"initial_inventory": {
"0": {
"oak_planks": 8,
"iron_ingot": 2
},
"1": {
"string": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "crossbow",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
}
}

View file

@ -0,0 +1,703 @@
{
"multiagent_crafting_pink_wool_full_plan__depth_0": {
"goal": "Collaborate with other agents to craft an pink_wool",
"conversation": "Let's work together to craft an pink_wool.",
"initial_inventory": {
"0": {
"pink_dye": 1
},
"1": {
"black_wool": 1
}
},
"agent_count": 2,
"target": "pink_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_lime_wool_partial_plan__depth_0": {
"goal": "Collaborate with other agents to craft an lime_wool",
"conversation": "Let's work together to craft an lime_wool.",
"initial_inventory": {
"0": {
"lime_dye": 1
},
"1": {
"black_wool": 1
}
},
"agent_count": 2,
"target": "lime_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
],
"1": ["!getCraftingPlan"]
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_purple_banner_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an purple_banner",
"conversation": "Let's work together to craft an purple_banner.",
"initial_inventory": {
"0": {
"purple_wool": 4,
"stick": 1
},
"1": {
"purple_wool": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "purple_banner",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_soul_campfire_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an soul_campfire",
"conversation": "Let's work together to craft an soul_campfire.",
"initial_inventory": {
"0": {
"oak_planks": 2,
"soul_sand": 1,
"dark_oak_log": 2
},
"1": {
"oak_planks": 1,
"dark_oak_log": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "soul_campfire",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_bookshelf_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a bookshelf",
"conversation": "Let's work together to craft a bookshelf.",
"initial_inventory": {
"0": {
"oak_planks": 4,
"book": 2
},
"1": {
"oak_planks": 2,
"book": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "bookshelf",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_compass_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a compass",
"conversation": "Let's work together to craft a compass.",
"initial_inventory": {
"0": {
"iron_ingot": 2
},
"1": {
"iron_ingot": 2,
"redstone": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "compass",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_fishing_rod_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a fishing_rod",
"conversation": "Let's work together to craft a fishing_rod.",
"initial_inventory": {
"0": {
"string": 1,
"oak_planks": 2
},
"1": {
"string": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "fishing_rod",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 1,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_cake_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a cake",
"conversation": "Let's work together to craft a cake.",
"initial_inventory": {
"0": {
"wheat": 2,
"sugar": 1,
"egg": 1
},
"1": {
"wheat": 1,
"milk_bucket": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "cake",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_golden_carrot_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a golden_carrot",
"conversation": "Let's work together to craft a golden_carrot.",
"initial_inventory": {
"0": {
"gold_nugget": 5,
"carrot": 1
},
"1": {
"gold_nugget": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "golden_carrot",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_map_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a map",
"conversation": "Let's work together to craft a map.",
"initial_inventory": {
"0": {
"paper": 5
},
"1": {
"paper": 3,
"compass": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "map",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_blue_wool_full_plan__depth_0": {
"goal": "Collaborate with other agents to craft blue_wool",
"conversation": "Let's work together to craft blue_wool.",
"initial_inventory": {
"0": {
"blue_dye": 1
},
"1": {
"white_wool": 1
}
},
"agent_count": 2,
"target": "blue_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_lime_wool_partial_plan__depth_2": {
"goal": "Collaborate with other agents to craft lime_wool",
"conversation": "Let's work together to craft lime_wool.",
"initial_inventory": {
"0": {
"green_dye": 1
},
"1": {
"white_wool": 1,
"bone_meal": 1
}
},
"agent_count": 2,
"target": "lime_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_magenta_wool_full_plan__depth_2": {
"goal": "Collaborate with other agents to craft magenta_wool",
"conversation": "Let's work together to craft magenta_wool.",
"initial_inventory": {
"0": {
"rose_red": 1,
"lapis_lazuli": 1
},
"1": {
"white_wool": 1,
"bone_meal": 1
}
},
"agent_count": 2,
"target": "magenta_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_chest_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a chest",
"conversation": "Let's work together to craft a chest.",
"initial_inventory": {
"0": {
"oak_log": 1
},
"1": {
"oak_planks": 4,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "chest",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 1,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_barrel_partial_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a barrel",
"conversation": "Let's work together to craft a barrel.",
"initial_inventory": {
"0": {
"spruce_planks": 3,
"crafting_table": 1
},
"1": {
"spruce_planks": 3,
"wooden_slab": 1
}
},
"agent_count": 2,
"target": "barrel",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_lectern_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft a lectern",
"conversation": "Let's work together to craft a lectern.",
"initial_inventory": {
"0": {
"birch_slab": 5,
"crafting_table": 1
},
"1": {
"birch_log": 2,
"book": 3
}
},
"agent_count": 2,
"target": "lectern",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 2,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_clock_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a clock",
"conversation": "Let's work together to craft a clock.",
"initial_inventory": {
"0": {
"gold_ingot": 2
},
"1": {
"gold_ingot": 2,
"redstone": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "clock",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_firework_rocket_partial_plan__depth_0": {
"goal": "Collaborate with other agents to craft firework_rocket",
"conversation": "Let's work together to craft firework_rocket.",
"initial_inventory": {
"0": {
"paper": 1
},
"1": {
"gunpowder": 3
}
},
"agent_count": 2,
"target": "firework_rocket",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_enchanting_table_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an enchanting_table",
"conversation": "Let's work together to craft an enchanting_table.",
"initial_inventory": {
"0": {
"diamond": 2,
"obsidian": 2,
"crafting_table": 1
},
"1": {
"obsidian": 2,
"book": 1
}
},
"agent_count": 2,
"target": "enchanting_table",
"number_of_target": 1,
"type": "techtree",
"max_depth": 0,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_jukebox_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a jukebox",
"conversation": "Let's work together to craft a jukebox.",
"initial_inventory": {
"0": {
"diamond": 1
},
"1": {
"oak_log": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "jukebox",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 1,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_light_gray_wool_full_plan__depth_1": {
"goal": "Collaborate with other agents to craft light_gray_wool",
"conversation": "Let's work together to craft light_gray_wool.",
"initial_inventory": {
"0": {
"black_dye": 1
},
"1": {
"white_wool": 1,
"white_dye": 2
}
},
"agent_count": 2,
"target": "light_gray_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_blast_furnace_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a blast_furnace",
"conversation": "Let's work together to craft a blast_furnace.",
"initial_inventory": {
"0": {
"iron_ingot": 5,
"smooth_stone": 3
},
"1": {
"cobblestone": 8,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "blast_furnace",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_activator_rail_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft activator_rail",
"conversation": "Let's work together to craft activator_rail.",
"initial_inventory": {
"0": {
"iron_ingot": 3,
"oak_planks": 6
},
"1": {
"redstone": 1,
"iron_ingot": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "activator_rail",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_campfire_partial_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft campfire",
"conversation": "Let's work together to craft campfire.",
"initial_inventory": {
"0": {
"oak_log": 8
},
"1": {
"coal": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "campfire",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 300,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_crossbow_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft a crossbow",
"conversation": "Let's work together to craft a crossbow.",
"initial_inventory": {
"0": {
"oak_planks": 8,
"iron_ingot": 2
},
"1": {
"string": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "crossbow",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 300,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
}
}

View file

@ -0,0 +1,291 @@
{
"crafting_iron_pickaxe": {
"goal": "Craft an iron pickaxe.",
"initial_inventory": {
"stone_pickaxe": 1
},
"agent_count": 1,
"target": "iron_pickaxe",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_stick": {
"goal": "Craft sticks.",
"initial_inventory": {},
"agent_count": 1,
"target": "stick",
"number_of_target": 4,
"type": "techtree",
"timeout": 300
},
"crafting_oak_log": {
"goal": "Get oak logs.",
"initial_inventory": {},
"agent_count": 1,
"target": "oak_log",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_wooden_pickaxe": {
"goal": "Craft a wooden pickaxe.",
"initial_inventory": {},
"agent_count": 1,
"target": "wooden_pickaxe",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_stone_pickaxe": {
"goal": "Craft a stone pickaxe.",
"initial_inventory": {},
"agent_count": 1,
"target": "stone_pickaxe",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_shears": {
"goal": "Craft shears.",
"initial_inventory": {
"iron_pickaxe": 1
},
"agent_count": 1,
"target": "shears",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_redstone": {
"goal": "Get redstone.",
"initial_inventory": {
"iron_pickaxe": 1
},
"agent_count": 1,
"target": "redstone",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_gold_ingot": {
"goal": "Get gold ingot.",
"initial_inventory": {
"iron_pickaxe": 1
},
"agent_count": 1,
"target": "gold_ingot",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_copper_ingot": {
"goal": "Get copper ingot.",
"initial_inventory": {
"iron_pickaxe": 1
},
"agent_count": 1,
"target": "copper_ingot",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_diamond": {
"goal": "Get diamond.",
"initial_inventory": {
"iron_pickaxe": 1
},
"agent_count": 1,
"target": "diamond",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_pink_wool_missing_wool": {
"goal": "Craft a pink wool.",
"initial_inventory": {
"pink_dye": 1,
"shears": 1
},
"agent_count": 1,
"target": "pink_wool",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_light_gray_banner": {
"goal": "Craft a light gray banner.",
"initial_inventory": {
"shears": 1,
"light_gray_dye": 7,
"oak_planks": 1,
"wool": 5
},
"agent_count": 1,
"target": "light_gray_banner",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_brush_missing_copper_ingot_": {
"goal": "Craft a brush.",
"initial_inventory": {
"feather": 1,
"diamond_pickaxe": 1
},
"agent_count": 1,
"target": "brush",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_shield_missing_planks": {
"goal": "Craft a shield.",
"initial_inventory": {
"iron_ingot": 6
},
"agent_count": 1,
"target": "shield",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_shield_missing_iron_ingot": {
"goal": "Craft a shield.",
"initial_inventory": {
"oak_planks": 7
},
"agent_count": 1,
"target": "shield",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_chest_minecart": {
"goal": "Craft a chest minecart.",
"agent_count": 1,
"initial_inventory":{
"chest": 1,
"minecart": 1
},
"target": "chest_minecart",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_stone_hoe": {
"goal": "Craft a stone hoe.",
"initial_inventory": {
"wooden_pickaxe": 1
},
"agent_count": 1,
"target": "stone_hoe",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_wooden_axe": {
"goal": "Craft a wooden axe.",
"initial_inventory": {},
"agent_count": 1,
"target": "wooden_axe",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_wooden_shovel": {
"goal": "Craft a wooden shovel.",
"initial_inventory": {},
"agent_count": 1,
"target": "wooden_shovel",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_crafting_table": {
"goal": "Craft a crafting table.",
"initial_inventory": {},
"agent_count": 1,
"target": "crafting_table",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_furnace": {
"goal": "Craft a furnace.",
"initial_inventory": {
"wooden_pickaxe": 1
},
"agent_count": 1,
"target": "furnace",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
},
"crafting_torch": {
"goal": "Craft torches.",
"initial_inventory": {
"wooden_pickaxe": 1
},
"agent_count": 1,
"target": "torch",
"number_of_target": 4,
"type": "techtree",
"timeout": 300
},
"crafting_iron_ingot": {
"goal": "Get iron ingot.",
"initial_inventory": {
"stone_pickaxe": 1
},
"agent_count": 1,
"target": "iron_ingot",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_diamond_from_stone_pickaxe": {
"goal": "Get a diamond using only a stone pickaxe.",
"initial_inventory": {
"stone_pickaxe": 1
},
"agent_count": 1,
"target": "diamond",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_diamond_pickaxe": {
"goal": "Craft a diamond pickaxe.",
"initial_inventory": {
"iron_pickaxe": 1
},
"agent_count": 1,
"target": "diamond_pickaxe",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"crafting_compass": {
"goal": "Craft a compass.",
"initial_inventory": {
"stone_pickaxe": 1
},
"agent_count": 1,
"target": "compass",
"number_of_target": 1,
"type": "techtree",
"timeout": 500
},
"mining_lapis_lazuli": {
"goal": "Mine lapis lazuli.",
"initial_inventory": {
"iron_pickaxe": 1
},
"agent_count": 1,
"target": "lapis_lazuli",
"number_of_target": 1,
"type": "techtree",
"timeout": 300
}
}

View file

@ -0,0 +1,703 @@
{
"multiagent_crafting_pink_wool_full_plan__depth_0": {
"goal": "Collaborate with other agents to craft an pink_wool",
"conversation": "Let's work together to craft an pink_wool.",
"initial_inventory": {
"0": {
"pink_dye": 1
},
"1": {
"black_wool": 1
}
},
"agent_count": 2,
"target": "pink_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_lime_wool_partial_plan__depth_0": {
"goal": "Collaborate with other agents to craft an lime_wool",
"conversation": "Let's work together to craft an lime_wool.",
"initial_inventory": {
"0": {
"lime_dye": 1
},
"1": {
"black_wool": 1
}
},
"agent_count": 2,
"target": "lime_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 300,
"blocked_actions": {
"0": [
],
"1": ["!getCraftingPlan"]
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_purple_banner_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an purple_banner",
"conversation": "Let's work together to craft an purple_banner.",
"initial_inventory": {
"0": {
"purple_wool": 4,
"stick": 1
},
"1": {
"purple_wool": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "purple_banner",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_soul_campfire_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an soul_campfire",
"conversation": "Let's work together to craft an soul_campfire.",
"initial_inventory": {
"0": {
"oak_planks": 2,
"soul_sand": 1,
"dark_oak_log": 2
},
"1": {
"oak_planks": 1,
"dark_oak_log": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "soul_campfire",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_bookshelf_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a bookshelf",
"conversation": "Let's work together to craft a bookshelf.",
"initial_inventory": {
"0": {
"oak_planks": 4,
"book": 2
},
"1": {
"oak_planks": 2,
"book": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "bookshelf",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_compass_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a compass",
"conversation": "Let's work together to craft a compass.",
"initial_inventory": {
"0": {
"iron_ingot": 2
},
"1": {
"iron_ingot": 2,
"redstone": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "compass",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_fishing_rod_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a fishing_rod",
"conversation": "Let's work together to craft a fishing_rod.",
"initial_inventory": {
"0": {
"string": 1,
"oak_planks": 2
},
"1": {
"string": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "fishing_rod",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 1,
"timeout": 600,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_cake_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a cake",
"conversation": "Let's work together to craft a cake.",
"initial_inventory": {
"0": {
"wheat": 2,
"sugar": 1,
"egg": 1
},
"1": {
"wheat": 1,
"milk_bucket": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "cake",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_golden_carrot_full_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a golden_carrot",
"conversation": "Let's work together to craft a golden_carrot.",
"initial_inventory": {
"0": {
"gold_nugget": 5,
"carrot": 1
},
"1": {
"gold_nugget": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "golden_carrot",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_map_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a map",
"conversation": "Let's work together to craft a map.",
"initial_inventory": {
"0": {
"paper": 5
},
"1": {
"paper": 3,
"compass": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "map",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_blue_wool_full_plan__depth_0": {
"goal": "Collaborate with other agents to craft blue_wool",
"conversation": "Let's work together to craft blue_wool.",
"initial_inventory": {
"0": {
"blue_dye": 1
},
"1": {
"white_wool": 1
}
},
"agent_count": 2,
"target": "blue_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_lime_wool_partial_plan__depth_2": {
"goal": "Collaborate with other agents to craft lime_wool",
"conversation": "Let's work together to craft lime_wool.",
"initial_inventory": {
"0": {
"green_dye": 1
},
"1": {
"white_wool": 1,
"bone_meal": 1
}
},
"agent_count": 2,
"target": "lime_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_magenta_wool_full_plan__depth_2": {
"goal": "Collaborate with other agents to craft magenta_wool",
"conversation": "Let's work together to craft magenta_wool.",
"initial_inventory": {
"0": {
"rose_red": 1,
"lapis_lazuli": 1
},
"1": {
"white_wool": 1,
"bone_meal": 1
}
},
"agent_count": 2,
"target": "magenta_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_chest_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a chest",
"conversation": "Let's work together to craft a chest.",
"initial_inventory": {
"0": {
"oak_log": 1
},
"1": {
"oak_planks": 4,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "chest",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 1,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_barrel_partial_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a barrel",
"conversation": "Let's work together to craft a barrel.",
"initial_inventory": {
"0": {
"spruce_planks": 3,
"crafting_table": 1
},
"1": {
"spruce_planks": 3,
"wooden_slab": 1
}
},
"agent_count": 2,
"target": "barrel",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 1200,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_lectern_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft a lectern",
"conversation": "Let's work together to craft a lectern.",
"initial_inventory": {
"0": {
"birch_slab": 5,
"crafting_table": 1
},
"1": {
"birch_log": 2,
"book": 3
}
},
"agent_count": 2,
"target": "lectern",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 2,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_clock_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft a clock",
"conversation": "Let's work together to craft a clock.",
"initial_inventory": {
"0": {
"gold_ingot": 2
},
"1": {
"gold_ingot": 2,
"redstone": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "clock",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 600,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_firework_rocket_partial_plan__depth_0": {
"goal": "Collaborate with other agents to craft firework_rocket",
"conversation": "Let's work together to craft firework_rocket.",
"initial_inventory": {
"0": {
"paper": 1
},
"1": {
"gunpowder": 3
}
},
"agent_count": 2,
"target": "firework_rocket",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": false
},
"multiagent_crafting_enchanting_table_partial_plan_requires_ctable__depth_0": {
"goal": "Collaborate with other agents to craft an enchanting_table",
"conversation": "Let's work together to craft an enchanting_table.",
"initial_inventory": {
"0": {
"diamond": 2,
"obsidian": 2,
"crafting_table": 1
},
"1": {
"obsidian": 2,
"book": 1
}
},
"agent_count": 2,
"target": "enchanting_table",
"number_of_target": 1,
"type": "techtree",
"max_depth": 0,
"depth": 0,
"timeout": 1200,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_jukebox_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a jukebox",
"conversation": "Let's work together to craft a jukebox.",
"initial_inventory": {
"0": {
"diamond": 1
},
"1": {
"oak_log": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "jukebox",
"number_of_target": 1,
"type": "techtree",
"max_depth": 1,
"depth": 1,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [],
"requires_ctable": true
},
"multiagent_crafting_light_gray_wool_full_plan__depth_1": {
"goal": "Collaborate with other agents to craft light_gray_wool",
"conversation": "Let's work together to craft light_gray_wool.",
"initial_inventory": {
"0": {
"black_dye": 1
},
"1": {
"white_wool": 1,
"white_dye": 2
}
},
"agent_count": 2,
"target": "light_gray_wool",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": false
},
"multiagent_crafting_blast_furnace_full_plan_requires_ctable__depth_1": {
"goal": "Collaborate with other agents to craft a blast_furnace",
"conversation": "Let's work together to craft a blast_furnace.",
"initial_inventory": {
"0": {
"iron_ingot": 5,
"smooth_stone": 3
},
"1": {
"cobblestone": 8,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "blast_furnace",
"number_of_target": 1,
"type": "techtree",
"max_depth": 2,
"depth": 1,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_activator_rail_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft activator_rail",
"conversation": "Let's work together to craft activator_rail.",
"initial_inventory": {
"0": {
"iron_ingot": 3,
"oak_planks": 6
},
"1": {
"redstone": 1,
"iron_ingot": 3,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "activator_rail",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_campfire_partial_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft campfire",
"conversation": "Let's work together to craft campfire.",
"initial_inventory": {
"0": {
"oak_log": 8
},
"1": {
"coal": 1,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "campfire",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 1200,
"blocked_actions": {
"0": [
"!getCraftingPlan"
],
"1": []
},
"missing_items": [
],
"requires_ctable": true
},
"multiagent_crafting_crossbow_full_plan_requires_ctable__depth_2": {
"goal": "Collaborate with other agents to craft a crossbow",
"conversation": "Let's work together to craft a crossbow.",
"initial_inventory": {
"0": {
"oak_planks": 8,
"iron_ingot": 2
},
"1": {
"string": 2,
"crafting_table": 1
}
},
"agent_count": 2,
"target": "crossbow",
"number_of_target": 1,
"type": "techtree",
"max_depth": 3,
"depth": 2,
"timeout": 1200,
"blocked_actions": {
"0": [],
"1": []
},
"missing_items": [
],
"requires_ctable": true
}
}